diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx index b2e36906b6010126c9cc97e28712fb9d5631c43f..f5170eb670ab11852d19fda62735f9da558597b5 100644 --- a/src/THcScalerEvtHandler.cxx +++ b/src/THcScalerEvtHandler.cxx @@ -74,6 +74,7 @@ static const UInt_t defaultDT = 4; THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description) : THaEvtTypeHandler(name,description), evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1), + fNormSlot(-1), dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE), fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1), fClockChan(-1), fLastClock(0), fClockOverflows(0) @@ -92,7 +93,7 @@ THcScalerEvtHandler::~THcScalerEvtHandler() } } -Int_t THcScalerEvtHandler::End( THaRunBase* r) +Int_t THcScalerEvtHandler::End( THaRunBase* ) { // Process any delayed events in order received @@ -354,16 +355,16 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) Int_t nscal=0; for (size_t i = 0; i < scalerloc.size(); i++) { size_t ivar = scalerloc[i]->ivar; - size_t isca = scalerloc[i]->iscaler; + size_t idx = scalerloc[i]->index; size_t ichan = scalerloc[i]->ichan; if (evcount==0) { - if (fDebugFile) *fDebugFile << "Debug dvarsFirst "<<i<<" "<<ivar<<" "<<isca<<" "<<ichan<<endl; + if (fDebugFile) *fDebugFile << "Debug dvarsFirst "<<i<<" "<<ivar<<" "<<idx<<" "<<ichan<<endl; if ((ivar < scalerloc.size()) && - (isca < scalers.size()) && + (idx < scalers.size()) && (ichan < MAXCHAN)){ if(fUseFirstEvent){ if (scalerloc[ivar]->ikind == ICOUNT){ - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); dvars[ivar] = scaldata; scal_present_read.push_back(scaldata); scal_prev_read.push_back(0); @@ -375,9 +376,9 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) dvarsFirst[ivar] = 0; } if (scalerloc[ivar]->ikind == IRATE) { - dvars[ivar] = (scalers[isca]->GetData(ichan))/fDeltaTime; + dvars[ivar] = (scalers[idx]->GetData(ichan))/fDeltaTime; dvarsFirst[ivar] = dvars[ivar]; - //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan)); //checks + //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[idx]->GetRate(ichan)); //checks } if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE){ Int_t bcm_ind=-1; @@ -391,12 +392,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } if (scalerloc[ivar]->ikind == ICURRENT) { dvars[ivar]=0.; - if (bcm_ind != -1) dvars[ivar]=((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; + if (bcm_ind != -1) dvars[ivar]=((scalers[idx]->GetData(ichan))/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 (bcm_ind != -1) { - fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; + fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[idx]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; dvars[ivar]+=fBCM_delta_charge[bcm_ind]; } } @@ -407,7 +408,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } else { //ifnotusefirstevent if (scalerloc[ivar]->ikind == ICOUNT) { - dvarsFirst[ivar] = scalers[isca]->GetData(ichan) ; + dvarsFirst[ivar] = scalers[idx]->GetData(ichan) ; scal_present_read.push_back(dvarsFirst[ivar]); scal_prev_read.push_back(0); } @@ -415,8 +416,8 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) dvarsFirst[ivar] = fTotalTime; } if (scalerloc[ivar]->ikind == IRATE) { - dvarsFirst[ivar] = (scalers[isca]->GetData(ichan))/fDeltaTime; - //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan)); //checks + dvarsFirst[ivar] = (scalers[idx]->GetData(ichan))/fDeltaTime; + //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[idx]->GetRate(ichan)); //checks } if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE) { @@ -431,12 +432,12 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } if (scalerloc[ivar]->ikind == ICURRENT) { dvarsFirst[ivar]=0.0; - if (bcm_ind != -1) dvarsFirst[ivar]=((scalers[isca]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; + if (bcm_ind != -1) dvarsFirst[ivar]=((scalers[idx]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; if (bcm_ind == fbcm_Current_Threshold_Index) scal_current= dvarsFirst[ivar]; } 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]; + fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[idx]->GetData(ichan))/fDeltaTime-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; dvarsFirst[ivar]+=fBCM_delta_charge[bcm_ind]; } } @@ -445,15 +446,15 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } } else { - cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<isca<<" "<<ichan<<endl; + cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<idx<<" "<<ichan<<endl; } }else{ // evcount != 0 - if (fDebugFile) *fDebugFile << "Debug dvars "<<i<<" "<<ivar<<" "<<isca<<" "<<ichan<<endl; + if (fDebugFile) *fDebugFile << "Debug dvars "<<i<<" "<<ivar<<" "<<idx<<" "<<ichan<<endl; if ((ivar < scalerloc.size()) && - (isca < scalers.size()) && + (idx < scalers.size()) && (ichan < MAXCHAN)) { if (scalerloc[ivar]->ikind == ICOUNT) { - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); if(scaldata < scal_prev_read[nscal]) { scal_overflows[nscal]++; } @@ -466,7 +467,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) dvars[ivar] = fTotalTime; } if (scalerloc[ivar]->ikind == IRATE) { - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); UInt_t diff; if(scaldata < scal_prev_read[nscal-1]) { diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata; @@ -474,7 +475,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) 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[idx]->GetRate(ichan));//checks } if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE) { @@ -490,7 +491,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) if (scalerloc[ivar]->ikind == ICURRENT) { dvars[ivar]=0; if (bcm_ind != -1) { - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); UInt_t diff; if(scaldata < scal_prev_read[nscal-1]) { diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata; @@ -504,7 +505,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } if (scalerloc[ivar]->ikind == ICHARGE) { if (bcm_ind != -1) { - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); UInt_t diff; if(scaldata < scal_prev_read[nscal-1]) { diff = (kMaxUInt-(scal_prev_read[nscal-1] - 1)) + scaldata; @@ -520,7 +521,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) } if (fDebugFile) *fDebugFile << " dvars "<<scalerloc[ivar]->ikind<<" "<<dvars[ivar]<<endl; } else { - cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<isca<<" "<<ichan<<endl; + cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<idx<<" "<<ichan<<endl; } } @@ -528,10 +529,10 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) // for (size_t i = 0; i < scalerloc.size(); i++) { size_t ivar = scalerloc[i]->ivar; - size_t isca = scalerloc[i]->iscaler; + size_t idx = scalerloc[i]->index; size_t ichan = scalerloc[i]->ichan; if (scalerloc[ivar]->ikind == ICUT+ICOUNT){ - UInt_t scaldata = scalers[isca]->GetData(ichan); + UInt_t scaldata = scalers[idx]->GetData(ichan); if ( scal_current > fbcm_Current_Threshold) { UInt_t diff; if(scaldata < scal_prev_read[nscal-1]) { @@ -628,18 +629,18 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) if (pos1 != minus1 && dbline.size()>4) { string sdesc = ""; for (size_t j=5; j<dbline.size(); j++) sdesc = sdesc+" "+dbline[j]; - UInt_t isca = atoi(dbline[1].c_str()); + UInt_t islot = atoi(dbline[1].c_str()); UInt_t ichan = atoi(dbline[2].c_str()); UInt_t ikind = atoi(dbline[3].c_str()); if (fDebugFile) - *fDebugFile << "add var "<<dbline[1]<<" desc = "<<sdesc<<" isca= "<<isca<<" "<<ichan<<" "<<ikind<<endl; + *fDebugFile << "add var "<<dbline[1]<<" desc = "<<sdesc<<" islot= "<<islot<<" "<<ichan<<" "<<ikind<<endl; TString tsname(dbline[4].c_str()); TString tsdesc(sdesc.c_str()); - AddVars(tsname,tsdesc,isca,ichan,ikind); + AddVars(tsname,tsdesc,islot,ichan,ikind); // add extra scaler which is cut on the current if (ikind == ICOUNT ||ikind == ITIME ||ikind == ICHARGE ) { tsname=tsname+"Cut"; - AddVars(tsname,tsdesc,isca,ichan,ICUT+ikind); + AddVars(tsname,tsdesc,islot,ichan,ICUT+ikind); } } pos1 = FindNoCase(dbline[0],smap); @@ -649,7 +650,8 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) UInt_t header, mask; char cdum[20]; sscanf(sinput.c_str(),"%s %d %d %d %x %x %d \n",cdum,&imodel,&icrate,&islot, &header, &mask, &inorm); - if ((fNormIdx >= 0) && (fNormIdx != inorm)) cout << "THcScalerEvtHandler::WARN: contradictory norm index "<<fNormIdx<<" "<<inorm<<endl; + if ((fNormSlot >= 0) && (fNormSlot != inorm)) cout << "THcScalerEvtHandler::WARN: contradictory norm slot "<<fNormSlot<<" "<<inorm<<endl; + fNormSlot = inorm; // slot number used for normalization. This variable is not used but is checked. Int_t clkchan = -1; Double_t clkfreq = 1; if (dbline.size()>8) { @@ -699,11 +701,16 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) // Headers must be unique over whole event, not // just within a ROC scalers[idx]->SetHeader(header, mask); +// The normalization slot has the clock in it, so we automatically recognize it. +// fNormIdx is the index in scaler[] and +// fNormSlot is the slot#, checked for consistency if (clkchan >= 0) { scalers[idx]->SetClock(defaultDT, clkchan, clkfreq); cout << "Setting scaler clock ... channel = "<<clkchan<<" ... freq = "<<clkfreq<<endl; if (fDebugFile) *fDebugFile <<"Setting scaler clock ... channel = "<<clkchan<<" ... freq = "<<clkfreq<<endl; fNormIdx = idx; + if (islot != fNormSlot) cout << "THcScalerEvtHandler:: WARN: contradictory norm slot ! "<<islot<<endl; + } } } @@ -770,6 +777,21 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) } #endif + // Verify that the slots are not defined twice + for (UInt_t i1=0; i1 < scalers.size()-1; i1++) { + for (UInt_t i2=i1+1; i2 < scalers.size(); i2++) { + if (scalers[i1]->GetSlot()==scalers[i2]->GetSlot()) + cout << "THcScalerEvtHandler:: WARN: same slot defined twice"<<endl; + } + } + // Identify indices of scalers[] vector to variables. + for (UInt_t i=0; i < scalers.size(); i++) { + for (UInt_t j = 0; j < scalerloc.size(); j++) { + if (scalerloc[j]->islot==static_cast<UInt_t>(scalers[i]->GetSlot())) + scalerloc[j]->index = i; + } + } + if(fDebugFile) *fDebugFile << "THcScalerEvtHandler:: Name of scaler bank "<<fName<<endl; for (size_t i=0; i<scalers.size(); i++) { if(fDebugFile) { @@ -784,15 +806,16 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) return kOK; } -void THcScalerEvtHandler::AddVars(TString name, TString desc, UInt_t iscal, +void THcScalerEvtHandler::AddVars(TString name, TString desc, UInt_t islot, UInt_t ichan, UInt_t ikind) { // need to add fName here to make it a unique variable. (Left vs Right HRS, for example) TString name1 = fName + name; TString desc1 = fName + desc; - HCScalerLoc *loc = new HCScalerLoc(name1, desc1, iscal, ichan, ikind); - loc->ivar = scalerloc.size(); // ivar will be the pointer to the dvars array. - scalerloc.push_back(loc); + // We don't yet know the correspondence between index of scalers[] and slots. + // Will put that in later. + scalerloc.push_back( new HCScalerLoc(name1, desc1, 0, islot, ichan, ikind, + scalerloc.size()) ); } void THcScalerEvtHandler::DefVars() diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h index 99bdb49f3b561d7e72b2fa610404062cde60c99a..41ce88c40416f21d83feb7b06546651694e7ff0b 100644 --- a/src/THcScalerEvtHandler.h +++ b/src/THcScalerEvtHandler.h @@ -20,13 +20,15 @@ #include <cstring> -class HCScalerLoc { // Utility class used by THaScalerEvtHandler +class HCScalerLoc { // Utility class used by THcScalerEvtHandler public: - HCScalerLoc(TString nm, TString desc, UInt_t isc, UInt_t ich, UInt_t iki) : - name(nm), description(desc), iscaler(isc), ichan(ich), ikind(iki) { }; + HCScalerLoc(TString nm, TString desc, UInt_t idx, Int_t s1, UInt_t ich, + UInt_t iki, Int_t iv) : + name(nm), description(desc), index(idx), islot(s1), ichan(ich), + ikind(iki), ivar(iv) { }; ~HCScalerLoc(); TString name, description; - UInt_t iscaler, ichan, ivar, ikind; + UInt_t index, islot, ichan, ikind, ivar; }; class THcScalerEvtHandler : public THaEvtTypeHandler { @@ -69,7 +71,7 @@ private: Double_t evcountR; UInt_t evNumber; Double_t evNumberR; - Int_t Nvars, ifound, fNormIdx, nscalers; + Int_t Nvars, ifound, fNormIdx, fNormSlot, nscalers; Double_t *dvars; UInt_t *dvars_prev_read; std::vector<UInt_t> scal_prev_read;