Skip to content
Snippets Groups Projects
THcTrigRawHit.cxx 7.64 KiB
Newer Older
/**
\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 class... 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.
\throw std::out_of_range Tried to set wrong signal.
*/

/**
\fn void THcTrigRawHit::SetSample(Int_t signal, Int_t data)
\brief Sets next waveform sample value.
\param[in] signal ADC.
\param[in] data Sample value to be set.
\throw std::out_of_range Tried to set wrong signal.
*/

/**
\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 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.
\throw std::out_of_range Tried to set wrong signal.
*/

/**
\fn void THcTrigRawHit::SetReference(Int_t signal, Int_t reference)
\brief Sets reference time.
\param[in] signal TDC.
\param[in] reference Reference time to be set.
\throw std::out_of_range Tried to set wrong signal.
*/

/**
\fn Int_t THcTrigRawHit::GetData(Int_t signal)
\brief Gets data for first hit of signal.
\param[in] signal ADC or TDC.
\throw std::out_of_range Tried to get wrong signal.
*/

/**
\fn Int_t THcTrigRawHit::GetRawData(Int_t signal)
\brief Gets raw data for first hit of signal.
\param[in] signal ADC or TDC.
\throw std::out_of_range Tried to get wrong signal.
\fn Int_t THcTrigRawHit::GetReference(Int_t signal)
\brief Returns reference time.
\param[in] signal TDC.
\throw std::out_of_range Tried to get wrong signal.
*/

/**
\fn THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal)
\brief Returns the signal type.
\param[in] signal ADC or TDC.
\throw std::out_of_range Tried to get wrong signal.
\fn Int_t THcTrigRawHit::GetNSignals()
\brief Returns number of signal handled by this class, i.e., `2`.
\fn Bool_t THcTrigRawHit::HasReference(Int_t signal)
\brief Checks if reference time is available.
\param[in] signal TDC.
\throw std::out_of_range Tried to get wrong signal.
\fn THcRawAdcHit& THcTrigRawHit::GetRawAdcHit()
\brief Gets reference to THcRawAdcHit.
\fn THcRawTdcHit& THcTrigRawHit::GetRawTdcHit()
\brief Gets reference to THcRawTdcHit.
/**
\fn void THcTrigRawHit::SetF250Params(Int_t NSA, Int_t NSB, Int_t NPED)
\brief See THcRawAdcHit::SetF250Params.
*/

// 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), fAdcHits(), fTdcHits() {}


THcTrigRawHit& THcTrigRawHit::operator=(const THcTrigRawHit& right) {
  // Call base class assignment operator.
  THcRawHit::operator=(right);

  if (this != &right) {
    for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
      fAdcHits[iAdcSig] = right.fAdcHits[iAdcSig];
    for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
      fTdcHits[iTdcSig] = right.fTdcHits[iTdcSig];

  return *this;
}


THcTrigRawHit::~THcTrigRawHit() {}


void THcTrigRawHit::Clear(Option_t* opt) {
  THcRawHit::Clear(opt);
  for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
    fAdcHits[iAdcSig].Clear();
  }
  for (Int_t iTdcSig=0; iTdcSig<fNTdcSignals; ++iTdcSig) {
    fTdcHits[iTdcSig].Clear();
}


void THcTrigRawHit::SetData(Int_t signal, Int_t data) {
  if (0 <= signal && signal < fNAdcSignals) {
    fAdcHits[signal].SetData(data);
  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    fTdcHits[signal-fNAdcSignals].SetTime(data);
  }
  else {
    throw std::out_of_range(
      "`THcTrigRawHit::SetData`: only signals `0` and `1` available!"
    );
void THcTrigRawHit::SetSample(Int_t signal, Int_t data) {
  if (0 <= signal && signal < fNAdcSignals) {
    fAdcHits[signal].SetSample(data);
  }
  else {
    throw std::out_of_range(
      "`THcTrigRawHit::SetSample`: only signal `0` available!"
    );
void THcTrigRawHit::SetDataTimePedestalPeak(
  Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak
) {
  if (0 <= signal && signal < fNAdcSignals) {
    fAdcHits[signal].SetDataTimePedestalPeak(data, time, pedestal, peak);
  }
  else {
    throw std::out_of_range(
      "`THcTrigRawHit::SetDataTimePedestalPeak`: only signal `0` available!"
    );
  }
}


void THcTrigRawHit::SetReference(Int_t signal, Int_t reference) {
  if (signal < fNAdcSignals) {
    fAdcHits[signal].SetRefTime(reference);
  } else if (signal < fNAdcSignals+fNTdcSignals) {
    fTdcHits[signal-fNAdcSignals].SetRefTime(reference);
  } else {
    throw std::out_of_range(
      "`THcTrigRawHit::SetReference`: only signals `2` and `3` available!"
}


Int_t THcTrigRawHit::GetData(Int_t signal) {
  if (0 <= signal && signal < fNAdcSignals) {
    return fAdcHits[signal].GetPulseInt();
  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    return fTdcHits[signal-fNAdcSignals].GetTime();
    throw std::out_of_range(
      "`THcTrigRawHit::GetData`: only signals `0` and `1` available!"
Int_t THcTrigRawHit::GetRawData(Int_t signal) {
  if (0 <= signal && signal < fNAdcSignals) {
    return fAdcHits[signal].GetPulseIntRaw();
  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    return fTdcHits[signal-fNAdcSignals].GetTimeRaw();
    throw std::out_of_range(
      "`THcTrigRawHit::GetRawData`: only signals `0` and `1` available!"
    );
Int_t THcTrigRawHit::GetReference(Int_t signal) {
  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    return fTdcHits[signal-fNAdcSignals].GetRefTime();
    throw std::out_of_range(
      "`THcTrigRawHit::GetReference`: only signal `1` available!"
    );
  }
}


THcRawHit::ESignalType THcTrigRawHit::GetSignalType(Int_t signal) {
  if (0 <= signal && signal < fNAdcSignals) {
    return kADC;
  }
  else if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    return kTDC;
  }
  else {
    throw std::out_of_range(
      "`THcTrigRawHit::GetSignalType`: only signals `0` and `1` available!"
    );
  }
Int_t THcTrigRawHit::GetNSignals() {
  return fNAdcSignals + fNTdcSignals;
Bool_t THcTrigRawHit::HasReference(Int_t signal) {
  if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
    return fTdcHits[signal-fNAdcSignals].HasRefTime();
  }
  else {
    throw std::out_of_range(
      "`THcTrigRawHit::HasReference`: only signal `1` available!"
THcRawAdcHit& THcTrigRawHit::GetRawAdcHit() {
  return fAdcHits[0];
THcRawTdcHit& THcTrigRawHit::GetRawTdcHit() {
  return fTdcHits[0];
void THcTrigRawHit::SetF250Params(Int_t NSA, Int_t NSB, Int_t NPED) {
  for (Int_t iAdcSig=0; iAdcSig<fNAdcSignals; ++iAdcSig) {
    fAdcHits[iAdcSig].SetF250Params(NSA, NSB, NPED);
  }
}


ClassImp(THcTrigRawHit)