Skip to content
Snippets Groups Projects
THcTrigRawHit.cxx 12 KiB
Newer Older
  • Learn to ignore specific revisions
  • /**
    \class THcTrigRawHit
    \ingroup DetSupport
    
    \brief Class representing a single raw hit for the THcTrigDet.
    
    
      - `signal 0` is ADC
      - `signal 1` is TDC
    
    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::GetAdcPulse(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 <iostream>
    
    #include <string>
    
    #include <stdexcept>
    
    
    #include "TObject.h"
    #include "TString.h"
    
    
    
    THcTrigRawHit::THcTrigRawHit(
      Int_t plane, Int_t counter
    ) :
      THcRawHit(plane, counter),
    
      fAdc(), fAdcTime(), fAdcPedestal(), fAdcPulse(), fAdcSamples(), fTdc(),
    
      fReferenceTime(), fHasReference(), fHasMulti(), fNRawHits(), fNRawSamples(0)
    
    {}
    
    
    THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) {
      // Call base class assignment operator.
      THcRawHit::operator=(right);
    
    
      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];
    
        }
        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;
    }
    
    
    THcTrigRawHit::~THcTrigRawHit() {}
    
    
    void THcTrigRawHit::Clear(Option_t* opt) {
    
      TObject::Clear(opt);
    
      for (UInt_t i=0; i<fNPlanes; ++i) {
        fHasReference[i] = kFALSE;
    
        fHasMulti[i] = kFALSE;
    
        fNRawHits[i] = 0;
      }
      fNRawSamples = 0;
    
    }
    
    
    void THcTrigRawHit::SetData(Int_t signal, Int_t data) {
    
      // Signal 0 is ADC; signal 1 is TDC.
    
      if (signal == 0) {
    
        if (fNRawHits[signal] >= fMaxNPulsesAdc) {
    
          throw std::out_of_range(
    
            "`THcTrigRawHit::SetData`: too many pulses for ADC signal!"
    
        fAdc[fNRawHits[signal]] = data;
        ++fNRawHits[signal];
    
      }
      // Signal 1 is TDC.
      else if (signal == 1) {
    
        if (fNRawHits[signal] >= fMaxNHitsTdc) {
    
          throw std::out_of_range(
    
            "`THcTrigRawHit::SetData`: too many hits for TDC signal!"
    
        fTdc[fNRawHits[signal]] = data;
        ++fNRawHits[signal];
    
      else throw std::out_of_range(
        "`THcTrigRawHit::SetData`: only signals `0` (ADC) and `1` (TDC) available!"
      );
    
    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!"
      );
    }
    
    
    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;
    
        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) {
        std::cerr
          << "Warning:"
          << " `THcTrigRawHit::SetReference`:"
          << " signal 0 (ADC) should not have reference time!"
    
          << " Check map file!"
          << std::endl;
    
      }
      else if (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) {
    
      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::GetAdcPulse(UInt_t iHit) {
    
      Int_t value = 0;
      Int_t signal = 0;
    
      if (iHit >= fNRawHits[signal] && iHit != 0) {
        TString msg = TString::Format(
    
          "`THcTrigRawHit::GetAdcPulse`: 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 = fAdcPulse[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) {
    
      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) {
    
      if (signal == 0 || signal == 1) {
        return fHasReference[signal];
      }
      else {
        throw std::out_of_range(
          "`THcTrigRawHit::HasReference`: only signals `0` and `1` available!"
        );
      }
    
    }
    
    
    ClassImp(THcTrigRawHit)