/// <summary>
 /// Find and process all of the Argos or DataLog files that need full or partial processing
 /// </summary>
 /// <param name="handler">Delegate to handle exceptions on each file, so that processing can continue.
 /// If the handler is null, processing will stop on first exception.
 /// The handler can throw it's own exception to halt further processing</param>
 /// <param name="pi">A project investigator.
 /// If provided, only files owned by or in projects managed by the given PI will be processed
 /// If null, then all files needing processing will be processed</param>
 public static void ProcessAll(Action<Exception, CollarFile, ArgosPlatform> handler = null,
                               ProjectInvestigator pi = null)
 {
     var database = new AnimalMovementDataContext();
     var views = new AnimalMovementViews();
     foreach (var fileId in
         views.NeverProcessedArgosFiles.Select(x => x.FileId)
              .Concat(views.NeverProcessedDataLogFiles.Select(x => x.FileId))
              .Concat(views.NeverProcessedIdfFiles.Select(x => x.FileId)))
     {
         var file = database.CollarFiles.First(f => f.FileId == fileId);
         if (pi != null &&
             (file.ProjectInvestigator == null || file.ProjectInvestigator.Login != pi.Login) &&
             (file.Project == null || file.Project.ProjectInvestigator1.Login != pi.Login))
             continue;
         try
         {
             ProcessFile(file);
         }
         catch (Exception ex)
         {
             if (handler == null)
                 throw;
             handler(ex, file, null);
         }
     }
     foreach (var item in views.PartiallyProcessedArgosFiles)
     {
         var file = database.CollarFiles.First(f => f.FileId == item.FileId);
         var platform = database.ArgosPlatforms.First(p => p.PlatformId == item.PlatformId);
         if (pi != null && file.ProjectInvestigator != pi && (file.Project == null ||
                                                              file.Project.ProjectInvestigator1 != pi))
             continue;
         try
         {
             ProcessFile(file, platform);
         }
         catch (Exception ex)
         {
             if (handler == null)
                 throw;
             handler(ex, file, platform);
         }
     }
 }
 private void SetUpTpfTab()
 {
     if (TpfDataGridView.DataSource != null)
         return;
     if (Collar.CollarManufacturer != "Telonics" || Collar.CollarModel != "Gen4")
         return;
     var views = new AnimalMovementViews();
     var ignoreSuffix = IgnoreSuffixCheckBox.Checked;
     var tpfList = views.AllTpfFileDatas.ToList();
     tpfList = ignoreSuffix
                   ? tpfList.Where(t => t.CTN.Length >= 6 && t.CTN.Substring(0, 6) == Collar.CollarId).ToList()
                   : tpfList.Where(t => t.CTN == Collar.CollarId).ToList();
     TpfDataGridView.DataSource = tpfList.Select(t => new
                                             {
                                                 t.FileId,
                                                 t.FileName,
                                                 t.Status,
                                                 t.CTN,
                                                 t.Frequency,
                                                 StartDate = t.TimeStamp,
                                             }).ToList();
     TpfDataGridView.Columns[5].HeaderText = "Start Date (UTC)";
 }
        private void LoadDataContext()
        {
            Database = new AnimalMovementDataContext();
            //Database.Log = Console.Out;
            //Collar is in a different DataContext, get one in this DataContext
            if (Collar != null)
                Collar = Database.Collars.FirstOrDefault(c => c.CollarManufacturer == Collar.CollarManufacturer && c.CollarId == Collar.CollarId);
            if (Collar == null)
                throw new InvalidOperationException("Collar Details Form not provided a valid Collar.");

            DatabaseFunctions = new AnimalMovementFunctions();
            DatabaseViews = new AnimalMovementViews();
            IsEditor = DatabaseFunctions.IsInvestigatorEditor(Collar.Manager, CurrentUser) ?? false;
        }
        private void SetUpParameterFilesTab()
        {
            if (ParametersDataGridView.DataSource != null)
                return;
            var views = new AnimalMovementViews();

            ParametersDataGridView.DataSource = views.AllTpfFileDatas.Where(t => t.Platform == Platform.PlatformId).Select(t => new
                                                    {
                                                        t.FileId,
                                                        t.FileName,
                                                        t.Status,
                                                        t.CTN,
                                                        t.Frequency,
                                                        StartDate = t.TimeStamp,
                                                    }).ToList();
            ParametersDataGridView.Columns[5].HeaderText = "Start Date (UTC)";
        }
 private static void ProcessTransmissions(CollarFile file, ArgosFile argos,
                                          IGrouping<string, ArgosTransmission> group)
 {
     LogGeneralMessage(String.Format("  Start processing transmissions for Argos Id {0}", group.Key));
     var platformId = group.Key;
     var transmissions = group.ToList();
     var first = transmissions.Min(t => t.DateTime);
     var last = transmissions.Max(t => t.DateTime);
     var databaseViews = new AnimalMovementViews();
     var parameterSets =
         databaseViews.GetTelonicsParametersForArgosDates(platformId, first, last)
                      .OrderBy(c => c.StartDate)
                      .ToList();
     if (parameterSets.Count == 0)
     {
         var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                 platformId, first, last);
         LogIssueForFile(file.FileId, msg, platformId, null, null, first, last);
         return;
     }
     if (parameterSets[0].StartDate != null && first < parameterSets[0].StartDate)
     {
         var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                 platformId, first, parameterSets[0].StartDate);
         LogIssueForFile(file.FileId, msg, platformId, null, null, first, parameterSets[0].StartDate);
     }
     int lastIndex = parameterSets.Count - 1;
     if (parameterSets[lastIndex].EndDate != null && parameterSets[lastIndex].EndDate < last)
     {
         var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                 platformId, parameterSets[lastIndex].EndDate, last);
         LogIssueForFile(file.FileId, msg, platformId, null, null, parameterSets[lastIndex].EndDate, last);
     }
     foreach (var parameterSet in parameterSets)
     {
         if (parameterSet.ParameterId == null ||
             (parameterSet.CollarModel == "Gen3" && parameterSet.Gen3Period == null) ||
             (parameterSet.CollarModel == "Gen4" && parameterSet.Format == null))
         {
             var start = parameterSet.StartDate ?? first;
             var end = parameterSet.EndDate ?? last;
             var msg = String.Format("No Telonics Parameters for Collar {0}/{3} from {1:g} to {2:g}",
                                     parameterSet.CollarManufacturer, start, end, parameterSet.CollarId);
             LogIssueForFile(file.FileId, msg, platformId, parameterSet.CollarManufacturer, parameterSet.CollarId, start, end);
             continue;
         }
         try
         {
             ProcessParameterSet(file, argos, first, last, transmissions, parameterSet);
         }
         catch (Exception ex)
         {
             var message = String.Format(
                 "ERROR {0} adding Argos {1} transmissions from {2:g} to {3:g} to Collar {4}/{5}",
                 ex.Message, parameterSet.PlatformId, first, last,
                 parameterSet.CollarManufacturer, parameterSet.CollarId);
             LogIssueForFile(file.FileId, message, parameterSet.PlatformId, parameterSet.CollarManufacturer,
                             parameterSet.CollarId, first, last);
         }
     }
     LogGeneralMessage("  Finished processing transmissions");
 }
        private static void ProcessIdfFile(CollarFile file)
        {
            LogGeneralMessage(String.Format("Start local processing of file {0}", file.FileId));

            var databaseViews = new AnimalMovementViews();
            var idfLink = databaseViews.CollarParametersForIridiumDownload(file.FileId).FirstOrDefault();
            if (idfLink == null)
            {
                LogGeneralMessage("No parameters found.  Skipping file.");
                return;
            }
            var database = new AnimalMovementDataContext();
            var tpfFile = database.CollarParameterFiles.FirstOrDefault(f => f.FileId == idfLink.ParameterFileId);
            if (tpfFile == null)
            {
                LogGeneralMessage("No collar parameter file found.  Skipping file.");
                return;
            }
            var collar = database.Collars.FirstOrDefault(
                    c => c.CollarManufacturer == idfLink.CollarManufacturer &&
                        (c.CollarId == idfLink.CollarId || c.CollarId == idfLink.CollarId.Substring(0,6)));
            if (collar == null)
            {
                LogGeneralMessage("No collar found.  Skipping file.");
                return;
            }

            var databaseFunctions = new AnimalMovementFunctions();
            //FIXME: check that this is generic to all telonics processing and not just Argos files
            databaseFunctions.ArgosFile_ClearProcessingResults(file.FileId);
            databaseFunctions.CollarFile_FixOwnerOfIdfFile((file.FileId));

            var processor = new Gen4Processor(tpfFile.Contents.ToArray());
            var lines = processor.ProcessIdf(file.Contents.ToArray());

            var data = Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, lines) + Environment.NewLine);
            var filename = Path.GetFileNameWithoutExtension(file.FileName) + "_" + DateTime.Now.ToString("yyyyMMdd") + ".csv";
            var fileLoader = new FileLoader(filename, data)
            {
                Project = null,
                Owner = tpfFile.ProjectInvestigator,  //Must match result from databaseFunctions.CollarFile_FixOwnerOfIdfFile
                Collar = collar,
                Status = file.Status,
                ParentFileId = file.FileId,
                AllowDuplicates = false
            };
            fileLoader.Load();
            LogGeneralMessage("Finished local processing of file");
        }
 private static bool OnDatabaseServer()
 {
     var database = new AnimalMovementViews();
     return database.Connection.DataSource == Environment.MachineName;
 }
 private static bool NeedTelonicsSoftware(CollarFile file)
 {
     var database = new AnimalMovementViews();
     return database.FileHasGen4Data(file.FileId) ?? false;
 }
 //TODO - Add additional location info: hidden locations, centroid, MCP area, average speed
 private void SetupLocationsTab()
 {
     if (Animal == null)
         return;
     var views = new AnimalMovementViews();
     var summary = views.AnimalLocationSummary(Animal.ProjectId, Animal.AnimalId).FirstOrDefault();
     if (summary == null)
     {
         SummaryLabel.Text = "There are NO locations.";
         LocationsGridView.Visible = false;
     }
     else
     {
         SummaryLabel.Text = String.Format("{0} fixes between {1:d} and {2:d}.", summary.Count, summary.First, summary.Last);
         LocationsGridView.Visible = true;
         var query = from location in views.AnimalLocations
                     where location.ProjectId == Animal.ProjectId && location.AnimalId == Animal.AnimalId
                     select new {location.Local_DateTime, location.Lat_WGS84, location.Lon_WGS84, Hidden = location.Status};
         LocationsGridView.DataSource = query;
     }
 }
Example #10
0
        private static bool OnDatabaseServer()
        {
            var database = new AnimalMovementViews();

            return(database.Connection.DataSource == Environment.MachineName);
        }
Example #11
0
        private static void ProcessTransmissions(CollarFile file, ArgosFile argos,
                                                 IGrouping <string, ArgosTransmission> group)
        {
            LogGeneralMessage(String.Format("  Start processing transmissions for Argos Id {0}", group.Key));
            var platformId    = group.Key;
            var transmissions = group.ToList();
            var first         = transmissions.Min(t => t.DateTime);
            var last          = transmissions.Max(t => t.DateTime);
            var databaseViews = new AnimalMovementViews();
            var parameterSets =
                databaseViews.GetTelonicsParametersForArgosDates(platformId, first, last)
                .OrderBy(c => c.StartDate)
                .ToList();

            if (parameterSets.Count == 0)
            {
                var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                        platformId, first, last);
                LogIssueForFile(file.FileId, msg, platformId, null, null, first, last);
                return;
            }
            if (parameterSets[0].StartDate != null && first < parameterSets[0].StartDate)
            {
                var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                        platformId, first, parameterSets[0].StartDate);
                LogIssueForFile(file.FileId, msg, platformId, null, null, first, parameterSets[0].StartDate);
            }
            int lastIndex = parameterSets.Count - 1;

            if (parameterSets[lastIndex].EndDate != null && parameterSets[lastIndex].EndDate < last)
            {
                var msg = String.Format("No Collar for ArgosId {0} from {1:g} to {2:g}",
                                        platformId, parameterSets[lastIndex].EndDate, last);
                LogIssueForFile(file.FileId, msg, platformId, null, null, parameterSets[lastIndex].EndDate, last);
            }
            foreach (var parameterSet in parameterSets)
            {
                if (parameterSet.ParameterId == null ||
                    (parameterSet.CollarModel == "Gen3" && parameterSet.Gen3Period == null) ||
                    (parameterSet.CollarModel == "Gen4" && parameterSet.Format == null))
                {
                    var start = parameterSet.StartDate ?? first;
                    var end   = parameterSet.EndDate ?? last;
                    var msg   = String.Format("No Telonics Parameters for Collar {0}/{3} from {1:g} to {2:g}",
                                              parameterSet.CollarManufacturer, start, end, parameterSet.CollarId);
                    LogIssueForFile(file.FileId, msg, platformId, parameterSet.CollarManufacturer, parameterSet.CollarId, start, end);
                    continue;
                }
                try
                {
                    ProcessParameterSet(file, argos, first, last, transmissions, parameterSet);
                }
                catch (Exception ex)
                {
                    var message = String.Format(
                        "ERROR {0} adding Argos {1} transmissions from {2:g} to {3:g} to Collar {4}/{5}",
                        ex.Message, parameterSet.PlatformId, first, last,
                        parameterSet.CollarManufacturer, parameterSet.CollarId);
                    LogIssueForFile(file.FileId, message, parameterSet.PlatformId, parameterSet.CollarManufacturer,
                                    parameterSet.CollarId, first, last);
                }
            }
            LogGeneralMessage("  Finished processing transmissions");
        }
        private void LoadDataContext()
        {
            Database = new AnimalMovementDataContext();
            //Database.Log = Console.Out;
            //File is in a different DataContext, get one in this DataContext
            if (File != null)
                File = Database.CollarFiles.FirstOrDefault(f => f.FileId == File.FileId);
            if (File == null)
                throw new InvalidOperationException("File Details Form not provided a valid File.");

            DatabaseViews = new AnimalMovementViews();
            var functions = new AnimalMovementFunctions();
            IsFileEditor = (functions.IsProjectEditor(File.ProjectId, CurrentUser) ?? false) ||
                           (functions.IsInvestigatorEditor(File.Owner, CurrentUser) ?? false);
        }