public static void SaveResultVideosLocally(List <SatyamResultsTableEntry> entries, string directoryName, int fps = 10)
        {
            directoryName = directoryName + "\\Raw";

            if (!Directory.Exists(directoryName))
            {
                Directory.CreateDirectory(directoryName);
            }

            SatyamJobStorageAccountAccess satyamStorage = new SatyamJobStorageAccountAccess();



            for (int i = 0; i < entries.Count; i++)
            {
                SatyamResultsTableEntry entry        = entries[i];
                SatyamResult            satyamResult = JSonUtils.ConvertJSonToObject <SatyamResult>(entry.ResultString);
                SatyamTask task = JSonUtils.ConvertJSonToObject <SatyamTask>(satyamResult.TaskParametersString);
                MultiObjectTrackingSubmittedJob job = JSonUtils.ConvertJSonToObject <MultiObjectTrackingSubmittedJob>(task.jobEntry.JobParameters);

                string blobDir = URIUtilities.localDirectoryFullPathFromURI(task.SatyamURI);

                //VATIC_DVA_CrowdsourcedResult taskr = new VATIC_DVA_CrowdsourcedResult(satyamResult.TaskResult, task.SatyamURI, start, end, task.SatyamJobSubmissionsTableEntryID.ToString());
                VATIC_DVA_CrowdsourcedResult taskr = MultiObjectTrackingAggregator.createVATIC_DVA_CrowdsourcedResultUsingSatyamBlobImageCount(satyamResult.TaskResult, blobDir, entry.ID.ToString(), job.FrameRate);
                MultiObjectTrackingResult    res   = taskr.getCompressedTracksInTimeSegment();

                List <string> ImageURLs = satyamStorage.getURLListOfSpecificExtensionUnderSubDirectoryByURI(blobDir, new List <string>()
                {
                    "jpg", "png"
                });
                string videoName = URIUtilities.localDirectoryNameFromURI(blobDir) + "_" + URIUtilities.filenameFromURINoExtension(task.SatyamURI) + "_" + entry.ID;

                MultiObjectTrackingAnalyzer.generateVideoForEvaluation(ImageURLs, res, directoryName, videoName, job.FrameRate);
            }
        }
        public static void SaveResultVideosLocally(List <SatyamResultsTableEntry> entries, string directoryName, int fps = 10)
        {
            directoryName = directoryName + "\\Raw";

            if (!Directory.Exists(directoryName))
            {
                Directory.CreateDirectory(directoryName);
            }

            SatyamJobStorageAccountAccess satyamStorage = new SatyamJobStorageAccountAccess();

            for (int i = 0; i < entries.Count; i++)
            {
                SatyamResultsTableEntry entry        = entries[i];
                SatyamResult            satyamResult = JSonUtils.ConvertJSonToObject <SatyamResult>(entry.ResultString);
                SatyamTask task = JSonUtils.ConvertJSonToObject <SatyamTask>(satyamResult.TaskParametersString);
                MultiObjectTrackingSubmittedJob job = JSonUtils.ConvertJSonToObject <MultiObjectTrackingSubmittedJob>(task.jobEntry.JobParameters);

                //VATIC_DVA_CrowdsourcedResult taskr = new VATIC_DVA_CrowdsourcedResult(satyamResult.TaskResult, task.SatyamURI, start, end, task.SatyamJobSubmissionsTableEntryID.ToString());
                VATIC_DVA_CrowdsourcedResult taskr = MultiObjectTrackingAggregator.createVATIC_DVA_CrowdsourcedResultUsingSatyamBlobImageCount(satyamResult.TaskResult, task.SatyamURI, entry.ID.ToString(), job.FrameRate);

                MultiObjectTrackingResult res = taskr.getCompressedTracksInTimeSegment();

                List <string> ImageURLs = satyamStorage.getURLListOfSubDirectoryByURL(task.SatyamURI);
                string[]      names     = task.SatyamURI.Split('/');
                string        videoName = names[names.Length - 2] + "_" + entry.ID;
                generateVideoForEvaluation(ImageURLs, res, directoryName, videoName, job.FrameRate);
            }
        }
        public static bool IsAcceptable(SatyamAggregatedResultsTableEntry aggEntry, SatyamResultsTableEntry result)
        {
            switch (result.JobTemplateType)
            {
            case TaskConstants.Classification_Image:
            case TaskConstants.Classification_Image_MTurk:
            case TaskConstants.Classification_Video:
            case TaskConstants.Classification_Video_MTurk:
                return(SingleObjectLabelingAggregator.IsAcceptable(aggEntry, result));

            case TaskConstants.Counting_Image:
            case TaskConstants.Counting_Image_MTurk:
            case TaskConstants.Counting_Video:
            case TaskConstants.Counting_Video_MTurk:
                return(ObjectCountingAggregator.IsAcceptable(aggEntry, result));

            case TaskConstants.Detection_Image:
            case TaskConstants.Detection_Image_MTurk:
                return(MultiObjectLocalizationAndLabelingAggregator.IsAcceptable(aggEntry, result));

            case TaskConstants.Tracking:
            case TaskConstants.Tracking_MTurk:
                return(MultiObjectTrackingAggregator.IsAcceptable(aggEntry, result));

            case TaskConstants.Segmentation_Image:
            case TaskConstants.Segmentation_Image_MTurk:
                return(ImageSegmentationAggregator.IsAcceptable(aggEntry, result));

            case TaskConstants.OpenEndedQuestion_Image:
            case TaskConstants.OpenEndedQuestion_Image_MTurk:
                return(true);    //TBD

            case TaskConstants.TrackletLabeling:
            case TaskConstants.TrackletLabeling_MTurk:
                return(TrackletLabelingAggregator.IsAcceptable(aggEntry, result));
            }
            return(false);
        }
        //public static void Aggregate()
        //{
        //    //first get all the results that are not aggregated
        //    SatyamResultsTableAccess resultsDB = new SatyamResultsTableAccess();
        //    List<SatyamResultsTableEntry> results = resultsDB.getEntriesByStatus();

        //    //first group all the results by the tasks since wach task may ahve multiple entries
        //    Dictionary<int, List<SatyamResultsTableEntry>> collectedResults = new Dictionary<int, List<SatyamResultsTableEntry>>();
        //    foreach (SatyamResultsTableEntry entry in results)
        //    {
        //        int taskID = entry.SatyamTaskTableEntryID;
        //        if (!collectedResults.ContainsKey(taskID))
        //        {
        //            collectedResults.Add(taskID, new List<SatyamResultsTableEntry>());
        //        }
        //        collectedResults[taskID].Add(entry);
        //    }

        //    //now aggreagate the results for eacht ask.
        //    List<int> taskIDList = collectedResults.Keys.ToList();
        //    List<SatyamAggregatedResultsTableEntry> aggEntries = new List<SatyamAggregatedResultsTableEntry>();
        //    foreach (int taskId in taskIDList)
        //    {
        //        SatyamAggregatedResultsTableEntry aggEntry = GetAggregatedResultString(taskId, collectedResults[taskId]);
        //        if (aggEntry != null)
        //        {
        //            aggEntries.Add(aggEntry);
        //        }
        //    }
        //    SatyamAggregatedResultsTableAccess aggDB = new SatyamAggregatedResultsTableAccess();
        //    aggDB.AddEntries(aggEntries);
        //    resultsDB.close();
        //    aggDB.close();
        //}

        public static SatyamAggregatedResultsTableEntry GetAggregatedResultString(int taskId, List <SatyamResultsTableEntry> resultEntries)
        {
            SatyamAggregatedResultsTableEntry aggEntry = null;
            string templateType    = resultEntries[0].JobTemplateType;
            string aggResultString = null;

            switch (templateType)
            {
            case TaskConstants.Classification_Image:
            case TaskConstants.Classification_Image_MTurk:
            case TaskConstants.Classification_Video:
            case TaskConstants.Classification_Video_MTurk:
                aggResultString = SingleObjectLabelingAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.Counting_Image:
            case TaskConstants.Counting_Image_MTurk:
            case TaskConstants.Counting_Video:
            case TaskConstants.Counting_Video_MTurk:
                aggResultString = ObjectCountingAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.Detection_Image:
            case TaskConstants.Detection_Image_MTurk:
                aggResultString = MultiObjectLocalizationAndLabelingAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.Tracking:
                aggResultString = null;    //Done testing, marked null so it becomes a demo page.
                break;

            case TaskConstants.Tracking_MTurk:
                aggResultString = MultiObjectTrackingAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.TrackletLabeling:
            case TaskConstants.TrackletLabeling_MTurk:
                aggResultString = TrackletLabelingAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.Segmentation_Image:
                aggResultString = null;    //Done testing, marked null so it becomes a demo page.
                break;

            case TaskConstants.Segmentation_Image_MTurk:
                aggResultString = ImageSegmentationAggregator.GetAggregatedResultString(resultEntries);
                break;

            case TaskConstants.OpenEndedQuestion_Image:
            case TaskConstants.OpenEndedQuestion_Image_MTurk:
                break;
            }
            if (aggResultString != null)
            {
                aggEntry                        = new SatyamAggregatedResultsTableEntry();
                aggEntry.JobGUID                = resultEntries[0].JobGUID;
                aggEntry.JobTemplateType        = resultEntries[0].JobTemplateType;
                aggEntry.SatyamTaskTableEntryID = resultEntries[0].SatyamTaskTableEntryID;
                aggEntry.UserID                 = resultEntries[0].UserID;
                aggEntry.ResultString           = aggResultString;
            }
            return(aggEntry);
        }