diff --git a/include/MGUIOptionsRevan.h b/include/MGUIOptionsRevan.h new file mode 100644 index 0000000..bb9e266 --- /dev/null +++ b/include/MGUIOptionsRevan.h @@ -0,0 +1,87 @@ +/* + * MGUIOptionsRevan.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MGUIOptionsRevan__ +#define __MGUIOptionsRevan__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// ROOT libs: +#include +#include +#include +#include +#include +#include +#include + +// MEGAlib libs: +#include "MGlobal.h" +#include "MString.h" +#include "MGUIEEntry.h" +#include "MGUIEFileSelector.h" +#include "MGUIERBList.h" +#include "MGUIOptions.h" + +// Nuclearizer libs: +#include "MModule.h" + + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MGUIOptionsRevan : public MGUIOptions +{ + // public Session: + public: + //! Default constructor + MGUIOptionsRevan(MModule* Module); + //! Default destructor + virtual ~MGUIOptionsRevan(); + + //! Process all button, etc. messages + virtual bool ProcessMessage(long Message, long Parameter1, long Parameter2); + + //! The creation part which gets overwritten + virtual void Create(); + + // protected methods: + protected: + + //! Actions after the Apply or OK button has been pressed + virtual bool OnApply(); + + + // protected members: + protected: + + // private members: + private: + //! Select the revan configuration file + MGUIEFileSelector* m_RevanCfgFileSelector; + + +#ifdef ___CLING___ + public: + ClassDef(MGUIOptionsRevan, 1) // basic class for dialog windows +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MModuleEventSaver.h b/include/MModuleEventSaver.h index 7211f27..e3f1d95 100644 --- a/include/MModuleEventSaver.h +++ b/include/MModuleEventSaver.h @@ -148,9 +148,9 @@ class MModuleEventSaver : public MModule static const unsigned int c_RoaFile = 0; static const unsigned int c_DatFile = 1; static const unsigned int c_EvtaFile = 2; - static const unsigned int c_SimFile = 3; - static const unsigned int c_TraFile = 4; - + static const unsigned int c_TraFile = 3; + static const unsigned int c_SimFile = 4; + // protected methods: protected: //! Start a new sub-file diff --git a/include/MModuleRevan.h b/include/MModuleRevan.h new file mode 100644 index 0000000..9903291 --- /dev/null +++ b/include/MModuleRevan.h @@ -0,0 +1,111 @@ +/* + * MModuleRevan.h + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * Please see the source-file for the copyright-notice. + * + */ + + +#ifndef __MModuleRevan__ +#define __MModuleRevan__ + + +//////////////////////////////////////////////////////////////////////////////// + + +// Standard libs: +#include +using namespace std; + +// ROOT libs: + +// MEGAlib libs: +#include "MGlobal.h" +#include "MString.h" +#include "MFile.h" +#include "MSettingsRevan.h" +#include "MGeometryRevan.h" +#include "MRawEventAnalyzer.h" + +// Nuclearizer libs: +#include "MModule.h" + +// Forward declarations: + + +//////////////////////////////////////////////////////////////////////////////// + + +class MModuleRevan : public MModule +{ + // public interface: + public: + //! Default constructor + MModuleRevan(); + //! Default destructor + virtual ~MModuleRevan(); + + //! Create a new object of this class + virtual MModuleRevan* Clone() { return new MModuleRevan(); } + + //! Get the revan configuration file name + MString GetRevanConfigurationFileName() const { return m_RevanConfigurationFileName; } + //! Set the revan configuration file name + void SetRevanConfigurationFileName(MString RevanConfigurationFileName) { m_RevanConfigurationFileName = RevanConfigurationFileName; } + + //! Initialize the module + virtual bool Initialize(); + + //! Finalize the module + virtual void Finalize(); + + //! Main data analysis routine, which updates the event to a new level + virtual bool AnalyzeEvent(MReadOutAssembly* Event); + + //! Show the options GUI + virtual void ShowOptionsGUI(); + + //! Read the configuration data from an XML node + virtual bool ReadXmlConfiguration(MXmlNode* Node); + //! Create an XML node tree from the configuration + virtual MXmlNode* CreateXmlConfiguration(); + + // protected methods: + protected: + + + // private methods: + private: + + // protected members: + protected: + + + // private members: + private: + //! The revan configuration file name + MString m_RevanConfigurationFileName; + + //! The settings for revan + MSettingsRevan* m_Settings; + + //! The revan geometry + MGeometryRevan* m_ReconstructionGeometry; + + //! The raw event analyzer + MRawEventAnalyzer* m_RawEventAnalyzer; + +#ifdef ___CLING___ + public: + ClassDef(MModuleRevan, 0) // no description +#endif + +}; + +#endif + + +//////////////////////////////////////////////////////////////////////////////// diff --git a/include/MReadOutAssembly.h b/include/MReadOutAssembly.h index 1a8b0aa..a0aa8da 100644 --- a/include/MReadOutAssembly.h +++ b/include/MReadOutAssembly.h @@ -294,6 +294,12 @@ class MReadOutAssembly : public MReadOutSequence //! Get the filgtered-out flag bool IsFilteredOut() const { return m_FilteredOut; } + //! Set the event-reconstruction-incomplete flag + void SetEventReconstructionIncomplete(bool Flag = true, MString Text = "") { m_EventReconstructionIncomplete = Flag; m_EventReconstructionIncompleteString = Text; } + //! Get the event-reconstruction-incomplete flag + bool IsEventReconstructionIncomplete() const { return m_EventReconstructionIncomplete; } + + //! Returns true if any of the "veto" flags have been set bool IsVeto() const; @@ -308,20 +314,30 @@ class MReadOutAssembly : public MReadOutSequence bool HasAnalysisProgress(uint64_t Progress) const { return (m_AnalysisProgress & Progress) == Progress ? true : false; } //! Return the analysis progress flag uint64_t GetAnalysisProgress() const { return m_AnalysisProgress; } + //! Set the Quality of this Event void SetEventQuality(double EventQuality){ m_EventQuality = EventQuality; } //!Return the Quality of this Event double GetEventQuality() const { return m_EventQuality; } + //! Parse some content from a line bool Parse(MString& Line, int Version = 1); + //! Steam the content in a way Nuclearizer can read it in again bool StreamDat(ostream& S, int Version = 1); //! Stream the content in MEGAlib's evta format void StreamEvta(ostream& S); + //! Stream the content in MEGAlib's evta format + void StreamTra(ostream& S); //! Stream the content in MEGAlib's roa format void StreamRoa(ostream& S, bool WithADCs = true, bool WithTACs = true, bool WithEnergies = false, bool WithTimings = false, bool WithTemperatures = false, bool WithFlags = false, bool WithOrigins = false, bool WithNearestNeighbors = false); + + //! Steam the BD flags + void StreamBDFlags(ostream& S); + //! Build the next MReadoutAssemply from a .dat file bool GetNextFromDatFile(MFile &F); + //! Use the info in m_Aspect to turn m_CL into an absolute UTC time bool ComputeAbsoluteTime(); //! Set the MTime corresponding to absolute UTC time @@ -435,26 +451,34 @@ class MReadOutAssembly : public MReadOutSequence // Flags indicating the quality of the event bool m_AspectIncomplete; MString m_AspectIncompleteString; + bool m_TimeIncomplete; MString m_TimeIncompleteString; + bool m_EnergyCalibrationIncomplete_BadStrip; MString m_EnergyCalibrationIncomplete_BadStripString; bool m_EnergyCalibrationIncomplete; MString m_EnergyCalibrationIncompleteString; + bool m_EnergyResolutionCalibrationIncomplete; MString m_EnergyResolutionCalibrationIncompleteString; + bool m_StripPairingIncomplete; MString m_StripPairingIncompleteString; + bool m_LLDEvent; MString m_LLDEventString; + bool m_DepthCalibrationIncomplete; MString m_DepthCalibrationIncompleteString; bool m_DepthCalibration_OutofRange; MString m_DepthCalibration_OutofRangeString; + bool m_StripHitBelowThreshold; MString m_StripHitBelowThresholdString; - + bool m_EventReconstructionIncomplete; + MString m_EventReconstructionIncompleteString; //! True if event has been filtered out bool m_FilteredOut; diff --git a/src/MAssembly.cxx b/src/MAssembly.cxx index f1e3721..06bbb82 100644 --- a/src/MAssembly.cxx +++ b/src/MAssembly.cxx @@ -76,6 +76,7 @@ using namespace std; #include "MModuleEventFilter.h" #include "MModuleEventSaver.h" #include "MModuleResponseGenerator.h" +#include "MModuleRevan.h" #include "MModuleTACcut.h" #include "MModuleNearestNeighbor.h" #include "MModuleDiagnostics.h" @@ -145,6 +146,7 @@ MAssembly::MAssembly() m_Supervisor->AddAvailableModule(new MModuleEventSaver()); m_Supervisor->AddAvailableModule(new MModuleTransmitterRealta()); m_Supervisor->AddAvailableModule(new MModuleResponseGenerator()); + m_Supervisor->AddAvailableModule(new MModuleRevan()); m_Supervisor->AddAvailableModule(new MModuleTACcut()); m_Supervisor->AddAvailableModule(new MModuleNearestNeighbor()); diff --git a/src/MGUIOptionsEventSaver.cxx b/src/MGUIOptionsEventSaver.cxx index 711241e..ab913a4 100644 --- a/src/MGUIOptionsEventSaver.cxx +++ b/src/MGUIOptionsEventSaver.cxx @@ -87,6 +87,7 @@ void MGUIOptionsEventSaver::Create() m_Mode->Add("*.roa file to use with melinator / nulcearizer"); m_Mode->Add("*.dat file containing all information for debugging"); m_Mode->Add("*.evta file to use with revan"); + m_Mode->Add("*.tra file to use with mimrec"); m_Mode->SetSelected(dynamic_cast(m_Module)->GetMode()); m_Mode->Create(); TypeFrame->AddFrame(m_Mode, FirstLabelLayout); @@ -96,7 +97,8 @@ void MGUIOptionsEventSaver::Create() dynamic_cast(m_Module)->GetFileName()); m_FileSelector->SetFileType("roa file (read-out assemlies)", "*.roa"); m_FileSelector->SetFileType("dat file (all info)", "*.dat"); - m_FileSelector->SetFileType("evta file (evta file)", "*.evta"); + m_FileSelector->SetFileType("evta file (not reconstructed events)", "*.evta"); + m_FileSelector->SetFileType("tra file (reconstructed events)", "*.tra"); TypeFrame->AddFrame(m_FileSelector, LabelLayout); diff --git a/src/MGUIOptionsRevan.cxx b/src/MGUIOptionsRevan.cxx new file mode 100644 index 0000000..561bddc --- /dev/null +++ b/src/MGUIOptionsRevan.cxx @@ -0,0 +1,126 @@ +/* + * MGUIOptionsRevan.cxx + * + * + * Copyright (C) by Andreas Zoglauer. + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Andreas Zoglauer. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +// Include the header: +#include "MGUIOptionsRevan.h" + +// Standard libs: + +// ROOT libs: +#include +#include +#include +#include + +// MEGAlib libs: +#include "MStreams.h" +#include "MModuleRevan.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MGUIOptionsRevan) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsRevan::MGUIOptionsRevan(MModule* Module) + : MGUIOptions(Module) +{ + // standard constructor +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MGUIOptionsRevan::~MGUIOptionsRevan() +{ + // kDeepCleanup is activated +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MGUIOptionsRevan::Create() +{ + PreCreate(); + + TGLayoutHints* LabelLayout = new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 10, 10, 10, 10); + + m_RevanCfgFileSelector = new MGUIEFileSelector(m_OptionsFrame, "Please select a revan configuration file:", + dynamic_cast(m_Module)->GetRevanConfigurationFileName()); + m_RevanCfgFileSelector->SetFileType("revan configuration", "*.revan.cfg"); + m_OptionsFrame->AddFrame(m_RevanCfgFileSelector, LabelLayout); + + + PostCreate(); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsRevan::ProcessMessage(long Message, long Parameter1, long Parameter2) +{ + // Modify here if you have more buttons + + bool Status = true; + + switch (GET_MSG(Message)) { + case kC_COMMAND: + switch (GET_SUBMSG(Message)) { + case kCM_BUTTON: + break; + default: + break; + } + break; + default: + break; + } + + if (Status == false) { + return false; + } + + // Call also base class + return MGUIOptions::ProcessMessage(Message, Parameter1, Parameter2); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MGUIOptionsRevan::OnApply() +{ + // Modify this to store the data in the module! + + dynamic_cast(m_Module)->SetRevanConfigurationFileName(m_RevanCfgFileSelector->GetFileName()); + + return true; +} + + +// MGUIOptionsRevan: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MModuleEventSaver.cxx b/src/MModuleEventSaver.cxx index 8f3dba1..dc7671c 100644 --- a/src/MModuleEventSaver.cxx +++ b/src/MModuleEventSaver.cxx @@ -53,7 +53,7 @@ MModuleEventSaver::MModuleEventSaver() : MModule() // Set all module relevant information // Set the module name --- has to be unique - m_Name = "Save events (roa, dat, or evta format)"; + m_Name = "Save events (roa, dat, evta, or tra format)"; // Set the XML tag --- has to be unique --- no spaces allowed m_XmlTag = "XmlTagEventSaver"; @@ -131,7 +131,7 @@ bool MModuleEventSaver::Initialize() MString Suffix = m_InternalFileName; if (Suffix.Last('.') != MString::npos) { Suffix.RemoveInPlace(0, Suffix.Last('.')); - if (Suffix == ".dat" || Suffix == ".roa" || Suffix == ".evta") { + if (Suffix == ".dat" || Suffix == ".roa" || Suffix == ".evta" || Suffix == ".tra") { m_InternalFileName.RemoveInPlace(m_InternalFileName.Last('.')); } } @@ -147,6 +147,8 @@ bool MModuleEventSaver::Initialize() m_InternalFileName += ".dat"; } else if (m_Mode == c_EvtaFile) { m_InternalFileName += ".evta"; + } else if (m_Mode == c_TraFile) { + m_InternalFileName += ".tra"; } else if (m_Mode == c_RoaFile) { m_InternalFileName += ".roa"; } else { @@ -176,6 +178,11 @@ bool MModuleEventSaver::Initialize() Header<<"Version 200"<StreamEvta(Out); + } else if (m_Mode == c_TraFile) { + Event->StreamTra(Out); } else if (m_Mode == c_DatFile) { Event->StreamDat(Out, 3); } else if (m_Mode == c_RoaFile) { diff --git a/src/MModuleRevan.cxx b/src/MModuleRevan.cxx new file mode 100644 index 0000000..56f6d8b --- /dev/null +++ b/src/MModuleRevan.cxx @@ -0,0 +1,244 @@ +/* + * MModuleRevan.cxx + * + * + * Copyright (C) by Andreas Zoglauer + * All rights reserved. + * + * + * This code implementation is the intellectual property of + * Jau-Shian Liang. + * + * By copying, distributing or modifying the Program (or any work + * based on the Program) you indicate your acceptance of this statement, + * and all its terms. + * + */ + + +//////////////////////////////////////////////////////////////////////////////// +// +// MModuleRevan +// +//////////////////////////////////////////////////////////////////////////////// + + +// Include the header: +#include "MModuleRevan.h" + +// Standard libs: + +// ROOT libs: + +// MEGAlib libs: +#include "MGUIOptionsRevan.h" + + +//////////////////////////////////////////////////////////////////////////////// + + +#ifdef ___CLING___ +ClassImp(MModuleRevan) +#endif + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleRevan::MModuleRevan() : MModule() +{ + // Construct an instance of MModuleTemplate + + // Set all module relevant information + + // Set the module name --- has to be unique + m_Name = "Event reconstruction (Revan)"; + + // Set the XML tag --- has to be unique --- no spaces allowed + m_XmlTag = "XmlTagRevan"; + + // Set all modules, which have to be done before this module + AddPreceedingModuleType(MAssembly::c_EventLoader, true); + AddPreceedingModuleType(MAssembly::c_EnergyCalibration, true); + AddPreceedingModuleType(MAssembly::c_StripPairing, true); + AddPreceedingModuleType(MAssembly::c_DepthCorrection, true); + AddPreceedingModuleType(MAssembly::c_PositionDetermiation, true); + + // Set all types this modules handles + AddModuleType(MAssembly::c_EventReconstruction); + + // Set all modules, which can follow this module + AddSucceedingModuleType(MAssembly::c_NoRestriction); + + // Set if this module has an options GUI + m_HasOptionsGUI = true; + + // Allow the use of multiple threads and instances + m_AllowMultiThreading = true; + m_AllowMultipleInstances = false; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MModuleRevan::~MModuleRevan() +{ + delete m_RawEventAnalyzer; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleRevan::Initialize() +{ + // Initialize the module + + m_Settings = new MSettingsRevan(); + m_Settings->Read(m_RevanConfigurationFileName); + + m_ReconstructionGeometry = new MGeometryRevan(); + if (m_ReconstructionGeometry->ScanSetupFile(m_Geometry->GetFileName(), false) == false) { + cout<<"Loading of geometry "<GetName()<<" failed!!"<SetGeometry(m_ReconstructionGeometry); + m_RawEventAnalyzer->SetSettings(m_Settings); + + m_RawEventAnalyzer->SetSaveOI(true); + m_RawEventAnalyzer->SetCoincidenceAlgorithm(MRawEventAnalyzer::c_CoincidenceAlgoNone); + m_RawEventAnalyzer->SetEventClusteringAlgorithm(MRawEventAnalyzer::c_EventClusteringAlgoNone); + m_RawEventAnalyzer->SetTrackingAlgorithm(MRawEventAnalyzer::c_TrackingAlgoNone); + + if (m_RawEventAnalyzer->PreAnalysis() == false) { + cout<<"Revan pre-analysis failed!"<IsBad() == true) { + // Nothing to do here - we already have bad flags raised + // return true; + //} + + MRERawEvent* RawEvent = new MRERawEvent(); + // --> will be deleted by the RawEventAnalyzer + + // The following is ugly, but currently the only way to get data into the raw event: + // Convert the data to text and parse it again + ostringstream Out; + Event->StreamEvta(Out); + + istringstream In(Out.str()); + string Line; + + while (getline(In, Line)) { + // Strip Windows CR if present + if (Line.empty() == false && Line.back() == '\r') Line.pop_back(); + RawEvent->ParseLine(Line.c_str(), 200); + } + + + // Reconstruct + m_RawEventAnalyzer->AddRawEvent(RawEvent); + unsigned int ReturnCode = m_RawEventAnalyzer->AnalyzeEvent(); + + if (ReturnCode == MRawEventAnalyzer::c_AnalysisSucess) { + MRERawEvent* BestRawEvent = nullptr; + if (m_RawEventAnalyzer->GetSingleOptimumEvent() != nullptr) { + BestRawEvent = m_RawEventAnalyzer->GetSingleOptimumEvent(); + } else if (m_RawEventAnalyzer->GetSingleBestTryEvent() != nullptr) { + BestRawEvent = m_RawEventAnalyzer->GetSingleBestTryEvent(); + } + + if (BestRawEvent != nullptr) { + MPhysicalEvent* PE = BestRawEvent->GetPhysicalEvent(); + Event->SetPhysicalEvent(PE); + } else { + Event->SetEventReconstructionIncomplete(true); + } + } else { + Event->SetEventReconstructionIncomplete(true); + } + + Event->SetAnalysisProgress(MAssembly::c_EventReconstruction); + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +void MModuleRevan::ShowOptionsGUI() +{ + //! Show the options GUI --- has to be overwritten! + + MGUIOptionsRevan* Options = new MGUIOptionsRevan(this); + Options->Create(); + gClient->WaitForUnmap(Options); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +bool MModuleRevan::ReadXmlConfiguration(MXmlNode* Node) +{ + //! Read the configuration data from an XML node + + MXmlNode* RevanConfigurationFileNameNode = Node->GetNode("RevanConfigurationFileName"); + if (RevanConfigurationFileNameNode != nullptr) { + m_RevanConfigurationFileName = RevanConfigurationFileNameNode->GetValueAsString(); + } + + return true; +} + + +//////////////////////////////////////////////////////////////////////////////// + + +MXmlNode* MModuleRevan::CreateXmlConfiguration() +{ + //! Create an XML node tree from the configuration + + MXmlNode* Node = new MXmlNode(nullptr, m_XmlTag); + new MXmlNode(Node, "RevanConfigurationFileName", m_RevanConfigurationFileName); + + return Node; +} + + +// MModuleRevan.cxx: the end... +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/MReadOutAssembly.cxx b/src/MReadOutAssembly.cxx index 0c6a9fa..1d0558a 100644 --- a/src/MReadOutAssembly.cxx +++ b/src/MReadOutAssembly.cxx @@ -190,6 +190,8 @@ void MReadOutAssembly::Clear() m_DepthCalibrationIncompleteString = ""; m_DepthCalibration_OutofRange = false; m_DepthCalibration_OutofRangeString = ""; + m_EventReconstructionIncomplete = false; + m_EventReconstructionIncompleteString = ""; m_FilteredOut = false; @@ -265,8 +267,10 @@ MStripHit* MReadOutAssembly::GetStripHit(unsigned int i) return 0; } + //////////////////////////////////////////////////////////////////////////////// + void MReadOutAssembly::AddStripHit(MStripHit* StripHit) { //! Add a strip hit @@ -308,8 +312,10 @@ MStripHit* MReadOutAssembly::GetStripHitTOnly(unsigned int i) return 0; } + //////////////////////////////////////////////////////////////////////////////// + void MReadOutAssembly::AddStripHitTOnly(MStripHit* StripHit) { //! Add a strip hit @@ -354,8 +360,10 @@ MCrystalHit* MReadOutAssembly::GetCrystalHit(unsigned int i) return 0; } + //////////////////////////////////////////////////////////////////////////////// + void MReadOutAssembly::AddCrystalHit(MCrystalHit* CrystalHit) { //! Add a strip hit @@ -560,70 +568,7 @@ bool MReadOutAssembly::StreamDat(ostream& S, int Version) } } - if (m_AspectIncomplete == true) { - S<<"BD AspectIncomplete"; - if (m_AspectIncompleteString != "") S<<" ("<GetStripHitMultipleTimesX()) { - S<<"BD Multiple Hits on LV Strip"<GetStripHitMultipleTimesY()) { - S<<"BD Multiple Hits on HV Strip"<StreamEvta(S); + } + + for (MSimIA& IA: m_SimIAs) { + S<IsNearestNeighbor() == true) { + continue; + } + m_StripHits[h]->StreamRoa(S, WithADCs, WithTACs, WithEnergies, WithTimings, WithTemperatures, WithFlags); + ++Counter; + } + for (unsigned int h = 0; h < m_CrystalHits.size(); ++h) { + m_CrystalHits[h]->StreamRoa(S, WithADCs, WithEnergies, WithTemperatures, WithFlags); + ++Counter; + } + if (Counter == 0) { + S<<"BD No hits"<ToTraString(); + } else { + S<<"ID "<StreamEvta(S); - } - - for (MSimIA& IA: m_SimIAs) { - S<IsNearestNeighbor() == true) { - continue; - } - m_StripHits[h]->StreamRoa(S, WithADCs, WithTACs, WithEnergies, WithTimings, WithTemperatures, WithFlags); - ++Counter; - } - for (unsigned int h = 0; h < m_CrystalHits.size(); ++h) { - m_CrystalHits[h]->StreamRoa(S, WithADCs, WithEnergies, WithTemperatures, WithFlags); - ++Counter; - } - if (Counter == 0) { - S<<"BD No hits"<