13 #include "THaDetMap.h"
16 #include "THaCutList.h"
19 #include "THaApparatus.h"
25 #include "THaTrackProj.h"
43 using std::setprecision;
47 THaApparatus* apparatus ) :
48 THaNonTrackingDetector(name,description,apparatus)
80 THaNonTrackingDetector()
150 string EngineDID = string(GetApparatus()->
GetName()).substr(0, 1) +
GetName();
151 std::transform(EngineDID.begin(), EngineDID.end(), EngineDID.begin(), ::toupper);
153 static const char*
const here =
"Init()";
154 Error(Here(here),
"Error filling detectormap for %s.", EngineDID.c_str());
159 if((status = THaNonTrackingDetector::Init( date )))
160 return fStatus=status;
164 InitHitList(fDetMap,
"THcCherenkovHit", fDetMap->GetTotNumChan()+1,
169 !(
fglHod = dynamic_cast<THcHodoscope*>(app->GetDetector(
"hod"))) ) {
170 static const char*
const here =
"ReadDatabase()";
171 Warning(Here(here),
"Hodoscope \"%s\" not found. ",
"hod");
175 THaVar* vpresent = gHaVars->Find(
Form(
"%s.present",GetApparatus()->
GetName()));
179 return fStatus = kOK;
190 string prefix = string(GetApparatus()->
GetName()).substr(0, 1) +
GetName();
191 std::transform(prefix.begin(), prefix.end(), prefix.begin(), ::tolower);
197 DBRequest list_1[] = {
198 {
"_tot_pmts", &fNelem, kInt},
207 cout <<
"Created Cherenkov detector " << GetApparatus()->GetName() <<
"."
208 <<
GetName() <<
" with " << fNelem <<
" PMTs" << endl;
232 {
"_dp_min", &
fDpMin, kDouble},
233 {
"_dp_max", &
fDpMax, kDouble},
245 for (
Int_t i=0;i<fNelem;i++) {
280 if( mode == kDefine && fIsSetup )
return kOK;
281 fIsSetup = ( mode == kDefine );
287 {
"numAdcHits",
"Number of ADC Hits Per PMT",
"fNumAdcHits"},
288 {
"totNumAdcHits",
"Total Number of ADC Hits",
"fTotNumAdcHits"},
289 {
"adcPedRaw",
"Raw ADC pedestals",
"frAdcPedRaw.THcSignalHit.GetData()"},
290 {
"adcPulseIntRaw",
"Raw ADC pulse integrals",
"frAdcPulseIntRaw.THcSignalHit.GetData()"},
291 {
"adcPulseAmpRaw",
"Raw ADC pulse amplitudes",
"frAdcPulseAmpRaw.THcSignalHit.GetData()"},
292 {
"adcPulseTimeRaw",
"Raw ADC pulse times",
"frAdcPulseTimeRaw.THcSignalHit.GetData()"},
293 {
"adcPed",
"ADC pedestals",
"frAdcPed.THcSignalHit.GetData()"},
294 {
"adcPulseInt",
"ADC pulse integrals",
"frAdcPulseInt.THcSignalHit.GetData()"},
295 {
"adcPulseAmp",
"ADC pulse amplitudes",
"frAdcPulseAmp.THcSignalHit.GetData()"},
296 {
"adcPulseTime",
"ADC pulse times",
"frAdcPulseTime.THcSignalHit.GetData()"},
299 DefineVarsFromList( vars, mode);
303 {
"adcCounter",
"ADC counter numbers",
"frAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"},
304 {
"adcErrorFlag",
"Error Flag for When FPGA Fails",
"fAdcErrorFlag.THcSignalHit.GetData()"},
306 {
"numGoodAdcHits",
"Number of Good ADC Hits Per PMT",
"fNumGoodAdcHits"},
307 {
"totNumGoodAdcHits",
"Total Number of Good ADC Hits",
"fTotNumGoodAdcHits"},
309 {
"numTracksMatched",
"Number of Tracks Matched Per Region",
"fNumTracksMatched"},
310 {
"numTracksFired",
"Number of Tracks that Fired Per Region",
"fNumTracksFired"},
311 {
"totNumTracksMatched",
"Total Number of Tracks Matched Per Region",
"fTotNumTracksMatched"},
312 {
"totNumTracksFired",
"Total Number of Tracks that Fired",
"fTotNumTracksFired"},
314 {
"xAtCer",
"Track X at Cherenkov mirror",
"fXAtCer"},
315 {
"yAtCer",
"Track Y at Cherenkov mirror",
"fYAtCer"},
317 {
"npe",
"Number of PEs",
"fNpe"},
318 {
"npeSum",
"Total Number of PEs",
"fNpeSum"},
320 {
"goodAdcPed",
"Good ADC pedestals",
"fGoodAdcPed"},
321 {
"goodAdcMult",
"Good ADC Multiplicity",
"fGoodAdcMult"},
322 {
"goodAdcHitUsed",
"Good ADC Hit Used",
"fGoodAdcHitUsed"},
323 {
"goodAdcPulseInt",
"Good ADC pulse integrals",
"fGoodAdcPulseInt"},
324 {
"goodAdcPulseIntRaw",
"Good ADC raw pulse integrals",
"fGoodAdcPulseIntRaw"},
325 {
"goodAdcPulseAmp",
"Good ADC pulse amplitudes",
"fGoodAdcPulseAmp"},
326 {
"goodAdcPulseTime",
"Good ADC pulse times",
"fGoodAdcPulseTime"},
327 {
"goodAdcTdcDiffTime",
"Good Hodo Start - ADC pulse times",
"fGoodAdcTdcDiffTime"},
328 {
"RefTime",
"Raw ADC RefTime (chan) ",
"fRefTime"},
332 return DefineVarsFromList(vars, mode);
379 fNpe.at(ielem) = 0.0;
397 if(gHaCuts->Result(
"Pedestal_event")) {
476 for(
Int_t ipmt = 0; ipmt < fNelem; ipmt++) {
486 Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
499 for(
Int_t npmt = 0; npmt < fNelem; npmt++) {
507 Double_t adctdcdiffTime = StartTime-pulseTime+OffsetTime;
532 for (
Int_t itrack = 0; itrack < nTracks; itrack++) {
534 THaTrack* track =
dynamic_cast<THaTrack*
> (tracks[itrack]);
535 if (track->GetIndex() != 0)
continue;
537 Double_t trackChi2 = track->GetChi2();
538 Int_t trackNDoF = track->GetNDoF();
539 Double_t trackRedChi2 = trackChi2/trackNDoF;
540 Double_t trackBeta = track->GetBeta();
541 Double_t trackEnergy = track->GetEnergy();
544 Double_t trackENorm = trackEnergy/trackMom;
547 Double_t trackTheta = track->GetTheta();
548 Double_t trackPhi = track->GetPhi();
557 if (trackRedChi2Cut && trackBetaCut && trackENormCut && trackDpCut) {
603 for(
Int_t i = 0; i < fNelem; i++) {
619 while(ihit < nrawhits) {
646 for(
Int_t i=0; i<fNelem;i++) {
669 return fNRegions * nValue + nRegion;
676 THaNonTrackingDetector::Print(opt);
679 cout <<
"Cherenkov Pedestals" << endl;
681 cout <<
"No. ADC" << endl;
682 for(
Int_t i=0; i<fNelem; i++)
683 cout <<
" " << i <<
" " <<
fPed[i] << endl;
Double_t GetF250_PeakPedestalRatio()
std::string GetName(const std::string &scope_name)
virtual void Clear(Option_t *opt="")
vector< Int_t > fNumTracksMatched
virtual Int_t FillMap(THaDetMap *detmap, const char *detectorname)
Class representing a Cherenkov PMT hit.
vector< Int_t > fNumAdcHits
Class for gas Cherenkov detectors.
void MissReport(const char *name)
static const Int_t MaxNumAdcPulse
Double_t GetOffsetTime() const
Int_t GetPulseTimeRaw(UInt_t iPulse=0) const
Gets raw pulse time. In subsamples.
vector< Int_t > fNumTracksFired
Double_t * fAdcPulseAmpTest
TClonesArray * frAdcPulseInt
TClonesArray * fRawHitList
Double_t * fAdcTimeWindowMin
virtual Int_t ApplyCorrections(void)
Double_t * fAdcTimeWindowMax
virtual Int_t ReadDatabase(const TDatime &date)
TObject * ConstructedAt(Int_t idx)
TClonesArray * frAdcPulseTimeRaw
virtual Int_t Decode(const THaEvData &)
vector< Double_t > fGoodAdcPed
TClonesArray * frAdcPedRaw
virtual Int_t FineProcess(TClonesArray &tracks)
Double_t GetPed() const
Gets sample pedestal. In channels.
void Error(const char *location, const char *msgfmt,...)
TClonesArray * frAdcPulseAmpRaw
static const Int_t MaxNumCerPmt
vector< Double_t > fGoodAdcMult
virtual void Clear(Option_t *option="")
void InitHitList(THaDetMap *detmap, const char *hitclass, Int_t maxhits, Int_t tdcref_cut=0, Int_t adcref_cut=0)
Save the electronics module to detector mapping and initialize a hit array of hits of class hitclass...
TClonesArray * frAdcPulseTime
vector< Double_t > fGoodAdcPulseIntRaw
THcRawAdcHit & GetRawAdcHitPos()
Int_t GetPulseAmpRaw(UInt_t iPulse=0) const
Gets raw pulse amplitude. In channels.
vector< Double_t > fGoodAdcTdcDiffTime
Double_t GetPulseAmp(UInt_t iPulse=0) const
Gets pedestal subtracted pulse amplitude. In channels.
Double_t GetPulseInt(UInt_t iPulse=0) const
Gets pedestal subtracted pulse integral. In channels.
virtual EStatus Init(const TDatime &run_time)
char * Form(const char *fmt,...)
void CreateMissReportParms(const char *prefix)
TClonesArray * fAdcErrorFlag
Double_t GetStartTime() const
void Warning(const char *location, const char *msgfmt,...)
vector< Double_t > fGoodAdcHitUsed
Int_t GetPulseIntRaw(UInt_t iPulse=0) const
Gets raw pulse integral. In channels.
R__EXTERN class THcDetectorMap * gHcDetectorMap
Int_t LoadParmValues(const DBRequest *list, const char *prefix="")
Retrieve parameter values from the parameter cache.
Bool_t HasRefTime() const
UInt_t GetNPulses() const
Gets number of set pulses.
TClonesArray * frAdcPulseAmp
Int_t fTotNumTracksMatched
virtual void InitializePedestals()
Int_t End(THaRunBase *run)
ClassImp(THcDCLookupTTDConv) THcDCLookupTTDConv
virtual void AccumulatePedestals(TClonesArray *rawhits)
virtual void Print(const Option_t *opt) const
TClonesArray * frAdcPulseIntRaw
virtual Int_t CoarseProcess(TClonesArray &tracks)
virtual void CalculatePedestals()
Int_t GetPedRaw() const
Gets raw signal pedestal. In channels.
Short_t Max(Short_t a, Short_t b)
vector< Double_t > fGoodAdcPulseInt
Double_t GetPulseTime(UInt_t iPulse=0) const
vector< Double_t > fGoodAdcPulseAmp
R__EXTERN class THcParmList * gHcParms
TObject * At(Int_t idx) const
Int_t GetF250_NPedestalSamples()
void GetData(std::string s, double *x, double *y, double *ey)
vector< Double_t > fGoodAdcPulseTime
virtual Int_t DefineVariables(EMode mode=kDefine)
Double_t GetAdcTopC() const
Class representing a single raw ADC hit.
virtual Int_t DecodeToHitList(const THaEvData &evdata, Bool_t suppress=kFALSE)
Populate the hitlist from the raw event data.
Double_t GetAdcTomV() const
Int_t GetIndex(Int_t nRegion, Int_t nValue)
A standard Hall C spectrometer apparatus.
vector< Int_t > fNumGoodAdcHits