From 61921d1687138a202cfe9a01286f54f3fdaa629b Mon Sep 17 00:00:00 2001 From: WingYeung Ma Date: Thu, 20 Aug 2026 16:21:57 -0700 Subject: [PATCH 1/2] FIX: Clean up the module ordering for the FITS and L0 savers --- include/MGUIOptionsSaverMeasurementsFITS.h | 1 - include/MModuleSaverMeasurementsFITS.h | 6 --- src/MAssembly.cxx | 1 - src/MGUIOptionsSaverMeasurementsFITS.cxx | 13 ------- src/MModuleSaverMeasurementsFITS.cxx | 45 ++++++++-------------- src/MModuleSaverMeasurementsL0.cxx | 7 +++- 6 files changed, 21 insertions(+), 52 deletions(-) diff --git a/include/MGUIOptionsSaverMeasurementsFITS.h b/include/MGUIOptionsSaverMeasurementsFITS.h index f0006148..54cd0888 100644 --- a/include/MGUIOptionsSaverMeasurementsFITS.h +++ b/include/MGUIOptionsSaverMeasurementsFITS.h @@ -74,7 +74,6 @@ class MGUIOptionsSaverMeasurementsFITS : public MGUIOptions MGUIEFileSelector* m_FileSelectorFITS; //! Select output level: L1b or L2 - TGComboBox* m_OutputDataLevelCombo; diff --git a/include/MModuleSaverMeasurementsFITS.h b/include/MModuleSaverMeasurementsFITS.h index ed2c96e4..16247ae3 100644 --- a/include/MModuleSaverMeasurementsFITS.h +++ b/include/MModuleSaverMeasurementsFITS.h @@ -77,12 +77,6 @@ class MModuleSaverMeasurementsFITS : public MModule //! Get the output file name MString GetFileName() const { return m_FileName; } - //! Set the output data level: 0 = L1a, 1 = L1b, 2 = L2 - void SetOutputDataLevel(int Level) { m_OutputDataLevel = Level; ConfigurePreceedingModules(); } - //! Get the output data level: 1 = L1b, 2 = L2 - int GetOutputDataLevel() const { return m_OutputDataLevel; } - - // protected methods: protected: //! Create the FITS file and extensions diff --git a/src/MAssembly.cxx b/src/MAssembly.cxx index eb778940..25841dfc 100644 --- a/src/MAssembly.cxx +++ b/src/MAssembly.cxx @@ -138,7 +138,6 @@ MAssembly::MAssembly() m_Supervisor->AddAvailableModule(new MModuleEventSaver()); m_Supervisor->AddAvailableModule(new MModuleSaverMeasurementsL0()); - m_Supervisor->AddAvailableModule(new MModuleSaverMeasurementsFITS()); m_Supervisor->AddAvailableModule(new MModuleSaverMeasurementsFITS("XmlTagSaverMeasurementsFITSL1a", 0, "Save events to L1a FITS")); m_Supervisor->AddAvailableModule(new MModuleSaverMeasurementsFITS("XmlTagSaverMeasurementsFITSL1b", 1, "Save events to L1b FITS")); m_Supervisor->AddAvailableModule(new MModuleSaverMeasurementsFITS("XmlTagSaverMeasurementsFITSL2", 2, "Save events to L2 FITS")); diff --git a/src/MGUIOptionsSaverMeasurementsFITS.cxx b/src/MGUIOptionsSaverMeasurementsFITS.cxx index 2160ccb6..d4861ecc 100644 --- a/src/MGUIOptionsSaverMeasurementsFITS.cxx +++ b/src/MGUIOptionsSaverMeasurementsFITS.cxx @@ -74,18 +74,6 @@ void MGUIOptionsSaverMeasurementsFITS::Create() m_FileSelectorFITS->SetFileType("FITS file", "*.fit"); m_OptionsFrame->AddFrame(m_FileSelectorFITS, LabelLayout); - // Output level selector: L1b or L2 - TGLabel* LevelLabel = new TGLabel(m_OptionsFrame, "Output Level:"); - m_OptionsFrame->AddFrame(LevelLabel, LabelLayout); - - m_OutputDataLevelCombo = new TGComboBox(m_OptionsFrame); - m_OutputDataLevelCombo->AddEntry("L1a (raw hits, no calibration)", 0); - m_OutputDataLevelCombo->AddEntry("L1b (all events, with QUALITY_FLAG)", 1); - m_OutputDataLevelCombo->AddEntry("L2 (screened, no QUALITY_FLAG)", 2); - m_OutputDataLevelCombo->Select(dynamic_cast(m_Module)->GetOutputDataLevel()); - m_OutputDataLevelCombo->Resize(300, 25); - m_OptionsFrame->AddFrame(m_OutputDataLevelCombo, LabelLayout); - PostCreate(); } @@ -129,7 +117,6 @@ bool MGUIOptionsSaverMeasurementsFITS::OnApply() // Modify this to store the data in the module! dynamic_cast(m_Module)->SetFileName(m_FileSelectorFITS->GetFileName()); - dynamic_cast(m_Module)->SetOutputDataLevel(m_OutputDataLevelCombo->GetSelected()); return true; } diff --git a/src/MModuleSaverMeasurementsFITS.cxx b/src/MModuleSaverMeasurementsFITS.cxx index b1c3d3ab..38b3d78e 100644 --- a/src/MModuleSaverMeasurementsFITS.cxx +++ b/src/MModuleSaverMeasurementsFITS.cxx @@ -79,6 +79,11 @@ MModuleSaverMeasurementsFITS::MModuleSaverMeasurementsFITS(MString XmlTag, int O // Set all types this modules handles AddModuleType(MAssembly::c_EventSaver); + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + // Allow multiple savers per sequence + SetTypeExclusive(false); + // Set if this module has an options GUI m_HasOptionsGUI = true; @@ -125,11 +130,6 @@ bool MModuleSaverMeasurementsFITS::Initialize() // If output data level is 0, call the external m_L1aWriter if (m_OutputDataLevel == 0) { - // L1b need strip pairing which is not a requirement for L1a. - m_PreceedingModules.clear(); - m_PreceedingModulesHardRequirement.clear(); - AddPreceedingModuleType(MAssembly::c_EventLoader); - if (m_L1aWriter.Create(m_FileName) == false) { if (g_Verbosity >= c_Error) cout<GetValue(); } - - MXmlNode* OutputLevelNode = Node->GetNode("OutputLevel"); - if (OutputLevelNode != nullptr) { - MString Level = OutputLevelNode->GetValue(); - if (Level == "L2" || Level == "l2") { - m_OutputDataLevel = 2; - } else if (Level == "L1a" || Level == "l1a") { - m_OutputDataLevel = 0; - } else { - m_OutputDataLevel = 1; - } - } - ConfigurePreceedingModules(); - return true; } @@ -720,13 +712,6 @@ MXmlNode* MModuleSaverMeasurementsFITS::CreateXmlConfiguration() MXmlNode* Node = new MXmlNode(0, m_XmlTag); new MXmlNode(Node, "FileName", m_FileName); - const char* lvl = "L1b"; - switch (m_OutputDataLevel) { - case 0: lvl = "L1a"; break; - case 2: lvl = "L2"; break; - default: lvl = "L1b"; break; // 1 = L1b - } - new MXmlNode(Node, "OutputLevel", lvl); return Node; } diff --git a/src/MModuleSaverMeasurementsL0.cxx b/src/MModuleSaverMeasurementsL0.cxx index d263aa62..3b9696b1 100644 --- a/src/MModuleSaverMeasurementsL0.cxx +++ b/src/MModuleSaverMeasurementsL0.cxx @@ -65,12 +65,17 @@ MModuleSaverMeasurementsL0::MModuleSaverMeasurementsL0() : MModule() // Set the XML tag --- has to be unique --- no spaces allowed m_XmlTag = "XmlTagSaverMeasurementsL0"; - // Set all modules, which have to be done before this module + // Set all modules, which have to be done before this module: + // The L0 saver writes simulated events into a binary file - requires an event loader and the detector effects engine module before it AddPreceedingModuleType(MAssembly::c_EventLoader); + AddPreceedingModuleType(MAssembly::c_DetectorEffectsEngine); // Set all types this modules handles AddModuleType(MAssembly::c_EventSaver); + // Allow multiple savers per sequence + SetTypeExclusive(false); + // Set if this module has an options GUI m_HasOptionsGUI = true; From 578b55d6750c905d6f2e9d322907ba5fbc655850 Mon Sep 17 00:00:00 2001 From: WingYeung Ma Date: Tue, 25 Aug 2026 23:16:18 -0700 Subject: [PATCH 2/2] FIX: L0 saver must immediately follow DEE --- src/MModuleSaverMeasurementsL0.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/MModuleSaverMeasurementsL0.cxx b/src/MModuleSaverMeasurementsL0.cxx index 3b9696b1..472f9c6f 100644 --- a/src/MModuleSaverMeasurementsL0.cxx +++ b/src/MModuleSaverMeasurementsL0.cxx @@ -67,8 +67,9 @@ MModuleSaverMeasurementsL0::MModuleSaverMeasurementsL0() : MModule() // Set all modules, which have to be done before this module: // The L0 saver writes simulated events into a binary file - requires an event loader and the detector effects engine module before it + // The DEE must be immediately before it AddPreceedingModuleType(MAssembly::c_EventLoader); - AddPreceedingModuleType(MAssembly::c_DetectorEffectsEngine); + AddPreceedingModuleType(MAssembly::c_DetectorEffectsEngine, true, true); // Set all types this modules handles AddModuleType(MAssembly::c_EventSaver);