/*! \file Station data \version $Id: Station.h 23438 2013-04-16 14:38:37Z schulz-a $ */ #ifndef _sevt_Station_h_ #define _sevt_Station_h_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include static const char CvsId_sevt_Station[] = "$Id: Station.h 23438 2013-04-16 14:38:37Z schulz-a $"; namespace sevt { class SEvent; /** \class Station Station.h "sevt/Station.h" \brief class to hold data at %Station level \ingroup sevt */ class Station { public: class Signal { public: Signal(const int start, const int stop, const double binsTh, const double charge) : fStart(start), fStop(stop), fBinsOverThresh(binsTh), fCharge(charge) { } int fStart; int fStop; double fBinsOverThresh; double fCharge; }; typedef std::vector SignalCollection; private: typedef std::vector::iterator InternalPMTIterator; typedef std::vector::const_iterator InternalConstPMTIterator; public: Station(const Station& station); Station& operator=(const Station& station); /// Iterator over station for read/write typedef boost::indirect_iterator PMTIterator; /// Iterator over station for read typedef boost::indirect_iterator ConstPMTIterator; /// an iterator over VEM traces of different components /** Returns a LabeledTrace when dereferenced*/ typedef utl::MultiTraceD::Iterator VEMTraceIterator; typedef utl::MultiTraceD::ConstIterator ConstVEMTraceIterator; /// Get the station Id int GetId() const { return fId; } //! \name PMT methods //@{ /// Check if a particular PMT object exists bool HasPMT(const unsigned int pmtId) const; /// Retrive a PMT by Id PMT& GetPMT(const unsigned int pmtId); const PMT& GetPMT(const unsigned int pmtId) const; /// begin PMT iterator for read/write PMTIterator PMTsBegin() { return PMTIterator(fPMTs.begin()); } /// end PMT iterator for read/write PMTIterator PMTsEnd() { return PMTIterator(fPMTs.end()); } /// begin PMT iterator for read ConstPMTIterator PMTsBegin() const { return ConstPMTIterator(fPMTs.begin()); } /// end PMT iterator for read ConstPMTIterator PMTsEnd() const { return ConstPMTIterator(fPMTs.end()); } //@} /// Specify source of signal component. /*! A number of "standard" signal components have been defined, and some empty slots are available for you to define your own. */ //! \name Signal component flags //@{ // this should go away with FatBastard typedef StationConstants::SignalComponent SignalComponent; /// total (shower and background) static const SignalComponent eTotal = StationConstants::eTotal; /// electrons and positrons from shower static const SignalComponent eElectron = StationConstants::eElectron; /// gammas from shower static const SignalComponent ePhoton = StationConstants::ePhoton; /// mu+ and mu- (including signal from mu decay electrons) from shower static const SignalComponent eMuon = StationConstants::eMuon; /// all hadrons from shower static const SignalComponent eHadron = StationConstants::eHadron; /// electrons from muon decay static const SignalComponent eDecayElectron = StationConstants::eDecayElectron; /// delta rays static const SignalComponent eDeltaRay = StationConstants::eDeltaRay; /// electrons from background static const SignalComponent eBackgroundElectron = StationConstants::eBackgroundElectron; /// photons from background static const SignalComponent eBackgroundPhoton = StationConstants::eBackgroundPhoton; /// muons from background static const SignalComponent eBackgroundMuon = StationConstants::eBackgroundMuon; /// hadrons from background static const SignalComponent eBackgroundHadron = StationConstants::eBackgroundHadron; /// signal from Cerenkov light generated in PMT face (includes all particle sources) static const SignalComponent ePMTGlassLight = StationConstants::ePMTGlassLight; /// signal from backscatter from surrounding SignalComponent earth (includes all particle sources) static const SignalComponent eAlbedo = StationConstants::eAlbedo; /// signal from direct light (includes all particle sources). Same as 0'th bounce light static const SignalComponent eDirectLight = StationConstants::eDirectLight; /// Signal from photons that bounced once (includes all particle sources) static const SignalComponent eFirstBounce = StationConstants::eFirstBounce; /// Signaltons that bounced twice (includes all particle sources) static const SignalComponent eSecondBounce = StationConstants::eSecondBounce; /// Signal from photons that bounced thrice (includes all particle sources) static const SignalComponent eThirdBounce = StationConstants::eThirdBounce; /// Estimated upper bound on signal (for saturation) static const SignalComponent eEstimatedUpperBound = StationConstants::eEstimatedUpperBound; /// Estimated lower bound on signal (for saturation) static const SignalComponent eEstimatedLowerBound = StationConstants::eEstimatedLowerBound; /// Estimated signal (for saturation) static const SignalComponent eEstimatedNormal = StationConstants::eEstimatedNormal; /// total FADC trace, with no saturation applied by FADC/baseline simulator static const SignalComponent eTotalNoSaturation = StationConstants::eTotalNoSaturation; /// photons from muon decay in shower static const SignalComponent eShowerMuonDecayPhoton = StationConstants::eShowerMuonDecayPhoton; /// electrons from muon decay in shower static const SignalComponent eShowerMuonDecayElectron = StationConstants::eShowerMuonDecayElectron; /// User-defined source static const SignalComponent eMySource0 = StationConstants::eMySource0; /// User-defined source static const SignalComponent eMySource1 = StationConstants::eMySource1; /// User-defined source static const SignalComponent eMySource2 = StationConstants::eMySource2; /// User-defined source static const SignalComponent eMySource3 = StationConstants::eMySource3; /// User-defined source static const SignalComponent eMySource4 = StationConstants::eMySource4; /// User-defined source static const SignalComponent eMySource5 = StationConstants::eMySource5; /// User-defined source static const SignalComponent eMySource6 = StationConstants::eMySource6; /// User-defined source static const SignalComponent eMySource7 = StationConstants::eMySource7; /// User-defined source static const SignalComponent eMySource8 = StationConstants::eMySource8; /// User-defined source static const SignalComponent eMySource9 = StationConstants::eMySource9; // just to track size static const SignalComponent eLastSource = eMySource9; static std::string GetSignalComponentName(const SignalComponent sc); //@} //! \name Methods for handling traces //@{ /// Get absolute start time of the VEM trace utl::TimeStamp GetTraceStartTime() const { return fTraceStartTime; } /// Set absolute start time of the VEM trace /*! For MC this should be set by the local trigger simulation */ void SetTraceStartTime(const utl::TimeStamp& Time) { fTraceStartTime = Time; } /// FADC trace calibrated in [VEM charge] utl::TraceD& GetVEMTrace(const SignalComponent source = eTotal) { return fTrace->GetTrace(source); } const utl::TraceD& GetVEMTrace(const SignalComponent source = eTotal) const { return fTrace->GetTrace(source); } /// Make a VEM trace object void MakeVEMTrace(const SignalComponent source = eTotal); /// Check whether VEM trace exists bool HasVEMTrace(const SignalComponent source = eTotal) const { return fTrace->HasLabel(source); } /// First VEM trace VEMTraceIterator VEMTracesBegin() { return fTrace->Begin(); } ConstVEMTraceIterator VEMTracesBegin() const { return fTrace->Begin(); } /// Last VEM trace VEMTraceIterator VEMTracesEnd() { return fTrace->End(); } ConstVEMTraceIterator VEMTracesEnd() const { return fTrace->End(); } //@} //! \name Has/Make/Get methods //@{ /// Get simulated data at station level StationSimData& GetSimData() { return *fSimData; } const StationSimData& GetSimData() const { return *fSimData; } /// Make station simulated data object void MakeSimData(); /// Check whether station simulated data exists bool HasSimData() const { return fSimData; } /// Get station level reconstructed data StationRecData& GetRecData() { return *fRecData; } const StationRecData& GetRecData() const { return *fRecData; } /// Make station reconstructed data object void MakeRecData(); /// Check whether station reconstructed data exists bool HasRecData() const { return fRecData; } /// Get Trigger data for the station StationTriggerData& GetTriggerData() { return *fTriggerData; } const StationTriggerData& GetTriggerData() const { return *fTriggerData; } /// Make trigger data object void MakeTriggerData(); /// Check whether trigger data object exists bool HasTriggerData() const { return fTriggerData; } /// Get calibration data for the station StationCalibData& GetCalibData() { return *fCalibData; } const StationCalibData& GetCalibData() const { return *fCalibData; } /// Make calibration data object void MakeCalibData(); /// Check whether calibration data object exists bool HasCalibData() const { return fCalibData; } /// Get GPS data for the station StationGPSData& GetGPSData() { return *fGPSData; } const StationGPSData& GetGPSData() const { return *fGPSData; } /// Make GPS data object void MakeGPSData(); /// Check whether GPS data object edists bool HasGPSData() const { return fGPSData; } //@} //!\name Station rejection status flags //@{ // should go away with FatBastard typedef StationConstants::ReconstructionStatus ReconstructionStatus; static const ReconstructionStatus eCandidate = StationConstants::eCandidate; static const ReconstructionStatus eRejected = StationConstants::eRejected; static const ReconstructionStatus eSilent = StationConstants::eSilent; typedef StationConstants::RejectionStatus RejectionStatus; static const RejectionStatus eNoRejection = StationConstants::eNoRejection; static const RejectionStatus eLightning = StationConstants::eLightning; static const RejectionStatus eBadCompress = StationConstants::eBadCompress; static const RejectionStatus eOutOfTime = StationConstants::eOutOfTime; static const RejectionStatus eOffGrid = StationConstants::eOffGrid; static const RejectionStatus eDenseArray = StationConstants::eDenseArray; static const RejectionStatus eRandom = StationConstants::eRandom; static const RejectionStatus eEngineeringArray = StationConstants::eEngineeringArray; static const RejectionStatus eMCInnerRadiusCut = StationConstants::eMCInnerRadiusCut; static const RejectionStatus eNoRecData = StationConstants::eNoRecData; static const RejectionStatus eLonely = StationConstants::eLonely; static const RejectionStatus eNoTrigger = StationConstants::eNoTrigger; static const RejectionStatus eErrorCode = StationConstants::eErrorCode; static const RejectionStatus eNoCalibData = StationConstants::eNoCalibData; static const RejectionStatus eNoGPSData = StationConstants::eNoGPSData; static const RejectionStatus eBadCalib = StationConstants::eBadCalib; static const RejectionStatus eNotDenseArray = StationConstants::eNotDenseArray; static const RejectionStatus eTOTd = StationConstants::eTOTd; static const RejectionStatus eNumRejectionStatusBits = StationConstants::eNumRejectionStatusBits; //@} //! \name Methods for setting/getting flags //@{ /// Check if the station is a candidate bool IsCandidate() const { return fReconstructionStatus == eCandidate; } /// Check if the station is rejected bool IsRejected() const { return fReconstructionStatus == eRejected; } /// Check if the station is silent bool IsSilent() const { return fReconstructionStatus == eSilent; } /// Set candidate station flag void SetCandidate() { fReconstructionStatus = eCandidate; } /// Set rejected station flag void SetRejected(const int reason) { fReconstructionStatus = eRejected; fRejectionStatus |= reason; } /// Set silent station flag void SetSilent() { fReconstructionStatus = eSilent; } int GetRejectionStatus() const { return fRejectionStatus; } void ClearRejectionStatus() { fRejectionStatus = eNoRejection; } // T2Life functions int GetT2Life() const { return fT2Life; } void SetT2Life(const int t2l) { fT2Life = t2l; } bool IsT2Life() const { return fT2Life > 0; } bool IsT2Life120() const { return fT2Life == 2; } /// Check if the station is saturated bool IsNoSaturation() const { return !(fSaturation[PMTConstants::eLowGain] || fSaturation[PMTConstants::eHighGain]); } bool IsLowGainSaturation() const { return fSaturation[PMTConstants::eLowGain]; } bool IsHighGainSaturation() const { return fSaturation[PMTConstants::eHighGain]; } void SetNoSaturation() { fSaturation[PMTConstants::eLowGain] = fSaturation[PMTConstants::eHighGain] = false; } void SetLowGainSaturation(const bool sat = true) { fSaturation[PMTConstants::eLowGain] = sat; } void SetHighGainSaturation(const bool sat = true) { fSaturation[PMTConstants::eHighGain] = sat; } //@} SignalCollection& GetSignals() { return fSignals; } const SignalCollection& GetSignals() const { return fSignals; } private: Station(const int stationId); ~Station(); static const std::string fgSourceNameLookup[eLastSource + 1]; int fId; std::vector fPMTs; utl::ShadowPtr fSimData; utl::ShadowPtr fRecData; utl::ShadowPtr fCalibData; utl::ShadowPtr fTriggerData; utl::ShadowPtr fGPSData; utl::TimeStamp fTraceStartTime; utl::InitializedShadowPtr fTrace; ReconstructionStatus fReconstructionStatus; bool fSaturation[PMTConstants::eNumberOfGains]; int fRejectionStatus; // T2Life // 0: not active acc. to T2Life // 1: T2, 2: T2-120 int fT2Life; SignalCollection fSignals; friend class sevt::SEvent; }; class CandidateStationFilter { public: bool operator()(const Station& station) { return station.IsCandidate(); } }; class SilentStationFilter { public: bool operator()(const Station& station) { return station.IsSilent(); } }; class RejectedStationFilter { public: RejectedStationFilter(const int statusMask) : fStatusMask(statusMask) { } bool operator()(const Station& station) { return station.GetRejectionStatus() & fStatusMask; } private: int fStatusMask; }; } #include #include #include #include #include #include #endif // Configure (x)emacs for this file ... // Local Variables: // mode: c++ // compile-command: "make -C .. SEvent/Station.o -k" // End: