31#if __cplusplus >= 201402L
32# define MKPMTDATA(name,title,nelem) make_unique<PMTData>((name),(title),(nelem))
34# define MKPMTDATA(name,title,nelem) unique_ptr<PMTData>(new PMTData((name),(title),(nelem)))
41 fAttenuation(0), fResolution(0), fRightPMTs(nullptr), fLeftPMTs(nullptr)
51 fRightPMTs(nullptr), fLeftPMTs(nullptr)
63 const char*
const here =
"ReadDatabase";
65 VarType kDataType = std::is_same<Data_t, Float_t>::value ?
kFloat :
kDouble;
66 VarType kDataTypeV = std::is_same<Data_t, Float_t>::value ? kFloatV : kDoubleV;
78 enum { kModeUnset = -255, kCommonStop = 0, kCommonStart = 1 };
82 Int_t tdc_mode = kModeUnset;
86 DBRequest config_request[] = {
87 {
"detmap", &detmap, kIntV },
88 {
"npaddles", &nelem,
kInt },
89 {
"tdc.res", &tdc2t, kDataType },
90 {
"tdc.cmnstart", &tdc_mode,
kInt, 0,
true },
96 if( !err && nelem <= 0 ) {
104 Error(
Here(
here),
"Cannot re-initialize with different number of paddles. "
105 "(was: %d, now: %d). Detector not re-initialized.",
fNelem, nelem );
119 if( tot_nchan != 4 * nval ) {
121 "inconsistent with 4*number of paddles (%d)",
128 if( tdc_mode == kModeUnset ) {
131 tdc_mode = kCommonStop;
134 if( tdc_mode != kCommonStop && tdc2t < 0.0 ) {
139 "positive since TDC mode explicitly set to common start.",tdc2t);
142 assert( tdc_mode != kModeUnset );
154 for(
UInt_t i = 0; i < nmodules; i++ ) {
157 if( i < nmodules/2 )
d->MakeADC();
else d->MakeTDC();
160 d->SetTDCMode(tdc_mode);
175 pmtData = detdata.get();
176 assert(pmtData->
GetSize() - nval == 0);
196 vector<Data_t> loff, roff, lped, rped, lgain, rgain, twalk;
197 DBRequest calib_request[] = {
198 {
"L.off", &loff, kDataTypeV, nval,
true },
199 {
"R.off", &roff, kDataTypeV, nval,
true },
200 {
"L.ped", &lped, kDataTypeV, nval,
true },
201 {
"R.ped", &rped, kDataTypeV, nval,
true },
202 {
"L.gain", &lgain, kDataTypeV, nval,
true },
203 {
"R.gain", &rgain, kDataTypeV, nval,
true },
204 {
"Cn", &
fCn, kDataType },
205 {
"MIP", &adcmip, kDataType, 0,
true },
210 {
"timewalk_params", &twalk, kDataTypeV, 2*nval,
true },
221 for(
UInt_t i = 0; i < nval; ++i ) {
224 calibR.
tdc2t = tdc2t;
225 calibR.off = roff[i];
226 calibR.ped = rped[i];
227 calibR.gain = rgain[i];
229 calibL.tdc2t = tdc2t;
230 calibL.off = loff[i];
231 calibL.ped = lped[i];
232 calibL.gain = lgain[i];
234 if( !twalk.empty() ) {
235 calibR.twalk = twalk[i];
236 calibL.twalk = twalk[nval+i];
238 calibR.twalk = calibL.twalk = 0;
251 {
"Detector position", pos,
kDouble, 3 },
253 {
"TDC offsets Left", &loff, kDataTypeV,
N },
254 {
"TDC offsets Right", &roff, kDataTypeV,
N },
255 {
"ADC pedestals Left", &lped, kDataTypeV,
N },
256 {
"ADC pedestals Right", &rped, kDataTypeV,
N },
257 {
"ADC gains Left", &lgain, kDataTypeV,
N },
258 {
"ADC gains Right", &rgain, kDataTypeV,
N },
259 {
"TDC resolution", &tdc2t, kDataType },
260 {
"TDC mode", &tdc_mode,
kInt },
261 {
"Light propag. speed", &
fCn, kDataType },
262 {
"ADC MIP", &adcmip, kDataType },
263 {
"Timewalk params", &twalk, kDataTypeV, 2*
N },
285 const char* key_prefix;
286 const char* comment_subst;
290 const vector<VarDefInfo> sides = {
294 for(
const auto& side : sides )
295 if(
Int_t ret = side.DefineVariables(
mode) )
300 {
"nthit",
"Number of paddles with L&R TDCs",
"GetNHits()" },
301 {
"t_pads",
"Paddles with L&R coincidence TDCs",
"fHits.pad" },
302 {
"y_t",
"y-position from timing (m)",
"fPadData.yt" },
303 {
"y_adc",
"y-position from amplitudes (m)",
"fPadData.ya" },
304 {
"time",
"Time of hit at plane (s)",
"fPadData.time" },
305 {
"dtime",
"Est. uncertainty of time (s)",
"fPadData.dtime" },
306 {
"dedx",
"dEdX-like deposited in paddle",
"fPadData.ampl" },
307 {
"hit.y_t",
"y-position from timing (m)",
"fHits.yt" },
308 {
"hit.y_adc",
"y-position from amplitudes (m)",
"fHits.ya" },
309 {
"hit.time",
"Time of hit at plane (s)",
"fHits.time" },
310 {
"hit.dtime",
"Est. uncertainty of time (s)",
"fHits.dtime" },
311 {
"hit.dedx" ,
"dEdX-like deposited in paddle",
"fHits.ampl" },
312 {
"trdx",
"track deviation in x-position (m)",
"fTrackProj.THaTrackProj.fdX" },
313 {
"trpad",
"paddle-hit associated with track",
"fTrackProj.THaTrackProj.fChannel" },
354 static_assert(
kRight == 0 ||
kLeft == 0,
"kRight or kLeft must be 0");
378 <<
" Scintillator " <<
GetPrefix() << endl;
379 cout <<
" paddle Left(TDC ADC ADC_p) Right(TDC ADC ADC_p)" << endl;
381 for(
int i = 0; i <
fNelem; i++ ) {
384 cout <<
" " << setw(2) << i + 1;
385 cout <<
" "; WriteValue(LPMT.tdc);
386 cout <<
" "; WriteValue(LPMT.adc);
387 cout <<
" "; WriteValue(LPMT.adc_p);
388 cout <<
" "; WriteValue(RPMT.tdc);
389 cout <<
" "; WriteValue(RPMT.adc);
390 cout <<
" "; WriteValue(RPMT.adc_p);
421 for(
const auto& idx :
fHitIdx ) {
422 ESide side = idx.first;
423 Int_t pad = idx.second;
426 if( PMT.nadc > 0 && PMT.ntdc > 0 )
440 ESide side = idx.first;
441 Int_t pad = idx.second;
447 if ( adc <=0 || ref <= 0 || par == 0)
466 for(
const auto& idx :
fHitIdx ) {
467 const ESide side = idx.first;
474 const Int_t pad = idx.second;
480 if( RPMT.ntdc > 0 && LPMT.ntdc > 0 ) {
483 Data_t yt = 0.5 *
fCn * (RPMT.tdc_c - LPMT.tdc_c);
494 std::sort( ALL(
fHits) );
507 for(
const auto& idx :
fHitIdx ) {
508 const ESide side = idx.first;
512 const Int_t pad = idx.second;
517 if( RPMT.nadc > 0 && RPMT.adc_c > 0 && LPMT.nadc > 0 && LPMT.adc_c > 0 ) {
522 thePad.ampl =
TMath::Sqrt(LPMT.adc_c * RPMT.adc_c *
527 auto theHit = find_if(ALL(
fHits),
528 [pad](
const HitData_t&
h ) {
return h.pad == pad; });
529 if( theHit !=
fHits.end() ) {
530 theHit->yt = thePad.yt;
531 theHit->ampl = thePad.ampl;
572 for(
const auto&
h :
fHits ) {
573 Double_t dx2 = xc - (padx0 +
h.pad * dpadx);
579 assert(pad >= 0 ||
fHits.empty());
582 proj->SetChannel(pad);
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char mode
#define MKPMTDATA(name, title, nelem)
static const char *const here
Int_t DefineVariables(THaAnalysisObject::EMode mode=THaAnalysisObject::kDefine, const char *key_prefix="", const char *comment_subst="")
HitCount_t & GetHitCount()
PMTData_t & GetPMT(size_t i)
UInt_t GetSize() const override
Int_t StoreHit(const DigitizerHitInfo_t &hitinfo, UInt_t data) override
PMTCalib_t & GetCalib(size_t i)
static Int_t LoadDB(FILE *file, const TDatime &date, const DBRequest *request, const char *prefix, Int_t search=0, const char *here="THaAnalysisObject::LoadDB")
static Int_t DefineVarsFromList(const void *list, EType type, EMode mode, const char *def_prefix, const TObject *obj, const char *prefix, const char *here, const char *comment_subst="")
virtual const char * Here(const char *) const
const char * GetPrefix() const
TString GetPrefixName() const
virtual FILE * OpenFile(const TDatime &date)
Module * GetModule(UInt_t i) const
UInt_t GetTotNumChan() const
Int_t FillDetMap(const std::vector< Int_t > &values, UInt_t flags=0, const char *here="FillDetMap")
virtual Int_t ReadGeometry(FILE *file, const TDatime &date, Bool_t required=false)
VecDetData_t fDetectorData
virtual void Reset(Option_t *opt="")
virtual Int_t GetView(const DigitizerHitInfo_t &hitinfo) const
virtual Int_t Decode(const THaEvData &)
virtual Int_t DefineVariables(EMode mode=kDefine)
Int_t CalcTrackProj(TClonesArray &tracks)
TClonesArray * fTrackProj
virtual void Clear(Option_t *="")
virtual Int_t Decode(const THaEvData &)
std::vector< HitData_t > fHits
Podd::PMTData * fRightPMTs
virtual Int_t DefineVariables(EMode mode=kDefine)
virtual Int_t StoreHit(const DigitizerHitInfo_t &hitinfo, UInt_t data)
virtual ~THaScintillator()
virtual Data_t TimeWalkCorrection(Idx_t idx, Data_t adc)
virtual Int_t FineProcess(TClonesArray &tracks)
virtual void Clear(Option_t *opt="")
virtual Int_t FindPaddleHits()
Podd::PMTData * fLeftPMTs
virtual Int_t ReadDatabase(const TDatime &date)
std::set< Idx_t > fHitIdx
std::pair< ESide, Int_t > Idx_t
virtual void PrintDecodedData(const THaEvData &evdata) const
std::vector< HitData_t > fPadData
virtual Int_t ApplyCorrections()
virtual Int_t CoarseProcess(TClonesArray &tracks)
TObject * At(Int_t idx) const override
Int_t GetLast() const override
virtual void Warning(const char *method, const char *msgfmt,...) const
virtual void Error(const char *method, const char *msgfmt,...) const
void GetXYZ(Double_t *carray) const
RVec< PromoteType< T > > abs(const RVec< T > &v)
Double_t Sqrt(Double_t x)