Skip to content
Snippets Groups Projects
Commit 9d6d10a2 authored by Stephen A. Wood's avatar Stephen A. Wood
Browse files

Deal with high rate scalers in THcScalerEvtHandler that overflow

  All Int_t variables that hold scaler values are now UInt_t
  Some variables that were Double_t are UInt_t
  Keep track of overflows so that tree variables holding scaler counts
     are correct for high rate scalers
  Catch overflows when computing differences from last scaler reading.
parent f8c9c966
No related branches found
No related tags found
No related merge requests found
...@@ -75,10 +75,14 @@ static const UInt_t defaultDT = 4; ...@@ -75,10 +75,14 @@ static const UInt_t defaultDT = 4;
THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description) THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description)
: THaEvtTypeHandler(name,description), evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1), : THaEvtTypeHandler(name,description), evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1),
dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE), dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE),
fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1) fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1),
fClockChan(-1), fLastClock(0), fClockOverflows(0)
{ {
fRocSet.clear(); fRocSet.clear();
fModuleSet.clear(); fModuleSet.clear();
scal_prev_read.clear();
scal_present_read.clear();
scal_overflows.clear();
} }
THcScalerEvtHandler::~THcScalerEvtHandler() THcScalerEvtHandler::~THcScalerEvtHandler()
...@@ -333,7 +337,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -333,7 +337,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
// The correspondance between dvars and the scaler and the channel // The correspondance between dvars and the scaler and the channel
// will be driven by a scaler.map file -- later // will be driven by a scaler.map file -- later
Double_t scal_current=0; Double_t scal_current=0;
fTotalTime = scalers[fNormIdx]->GetData(fClockChan)/fClockFreq; UInt_t thisClock = scalers[fNormIdx]->GetData(fClockChan);
if(thisClock < fLastClock) { // Count clock scaler wrap arounds
fClockOverflows++;
}
fTotalTime = (thisClock+(((Double_t) fClockOverflows)*kMaxUInt+fClockOverflows))/fClockFreq;
fLastClock = thisClock;
fDeltaTime= fTotalTime - fPrevTotalTime; fDeltaTime= fTotalTime - fPrevTotalTime;
fPrevTotalTime=fTotalTime; fPrevTotalTime=fTotalTime;
Int_t nscal=0; Int_t nscal=0;
...@@ -348,10 +357,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -348,10 +357,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
(ichan < MAXCHAN)){ (ichan < MAXCHAN)){
if(fUseFirstEvent){ if(fUseFirstEvent){
if (scalerloc[ivar]->ikind == ICOUNT){ if (scalerloc[ivar]->ikind == ICOUNT){
dvars[ivar] = scalers[isca]->GetData(ichan); UInt_t scaldata = scalers[isca]->GetData(ichan);
scal_present_read.push_back(dvars[ivar]); dvars[ivar] = scaldata;
scal_prev_read.push_back(0.0); scal_present_read.push_back(scaldata);
dvarsFirst[ivar] = 0; scal_prev_read.push_back(0);
scal_overflows.push_back(0);
dvarsFirst[ivar] = 0.0;
} }
if (scalerloc[ivar]->ikind == ITIME){ if (scalerloc[ivar]->ikind == ITIME){
dvars[ivar] =fTotalTime; dvars[ivar] =fTotalTime;
...@@ -378,8 +389,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -378,8 +389,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar]; if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar];
} }
if (scalerloc[ivar]->ikind == ICHARGE) { if (scalerloc[ivar]->ikind == ICHARGE) {
if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; if (bcm_ind != -1) {
if (bcm_ind != -1) dvars[ivar]+=fBCM_delta_charge[bcm_ind]; fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
dvars[ivar]+=fBCM_delta_charge[bcm_ind];
}
} }
// printf("1st event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]); // printf("1st event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]);
} }
...@@ -390,7 +403,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -390,7 +403,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
if (scalerloc[ivar]->ikind == ICOUNT) { if (scalerloc[ivar]->ikind == ICOUNT) {
dvarsFirst[ivar] = scalers[isca]->GetData(ichan) ; dvarsFirst[ivar] = scalers[isca]->GetData(ichan) ;
scal_present_read.push_back(dvarsFirst[ivar]); scal_present_read.push_back(dvarsFirst[ivar]);
scal_prev_read.push_back(0.0); scal_prev_read.push_back(0);
} }
if (scalerloc[ivar]->ikind == ITIME){ if (scalerloc[ivar]->ikind == ITIME){
dvarsFirst[ivar] = fTotalTime; dvarsFirst[ivar] = fTotalTime;
...@@ -416,8 +429,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -416,8 +429,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvarsFirst[ivar]; if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvarsFirst[ivar];
} }
if (scalerloc[ivar]->ikind == ICHARGE) { if (scalerloc[ivar]->ikind == ICHARGE) {
if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; if (bcm_ind != -1) {
if (bcm_ind != -1) dvarsFirst[ivar]+=fBCM_delta_charge[bcm_ind]; fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
dvarsFirst[ivar]+=fBCM_delta_charge[bcm_ind];
}
} }
} }
if (fDebugFile) *fDebugFile << " dvarsFirst "<<scalerloc[ivar]->ikind<<" "<<dvarsFirst[ivar]<<endl; if (fDebugFile) *fDebugFile << " dvarsFirst "<<scalerloc[ivar]->ikind<<" "<<dvarsFirst[ivar]<<endl;
...@@ -426,21 +441,33 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -426,21 +441,33 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
else { else {
cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<isca<<" "<<ichan<<endl; cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<isca<<" "<<ichan<<endl;
} }
}else{ //evcount=/=0 }else{ // evcount != 0
if (fDebugFile) *fDebugFile << "Debug dvars "<<i<<" "<<ivar<<" "<<isca<<" "<<ichan<<endl; if (fDebugFile) *fDebugFile << "Debug dvars "<<i<<" "<<ivar<<" "<<isca<<" "<<ichan<<endl;
if ((ivar < scalerloc.size()) && if ((ivar < scalerloc.size()) &&
(isca < scalers.size()) && (isca < scalers.size()) &&
(ichan < MAXCHAN)) { (ichan < MAXCHAN)) {
if (scalerloc[ivar]->ikind == ICOUNT) { if (scalerloc[ivar]->ikind == ICOUNT) {
dvars[ivar] = scalers[isca]->GetData(ichan)-dvarsFirst[ivar]; UInt_t scaldata = scalers[isca]->GetData(ichan);
scal_present_read[nscal]=dvars[ivar]; if(scaldata < scal_prev_read[nscal]) {
scal_overflows[nscal]++;
}
dvars[ivar] = scaldata + (1+((Double_t)kMaxUInt))*scal_overflows[nscal]
-dvarsFirst[ivar];
scal_present_read[nscal]=scaldata;
nscal++; nscal++;
} }
if (scalerloc[ivar]->ikind == ITIME) { if (scalerloc[ivar]->ikind == ITIME) {
dvars[ivar] = fTotalTime; dvars[ivar] = fTotalTime;
} }
if (scalerloc[ivar]->ikind == IRATE) { if (scalerloc[ivar]->ikind == IRATE) {
dvars[ivar] = (scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime; UInt_t scaldata = scalers[isca]->GetData(ichan);
UInt_t diff;
if(scaldata < scal_prev_read[nscal-1]) {
diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
} else {
diff = scaldata - scal_prev_read[nscal-1];
}
dvars[ivar] = diff/fDeltaTime;
// printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan));//checks // printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan));//checks
} }
if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE) if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE)
...@@ -456,12 +483,30 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -456,12 +483,30 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
} }
if (scalerloc[ivar]->ikind == ICURRENT) { if (scalerloc[ivar]->ikind == ICURRENT) {
dvars[ivar]=0; dvars[ivar]=0;
if (bcm_ind != -1) dvars[ivar]=((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; if (bcm_ind != -1) {
if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar]; UInt_t scaldata = scalers[isca]->GetData(ichan);
UInt_t diff;
if(scaldata < scal_prev_read[nscal-1]) {
diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
} else {
diff = scaldata - scal_prev_read[nscal-1];
}
dvars[ivar]=(diff/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
}
if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvars[ivar];
} }
if (scalerloc[ivar]->ikind == ICHARGE) { if (scalerloc[ivar]->ikind == ICHARGE) {
if (bcm_ind != -1) fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; if (bcm_ind != -1) {
if (bcm_ind != -1) dvars[ivar]+=fBCM_delta_charge[bcm_ind]; UInt_t scaldata = scalers[isca]->GetData(ichan);
UInt_t diff;
if(scaldata < scal_prev_read[nscal-1]) {
diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata;
} else {
diff = scaldata - scal_prev_read[nscal-1];
}
fBCM_delta_charge[bcm_ind]=fDeltaTime*(diff/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind];
dvars[ivar]+=fBCM_delta_charge[bcm_ind];
}
} }
// printf("event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]); // printf("event %i index %i fBCMname %s scalerloc %s offset %f gain %f computed %f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvars[ivar]);
} }
...@@ -478,10 +523,17 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) ...@@ -478,10 +523,17 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync)
size_t isca = scalerloc[i]->iscaler; size_t isca = scalerloc[i]->iscaler;
size_t ichan = scalerloc[i]->ichan; size_t ichan = scalerloc[i]->ichan;
if (scalerloc[ivar]->ikind == ICUT+ICOUNT){ if (scalerloc[ivar]->ikind == ICUT+ICOUNT){
UInt_t scaldata = scalers[isca]->GetData(ichan);
if ( scal_current > fbcm_Current_Threshold) { if ( scal_current > fbcm_Current_Threshold) {
dvars[ivar] += (scalers[isca]->GetData(ichan)-dvars_prev_read[ivar]); UInt_t diff;
if(scaldata < scal_prev_read[nscal-1]) {
diff = (kMaxUInt-(dvars_prev_read[ivar] - 1)) + scaldata;
} else {
diff = scaldata - dvars_prev_read[ivar];
}
dvars[ivar] += diff;
} }
dvars_prev_read[ivar] = scalers[isca]->GetData(ichan); dvars_prev_read[ivar] = scaldata;
} }
if (scalerloc[ivar]->ikind == ICUT+ICHARGE){ if (scalerloc[ivar]->ikind == ICUT+ICHARGE){
Int_t bcm_ind=-1; Int_t bcm_ind=-1;
...@@ -740,11 +792,11 @@ void THcScalerEvtHandler::DefVars() ...@@ -740,11 +792,11 @@ void THcScalerEvtHandler::DefVars()
// called after AddVars has finished being called. // called after AddVars has finished being called.
Nvars = scalerloc.size(); Nvars = scalerloc.size();
if (Nvars == 0) return; if (Nvars == 0) return;
dvars_prev_read = new Double_t[Nvars]; // dvars is a member of this class dvars_prev_read = new UInt_t[Nvars]; // dvars_prev_read is a member of this class
dvars = new Double_t[Nvars]; // dvars is a member of this class dvars = new Double_t[Nvars]; // dvars is a member of this class
dvarsFirst = new Double_t[Nvars]; // dvarsFirst is a member of this class dvarsFirst = new Double_t[Nvars]; // dvarsFirst is a member of this class
memset(dvars, 0, Nvars*sizeof(Double_t)); memset(dvars, 0, Nvars*sizeof(Double_t));
memset(dvars_prev_read, 0, Nvars*sizeof(Double_t)); memset(dvars_prev_read, 0, Nvars*sizeof(UInt_t));
memset(dvarsFirst, 0, Nvars*sizeof(Double_t)); memset(dvarsFirst, 0, Nvars*sizeof(Double_t));
if (gHaVars) { if (gHaVars) {
if(fDebugFile) *fDebugFile << "THcScalerEVtHandler:: Have gHaVars "<<gHaVars<<endl; if(fDebugFile) *fDebugFile << "THcScalerEVtHandler:: Have gHaVars "<<gHaVars<<endl;
......
...@@ -60,7 +60,6 @@ private: ...@@ -60,7 +60,6 @@ private:
Double_t fDeltaTime; Double_t fDeltaTime;
Double_t fPrevTotalTime; Double_t fPrevTotalTime;
Double_t fbcm_Current_Threshold; Double_t fbcm_Current_Threshold;
size_t fClockChan;
Double_t fClockFreq; Double_t fClockFreq;
Int_t fbcm_Current_Threshold_Index; Int_t fbcm_Current_Threshold_Index;
char** fBCM_Name; char** fBCM_Name;
...@@ -68,15 +67,19 @@ private: ...@@ -68,15 +67,19 @@ private:
Double_t evcountR; Double_t evcountR;
Int_t Nvars, ifound, fNormIdx, nscalers; Int_t Nvars, ifound, fNormIdx, nscalers;
Double_t *dvars; Double_t *dvars;
Double_t *dvars_prev_read; UInt_t *dvars_prev_read;
std::vector<Int_t> scal_prev_read; std::vector<UInt_t> scal_prev_read;
std::vector<Int_t> scal_present_read; std::vector<UInt_t> scal_present_read;
std::vector<UInt_t> scal_overflows;
Double_t *dvarsFirst; Double_t *dvarsFirst;
TTree *fScalerTree; TTree *fScalerTree;
Bool_t fUseFirstEvent; Bool_t fUseFirstEvent;
Bool_t fOnlySyncEvents; Bool_t fOnlySyncEvents;
Bool_t fOnlyBanks; Bool_t fOnlyBanks;
Int_t fDelayedType; Int_t fDelayedType;
Int_t fClockChan;
UInt_t fLastClock;
Int_t fClockOverflows;
std::vector<UInt_t*> fDelayedEvents; std::vector<UInt_t*> fDelayedEvents;
std::set<UInt_t> fRocSet; std::set<UInt_t> fRocSet;
std::set<UInt_t> fModuleSet; std::set<UInt_t> fModuleSet;
......
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