diff --git a/src/THcTrigDet.cxx b/src/THcTrigDet.cxx index cda6bcbaa21dc019a7b5f99eeaea557a64cf2228..5d1abd0371ec7f6f5e8187f1ddb1647f0ce67e8b 100644 --- a/src/THcTrigDet.cxx +++ b/src/THcTrigDet.cxx @@ -8,9 +8,38 @@ This class behaves as a detector, but it does not correspond to any physical detector in the hall. Its purpose is to gather all the trigger related data comming from a specific source, like HMS. -Use only with THcTrigApp class. +Can hold up to 100 ADC and TDC channels, though the limit can be changed if +needed. It just seemed like a reasonable starting value. + +# Defined variables + +For ADC channels it defines: + - ADC value: `var_adc` + - pedestal: `var_adcPed` + - multiplicity: `var_adcMult` + +For TDC channels it defines: + - TDC value: `var_tdc` + - multiplicity: `var_tdcMult` + +# Parameter file variables + +The names and number of channels is defined in a parameter file. The detector +looks for next variables: + - `prefix_numAdc = number_of_ADC_channels` + - `prefix_numTdc = number_of_TDC_channels` + - `prefix_adcNames = "varName1 varName2 ... varNameNumAdc"` + - `prefix_tdcNames = "varName1 varName2 ... varNameNumTdc"` + +# Map file information -Note: not yet finalized! +ADC channels must be assigned plane `1` and signal `0` while TDC channels must +be assigned plane `2` and signal `1`. + +Each channel within a plane must be assigned a consecutive "bar" number, which +is then used to get the correct variable name from parameter file. + +Use only with THcTrigApp class. */ /** @@ -45,7 +74,7 @@ Note: not yet finalized! \brief Clears variables before next event. -\param[in] opt Maybe used in base clas... +\param[in] opt Maybe used in base clas... Not sure. */ /** @@ -56,6 +85,8 @@ Note: not yet finalized! \param[in] evData Raw data to decode. */ +//TODO: Check if fNumAdc < fMaxAdcChannels && fNumTdc < fMaxTdcChannels. + #include "THcTrigDet.h" #include <algorithm> @@ -84,7 +115,8 @@ THcTrigDet::THcTrigDet( THaDetector(name, description, app), THcHitList(), fKwPrefix(""), fNumAdc(0), fNumTdc(0), fAdcNames(), fTdcNames(), - fAdcVals(), fTdcVals() + fAdcVal(), fAdcPedestal(), fAdcMultiplicity(), + fTdcVal(), fTdcMultiplicity() {} @@ -96,8 +128,8 @@ THaAnalysisObject::EStatus THcTrigDet::Init(const TDatime& date) { Setup(GetName(), GetTitle()); // Initialize all variables. - for (int i=0; i<fMaxAdcChannels; ++i) fAdcVals[i] = -1.0; - for (int i=0; i<fMaxTdcChannels; ++i) fTdcVals[i] = -1.0; + for (int i=0; i<fMaxAdcChannels; ++i) fAdcVal[i] = -1.0; + for (int i=0; i<fMaxTdcChannels; ++i) fTdcVal[i] = -1.0; // Call initializer for base class. // This also calls `ReadDatabase` and `DefineVariables`. @@ -125,9 +157,11 @@ THaAnalysisObject::EStatus THcTrigDet::Init(const TDatime& date) { void THcTrigDet::Clear(Option_t* opt) { + THaAnalysisObject::Clear(opt); + // Reset all data. - for (int i=0; i<fNumAdc; ++i) fAdcVals[i] = 0.0; - for (int i=0; i<fNumTdc; ++i) fTdcVals[i] = 0.0; + for (int i=0; i<fNumAdc; ++i) fAdcVal[i] = 0.0; + for (int i=0; i<fNumTdc; ++i) fTdcVal[i] = 0.0; } @@ -140,8 +174,15 @@ Int_t THcTrigDet::Decode(const THaEvData& evData) { while (iHit < numHits) { THcTrigRawHit* hit = dynamic_cast<THcTrigRawHit*>(fRawHitList->At(iHit)); - if (hit->fPlane == 1) fAdcVals[hit->fCounter-1] = hit->GetData(0); - else if (hit->fPlane == 2) fTdcVals[hit->fCounter-1] = hit->GetData(1); + if (hit->fPlane == 1) { + fAdcVal[hit->fCounter-1] = hit->GetData(0, 0); + fAdcPedestal[hit->fCounter-1] = hit->GetAdcPedestal(0); + fAdcMultiplicity[hit->fCounter-1] = hit->GetMultiplicity(0); + } + else if (hit->fPlane == 2) { + fTdcVal[hit->fCounter-1] = hit->GetData(1, 0); + fTdcMultiplicity[hit->fCounter-1] = hit->GetMultiplicity(1); + } else { throw std::out_of_range( "`THcTrigDet::Decode`: only planes `1` and `2` available!" @@ -189,28 +230,55 @@ Int_t THcTrigDet::DefineVariables(THaAnalysisObject::EMode mode) { std::vector<RVarDef> vars; - // Push the variable names for ADC channels. - std::vector<TString> varTitlesAdc(fNumAdc); - std::vector<TString> varNamesAdc(fNumAdc); + //Push the variable names for ADC channels. + std::vector<TString> adcValTitle(fNumAdc), adcValVar(fNumAdc); + std::vector<TString> adcPedestalTitle(fNumAdc), adcPedestalVar(fNumAdc); + std::vector<TString> adcMultiplicityTitle(fNumAdc), adcMultiplicityVar(fNumAdc); + for (int i=0; i<fNumAdc; ++i) { - varNamesAdc.at(i) = TString::Format("fAdcVals[%d]", i); - varTitlesAdc.at(i) = fAdcNames.at(i) + "_adc"; + adcValTitle.at(i) = fAdcNames.at(i) + "_adc"; + adcValVar.at(i) = TString::Format("fAdcVal[%d]", i); + vars.push_back({ + adcValTitle.at(i).Data(), + adcValTitle.at(i).Data(), + adcValVar.at(i).Data() + }); + + adcPedestalTitle.at(i) = fAdcNames.at(i) + "_adcPed"; + adcPedestalVar.at(i) = TString::Format("fAdcPedestal[%d]", i); + vars.push_back({ + adcPedestalTitle.at(i).Data(), + adcPedestalTitle.at(i).Data(), + adcPedestalVar.at(i).Data() + }); + + adcMultiplicityTitle.at(i) = fAdcNames.at(i) + "_adcMult"; + adcMultiplicityVar.at(i) = TString::Format("fAdcMultiplicity[%d]", i); vars.push_back({ - varTitlesAdc.at(i).Data(), - varTitlesAdc.at(i).Data(), - varNamesAdc.at(i).Data() + adcMultiplicityTitle.at(i).Data(), + adcMultiplicityTitle.at(i).Data(), + adcMultiplicityVar.at(i).Data() }); } + // Push the variable names for TDC channels. - std::vector<TString> varTitlesTdc(fNumTdc); - std::vector<TString> varNamesTdc(fNumTdc); + std::vector<TString> tdcValTitle(fNumTdc), tdcValVar(fNumTdc); + std::vector<TString> tdcMultiplicityTitle(fNumTdc), tdcMultiplicityVar(fNumTdc); for (int i=0; i<fNumTdc; ++i) { - varNamesTdc.at(i) = TString::Format("fTdcVals[%d]", i); - varTitlesTdc.at(i) = fTdcNames.at(i) + "_tdc"; + tdcValTitle.at(i) = fTdcNames.at(i) + "_tdc"; + tdcValVar.at(i) = TString::Format("fTdcVal[%d]", i); + vars.push_back({ + tdcValTitle.at(i).Data(), + tdcValTitle.at(i).Data(), + tdcValVar.at(i).Data() + }); + + tdcMultiplicityTitle.at(i) = fTdcNames.at(i) + "_tdcMult"; + tdcMultiplicityVar.at(i) = TString::Format("fTdcMultiplicity[%d]", i); vars.push_back({ - varTitlesTdc.at(i).Data(), - varTitlesTdc.at(i).Data(), - varNamesTdc.at(i).Data() + tdcMultiplicityTitle.at(i).Data(), + tdcMultiplicityTitle.at(i).Data(), + tdcMultiplicityVar.at(i).Data() }); } diff --git a/src/THcTrigDet.h b/src/THcTrigDet.h index 3b44bd9b07f0790d6b9fbdeb77e738416362fb82..ee6ac5ab106f7ffa1e74619036e7bee7ed7691bc 100644 --- a/src/THcTrigDet.h +++ b/src/THcTrigDet.h @@ -42,8 +42,12 @@ class THcTrigDet : public THaDetector, public THcHitList { static const int fMaxAdcChannels = 100; static const int fMaxTdcChannels = 100; - Double_t fAdcVals[fMaxAdcChannels]; - Double_t fTdcVals[fMaxTdcChannels]; + Int_t fAdcVal[fMaxAdcChannels]; + Int_t fAdcPedestal[fMaxAdcChannels]; + Int_t fAdcMultiplicity[fMaxAdcChannels]; + + Int_t fTdcVal[fMaxTdcChannels]; + Int_t fTdcMultiplicity[fMaxTdcChannels]; private: THcTrigDet(); diff --git a/src/THcTrigRawHit.cxx b/src/THcTrigRawHit.cxx index 62065d4fda71ed481251169a56bf912c14625664..0b1feb2a32b5b3e85d47837afccea4f7928d260e 100644 --- a/src/THcTrigRawHit.cxx +++ b/src/THcTrigRawHit.cxx @@ -4,23 +4,234 @@ \brief Class representing a single raw hit for the THcTrigDet. -Contains plane, counter and an ADC or a TDC value. + - `signal 0` is ADC + - `signal 1` is TDC -Note: not yet finalized! +It supports rich data from flash 250 ADC modules. */ +/** +\fn THcTrigRawHit::THcTrigRawHit(Int_t plane=0, Int_t counter=0) + +\brief A constructor. + +\param[in] plane Internal plane number of the hit. Should be `1` for ADC and + `2` for TDC. +\param[in] counter Internal bar number of the hit. +*/ + +/** +\fn THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) + +\brief Assignment operator. + +\param[in] right Raw hit to be assigned. +*/ + +/** +\fn THcTrigRawHit::~THcTrigRawHit() + +\brief A destructor. +*/ + +/** +\fn void THcTrigRawHit::Clear(Option_t* opt="") + +\brief Clears variables before next event. + +\param[in] opt Maybe used in base clas... Not sure. + +*/ + +/** +\fn void THcTrigRawHit::SetData(Int_t signal, Int_t data) + +\brief Sets next data value. + +\param[in] signal ADC or TDC. +\param[in] data Value to be set. +*/ + +/** +\fn void THcTrigRawHit::SetSample(Int_t signal, Int_t data) + +\brief Sets next waveform sample value. + +\param[in] signal ADC or TDC. +\param[in] data Sample value to be set. +*/ + +/** +\fn void THcTrigRawHit::SetDataTimePedestalPeak( + Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak) + +\brief Sets multiple bits of data from flash 250 ADC modules. + +\param[in] signal Usually ADC. +\param[in] data ADC sum value to be set. +\param[in] time Time of the peak. +\param[in] pedestal Pedestal value. +\param[in] peak Sample ADC value at peak. +*/ + +/** +\fn void THcTrigRawHit::SetReference(Int_t signal, Int_t reference) + +\brief Sets reference time. + +\param[in] signal ADC or TDC. +\param[in] reference Reference time to be set. +*/ + +/** +\fn Int_t THcTrigRawHit::GetData(Int_t signal) + +\brief Gets data for first hit of signal. + +\param[in] signal ADC or TDC. + +Read also GetData(Int_t signal, UInt_t iHit). +*/ + +/** +\fn Int_t THcTrigRawHit::GetData(Int_t signal, UInt_t iHit) + +\brief Gets data for specific hit of signal. + +\param[in] signal ADC or TDC. +\param[in] iHit Sequential number of wanted hit. + +If the signal is TDC, the returned value is corrected for reference time, if +available. + +Read also GetRawData(Int_t signal, UInt_t iHit) +*/ + +/** +\fn Int_t THcTrigRawHit::GetRawData(Int_t signal) + +\brief Gets raw data for first hit of signal. + +\param[in] signal ADC or TDC. + +Read also GetRawData(Int_t signal, UInt_t iHit). +*/ + +/** +\fn Int_t THcTrigRawHit::GetRawData(Int_t signal, UInt_t iHit) + +\brief Gets raw data for specific hit of signal. + +\param[in] signal ADC or TDC. +\param[in] iHit Sequential number of wanted hit. + +If requesting the first hit where it does not exist, `0` is returned. +*/ + +/** +\fn Int_t THcTrigRawHit::GetAdcTime(UInt_t iHit) + +\brief Gets reference time subtracted time of ADC peak. + +\param[in] iHit Sequential number of wanted hit. + +If requesting the first hit where it does not exist or if time is not +available, `0` is returned. +*/ + +/** +\fn Int_t THcTrigRawHit::GetAdcPedestal(UInt_t iHit) + +\brief Gets the ADC pedestal value. + +\param[in] iHit Sequential number of wanted hit. + +The pedestal value is usually a sum of `N` samples, where `N` is defined in +ADC module settings. + +If requesting the first hit where it does not exist or if pedestal is not +available, `0` is returned. +*/ + +/** +\fn Int_t THcTrigRawHit::GetAdcPeak(UInt_t iHit) + +\brief Gets the position of ADC peak. + +\param[in] iHit Sequential number of wanted hit. + +If requesting the first hit where it does not exist or if peak is not +available, `0` is returned. +*/ + +/** +\fn Int_t THcTrigRawHit::GetNSignals() + +\brief Returns number of signal handled by this class, i.e., `2`. +*/ + +/** +\fn THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal) + +\brief Returns the signal type. + +\param[in] signal ADC or TDC. +*/ + +/** +\fn Int_t THcTrigRawHit::GetReference(Int_t signal) + +\brief Returns reference time. + +\param[in] signal ADC or TDC. + +Returns `0` if reference time is not available. +*/ + +/** +\fn Int_t THcTrigRawHit::GetMultiplicity(Int_t signal) + +\brief Gets the number of hits for this event. + +\param[in] signal ADC or TDC. + +*/ + +/** +\fn Bool_t THcTrigRawHit::HasMulti(Int_t signal) + +\brief Checks if rich data is available. + +\param[in] signal ADC or TDC. + +*/ + +/** +\fn Bool_t THcTrigRawHit::HasReference(Int_t signal) + +\brief Checks if reference time is available. + +\param[in] signal ADC or TDC. + +*/ + +// TODO: Check if signal matches plane. + #include "THcTrigRawHit.h" +#include <string> #include <stdexcept> +#include "TObject.h" +#include "TString.h" + THcTrigRawHit::THcTrigRawHit( Int_t plane, Int_t counter ) : THcRawHit(plane, counter), - fAdcVal(), fTdcVal(), fNumAdcSamples(0), fNumTdcSamples(0), - fAdcReferenceTime(0), fTdcReferenceTime(0), - fHasAdcRef(kFALSE), fHasTdcRef(kFALSE) + fAdc(), fAdcTime(), fAdcPedestal(), fAdcPeak(), fAdcSamples(), fTdc(), + fReferenceTime(), fHasReference(), fHasMulti(), fNRawHits(), fNRawSamples(0) {} @@ -28,16 +239,27 @@ THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) { // Call base class assignment operator. THcRawHit::operator=(right); - for (UInt_t i=0; i<fNumAdcSamples; ++i) fAdcVal[i] = right.fAdcVal[i]; - for (UInt_t i=0; i<fNumTdcSamples; ++i) fTdcVal[i] = right.fTdcVal[i]; - - fNumAdcSamples = right.fNumAdcSamples; - fNumTdcSamples = right.fNumTdcSamples; - - fAdcReferenceTime = right.fAdcReferenceTime; - fTdcReferenceTime = right.fTdcReferenceTime; - fHasAdcRef = right.fHasAdcRef; - fHasTdcRef = right.fHasTdcRef; + if (this != &right) { + for (UInt_t i=0; i<fMaxNPulsesAdc; ++i) { + fAdc[i] = right.fAdc[i]; + fAdcTime[i] = right.fAdcTime[i]; + fAdcPedestal[i] = right.fAdcPedestal[i]; + fAdcPeak[i] = right.fAdcPeak[i]; + } + for (UInt_t i=0; i<fMaxNSamplesAdc; ++i) { + fAdcSamples[i] = right.fAdcSamples[i]; + } + for (UInt_t i=0; i<fMaxNHitsTdc; ++i) { + fTdc[i] = right.fTdc[i]; + } + for (UInt_t i=0; i<fNPlanes; ++i) { + fReferenceTime[i] = right.fReferenceTime[i]; + fHasReference[i] = right.fHasReference[i]; + fHasMulti[i] = right.fHasMulti[i]; + fNRawHits[i] = right.fNRawHits[i]; + } + fNRawSamples = right.fNRawSamples; + } return *this; } @@ -47,69 +269,274 @@ THcTrigRawHit::~THcTrigRawHit() {} void THcTrigRawHit::Clear(Option_t* opt) { - fNumAdcSamples = 0; - fNumTdcSamples = 0; - fHasAdcRef = kFALSE; - fHasTdcRef = kFALSE; + TObject::Clear(opt); + + for (UInt_t i=0; i<fNPlanes; ++i) { + fHasReference[i] = kFALSE; + fHasReference[i] = kFALSE; + fNRawHits[i] = 0; + } + fNRawSamples = 0; } void THcTrigRawHit::SetData(Int_t signal, Int_t data) { - // TODO: check if signal matches plane. - // Signal 0 is ADC. + // Signal 0 is ADC; signal 1 is TDC. if (signal == 0) { - if (fNumAdcSamples >= fMaxAdcSamples) { + if (fNRawHits[signal] >= fMaxNPulsesAdc) { throw std::out_of_range( - "`THcTrigRawHit::SetData`: too many samples for ADC signal!" + "`THcTrigRawHit::SetData`: too many pulses for ADC signal!" ); } - fAdcVal[fNumAdcSamples] = data; - ++fNumAdcSamples; + fAdc[fNRawHits[signal]] = data; + ++fNRawHits[signal]; } // Signal 1 is TDC. else if (signal == 1) { - if (fNumTdcSamples >= fMaxTdcSamples) { + if (fNRawHits[signal] >= fMaxNHitsTdc) { throw std::out_of_range( - "`THcTrigRawHit::SetData`: too many samples for TDC signal!" + "`THcTrigRawHit::SetData`: too many hits for TDC signal!" ); } - fTdcVal[fNumTdcSamples] = data; - ++fNumTdcSamples; + fTdc[fNRawHits[signal]] = data; + ++fNRawHits[signal]; } - else throw std::out_of_range("`THcTrigRawHit::SetData`: only signals `0` and `1` available!"); + else throw std::out_of_range( + "`THcTrigRawHit::SetData`: only signals `0` (ADC) and `1` (TDC) available!" + ); } -void THcTrigRawHit::SetReference(Int_t signal, Int_t reference) { +void THcTrigRawHit::SetSample(Int_t signal, Int_t data) { + if (signal == 0) { + if (fNRawSamples >= fMaxNSamplesAdc) { + throw std::out_of_range( + "`THcTrigRawHit::SetData`: too many samples for ADC signal!" + ); + } + fAdcSamples[fNRawSamples] = data; + ++fNRawSamples; + } + else throw std::out_of_range( + "`THcTrigRawHit::SetSample`: only signal `0` (ADC) support samples!" + ); +} + - if (signal == 0) fAdcReferenceTime = reference; - else if (signal == 1) fTdcReferenceTime = reference; - else throw std::out_of_range("`THcTrigRawHit::SetReference`: only signals `0` and `1` available!"); +void THcTrigRawHit::SetDataTimePedestalPeak( + Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak +) { + if (signal == 0) { + if (fNRawHits[signal] >= fMaxNPulsesAdc) { + throw std::out_of_range( + "`THcTrigRawHit::SetData`: too many pulses for ADC signal!" + ); + } + fAdc[fNRawHits[signal]] = data; + fAdcTime[fNRawHits[signal]] = time; + fAdcPedestal[fNRawHits[signal]] = pedestal; + fAdcPeak[fNRawHits[signal]] = peak; + fHasMulti[signal] = kTRUE; + ++fNRawHits[signal]; + } + else throw std::out_of_range( + "`THcTrigRawHit::SetDataTimePedestalPeak`: only signal `0` (ADC) support rich data!" + ); +} + + +void THcTrigRawHit::SetReference(Int_t signal, Int_t reference) { + if (signal == 0 || signal == 1) { + fReferenceTime[signal] = reference; + fHasReference[signal] = kTRUE; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::SetReference`: only signals `0` and `1` available!" + ); + } } Int_t THcTrigRawHit::GetData(Int_t signal) { - // TODO: expand this. Maybe add new methods. - // For now only returns first value. - if (signal == 0) return fAdcVal[0]; - else if (signal == 1) return fTdcVal[0]; - else throw std::out_of_range("`THcTrigRawHit::GetData`: only signals `0` and `1` available!"); + return GetData(signal, 0); +} + + +Int_t THcTrigRawHit::GetData(Int_t signal, UInt_t iHit) { + Int_t value = GetRawData(signal, iHit); + + if (signal == 1 && fHasReference[signal]) value -= fReferenceTime[signal]; + + return value; +} + + +Int_t THcTrigRawHit::GetRawData(Int_t signal) { + return GetRawData(signal, 0); +} + + +Int_t THcTrigRawHit::GetRawData(Int_t signal, UInt_t iHit) { + Int_t value = 0; + + if (iHit >= fNRawHits[signal] && iHit != 0) { + TString msg = TString::Format( + "`THcTrigRawHit::GetRawData`: requested hit %d for signal %d where only %d hit available!", + iHit, signal, fNRawHits[signal] + ); + throw std::out_of_range(msg.Data()); + } + else if (iHit >= fNRawHits[signal] && iHit == 0) { + value = 0; + } + else { + if (signal == 0) value = fAdc[iHit]; + else if (signal == 1) value = fTdc[iHit]; + else { + throw std::out_of_range( + "`THcTrigRawHit::GetRawData`: only signals `0` and `1` available!" + ); + } + } + + return value; +} + + +Int_t THcTrigRawHit::GetAdcTime(UInt_t iHit) { + Int_t value = 0; + Int_t signal = 0; + + if (iHit >= fNRawHits[signal] && iHit != 0) { + TString msg = TString::Format( + "`THcTrigRawHit::GetAdcTime`: requested hit %d for signal %d where only %d hit available!", + iHit, signal, fNRawHits[signal] + ); + throw std::out_of_range(msg.Data()); + } + else if (iHit >= fNRawHits[signal] && iHit == 0) { + value = 0; + } + else { + if (fHasMulti[0]) value = fAdcTime[iHit]; + else value = 0; + } + + if (fHasReference[signal]) value -= fReferenceTime[signal]; + + return value; +} + + +Int_t THcTrigRawHit::GetAdcPedestal(UInt_t iHit) { + Int_t value = 0; + Int_t signal = 0; + + if (iHit >= fNRawHits[signal] && iHit != 0) { + TString msg = TString::Format( + "`THcTrigRawHit::GetAdcPedestal`: requested hit %d for signal %d where only %d hit available!", + iHit, signal, fNRawHits[signal] + ); + throw std::out_of_range(msg.Data()); + } + else if (iHit >= fNRawHits[signal] && iHit == 0) { + value = 0; + } + else { + if (fHasMulti[0]) value = fAdcPedestal[iHit]; + else value = 0; + } + + return value; +} + + +Int_t THcTrigRawHit::GetAdcPeak(UInt_t iHit) { + Int_t value = 0; + Int_t signal = 0; + + if (iHit >= fNRawHits[signal] && iHit != 0) { + TString msg = TString::Format( + "`THcTrigRawHit::GetAdcPeak`: requested hit %d for signal %d where only %d hit available!", + iHit, signal, fNRawHits[signal] + ); + throw std::out_of_range(msg.Data()); + } + else if (iHit >= fNRawHits[signal] && iHit == 0) { + value = 0; + } + else { + if (fHasMulti[0]) value = fAdcPeak[iHit]; + else value = 0; + } + + return value; +} + + +Int_t THcTrigRawHit::GetNSignals() { + return 2; +} + + +THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal) { + if (signal == 0) return kADC; + else if (signal == 1) return kTDC; + else { + throw std::out_of_range( + "`THcTrigRawHit::GetSignalType`: only signals `0` and `1` available!" + ); + } } Int_t THcTrigRawHit::GetReference(Int_t signal) { - // Reference time. - if (signal == 0) return fAdcReferenceTime; - else if (signal == 1) return fTdcReferenceTime; - else throw std::out_of_range("`THcTrigRawHit::GetReference`: only signals `0` and `1` available!"); + if (signal == 0 || signal == 1) { + if (fHasReference[signal]) return fReferenceTime[signal]; + else return 0; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::GetReference`: only signals `0` and `1` available!" + ); + } +} + + +Int_t THcTrigRawHit::GetMultiplicity(Int_t signal) { + if (signal == 0 || signal == 1) { + return fNRawHits[signal]; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::GetMultiplicity`: only signals `0` and `1` available!" + ); + } +} + + +Bool_t THcTrigRawHit::HasMulti(Int_t signal) { + if (signal == 0 || signal == 1) { + return fHasMulti[signal]; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::HasMulti`: only signals `0` and `1` available!" + ); + } } Bool_t THcTrigRawHit::HasReference(Int_t signal) { - // Reference time. - if (signal == 0) return fHasAdcRef; - else if (signal == 1) return fHasTdcRef; - else throw std::out_of_range("`THcTrigRawHit::HasReference`: only signals `0` and `1` available!"); + if (signal == 0 || signal == 1) { + return fHasReference[signal]; + } + else { + throw std::out_of_range( + "`THcTrigRawHit::HasReference`: only signals `0` and `1` available!" + ); + } } diff --git a/src/THcTrigRawHit.h b/src/THcTrigRawHit.h index 996ea999c9580ca7746ad09d81f3252d684edf47..e2389d60f90ed5d0cda9529058be0970ff72cc90 100644 --- a/src/THcTrigRawHit.h +++ b/src/THcTrigRawHit.h @@ -14,25 +14,49 @@ class THcTrigRawHit : public THcRawHit { virtual void Clear(Option_t* opt=""); void SetData(Int_t signal, Int_t data); + void SetSample(Int_t signal, Int_t data); + void SetDataTimePedestalPeak( + Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak + ); void SetReference(Int_t signal, Int_t reference); + Int_t GetData(Int_t signal); + Int_t GetData(Int_t signal, UInt_t iHit); + Int_t GetRawData(Int_t signal); + Int_t GetRawData(Int_t signal, UInt_t iHit); + Int_t GetAdcTime(UInt_t iHit); + Int_t GetAdcPedestal(UInt_t iHit); + Int_t GetAdcPeak(UInt_t iHit); + Int_t GetNSignals(); + ESignalType GetSignalType(Int_t signal); Int_t GetReference(Int_t signal); + Int_t GetMultiplicity(Int_t signal); + + Bool_t HasMulti(Int_t signal); Bool_t HasReference(Int_t signal); + protected: - static const Int_t fMaxAdcSamples = 160; - static const Int_t fMaxTdcSamples = 16; - static const Int_t fNumPlanes = 2; - - Int_t fAdcVal[fMaxAdcSamples]; - Int_t fTdcVal[fMaxTdcSamples]; - UInt_t fNumAdcSamples; - UInt_t fNumTdcSamples; - - Int_t fAdcReferenceTime; - Int_t fTdcReferenceTime; - Bool_t fHasAdcRef; - Bool_t fHasTdcRef; + static const Int_t fMaxNPulsesAdc = 4; + static const Int_t fMaxNSamplesAdc = 160; + static const Int_t fMaxNHitsTdc = 16; + static const Int_t fNPlanes = 2; + + Int_t fAdc[fMaxNPulsesAdc]; + Int_t fAdcTime[fMaxNPulsesAdc]; + Int_t fAdcPedestal[fMaxNPulsesAdc]; + Int_t fAdcPeak[fMaxNPulsesAdc]; + + Int_t fAdcSamples[fMaxNSamplesAdc]; + + Int_t fTdc[fMaxNHitsTdc]; + + Int_t fReferenceTime[fNPlanes]; + Bool_t fHasReference[fNPlanes]; + Bool_t fHasMulti[fNPlanes]; + UInt_t fNRawHits[fNPlanes]; + + UInt_t fNRawSamples; private: ClassDef(THcTrigRawHit, 0);