/// <summary> /// Process one or more .NCC Review measurement data files, with related .NOP/.COP files. /// see Import Operator Declarations from Operator Review and Measurements from Radiation Review p. 24, /// See Operator Declaration File Format p. 87, /// See Operator Declaration File Format for Curium Ratio Measurements p. 88, /// See Radiation Review Measurement Data File Format p. 93, INCC Software Users Manual, March 29, 2009 /// </summary> void INCCReviewFileProcessing() { FireEvent(EventType.ActionPrep, this); NC.App.Opstate.StampOperationStartTime(); // This code would be the same for an interactive version of this operation // > Start here // first find and process and .NOP files List<string> exts = new List<string>() { ".nop", ".cop" }; FileList<CSVFile> hdlr = new FileList<CSVFile>(); hdlr.Init(exts, ctrllog); FileList<CSVFile> files = null; // The INCC5 semantics if (NC.App.AppContext.FileInputList == null) files = (FileList<CSVFile>)hdlr.BuildFileList(NC.App.AppContext.FileInput, NC.App.AppContext.Recurse, true); else files = (FileList<CSVFile>)hdlr.BuildFileList(NC.App.AppContext.FileInputList); // construct lists of isotopics and items from the NOP and COP files OPFiles opfiles = new OPFiles(); opfiles.Process(files); ctrllog.TraceEvent(LogLevels.Verbose, 33085, "NOP items " + opfiles.NOPItemIds.Count); // process the NCC files only INCCFileOrFolderInfo foo = new INCCFileOrFolderInfo(ctrllog, "*.NCC"); if (NC.App.AppContext.FileInputList == null) foo.SetPath(NC.App.AppContext.FileInput); else foo.SetFileList(NC.App.AppContext.FileInputList); List<INCCTransferBase> res = foo.Restore(); // use RemoveAll to cull those NCC files that reference a non-existent detector DetectorList dl = NC.App.DB.Detectors; foreach (INCCReviewFile rf in res) { List<Detector> tdk = dl.FindAll(d => 0 == string.Compare(d.Id.DetectorName, rf.detector, true)); if (tdk.Count < 1) { rf.skip = true; ctrllog.TraceEvent(LogLevels.Warning, 33085, "No detector " + rf.detector + " defined, cannot complete processing NCC review file " + System.IO.Path.GetFileName(rf.Path)); } } res.RemoveAll(rf => (rf as INCCReviewFile).skip); res.Sort((rf1, rf2) => // sort chronologically { return DateTime.Compare((rf1 as INCCReviewFile).dt, (rf2 as INCCReviewFile).dt); }); /// end here > The sorted, filtered and processed list here would be returned to the UI for display and interactive selection if (res == null || res.Count < 1) { NC.App.Opstate.StopTimer(0); NC.App.Opstate.StampOperationStopTime(); FireEvent(EventType.ActionStop, this); ctrllog.TraceEvent(LogLevels.Warning, 33085, "No useable NCC review files found in " + System.IO.Path.GetFullPath(foo.GetPath())); return; } AcquireParameters orig_acq = new AcquireParameters(NC.App.Opstate.Measurement.AcquireState); // Each NCC file is a separate measurement foreach (INCCReviewFile irf in res) { ResetMeasurement(); if (NC.App.Opstate.IsQuitRequested) break; // Find the detector named in the NCC file (existence shown in earlier processing above) Detector curdet = NC.App.DB.Detectors.Find(d => string.Compare(d.Id.DetectorName, irf.detector, true) == 0); // set up acquire state based on the NCC file content AcquireParameters newacq = ConfigureAcquireState(curdet, orig_acq, irf); AssaySelector.MeasurementOption mo = NCCMeasOption(irf); // make a temp MeasId MeasId thisone = new MeasId(mo, newacq.MeasDateTime); // get the list of measurement Ids for this detector List<MeasId> list = NC.App.DB.MeasurementIds(curdet.Id.DetectorName, mo.PrintName()); MeasId already = list.Find(mid => mid.Equals(thisone)); if (already != null) { // URGENT: do the replacement as it says ctrllog.TraceEvent(LogLevels.Warning, 33085, "Replacing the matching {0} measurement, timestamp {1} (in a future release)", already.MeasOption.PrintName(), already.MeasDateTime.ToString()); } IntegrationHelpers.BuildMeasurement(newacq, curdet, mo); Measurement meas = NC.App.Opstate.Measurement; meas.MeasDate = newacq.MeasDateTime; // use the date and time from the NCC file content meas.Persist(); // preserve the basic results record if (AssaySelector.ForMass(meas.MeasOption) && !meas.INCCAnalysisState.Methods.AnySelected()) ctrllog.TraceEvent(LogLevels.Warning, 437, "No mass methods for " + meas.INCCAnalysisState.Methods.selector.ToString()); try { UInt16 total_number_runs = 0; double run_count_time = 0; double total_good_count_time = 0; if (irf.num_runs == 0) { ctrllog.TraceEvent(LogLevels.Error, 440, "This measurement has no good cycles."); continue; } if (meas.MeasOption == AssaySelector.MeasurementOption.holdup) continue; /* convert to total count time */ total_number_runs = irf.num_runs; total_good_count_time = (double)irf.num_runs * run_count_time; meas.RequestedRepetitions = total_number_runs; // convert runs to cycles for (int i = 0; i < irf.num_runs; i++) { /* run date and time (IAEA format) */ AddReviewFileCycle(i, irf.runs[i], irf.times[i], meas, irf.Path); if (i % 8 == 0) FireEvent(EventType.ActionInProgress, this); } FireEvent(EventType.ActionInProgress, this); // NEXT: handle true AAS cycles as in INCC5 if (meas.MeasOption == AssaySelector.MeasurementOption.verification && meas.INCCAnalysisState.Methods.Has(AnalysisMethod.AddASource) && meas.AcquireState.well_config == WellConfiguration.Passive) { ctrllog.TraceEvent(LogLevels.Error, 440, "No add-a-source data processed because I am lame. " + "AAS "); //AddASourceSetup aass = IntegrationHelpers.GetCurrentAASSParams(meas.Detectors[0]); //for (int n = 1; n <= aass.number_positions; n++) //{ // /* number of good runs */ // string l = td.reader.ReadLine(); // if (td.reader.EndOfStream) // { // ctrllog.TraceEvent(LogLevels.Error, 440, "No add-a-source data found in disk file. " + "AAS p" + n.ToString()); // } //} } } catch (Exception e) { NC.App.Opstate.SOH = NCC.OperatingState.Trouble; ctrllog.TraceException(e, true); ctrllog.TraceEvent(LogLevels.Error, 437, "NCC file processing stopped with error: '" + e.Message + "'"); } finally { NC.App.Loggers.Flush(); } FireEvent(EventType.ActionInProgress, this); ComputeFromINCC5SRData(meas); FireEvent(EventType.ActionInProgress, this); } NC.App.Opstate.ResetTokens(); NC.App.Opstate.SOH = NCC.OperatingState.Stopping; NC.App.Opstate.StampOperationStopTime(); FireEvent(EventType.ActionStop, this); }
void INCCTransferFileProcessing() { FireEvent(EventType.ActionPrep, this); NC.App.Opstate.StampOperationStartTime(); INCCFileOrFolderInfo foo = new INCCFileOrFolderInfo(ctrllog); if (NC.App.AppContext.FileInputList == null) foo.SetPath(NC.App.AppContext.FileInput); else foo.SetFileList(NC.App.AppContext.FileInputList); List<INCCTransferBase> res = foo.Restore(); if (res != null) { // do the detectors and the methods first, then do the transfer files with the data and results res.Sort((itb1, itb2) => { if (itb1 is INCCInitialDataDetectorFile) if (!(itb2 is INCCInitialDataDetectorFile)) return -1; else return 0; if (itb1 is INCCInitialDataCalibrationFile) if (itb2 is INCCInitialDataDetectorFile) return 1; else if (itb2 is INCCTransferFile) return -1; else return 0; if (itb1 is INCCTransferFile) if (!(itb2 is INCCTransferFile)) return 1; else return 0; return 0; }); // the in-memory load now occurs if (res.Count > 0) { ctrllog.TraceInformation("=== Processing the intermediate transfer content"); int j = 1; // when processing a detector, detector calib, and 1 or more transfer files in batch, the order is important. bool modI = false, modC = false; foreach (INCCTransferBase bar in res) { if (bar is INCCInitialDataDetectorFile) // first in the list, define the detectors { INCCKnew k = new INCCKnew(ctrllog); k.BuildDetector((INCCInitialDataDetectorFile)bar, j); j++; modI = true; } } if (modI) // detector files have these various related parameters, update the in-memory collection state and the database to reflect this { // DB create/update on all records NC.App.DB.UpdateDetectors(); NC.App.DB.BackgroundParameters.SetMap(); NC.App.DB.UnattendedParameters.SetMap(); // created from scratch NC.App.DB.NormParameters.SetMap(); NC.App.DB.AASSParameters.SetMap(); NC.App.DB.HVParameters.SetMap(); } foreach (INCCTransferBase bar in res) { if (bar is INCCInitialDataCalibrationFile) // second in the list, get the calib info attached to detectors { INCCKnew k = new INCCKnew(ctrllog); k.BuildCalibration((INCCInitialDataCalibrationFile)bar, j); j++; modC = true; } } if (modC) // update the datbase with new material defs and method analysis parameters { NC.App.DB.Materials.SetList(); NC.App.DB.Materials.Reset(); NC.App.DB.UpdateAnalysisMethods(); } foreach (INCCTransferBase bar in res) { if (bar is INCCTransferFile) // third, after prep with detector data and calib, this is measurement data and results derived using detectors and thier calibration parameters. { INCCKnew k = new INCCKnew(ctrllog); bool supercool = k.BuildMeasurement((INCCTransferFile)bar, j); j++; if (!supercool) continue; if (NC.App.AppContext.Replay) Replay(k.Meas, ConstructedSource.INCCTransfer); else PassThru(k.Meas); } } } NC.App.Opstate.SOH = NCC.OperatingState.Stopping; NC.App.Opstate.StampOperationStopTime(); FireEvent(EventType.ActionStop, this); } }