/// <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; } }
private static bool OnDatabaseServer() { var database = new AnimalMovementViews(); return(database.Connection.DataSource == Environment.MachineName); }
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); }