Skip to content
Snippets Groups Projects
Commit 4bcc8096 authored by Whitney Armstrong's avatar Whitney Armstrong
Browse files

THcRawAdcHit: logging and fixed throws

- added hit logging to THcRawAdcHit
- removed throws when too many pulses where set
parent 101b856f
No related branches found
No related tags found
No related merge requests found
...@@ -88,12 +88,12 @@ Returns 0 if tried to access first pulse but no pulses are set. ...@@ -88,12 +88,12 @@ Returns 0 if tried to access first pulse but no pulses are set.
*/ */
/** /**
\fn Double_t THcRawAdcHit::GetData(UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow, UInt_t iIntHigh) const \fn Double_t THcRawAdcHit::GetData(UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow, UInt_t iIntHigh)
\brief Gets pedestal subtracted integral of samples. In channels. const \brief Gets pedestal subtracted integral of samples. In channels. \param[in] iPedLow
\param[in] iPedLow Sequential number of first sample to be averaged for pedestal value. Sequential number of first sample to be averaged for pedestal value. \param[in] iPedHigh Sequential
\param[in] iPedHigh Sequential number of last sample to be averaged for pedestal value. number of last sample to be averaged for pedestal value. \param[in] iIntLow Sequential number of
\param[in] iIntLow Sequential number of first sample to be integrated. first sample to be integrated. \param[in] iIntHigh Sequential number of last sample to be
\param[in] iIntHigh Sequential number of last sample to be integrated. integrated.
*/ */
/** /**
...@@ -183,42 +183,39 @@ Returns 0 if no signal pedestal is set. ...@@ -183,42 +183,39 @@ Returns 0 if no signal pedestal is set.
// TODO: Disallow using both SetData and SetDataTimePedestalPeak. // TODO: Disallow using both SetData and SetDataTimePedestalPeak.
#include "THcRawAdcHit.h" #include "THcRawAdcHit.h"
#include <stdexcept>
#include "TString.h" #include "TString.h"
const Double_t THcRawAdcHit::fNAdcChan = 4096.0; // Number of FADC channels in units of ADC channels #include <stdexcept>
const Double_t THcRawAdcHit::fAdcRange = 1.0; // Dynamic range of FADCs in units of V, // TO-DO: Get fAdcRange from pre-start event const Double_t THcRawAdcHit::fNAdcChan = 4096.0; // Number of FADC channels in units of ADC channels
const Double_t THcRawAdcHit::fAdcImpedence = 50.0; // FADC input impedence in units of Ohms const Double_t THcRawAdcHit::fAdcRange =
const Double_t THcRawAdcHit::fAdcTimeSample = 4000.0; // Length of FADC time sample in units of ps 1.0; // Dynamic range of FADCs in units of V, // TO-DO: Get fAdcRange from pre-start event
const Double_t THcRawAdcHit::fAdcTimeRes = 0.0625; // FADC time resolution in units of ns const Double_t THcRawAdcHit::fAdcImpedence = 50.0; // FADC input impedence in units of Ohms
const Double_t THcRawAdcHit::fAdcTimeSample = 4000.0; // Length of FADC time sample in units of ps
THcRawAdcHit::THcRawAdcHit() : const Double_t THcRawAdcHit::fAdcTimeRes = 0.0625; // FADC time resolution in units of ns
TObject(),
fNPedestalSamples(4), fNPeakSamples(9), THcRawAdcHit::THcRawAdcHit()
fPeakPedestalRatio(1.0*fNPeakSamples/fNPedestalSamples), : podd2::HitLogging<TObject>(), fNPedestalSamples(4), fNPeakSamples(9),
fSubsampleToTimeFactor(0.0625), fPeakPedestalRatio(1.0 * fNPeakSamples / fNPedestalSamples), fSubsampleToTimeFactor(0.0625),
fPed(0), fPulseInt(), fPulseAmp(), fPulseTime(), fSample(), fPed(0), fPulseInt(), fPulseAmp(), fPulseTime(), fSample(), fRefTime(0), fHasMulti(kFALSE),
fRefTime(0), fHasMulti(kFALSE), fHasRefTime(kFALSE), fNPulses(0), fNSamples(0) fHasRefTime(kFALSE), fNPulses(0), fNSamples(0) {}
{}
THcRawAdcHit& THcRawAdcHit::operator=(const THcRawAdcHit& right) { THcRawAdcHit& THcRawAdcHit::operator=(const THcRawAdcHit& right) {
TObject::operator=(right); TObject::operator=(right);
if (this != &right) { if (this != &right) {
fPed = right.fPed; fPed = right.fPed;
for (UInt_t i=0; i<fMaxNPulses; ++i) { for (UInt_t i = 0; i < fMaxNPulses; ++i) {
fPulseInt[i] = right.fPulseInt[i]; fPulseInt[i] = right.fPulseInt[i];
fPulseAmp[i] = right.fPulseAmp[i]; fPulseAmp[i] = right.fPulseAmp[i];
fPulseTime[i] = right.fPulseTime[i]; fPulseTime[i] = right.fPulseTime[i];
} }
for (UInt_t i=0; i<fMaxNSamples; ++i) { for (UInt_t i = 0; i < fMaxNSamples; ++i) {
fSample[i] = right.fSample[i]; fSample[i] = right.fSample[i];
} }
fHasMulti = right.fHasMulti; fHasMulti = right.fHasMulti;
fNPulses = right.fNPulses; fNPulses = right.fNPulses;
fNSamples = right.fNSamples; fNSamples = right.fNSamples;
fRefTime = right.fRefTime; fRefTime = right.fRefTime;
fHasRefTime = right.fHasRefTime; fHasRefTime = right.fHasRefTime;
} }
...@@ -231,147 +228,119 @@ void THcRawAdcHit::Clear(Option_t* opt) { ...@@ -231,147 +228,119 @@ void THcRawAdcHit::Clear(Option_t* opt) {
TObject::Clear(opt); TObject::Clear(opt);
fPed = 0; fPed = 0;
for (UInt_t i=0; i<fNPulses; ++i) { for (UInt_t i = 0; i < fNPulses; ++i) {
fPulseInt[i] = 0; fPulseInt[i] = 0;
fPulseAmp[i] = 0; fPulseAmp[i] = 0;
fPulseTime[i] = 0; fPulseTime[i] = 0;
} }
for (UInt_t i=0; i<fNSamples; ++i) { for (UInt_t i = 0; i < fNSamples; ++i) {
fSample[i] = 0 ; fSample[i] = 0;
} }
fHasMulti = kFALSE; fHasMulti = kFALSE;
fNPulses = 0; fNPulses = 0;
fNSamples = 0; fNSamples = 0;
fRefTime = 0; fRefTime = 0;
fHasRefTime = kFALSE; fHasRefTime = kFALSE;
} }
void THcRawAdcHit::SetData(Int_t data) { void THcRawAdcHit::SetData(Int_t data) {
if (fNPulses >= fMaxNPulses) { if (fNPulses >= fMaxNPulses) {
throw std::out_of_range( _hit_logger->error("THcRawAdcHit::SetData: too many pulses! Ignoring pulse {}",fNPulses);
"`THcRawAdcHit::SetData`: too many pulses!" //throw std::out_of_range("`THcRawAdcHit::SetData`: too many pulses!");
); return;
} }
fPulseInt[fNPulses] = data; fPulseInt[fNPulses] = data;
++fNPulses; ++fNPulses;
} }
void THcRawAdcHit::SetRefTime(Int_t refTime) { void THcRawAdcHit::SetRefTime(Int_t refTime) {
fRefTime = refTime; fRefTime = refTime;
fHasRefTime = kTRUE; fHasRefTime = kTRUE;
} }
void THcRawAdcHit::SetSample(Int_t data) { void THcRawAdcHit::SetSample(Int_t data) {
if (fNSamples >= fMaxNSamples) { if (fNSamples >= fMaxNSamples) {
throw std::out_of_range( throw std::out_of_range("`THcRawAdcHit::SetSample`: too many samples!");
"`THcRawAdcHit::SetSample`: too many samples!"
);
} }
fSample[fNSamples] = data; fSample[fNSamples] = data;
++fNSamples; ++fNSamples;
} }
void THcRawAdcHit::SetDataTimePedestalPeak( void THcRawAdcHit::SetDataTimePedestalPeak(Int_t data, Int_t time, Int_t pedestal, Int_t peak) {
Int_t data, Int_t time, Int_t pedestal, Int_t peak
) {
if (fNPulses >= fMaxNPulses) { if (fNPulses >= fMaxNPulses) {
throw std::out_of_range( _hit_logger->error("THcRawAdcHit::SetDataTimePedestalPeak: too many pulses! Ignoring pulse {}",fNPulses);
"`THcRawAdcHit::SetData`: too many pulses!" //throw std::out_of_range("`THcRawAdcHit::SetData`: too many pulses!");
); return;
} }
fPulseInt[fNPulses] = data; fPulseInt[fNPulses] = data;
fPulseTime[fNPulses] = time; fPulseTime[fNPulses] = time;
fPed = pedestal; fPed = pedestal;
fPulseAmp[fNPulses] = peak; fPulseAmp[fNPulses] = peak;
fHasMulti = kTRUE; fHasMulti = kTRUE;
++fNPulses; ++fNPulses;
} }
Int_t THcRawAdcHit::GetRawData(UInt_t iPulse) const { Int_t THcRawAdcHit::GetRawData(UInt_t iPulse) const {
if (iPulse >= fNPulses && iPulse != 0) { if (iPulse >= fNPulses && iPulse != 0) {
TString msg = TString::Format( TString msg = TString::Format(
"`THcRawAdcHit::GetRawData`: requested pulse %d where only %d pulses available!", "`THcRawAdcHit::GetRawData`: requested pulse %d where only %d pulses available!", iPulse,
iPulse, fNPulses fNPulses);
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} } else if (iPulse >= fNPulses && iPulse == 0) {
else if (iPulse >= fNPulses && iPulse == 0) {
return 0; return 0;
} } else {
else {
return fPulseInt[iPulse]; return fPulseInt[iPulse];
} }
} }
Double_t THcRawAdcHit::GetAverage(UInt_t iSampleLow, UInt_t iSampleHigh) const { Double_t THcRawAdcHit::GetAverage(UInt_t iSampleLow, UInt_t iSampleHigh) const {
if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) { if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) {
TString msg = TString::Format( TString msg = TString::Format("`THcRawAdcHit::GetAverage`: not this many samples available!");
"`THcRawAdcHit::GetAverage`: not this many samples available!"
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} } else {
else {
Double_t average = 0.0; Double_t average = 0.0;
for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) { for (UInt_t i = iSampleLow; i <= iSampleHigh; ++i) {
average += fSample[i]; average += fSample[i];
} }
return average / (iSampleHigh - iSampleLow + 1); return average / (iSampleHigh - iSampleLow + 1);
} }
} }
Int_t THcRawAdcHit::GetIntegral(UInt_t iSampleLow, UInt_t iSampleHigh) const { Int_t THcRawAdcHit::GetIntegral(UInt_t iSampleLow, UInt_t iSampleHigh) const {
if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) { if (iSampleHigh >= fNSamples || iSampleLow >= fNSamples) {
TString msg = TString::Format( TString msg = TString::Format("`THcRawAdcHit::GetAverage`: not this many samples available!");
"`THcRawAdcHit::GetAverage`: not this many samples available!"
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} } else {
else {
Int_t integral = 0; Int_t integral = 0;
for (UInt_t i=iSampleLow; i<=iSampleHigh; ++i) { for (UInt_t i = iSampleLow; i <= iSampleHigh; ++i) {
integral += fSample[i]; integral += fSample[i];
} }
return integral; return integral;
} }
} }
Double_t THcRawAdcHit::GetData( Double_t THcRawAdcHit::GetData(UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow,
UInt_t iPedLow, UInt_t iPedHigh, UInt_t iIntLow, UInt_t iIntHigh UInt_t iIntHigh) const {
) const { return GetIntegral(iIntLow, iIntHigh) - GetAverage(iPedHigh, iPedLow) * (iIntHigh - iIntLow + 1);
return
GetIntegral(iIntLow, iIntHigh)
- GetAverage(iPedHigh, iPedLow) * (iIntHigh - iIntLow + 1);
} }
UInt_t THcRawAdcHit::GetNPulses() const { UInt_t THcRawAdcHit::GetNPulses() const { return fNPulses; }
return fNPulses;
}
UInt_t THcRawAdcHit::GetNSamples() const { UInt_t THcRawAdcHit::GetNSamples() const { return fNSamples; }
return fNSamples;
}
Bool_t THcRawAdcHit::HasMulti() const { Bool_t THcRawAdcHit::HasMulti() const { return fHasMulti; }
return fHasMulti;
}
Int_t THcRawAdcHit::GetPedRaw() const { Int_t THcRawAdcHit::GetPedRaw() const { return fPed; }
return fPed;
}
Int_t THcRawAdcHit::GetPulseIntRaw(UInt_t iPulse) const { Int_t THcRawAdcHit::GetPulseIntRaw(UInt_t iPulse) const {
if (iPulse < fNPulses) { if (iPulse < fNPulses) {
return fPulseInt[iPulse]; return fPulseInt[iPulse];
} } else if (iPulse == 0) {
else if (iPulse == 0) {
return 0; return 0;
} } else {
else {
TString msg = TString::Format( TString msg = TString::Format(
"`THcRawAdcHit::GetPulseIntRaw`: Trying to get pulse %d where only %d pulses available!", "`THcRawAdcHit::GetPulseIntRaw`: Trying to get pulse %d where only %d pulses available!",
iPulse, fNPulses iPulse, fNPulses);
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} }
} }
...@@ -379,15 +348,12 @@ Int_t THcRawAdcHit::GetPulseIntRaw(UInt_t iPulse) const { ...@@ -379,15 +348,12 @@ Int_t THcRawAdcHit::GetPulseIntRaw(UInt_t iPulse) const {
Int_t THcRawAdcHit::GetPulseAmpRaw(UInt_t iPulse) const { Int_t THcRawAdcHit::GetPulseAmpRaw(UInt_t iPulse) const {
if (iPulse < fNPulses) { if (iPulse < fNPulses) {
return fPulseAmp[iPulse]; return fPulseAmp[iPulse];
} } else if (iPulse == 0) {
else if (iPulse == 0) {
return 0; return 0;
} } else {
else {
TString msg = TString::Format( TString msg = TString::Format(
"`THcRawAdcHit::GetPulseAmpRaw`: Trying to get pulse %d where only %d pulses available!", "`THcRawAdcHit::GetPulseAmpRaw`: Trying to get pulse %d where only %d pulses available!",
iPulse, fNPulses iPulse, fNPulses);
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} }
} }
...@@ -395,15 +361,12 @@ Int_t THcRawAdcHit::GetPulseAmpRaw(UInt_t iPulse) const { ...@@ -395,15 +361,12 @@ Int_t THcRawAdcHit::GetPulseAmpRaw(UInt_t iPulse) const {
Int_t THcRawAdcHit::GetPulseTimeRaw(UInt_t iPulse) const { Int_t THcRawAdcHit::GetPulseTimeRaw(UInt_t iPulse) const {
if (iPulse < fNPulses) { if (iPulse < fNPulses) {
return fPulseTime[iPulse]; return fPulseTime[iPulse];
} } else if (iPulse == 0) {
else if (iPulse == 0) {
return 0; return 0;
} } else {
else {
TString msg = TString::Format( TString msg = TString::Format(
"`THcRawAdcHit::GetPulseTimeRaw`: Trying to get pulse %d where only %d pulses available!", "`THcRawAdcHit::GetPulseTimeRaw`: Trying to get pulse %d where only %d pulses available!",
iPulse, fNPulses iPulse, fNPulses);
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} }
} }
...@@ -411,26 +374,28 @@ Int_t THcRawAdcHit::GetPulseTimeRaw(UInt_t iPulse) const { ...@@ -411,26 +374,28 @@ Int_t THcRawAdcHit::GetPulseTimeRaw(UInt_t iPulse) const {
Int_t THcRawAdcHit::GetSampleRaw(UInt_t iSample) const { Int_t THcRawAdcHit::GetSampleRaw(UInt_t iSample) const {
if (iSample < fNSamples) { if (iSample < fNSamples) {
return fSample[iSample]; return fSample[iSample];
} } else {
else {
TString msg = TString::Format( TString msg = TString::Format(
"`THcRawAdcHit::GetSampleRaw`: Trying to get sample %d where only %d samples available!", "`THcRawAdcHit::GetSampleRaw`: Trying to get sample %d where only %d samples available!",
iSample, fNSamples iSample, fNSamples);
);
throw std::out_of_range(msg.Data()); throw std::out_of_range(msg.Data());
} }
} }
Double_t THcRawAdcHit::GetPed() const { Double_t THcRawAdcHit::GetPed() const {
return (static_cast<Double_t>(fPed)/static_cast<Double_t>(fNPedestalSamples))*GetAdcTomV(); return (static_cast<Double_t>(fPed) / static_cast<Double_t>(fNPedestalSamples)) * GetAdcTomV();
} }
Double_t THcRawAdcHit::GetPulseInt(UInt_t iPulse) const { Double_t THcRawAdcHit::GetPulseInt(UInt_t iPulse) const {
return (static_cast<Double_t>(fPulseInt[iPulse]) - static_cast<Double_t>(fPed)*fPeakPedestalRatio)*GetAdcTopC(); return (static_cast<Double_t>(fPulseInt[iPulse]) -
static_cast<Double_t>(fPed) * fPeakPedestalRatio) *
GetAdcTopC();
} }
Double_t THcRawAdcHit::GetPulseAmp(UInt_t iPulse) const { Double_t THcRawAdcHit::GetPulseAmp(UInt_t iPulse) const {
return (static_cast<Double_t>(fPulseAmp[iPulse]) - static_cast<Double_t>(fPed)/static_cast<Double_t>(fNPedestalSamples))*GetAdcTomV(); return (static_cast<Double_t>(fPulseAmp[iPulse]) -
static_cast<Double_t>(fPed) / static_cast<Double_t>(fNPedestalSamples)) *
GetAdcTomV();
} }
Double_t THcRawAdcHit::GetPulseTime(UInt_t iPulse) const { Double_t THcRawAdcHit::GetPulseTime(UInt_t iPulse) const {
...@@ -438,13 +403,13 @@ Double_t THcRawAdcHit::GetPulseTime(UInt_t iPulse) const { ...@@ -438,13 +403,13 @@ Double_t THcRawAdcHit::GetPulseTime(UInt_t iPulse) const {
if (fHasRefTime) { if (fHasRefTime) {
rawtime -= fRefTime; rawtime -= fRefTime;
} }
return (static_cast<Double_t>(rawtime)*GetAdcTons()); return (static_cast<Double_t>(rawtime) * GetAdcTons());
} }
Int_t THcRawAdcHit::GetSampleIntRaw() const { Int_t THcRawAdcHit::GetSampleIntRaw() const {
Int_t integral = 0; Int_t integral = 0;
for (UInt_t iSample=0; iSample<fNSamples; ++iSample) { for (UInt_t iSample = 0; iSample < fNSamples; ++iSample) {
integral += fSample[iSample]; integral += fSample[iSample];
} }
...@@ -452,55 +417,46 @@ Int_t THcRawAdcHit::GetSampleIntRaw() const { ...@@ -452,55 +417,46 @@ Int_t THcRawAdcHit::GetSampleIntRaw() const {
} }
Double_t THcRawAdcHit::GetSampleInt() const { Double_t THcRawAdcHit::GetSampleInt() const {
return static_cast<Double_t>(GetSampleIntRaw()) - GetPed()*static_cast<Double_t>(fNSamples); return static_cast<Double_t>(GetSampleIntRaw()) - GetPed() * static_cast<Double_t>(fNSamples);
} }
void THcRawAdcHit::SetF250Params(Int_t NSA, Int_t NSB, Int_t NPED) { void THcRawAdcHit::SetF250Params(Int_t NSA, Int_t NSB, Int_t NPED) {
if (NSA < 0 || NSB < 0 || NPED < 0) { if (NSA < 0 || NSB < 0 || NPED < 0) {
TString msg = TString::Format( TString msg = TString::Format("`THcRawAdcHit::SetF250Params`: One of the params is negative! "
"`THcRawAdcHit::SetF250Params`: One of the params is negative! NSA = %d NSB = %d NPED = %d", "NSA = %d NSB = %d NPED = %d",
NSA, NSB, NPED NSA, NSB, NPED);
);
throw std::invalid_argument(msg.Data()); throw std::invalid_argument(msg.Data());
} }
fNPedestalSamples = NPED; fNPedestalSamples = NPED;
fNPeakSamples = NSA + NSB; fNPeakSamples = NSA + NSB;
fPeakPedestalRatio = 1.0*fNPeakSamples/fNPedestalSamples; fPeakPedestalRatio = 1.0 * fNPeakSamples / fNPedestalSamples;
} }
// FADC conversion factors // FADC conversion factors
// Convert pedestal and amplitude to mV // Convert pedestal and amplitude to mV
Double_t THcRawAdcHit::GetAdcTomV() const { Double_t THcRawAdcHit::GetAdcTomV() const {
// 1000 mV / 4096 ADC channels // 1000 mV / 4096 ADC channels
return (fAdcRange*1000. / fNAdcChan); return (fAdcRange * 1000. / fNAdcChan);
} }
// Convert integral to pC // Convert integral to pC
Double_t THcRawAdcHit::GetAdcTopC() const { Double_t THcRawAdcHit::GetAdcTopC() const {
// (1 V / 4096 adc channels) * (4000 ps time sample / 50 ohms input resistance) = 0.020 pc/channel // (1 V / 4096 adc channels) * (4000 ps time sample / 50 ohms input resistance) = 0.020 pc/channel
return (fAdcRange / fNAdcChan) * (fAdcTimeSample / fAdcImpedence); return (fAdcRange / fNAdcChan) * (fAdcTimeSample / fAdcImpedence);
} }
// Convert time sub samples to ns // Convert time sub samples to ns
Double_t THcRawAdcHit::GetAdcTons() const { Double_t THcRawAdcHit::GetAdcTons() const { return fAdcTimeRes; }
return fAdcTimeRes;
}
Int_t THcRawAdcHit::GetRefTime() const { Int_t THcRawAdcHit::GetRefTime() const {
if (fHasRefTime) { if (fHasRefTime) {
return fRefTime; return fRefTime;
} } else {
else { TString msg = TString::Format("`THcRawAdcHit::GetRefTime`: Reference time not available!");
TString msg = TString::Format(
"`THcRawAdcHit::GetRefTime`: Reference time not available!"
);
throw std::runtime_error(msg.Data()); throw std::runtime_error(msg.Data());
} }
} }
Bool_t THcRawAdcHit::HasRefTime() const { return fHasRefTime; }
Bool_t THcRawAdcHit::HasRefTime() const {
return fHasRefTime;
}
ClassImp(THcRawAdcHit) ClassImp(THcRawAdcHit)
...@@ -3,8 +3,9 @@ ...@@ -3,8 +3,9 @@
#include "TObject.h" #include "TObject.h"
#include "podd2/Logger.h"
class THcRawAdcHit : public TObject { class THcRawAdcHit : public podd2::HitLogging<TObject> {
public: public:
THcRawAdcHit(); THcRawAdcHit();
THcRawAdcHit& operator=(const THcRawAdcHit& right); THcRawAdcHit& operator=(const THcRawAdcHit& right);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#pragma link C++ namespace hallc; #pragma link C++ namespace hallc;
#pragma link C++ namespace hcana; #pragma link C++ namespace hcana;
#pragma link C++ namespace podd2;
#pragma link C++ namespace hallc::data; #pragma link C++ namespace hallc::data;
...@@ -21,6 +22,7 @@ ...@@ -21,6 +22,7 @@
#pragma link C++ class std::vector<hallc::data::PulseWaveForm>+; #pragma link C++ class std::vector<hallc::data::PulseWaveForm>+;
#pragma link C++ class podd2::HitLogging<TObject>+;
#pragma link C++ global gHcParms; #pragma link C++ global gHcParms;
#pragma link C++ global gHcDetectorMap; #pragma link C++ global gHcDetectorMap;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment