Skip to content
Snippets Groups Projects
THcRawAdcHit.cxx 5.27 KiB
Newer Older
/**
\class THcTrigRawHit
\ingroup DetSupport

\brief Class representing a single raw ADC hit.

It supports rich data from flash 250 ADC modules.
*/

#include "THcRawAdcHit.h"

#include <stdexcept>

#include "TString.h"


THcRawAdcHit::THcRawAdcHit() :
  TObject(),
  fAdc(), fAdcTime(), fAdcPedestal(), fAdcPeak(), fAdcSample(),
  fHasMulti(kFALSE), fNPulses(0), fNSamples(0)
{}


THcRawAdcHit& THcRawAdcHit::operator=(const THcRawAdcHit& right) {
  TObject::operator=(right);

  if (this != &right) {
    for (UInt_t i=0; i<fMaxNPulses; ++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<fMaxNSamples; ++i) {
      fAdcSample[i] = right.fAdcSample[i];
    }
    fHasMulti = right.fHasMulti;
    fNPulses = right.fNPulses;
    fNSamples = right.fNSamples;
  }

  return *this;
}


THcRawAdcHit::~THcRawAdcHit() {}


void THcRawAdcHit::Clear(Option_t* opt) {
  TObject::Clear(opt);

  //for (UInt_t i=0; i<fMaxNPulses; ++i) {
  //  fAdc[i] = 0;
  //  fAdcTime[i] = 0;
  //  fAdcPedestal[i] = 0;
  //  fAdcPeak[i] = 0;
  //}
  //for (UInt_t i=0; i<fMaxNSamples; ++i) {
  //  fAdcSample[i] = 0 ;
  //}
  fHasMulti = kFALSE;
  fNPulses = 0;
  fNSamples = 0;
}


void THcRawAdcHit::SetData(Int_t data) {
  if (fNPulses >= fMaxNPulses) {
    throw std::out_of_range(
      "`THcRawAdcHit::SetData`: too many pulses!"
    );
  }
  fAdc[fNPulses] = data;
  ++fNPulses;
}


void THcRawAdcHit::SetSample(Int_t data) {
  if (fNSamples >= fMaxNSamples) {
    throw std::out_of_range(
      "`THcRawAdcHit::SetSample`: too many samples!"
    );
  }
  fAdcSample[fNSamples] = data;
  ++fNSamples;
}


void THcRawAdcHit::SetDataTimePedestalPeak(
  Int_t data, Int_t time, Int_t pedestal, Int_t peak
) {
  if (fNPulses >= fMaxNPulses) {
    throw std::out_of_range(
      "`THcRawAdcHit::SetData`: too many pulses!"
    );
  }
  fAdc[fNPulses] = data;
  fAdcTime[fNPulses] = data;
  fAdcPedestal[fNPulses] = data;
  fAdcPeak[fNPulses] = data;
  fHasMulti = kTRUE;
  ++fNPulses;
}


Int_t THcRawAdcHit::GetRawData(UInt_t iPulse) {
  if (iPulse >= fNPulses && iPulse != 0) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetRawData`: requested pulse %d where only %d pulses available!",
      iPulse, fNPulses
    );
    throw std::out_of_range(msg.Data());
  }
  else if (iPulse >= fNPulses && iPulse == 0) {
    return 0;
  }
  else {
    return fAdc[iPulse];
  }
}


Int_t THcRawAdcHit::GetAdcTime(UInt_t iPulse) {
  if (iPulse >= fNPulses && iPulse != 0) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetAdcTime`: requested pulse %d where only %d pulses available!",
      iPulse, fNPulses
    );
    throw std::out_of_range(msg.Data());
  }
  else if (fHasMulti) {
    return fAdcTime[iPulse];
  }
  else {
    return 0;
  }
}


Int_t THcRawAdcHit::GetAdcPedestal(UInt_t iPulse) {
  if (iPulse >= fNPulses && iPulse != 0) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetAdcPedestal`: requested pulse %d where only %d pulses available!",
      iPulse, fNPulses
    );
    throw std::out_of_range(msg.Data());
  }
  else if (fHasMulti) {
    return fAdcPedestal[iPulse];
  }
  else {
    return 0;
  }
}


Int_t THcRawAdcHit::GetAdcPeak(UInt_t iPulse) {
  if (iPulse >= fNPulses && iPulse != 0) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetAdcPeak`: requested pulse %d where only %d pulses available!",
      iPulse, fNPulses
    );
    throw std::out_of_range(msg.Data());
  }
  else if (fHasMulti) {
    return fAdcPeak[iPulse];
  }
  else {
    return 0;
  }
}


Int_t THcRawAdcHit::GetSample(UInt_t iSample) {
  if (iSample >= fNSamples && iSample != 0) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetSample`: requested sample %d where only %d sample available!",
      iSample, fNSamples
    );
    throw std::out_of_range(msg.Data());
  }
  else if (iSample >= fNSamples && iSample == 0) {
    return 0;
  }
Double_t THcRawAdcHit::GetAverage(UInt_t iSampleLow, UInt_t iSampleHigh) {
  if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetAverage`: not this many samples available!"
    );
    throw std::out_of_range(msg.Data());
  }
  else {
    Double_t average = 0.0;
    for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) {
      average += fAdcSample[i];
    }
    return average / (iSampleHigh - iSampleLow + 1);
  }
}


Int_t THcRawAdcHit::GetIntegral(UInt_t iSampleLow, UInt_t iSampleHigh) {
  if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) {
    TString msg = TString::Format(
      "`THcRawAdcHit::GetAverage`: not this many samples available!"
    );
    throw std::out_of_range(msg.Data());
  }
  else {
    Int_t integral = 0;
    for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) {
      integral += fAdcSample[i];
    }
    return integral;
  }
}


Double_t THcRawAdcHit::GetData(
  UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow, UInt_t iIntHigh
) {
  return
    GetIntegral(iIntLow, iIntHigh)
    - GetAverage(iPedHigh, iPedLow) * (iIntHigh - iIntLow + 1);
}


UInt_t THcRawAdcHit::GetNPulses() {
  return fNPulses;
}


UInt_t THcRawAdcHit::GetNSamples() {
  return fNSamples;
}


Bool_t THcRawAdcHit::HasMulti() {
  return fHasMulti;
}


ClassImp(THcRawAdcHit)