Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • jlab/hallc/analyzer_software/hcana
  • whit/hcana
2 results
Show changes
Showing
with 2130 additions and 1368 deletions
This diff is collapsed.
......@@ -76,11 +76,14 @@ public:
virtual Int_t FineProcess( TClonesArray& tracks );
virtual Int_t End(THaRunBase* run=0);
Double_t DetermineTimePeak(Int_t FillFlag);
void EstimateFocalPlaneTime(void);
void OriginalTrackEffTest(void);
void TrackEffTest(void);
void CalcCluster(void);
virtual Int_t ApplyCorrections( void );
Double_t GetStartTime() const { return fStartTime; }
Double_t GetOffsetTime() const { return fOffsetTime; }
Bool_t IsStartTimeGood() const {return fGoodStartTime;};
Int_t GetNfptimes() const {return fNfptimes;};
Int_t GetScinIndex(Int_t nPlane, Int_t nPaddle);
......@@ -192,12 +195,19 @@ protected:
Bool_t fSHMS;
Bool_t fGoodStartTime;
Double_t fStartTime;
Double_t fADCStartTime;
Double_t fOffsetTime;
Double_t fFPTimeAll;
Int_t fNfptimes;
Bool_t* fPresentP;
Double_t fTimeHist_Peak;
Double_t fTimeHist_Sigma;
Double_t fTimeHist_Hits;
Double_t fTimeHist_StartTime_NumPeaks;
Double_t fTimeHist_StartTime_Peak;
Double_t fTimeHist_StartTime_Sigma;
Double_t fTimeHist_StartTime_Hits;
Double_t fTimeHist_FpTime_NumPeaks;
Double_t fTimeHist_FpTime_Peak;
Double_t fTimeHist_FpTime_Sigma;
Double_t fTimeHist_FpTime_Hits;
Double_t fBeta;
......@@ -207,7 +217,7 @@ protected:
// Potential Hall C parameters. Mostly here for demonstration
Int_t fNPlanes; // Number of planes
UInt_t fMaxScinPerPlane,fMaxHodoScin; // max number of scin/plane; product of the first two
UInt_t fMaxScinPerPlane,fMaxHodoScin,fTotHodScin; // max number of scin/plane; product of the first two
Double_t fStartTimeCenter, fStartTimeSlop, fScinTdcToTime;
Double_t fTofTolerance;
Int_t fCosmicFlag; //
......@@ -216,6 +226,7 @@ protected:
Double_t fScinTdcMin, fScinTdcMax; // min and max TDC values
char** fPlaneNames;
UInt_t* fNPaddle; // Number of paddles per plane
Int_t fTrackBetaIncludeSinglePmtHits;
Double_t *fHodoNegAdcTimeWindowMin;
Double_t *fHodoNegAdcTimeWindowMax;
......@@ -265,6 +276,7 @@ protected:
Int_t fCheckEvent;
Int_t fEventType;
Int_t fEventNum;
Int_t fGoodTrack;
Double_t fScin2XZpos;
......@@ -407,6 +419,10 @@ protected:
std::vector<Int_t > fNClust; // # scins clusters for the plane
std::vector<std::vector<Int_t> > fClustSize; // # scin cluster size
std::vector<std::vector<Double_t> > fClustPos; // # scin cluster position
std::vector<Int_t > fNCluster; // # scins clusters for the plane
std::vector<std::vector<Int_t> > fClusterSize; // # scin cluster size
std::vector<std::vector<Double_t> > fClusterXPos; // # scin cluster position
std::vector<std::vector<Double_t> > fClusterYPos; // # scin cluster position
std::vector<Int_t > fThreeScin; // # scins three clusters for the plane
std::vector<Int_t > fGoodScinHitsX; // # hits in fid x range
// Could combine the above into a structure
......
This diff is collapsed.
......@@ -258,6 +258,10 @@ void THcRawAdcHit::SetRefTime(Int_t refTime) {
fHasRefTime = kTRUE;
}
void THcRawAdcHit::SetRefDiffTime(Int_t refDiffTime) {
fRefDiffTime = refDiffTime;
}
void THcRawAdcHit::SetSample(Int_t data) {
if (fNSamples >= fMaxNSamples) {
// throw std::out_of_range("`THcRawAdcHit::SetSample`: too many samples!");
......@@ -481,6 +485,22 @@ Int_t THcRawAdcHit::GetRefTime() const {
}
}
Bool_t THcRawAdcHit::HasRefTime() const { return fHasRefTime; }
Int_t THcRawAdcHit::GetRefDiffTime() const {
if (fHasRefTime) {
return fRefDiffTime;
}
else {
TString msg = TString::Format(
"`THcRawAdcHit::GetRefTime`: Reference time not available!"
);
throw std::runtime_error(msg.Data());
}
}
Bool_t THcRawAdcHit::HasRefTime() const {
return fHasRefTime;
}
ClassImp(THcRawAdcHit)
......@@ -16,12 +16,14 @@ class THcRawAdcHit : public podd2::HitLogging<TObject> {
void SetData(Int_t data);
void SetSample(Int_t data);
void SetRefTime(Int_t refTime);
void SetRefDiffTime(Int_t refDiffTime);
void SetDataTimePedestalPeak(
Int_t data, Int_t time, Int_t pedestal, Int_t peak
);
Int_t GetRawData(UInt_t iPulse=0) const;
Double_t GetF250_PeakPedestalRatio() {return fPeakPedestalRatio;};
Int_t GetF250_NPedestalSamples() {return fNPedestalSamples;};
Double_t GetAverage(UInt_t iSampleLow, UInt_t iSampleHigh) const;
Int_t GetIntegral(UInt_t iSampleLow, UInt_t iSampleHigh) const;
......@@ -41,6 +43,7 @@ class THcRawAdcHit : public podd2::HitLogging<TObject> {
Int_t GetPulseTimeRaw(UInt_t iPulse=0) const;
Int_t GetSampleRaw(UInt_t iSample=0) const;
Int_t GetRefTime() const;
Int_t GetRefDiffTime() const;
Double_t GetPed() const;
Double_t GetPulseInt(UInt_t iPulse=0) const;
......@@ -82,6 +85,7 @@ class THcRawAdcHit : public podd2::HitLogging<TObject> {
Int_t fPulseTime[fMaxNPulses];
Int_t fSample[fMaxNSamples]; // the big buffer
Int_t fRefTime;
Int_t fRefDiffTime;
Bool_t fHasMulti;
Bool_t fHasRefTime;
......
......@@ -59,6 +59,17 @@ void THcRawDCHit::SetReference(Int_t signal, Int_t reference) {
}
}
void THcRawDCHit::SetReferenceDiff(Int_t signal, Int_t reference) {
if (signal == 0) {
fTdcHit.SetRefDiffTime(reference);
}
else {
throw std::out_of_range(
"`THcRawDCHit::SetReference`: only signal `0` available!"
);
}
}
Int_t THcRawDCHit::GetData(Int_t signal) {
if (signal == 0) {
......@@ -95,6 +106,17 @@ Int_t THcRawDCHit::GetReference(Int_t signal) {
}
}
Int_t THcRawDCHit::GetReferenceDiff(Int_t signal) {
if (signal == 0) {
return fTdcHit.GetRefDiffTime();
}
else {
throw std::out_of_range(
"`THcRawDCHit::GetReference`: only signal `0` available!"
);
}
}
THcRawHit::ESignalType THcRawDCHit::GetSignalType(Int_t signal) {
if (signal == 0) {
......
......@@ -18,10 +18,12 @@ class THcRawDCHit : public THcRawHit {
virtual void SetData(Int_t signal, Int_t data);
virtual void SetReference(Int_t signal, Int_t reference);
virtual void SetReferenceDiff(Int_t signal, Int_t reference);
virtual Int_t GetData(Int_t signal);
virtual Int_t GetRawData(Int_t signal);
virtual Int_t GetReference(Int_t signal);
virtual Int_t GetReferenceDiff(Int_t signal);
virtual ESignalType GetSignalType(Int_t signal);
virtual Int_t GetNSignals();
......
......@@ -38,9 +38,10 @@ public:
virtual ESignalType GetSignalType(Int_t /* signal */) {return kUndefined;}
virtual Int_t GetNSignals() { return 1;}
virtual void SetReference(Int_t /* signal */, Int_t /* reference */) {};
virtual Bool_t HasReference(Int_t /* signal */) {return kFALSE;};
virtual Int_t GetReference(Int_t /* signal */) {return 0;};
virtual void SetReference(Int_t signal, Int_t reference) {};
virtual void SetReferenceDiff(Int_t signal, Int_t reference) {};
virtual Bool_t HasReference(Int_t signal) {return kFALSE;};
virtual Int_t GetReference(Int_t signal) {return 0;};
virtual void SetF250Params(Int_t /* NSA */, Int_t /* NSB */, Int_t /* NPED */) {};
......
......@@ -105,6 +105,18 @@ void THcRawHodoHit::SetReference(Int_t signal, Int_t reference) {
}
}
void THcRawHodoHit::SetReferenceDiff(Int_t signal, Int_t referenceDiff) {
if (signal < fNAdcSignals) {
fAdcHits[signal].SetRefDiffTime(referenceDiff);
} else if (signal < fNAdcSignals+fNTdcSignals) {
fTdcHits[signal-fNAdcSignals].SetRefDiffTime(referenceDiff);
} else {
throw std::out_of_range(
"`THcRawHodoHit::SetReference`: only signals `2` and `3` available!"
);
}
}
Int_t THcRawHodoHit::GetData(Int_t signal) {
if (0 <= signal && signal < fNAdcSignals) {
......@@ -147,6 +159,17 @@ Int_t THcRawHodoHit::GetReference(Int_t signal) {
}
}
Int_t THcRawHodoHit::GetReferenceDiff(Int_t signal) {
if (fNAdcSignals <= signal && signal < fNAdcSignals+fNTdcSignals) {
return fTdcHits[signal-fNAdcSignals].GetRefDiffTime();
}
else {
throw std::out_of_range(
"`THcRawHodoHit::GetReference`: only signals `2` and `3` available!"
);
}
}
THcRawHit::ESignalType THcRawHodoHit::GetSignalType(Int_t signal) {
if (0 <= signal && signal < fNAdcSignals) {
......
......@@ -25,10 +25,12 @@ class THcRawHodoHit : public THcRawHit {
Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak
);
virtual void SetReference(Int_t signal, Int_t reference);
virtual void SetReferenceDiff(Int_t signal, Int_t referenceDiff);
virtual Int_t GetData(Int_t signal);
virtual Int_t GetRawData(Int_t signal);
virtual Int_t GetReference(Int_t signal);
virtual Int_t GetReferenceDiff(Int_t signal);
virtual ESignalType GetSignalType(Int_t signal);
virtual Int_t GetNSignals();
......
......@@ -92,6 +92,16 @@ void THcRawShowerHit::SetReference(Int_t signal, Int_t reference) {
}
}
void THcRawShowerHit::SetReferenceDiff(Int_t signal, Int_t reference) {
if (signal < fNAdcSignals) {
fAdcHits[signal].SetRefDiffTime(reference);
} else {
throw std::out_of_range(
"`THcRawHodoHit::SetReference`: only signals `2` and `3` available!"
);
}
}
Int_t THcRawShowerHit::GetData(Int_t signal) {
if (0 <= signal && signal < fNAdcSignals) {
......
......@@ -22,6 +22,7 @@ class THcRawShowerHit : public THcRawHit {
Int_t signal, Int_t data, Int_t time, Int_t pedestal, Int_t peak
);
virtual void SetReference(Int_t signal, Int_t reference);
virtual void SetReferenceDiff(Int_t signal, Int_t reference);
virtual Int_t GetData(Int_t signal);
virtual Int_t GetRawData(Int_t signal);
......
......@@ -95,6 +95,7 @@ THcRawTdcHit& THcRawTdcHit::operator=(const THcRawTdcHit& right) {
fTime[iHit] = right.fTime[iHit];
}
fRefTime = right.fRefTime;
fRefDiffTime = right.fRefDiffTime;
fHasRefTime = right.fHasRefTime;
fNHits = right.fNHits;
}
......@@ -113,6 +114,7 @@ void THcRawTdcHit::Clear(Option_t* opt) {
fTime[iHit] = 0;
}
fRefTime = 0;
fRefDiffTime = 0;
fHasRefTime = kFALSE;
fNHits = 0;
}
......@@ -138,6 +140,10 @@ void THcRawTdcHit::SetRefTime(Int_t refTime) {
fHasRefTime = kTRUE;
}
void THcRawTdcHit::SetRefDiffTime(Int_t refDiffTime) {
fRefDiffTime = refDiffTime;
}
Int_t THcRawTdcHit::GetTimeRaw(UInt_t iHit) const {
if (iHit < fNHits) {
......@@ -177,6 +183,18 @@ Int_t THcRawTdcHit::GetRefTime() const {
}
}
Int_t THcRawTdcHit::GetRefDiffTime() const {
if (fHasRefTime) {
return fRefDiffTime;
}
else {
TString msg = TString::Format(
"`THcRawTdcHit::GetRefDiffTime`: Reference time not available!"
);
throw std::runtime_error(msg.Data());
}
}
Bool_t THcRawTdcHit::HasRefTime() const {
return fHasRefTime;
......
......@@ -14,10 +14,12 @@ class THcRawTdcHit : public TObject {
void SetTime(Int_t time);
void SetRefTime(Int_t refTime);
void SetRefDiffTime(Int_t refDiffTime);
Int_t GetTimeRaw(UInt_t iHit=0) const;
Int_t GetTime(UInt_t iHit=0) const;
Int_t GetRefTime() const;
Int_t GetRefDiffTime() const;
Bool_t HasRefTime() const;
......@@ -30,6 +32,7 @@ class THcRawTdcHit : public TObject {
Int_t fTime[fMaxNHits];
Int_t fRefTime;
Int_t fRefDiffTime;
Bool_t fHasRefTime;
UInt_t fNHits;
......
This diff is collapsed.
......@@ -59,6 +59,8 @@ public:
Int_t fNumBCMs;
Double_t *fBCM_Gain;
Double_t *fBCM_Offset;
Double_t *fBCM_SatOffset;
Double_t *fBCM_SatQuadratic;
Double_t *fBCM_delta_charge;
Double_t fTotalTime;
Double_t fDeltaTime;
......
......@@ -534,11 +534,21 @@ Int_t THcScintillatorPlane::DefineVariables( EMode mode )
{"DiffDisTrackCorr", "TW Corrected Dist Difference between track and scintillator position (cm)", "fGoodDiffDistTrack"},
{"TrackXPos", "Track X position at plane (cm)", "fTrackXPosition"},
{"TrackYPos", "Track Y position at plane (cm)", "fTrackYPosition"},
{"ScinXPos", "Scint Average Y position at plane (cm)", "fScinXPos"},
{"ScinYPos", "Scint Average Xposition at plane (cm)", "fScinYPos"},
{"NumClus", "Number of clusters", "fNumberClusters"},
{"Clus.Pos", "Position of each paddle clusters", "fCluster.THcScintPlaneCluster.GetClusterPosition()"},
{"Clus.Size", "Size of each paddle clusters", "fCluster.THcScintPlaneCluster.GetClusterSize()"},
{"Clus.Flag", "Flag of each paddle clusters", "fCluster.THcScintPlaneCluster.GetClusterFlag()"},
{"Clus.UsedFlag", "USed Flag of each paddle clusters", "fCluster.THcScintPlaneCluster.GetClusterUsedFlag()"},
{"PosTdcRefTime", "Reference time of Pos TDC", "fPosTdcRefTime"},
{"NegTdcRefTime", "Reference time of Neg TDC", "fNegTdcRefTime"},
{"PosAdcRefTime", "Reference time of Pos ADC", "fPosAdcRefTime"},
{"NegAdcRefTime", "Reference time of Neg aDC", "fNegAdcRefTime"},
{"PosTdcRefDiffTime", "Reference Diff time of Pos TDC", "fPosTdcRefDiffTime"},
{"NegTdcRefDiffTime", "Reference Diff time of Neg TDC", "fNegTdcRefDiffTime"},
{"PosAdcRefDiffTime", "Reference Diff time of Pos ADC", "fPosAdcRefDiffTime"},
{"NegAdcRefDiffTime", "Reference Diff time of Neg aDC", "fNegAdcRefDiffTime"},
//{"ngoodhits", "Number of paddle hits (passed tof tolerance and used to determine the focal plane time )", "GetNGoodHits() "},
{ 0 }
};
......@@ -643,9 +653,19 @@ void THcScintillatorPlane::Clear( Option_t* )
fpTime = -1.e4;
fHitDistance = kBig;
fScinYPos = kBig;
fScinXPos = kBig;
fTrackXPosition = kBig;
fTrackYPosition = kBig;
fNumberClusters=0;
fPosTdcRefTime = kBig;
fPosAdcRefTime = kBig;
fNegTdcRefTime = kBig;
fNegAdcRefTime = kBig;
fPosTdcRefDiffTime = kBig;
fPosAdcRefDiffTime = kBig;
fNegTdcRefDiffTime = kBig;
fNegAdcRefDiffTime = kBig;
}
//_____________________________________________________________________________
......@@ -700,6 +720,14 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
*
*/
//raw
fPosTdcRefTime = kBig;
fPosAdcRefTime = kBig;
fNegTdcRefTime = kBig;
fNegAdcRefTime = kBig;
fPosTdcRefDiffTime = kBig;
fPosAdcRefDiffTime = kBig;
fNegTdcRefDiffTime = kBig;
fNegAdcRefDiffTime = kBig;
Int_t nrPosTDCHits=0;
Int_t nrNegTDCHits=0;
Int_t nrPosADCHits=0;
......@@ -774,6 +802,7 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
// might include multiple hits if it uses a multihit tdc.
// Use "ihit" as the index over THcRawHodoHit objects. Use
// "thit" to index over multiple tdc hits within an "ihit".
Bool_t problem_flag=kFALSE;
while(ihit < nrawhits) {
THcRawHodoHit* hit = (THcRawHodoHit *) rawhits->At(ihit);
if(hit->fPlane > fPlaneNum) {
......@@ -784,8 +813,17 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
Int_t index=padnum-1;
THcRawTdcHit& rawPosTdcHit = hit->GetRawTdcHitPos();
if (rawPosTdcHit.GetNHits() >0 && rawPosTdcHit.HasRefTime()) {
if (fPosTdcRefTime == kBig) {
fPosTdcRefTime=rawPosTdcHit.GetRefTime() ;
fPosTdcRefDiffTime=rawPosTdcHit.GetRefDiffTime() ;
}
if (fPosTdcRefTime != rawPosTdcHit.GetRefTime()) {
cout << "THcScintillatorPlane: " << GetName() << " reftime problem at paddle num = " << padnum << " TDC pos hits = " << rawPosTdcHit.GetNHits() << endl;
problem_flag=kTRUE;
}
}
for (UInt_t thit=0; thit<rawPosTdcHit.GetNHits(); ++thit) {
((THcSignalHit*) frPosTdcTimeRaw->ConstructedAt(nrPosTdcHits))->Set(padnum, rawPosTdcHit.GetTimeRaw(thit));
((THcSignalHit*) frPosTdcTime->ConstructedAt(nrPosTdcHits))->Set(padnum, rawPosTdcHit.GetTime(thit));
......@@ -794,6 +832,17 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
fTotNumPosTdcHits++;
}
THcRawTdcHit& rawNegTdcHit = hit->GetRawTdcHitNeg();
if (rawNegTdcHit.GetNHits() >0 && rawNegTdcHit.HasRefTime()) {
if (fNegTdcRefTime == kBig) {
fNegTdcRefTime=rawNegTdcHit.GetRefTime() ;
fNegTdcRefDiffTime=rawNegTdcHit.GetRefDiffTime() ;
}
if (fNegTdcRefTime != rawNegTdcHit.GetRefTime()) {
cout << "THcScintillatorPlane: " << GetName()<< " Neg TDC reftime problem at paddle num = " << padnum << " TDC neg hits = " << rawNegTdcHit.GetNHits() << endl;
problem_flag=kTRUE;
}
}
// cout << " paddle num = " << padnum << " TDC Neg hits = " << rawNegTdcHit.GetNHits() << endl;
for (UInt_t thit=0; thit<rawNegTdcHit.GetNHits(); ++thit) {
((THcSignalHit*) frNegTdcTimeRaw->ConstructedAt(nrNegTdcHits))->Set(padnum, rawNegTdcHit.GetTimeRaw(thit));
((THcSignalHit*) frNegTdcTime->ConstructedAt(nrNegTdcHits))->Set(padnum, rawNegTdcHit.GetTime(thit));
......@@ -802,6 +851,17 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
fTotNumNegTdcHits++;
}
THcRawAdcHit& rawPosAdcHit = hit->GetRawAdcHitPos();
if (rawPosAdcHit.GetNPulses() >0 && rawPosAdcHit.HasRefTime()) {
if (fPosAdcRefTime == kBig ) {
fPosAdcRefTime=rawPosAdcHit.GetRefTime() ;
fPosAdcRefDiffTime=rawPosAdcHit.GetRefDiffTime() ;
}
if (fPosAdcRefTime != rawPosAdcHit.GetRefTime()) {
cout << "THcScintillatorPlane: " << GetName()<< " Pos ADC reftime problem at paddle num = " << padnum << " ADC pos hits = " << rawPosAdcHit.GetNPulses() << endl;
problem_flag=kTRUE;
}
}
// cout << " paddle num = " << padnum << " ADC Pos hits = " << rawPosAdcHit.GetNPulses() << endl;
for (UInt_t thit=0; thit<rawPosAdcHit.GetNPulses(); ++thit) {
((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPedRaw());
((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPed());
......@@ -824,6 +884,17 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
fTotNumPosAdcHits++;
}
THcRawAdcHit& rawNegAdcHit = hit->GetRawAdcHitNeg();
if (rawNegAdcHit.GetNPulses()>0 && rawNegAdcHit.HasRefTime()) {
if (fNegAdcRefTime == kBig) {
fNegAdcRefTime=rawNegAdcHit.GetRefTime() ;
fNegAdcRefDiffTime=rawNegAdcHit.GetRefDiffTime() ;
}
if (fNegAdcRefTime != rawNegAdcHit.GetRefTime()) {
cout << "THcScintillatorPlane: " << GetName()<< " Neg ADC reftime problem at paddle num = " << padnum << " TDC pos hits = " << rawNegAdcHit.GetNPulses() << endl;
problem_flag=kTRUE;
}
}
// cout << " paddle num = " << padnum << " ADC Neg hits = " << rawNegAdcHit.GetNPulses() << endl;
for (UInt_t thit=0; thit<rawNegAdcHit.GetNPulses(); ++thit) {
((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPedRaw());
((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPed());
......@@ -882,7 +953,7 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
if(tdc_pos >= fScinTdcMin && tdc_pos <= fScinTdcMax) {
btdcraw_pos = kTRUE;
good_ielem_postdc = thit;
break;
break;
}
}
for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) {
......@@ -890,58 +961,86 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
if(tdc_neg >= fScinTdcMin && tdc_neg <= fScinTdcMax) {
btdcraw_neg = kTRUE;
good_ielem_negtdc = thit;
break;
break;
}
}
//
if(fADCMode == kADCDynamicPedestal) {
Int_t good_ielem_negadc_test2=-1;
Int_t good_ielem_posadc_test2=-1;
//Loop Here over all hits per event for neg side of plane
if (good_ielem_negtdc != -1) {
Double_t max_adcamp_test=-1000.;
Double_t max_adctdcdiff_test=1000.;
for (UInt_t ielem=0;ielem<rawNegAdcHit.GetNPulses();ielem++) {
Double_t pulsePed = rawNegAdcHit.GetPed();
Double_t pulseInt = rawNegAdcHit.GetPulseInt(ielem);
Double_t pulseAmp = rawNegAdcHit.GetPulseAmp(ielem);
Double_t pulseTime = rawNegAdcHit.GetPulseTime(ielem)+fAdcTdcOffset;
Bool_t errorflag = 0 ;
Double_t TdcAdcTimeDiff = tdc_neg*fScinTdcToTime-pulseTime;
if (rawNegAdcHit.GetPulseAmpRaw(ielem) <= 0) errorflag=1;
if (rawNegAdcHit.GetPulseAmpRaw(ielem) <= 0)pulseAmp= 200.;
Bool_t pulseTimeCut =( TdcAdcTimeDiff > fHodoNegAdcTimeWindowMin[index]) && (TdcAdcTimeDiff < fHodoNegAdcTimeWindowMax[index]);
if (!errorflag && pulseTimeCut && adcint_neg == -999) {
adcped_neg = pulsePed;
adcmult_neg = rawNegAdcHit.GetNPulses();
adchitused_neg = ielem+1;
adcint_neg = pulseInt;
adcamp_neg = pulseAmp;
adctime_neg = pulseTime;
badcraw_neg = kTRUE;
if (pulseTimeCut && pulseAmp>max_adcamp_test) {
good_ielem_negadc = ielem;
adctdcdifftime_neg=TdcAdcTimeDiff;
max_adcamp_test=pulseAmp;
}
if (abs(TdcAdcTimeDiff) < max_adctdcdiff_test) {
good_ielem_negadc_test2 = ielem;
max_adctdcdiff_test=abs(TdcAdcTimeDiff);
}
}
}
//
if ( good_ielem_negadc == -1 && good_ielem_negadc_test2 != -1) good_ielem_negadc=good_ielem_negadc_test2;
if ( good_ielem_negadc == -1 && good_ielem_negadc_test2 == -1 && rawNegAdcHit.GetNPulses()>0) {
good_ielem_negadc=0;
}
//
if (good_ielem_negadc != -1 && good_ielem_negadc<rawNegAdcHit.GetNPulses()) {
adcped_neg = rawNegAdcHit.GetPed();
adcmult_neg = rawNegAdcHit.GetNPulses();
adchitused_neg = good_ielem_negadc+1;
adcint_neg = rawNegAdcHit.GetPulseInt(good_ielem_negadc);
adcamp_neg = rawNegAdcHit.GetPulseAmp(good_ielem_negadc);
if (rawNegAdcHit.GetPulseAmpRaw(good_ielem_negadc) <= 0) adcamp_neg= 200.;
adctime_neg = rawNegAdcHit.GetPulseTime(good_ielem_negadc)+fAdcTdcOffset;
badcraw_neg = kTRUE;
adctdcdifftime_neg=tdc_neg*fScinTdcToTime-adctime_neg;
}
//
//Loop Here over all hits per event for pos side of plane
if (good_ielem_postdc != -1) {
Double_t max_adcamp_test=-1000.;
Double_t max_adctdcdiff_test=1000.;
//
for (UInt_t ielem=0;ielem<rawPosAdcHit.GetNPulses();ielem++) {
Double_t pulsePed = rawPosAdcHit.GetPed();
Double_t pulseInt = rawPosAdcHit.GetPulseInt(ielem);
Double_t pulseAmp = rawPosAdcHit.GetPulseAmp(ielem);
Double_t pulseTime = rawPosAdcHit.GetPulseTime(ielem)+fAdcTdcOffset;
Bool_t errorflag = 0 ;
Double_t TdcAdcTimeDiff = tdc_pos*fScinTdcToTime-pulseTime;
if (rawPosAdcHit.GetPulseAmpRaw(ielem) <= 0) errorflag=1;
Bool_t pulseTimeCut =( TdcAdcTimeDiff > fHodoPosAdcTimeWindowMin[index]) && (TdcAdcTimeDiff < fHodoPosAdcTimeWindowMax[index]);
if (!errorflag && pulseTimeCut && adcint_pos == -999) {
adcped_pos = pulsePed;
adcmult_pos = rawPosAdcHit.GetNPulses();
adchitused_pos = ielem+1;
adcint_pos = pulseInt;
adcamp_pos = pulseAmp;
adctime_pos = pulseTime;
badcraw_pos = kTRUE;
if (rawPosAdcHit.GetPulseAmpRaw(ielem) <= 0)pulseAmp= 200.;
if (pulseTimeCut && pulseAmp>max_adcamp_test) {
good_ielem_posadc = ielem;
adctdcdifftime_pos=TdcAdcTimeDiff;
max_adcamp_test=pulseAmp;
}
if (abs(TdcAdcTimeDiff) < max_adctdcdiff_test) {
good_ielem_posadc_test2 = ielem;
max_adctdcdiff_test=abs(TdcAdcTimeDiff);
}
}
} //
if ( good_ielem_posadc == -1 && good_ielem_posadc_test2 != -1) good_ielem_posadc=good_ielem_posadc_test2;
if ( good_ielem_posadc == -1 && good_ielem_posadc_test2 == -1 && rawPosAdcHit.GetNPulses()>0) good_ielem_posadc=0;
if (good_ielem_posadc != -1 && good_ielem_posadc<rawPosAdcHit.GetNPulses()) {
adcped_pos = rawPosAdcHit.GetPed();
adcmult_pos = rawPosAdcHit.GetNPulses();
adchitused_pos = good_ielem_posadc+1;
adcint_pos = rawPosAdcHit.GetPulseInt(good_ielem_posadc);
adcamp_pos = rawPosAdcHit.GetPulseAmp(good_ielem_posadc);
if (rawPosAdcHit.GetPulseAmpRaw(good_ielem_posadc) <= 0) adcamp_pos= 200.;
adctime_pos = rawPosAdcHit.GetPulseTime(good_ielem_posadc)+fAdcTdcOffset;
badcraw_pos = kTRUE;
adctdcdifftime_pos=tdc_pos*fScinTdcToTime-adctime_pos;
//
}
} else if (fADCMode == kADCSampleIntegral) {
adcint_pos = hit->GetRawAdcHitPos().GetSampleIntRaw() - fPosPed[index];
......@@ -972,7 +1071,7 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
}
//
if((btdcraw_pos && badcraw_pos) || (btdcraw_neg && badcraw_neg )) {
if (good_ielem_posadc != -1) {
if (good_ielem_posadc != -1) {
//good adc multiplicity
fTotNumGoodPosAdcHits++;
fTotNumGoodAdcHits++;
......@@ -1045,9 +1144,12 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
}
// Do corrections if valid TDC on both ends of bar
if( (btdcraw_pos && btdcraw_neg) && (badcraw_pos && badcraw_neg) ) {
// Do the pulse height correction to the time. (Position dependent corrections later)
Double_t adc_timec_pos= adctime_pos;
Double_t adc_timec_neg= adctime_neg;
Double_t timec_pos, timec_neg;
if(fTofUsingInvAdc) {
timec_pos = tdc_pos*fScinTdcToTime
......@@ -1059,6 +1161,8 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
} else { // FADC style
timec_pos = tdc_pos*fScinTdcToTime -tw_corr_pos + fHodo_LCoeff[index];
timec_neg = tdc_neg*fScinTdcToTime -tw_corr_neg- 2*fHodoCableFit[index] + fHodo_LCoeff[index];
adc_timec_pos = adc_timec_pos -tw_corr_pos + fHodo_LCoeff[index];
adc_timec_neg = adc_timec_neg -tw_corr_neg- 2*fHodoCableFit[index] + fHodo_LCoeff[index];
}
Double_t TWCorrDiff = fGoodNegTdcTimeWalkCorr.at(padnum-1) - 2*fHodoCableFit[index] - fGoodPosTdcTimeWalkCorr.at(padnum-1);
......@@ -1077,6 +1181,8 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
hit_position=TMath::Min(hit_position,fPosLeft);
hit_position=TMath::Max(hit_position,fPosRight);
Double_t scin_corrected_time, postime, negtime;
Double_t adc_postime=adc_timec_pos;
Double_t adc_negtime=adc_timec_neg;
if(fTofUsingInvAdc) {
timec_pos -= (fPosLeft-hit_position)/
fHodoPosInvAdcLinear[index];
......@@ -1091,23 +1197,32 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
negtime = timec_neg - (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
}
} else {
scin_corrected_time = 0.5*(timec_neg+timec_pos); // add constants for each paddle, 25ns, 25 + zpos, . . . //remove propagation time
scin_corrected_time = 0.5*(timec_neg+timec_pos);
timec_pos= scin_corrected_time;
timec_neg= scin_corrected_time;
timec_neg= scin_corrected_time;
Double_t adc_time_corrected = 0.5*(adc_timec_pos+adc_timec_neg);
if (fCosmicFlag) {
postime = timec_pos + (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
negtime = timec_neg + (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
adc_postime = adc_time_corrected + (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
adc_negtime = adc_time_corrected + (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
} else {
postime = timec_pos - (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
negtime = timec_neg - (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
adc_postime = adc_time_corrected - (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
adc_negtime = adc_time_corrected - (fZpos+(index%2)*fDzpos)/(29.979*fBetaNominal);
}
}
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPaddleCenter(fPosCenter[index]);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCorrectedTimes(timec_pos,timec_neg,
postime, negtime,
scin_corrected_time);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCpeak(adcamp_pos); // need for new TWCOrr
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCpeak(adcamp_neg); // need for new TWCOrr
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCpeak(adcamp_pos);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCpeak(adcamp_neg);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCCorrtime(adc_postime);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCCorrtime(adc_negtime);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCalcPosition(fHitDistCorr); //
fGoodPosTdcTimeCorr.at(padnum-1) = timec_pos;
fGoodNegTdcTimeCorr.at(padnum-1) = timec_neg;
fGoodPosTdcTimeTOFCorr.at(padnum-1) = postime;
......@@ -1138,14 +1253,24 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
if (badcraw_neg) adc_neg=adcamp_neg;
if (badcraw_pos) adc_pos=adcamp_pos;
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPaddleCenter(fPosCenter[index]);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCorrectedTimes(timec_pos,timec_neg,
timec_pos,timec_neg,0.0);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCorrectedTimes(timec_pos,timec_neg);
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCpeak(adc_neg); // needed for new TWCOrr
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCpeak(adc_pos); // needed for new TWCOrr
if (badcraw_neg) {
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCtime(adctime_neg);
} else {
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetNegADCtime(-999.);
}
if (badcraw_pos) {
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCtime(adctime_pos);
} else {
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetPosADCtime(-999.);
}
((THcHodoHit*) fHodoHits->At(fNScinHits))->SetCalcPosition(kBig); //
fGoodPosTdcTimeCorr.at(padnum-1) = timec_pos;
fGoodNegTdcTimeCorr.at(padnum-1) = timec_neg;
fGoodPosTdcTimeTOFCorr.at(padnum-1) = timec_pos;
fGoodNegTdcTimeTOFCorr.at(padnum-1) = timec_neg;
fGoodPosTdcTimeTOFCorr.at(padnum-1) = kBig;
fGoodNegTdcTimeTOFCorr.at(padnum-1) = kBig;
}
// if ( ((THcHodoHit*) fHodoHits->At(fNScinHits))->GetPosTOFCorrectedTime() != ((THcHodoHit*) fHodoHits->At(fNScinHits))->GetPosTOFCorrectedTime()) cout << " ihit = " << ihit << " scinhit = " << fNScinHits << " plane = " << fPlaneNum << " padnum = " << padnum << " " << tdc_pos<< " "<< tdc_neg<< " " << ((THcHodoHit*) fHodoHits->At(fNScinHits))->GetPosTOFCorrectedTime() << endl;
fNScinHits++; // One or more good time counter
......@@ -1154,7 +1279,10 @@ Int_t THcScintillatorPlane::ProcessHits(TClonesArray* rawhits, Int_t nexthit)
ihit++; // Raw hit counter
}
// cout << "THcScintillatorPlane: ihit = " << ihit << endl;
if (problem_flag) {
cout << "THcScintillatorPlane::ProcessHits " << fPlaneNum << " " << nexthit << "/" << nrawhits << endl;
cout << " Ref problem end *******" << endl;
}
return(ihit);
}
......
......@@ -63,6 +63,8 @@ class THcScintillatorPlane : public THaSubDetector {
void SetFpTime(Double_t f) {fFptime=f;};
void SetNGoodHits(Int_t ng) {fNGoodHits=ng;};
void SetHitDistance(Double_t f) {fHitDistance=f;}; // Distance between track and hit paddle
void SetScinYPos(Double_t f) {fScinYPos=f;}; // Scint Average Y position at plane (cm)
void SetScinXPos(Double_t f) {fScinXPos=f;}; // Scint Average X position at plane (cm)
void SetTrackXPosition(Double_t f) {fTrackXPosition=f;}; // Distance track X position at plane
void SetTrackYPosition(Double_t f) {fTrackYPosition=f;}; // Distance track Y position at plane
void SetNumberClusters(Int_t nclus) {fNumberClusters=nclus;}; // number of paddle
......@@ -181,7 +183,17 @@ class THcScintillatorPlane : public THaSubDetector {
vector<Double_t> fGoodDiffDistTrack;
Int_t fDebugAdc;
Double_t fPosTdcRefTime;
Double_t fPosAdcRefTime;
Double_t fNegTdcRefTime;
Double_t fNegAdcRefTime;
Double_t fPosTdcRefDiffTime;
Double_t fPosAdcRefDiffTime;
Double_t fNegTdcRefDiffTime;
Double_t fNegAdcRefDiffTime;
Double_t fHitDistance;
Double_t fScinXPos;
Double_t fScinYPos;
Double_t fTrackXPosition;
Double_t fTrackYPosition;
Int_t fCosmicFlag; //
......@@ -272,7 +284,10 @@ class THcScintillatorPlane : public THaSubDetector {
Double_t *fNegPed;
Double_t *fNegSig;
Double_t *fNegThresh;
//
Int_t fEventType;
Int_t fEventNum;
//
Int_t fNScinGoodHits; // number of hits for which both ends of the paddle fired in time!
Double_t fpTime; // the original code only has one fpTime per plane!
......
......@@ -36,6 +36,7 @@ THcShower::THcShower( const char* name, const char* description,
hcana::ConfigLogging<THaNonTrackingDetector>(name,description,apparatus),
fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
fPedPosDefault(0),fPedNegDefault(0),
fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
......@@ -53,6 +54,7 @@ THcShower::THcShower( ) :
hcana::ConfigLogging<THaNonTrackingDetector>(),
fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0),
fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0),
fPedPosDefault(0),fPedNegDefault(0),
fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0),
fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0),
fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0)
......@@ -388,6 +390,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
fNegAdcTimeWindowMin = new Double_t [fNTotBlocks];
fPosAdcTimeWindowMax = new Double_t [fNTotBlocks];
fNegAdcTimeWindowMax = new Double_t [fNTotBlocks];
fPedPosDefault = new Int_t [fNTotBlocks];
fPedNegDefault = new Int_t [fNTotBlocks];
DBRequest list[]={
{"cal_pos_cal_const", hcal_pos_cal_const, kDouble, fNTotBlocks},
......@@ -400,6 +404,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
{"cal_neg_AdcTimeWindowMin", fNegAdcTimeWindowMin, kDouble, static_cast<UInt_t>(fNTotBlocks),1},
{"cal_pos_AdcTimeWindowMax", fPosAdcTimeWindowMax, kDouble, static_cast<UInt_t>(fNTotBlocks),1},
{"cal_neg_AdcTimeWindowMax", fNegAdcTimeWindowMax, kDouble, static_cast<UInt_t>(fNTotBlocks),1},
{"cal_PedNegDefault", fPedNegDefault, kInt, static_cast<UInt_t>(fNTotBlocks),1},
{"cal_PedPosDefault", fPedNegDefault, kInt, static_cast<UInt_t>(fNTotBlocks),1},
{"cal_min_peds", &fShMinPeds, kInt,0,1},
{0}
};
......@@ -410,6 +416,8 @@ Int_t THcShower::ReadDatabase( const TDatime& date )
fNegAdcTimeWindowMin[ip] = -1000.;
fPosAdcTimeWindowMax[ip] = 1000.;
fNegAdcTimeWindowMax[ip] = 1000.;
fPedNegDefault[ip] = 0;
fPedPosDefault[ip] = 0;
}
gHcParms->LoadParmValues((DBRequest*)&list, prefix);
......@@ -617,6 +625,8 @@ void THcShower::DeleteArrays()
delete [] fNegAdcTimeWindowMin; fNegAdcTimeWindowMin = 0;
delete [] fPosAdcTimeWindowMax; fPosAdcTimeWindowMax = 0;
delete [] fNegAdcTimeWindowMax; fNegAdcTimeWindowMax = 0;
delete [] fPedNegDefault; fPedNegDefault = 0;
delete [] fPedPosDefault; fPedPosDefault = 0;
delete [] fShPosPedLimit; fShPosPedLimit = 0;
delete [] fShNegPedLimit; fShNegPedLimit = 0;
delete [] fPosGain; fPosGain = 0;
......
......@@ -73,6 +73,17 @@ public:
return ( Side == 0 ? fPosGain[nelem] : fNegGain[nelem]);
}
Double_t GetPedDefault(Int_t NBlock, Int_t NLayer, Int_t Side) {
if (Side!=0&&Side!=1) {
cout << "*** Wrong Side in GetPedDefault:" << Side << " ***" << endl;
return -1;
}
Int_t nelem = 0;
for (Int_t i=0; i<NLayer; i++) nelem += fNBlocks[i];
nelem += NBlock;
return ( Side == 0 ? fPedPosDefault[nelem] : fPedNegDefault[nelem] );
}
Double_t GetWindowMin(Int_t NBlock, Int_t NLayer, Int_t Side) {
if (Side!=0&&Side!=1) {
cout << "*** Wrong Side in GetWindowMin:" << Side << " ***" << endl;
......@@ -189,7 +200,9 @@ protected:
Double_t* fNegAdcTimeWindowMin;
Double_t* fPosAdcTimeWindowMax;
Double_t* fNegAdcTimeWindowMax;
Double_t fAdcTdcOffset;
Int_t* fPedPosDefault;
Int_t* fPedNegDefault;
Double_t fAdcTdcOffset;
Int_t fAnalyzePedestals; // Flag for pedestal analysis.
......