diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx index 17ad03e6306f0c5843370e52aaeaa4fedb76545b..ab059283dfda42a1ae754b7691233bc65bfecea4 100644 --- a/src/THcScalerEvtHandler.cxx +++ b/src/THcScalerEvtHandler.cxx @@ -66,12 +66,15 @@ using namespace Decoder; static const UInt_t ICOUNT = 1; static const UInt_t IRATE = 2; static const UInt_t ICURRENT = 3; +static const UInt_t ICHARGE = 4; +static const UInt_t ITIME = 5; +static const UInt_t ICUT = 6; static const UInt_t MAXCHAN = 32; 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), - dvars(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kFALSE), + dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE), fDelayedType(-1), fOnlyBanks(kFALSE) { fRocSet.clear(); @@ -112,24 +115,35 @@ Int_t THcScalerEvtHandler::ReadDatabase(const TDatime& date ) {0} }; gHcParms->LoadParmValues((DBRequest*)&list, prefix); - cout << " NUmber of BCMs = " << fNumBCMs << endl; + //cout << " NUmber of BCMs = " << fNumBCMs << endl; // fBCM_Gain = new Double_t[fNumBCMs]; fBCM_Offset = new Double_t[fNumBCMs]; - string bcm_namelist; + fBCM_delta_charge= new Double_t[fNumBCMs]; + string bcm_namelist; DBRequest list2[]={ {"BCM_Gain", fBCM_Gain, kDouble, (UInt_t) fNumBCMs}, {"BCM_Offset", fBCM_Offset, kDouble,(UInt_t) fNumBCMs}, {"BCM_Names", &bcm_namelist, kString}, + {"BCM_Current_threshold", &fbcm_Current_Threshold, kDouble,0, 1}, + {"BCM_Current_threshold_index", &fbcm_Current_Threshold_Index, kInt,0,1}, {0} }; + fbcm_Current_Threshold = 0.0; + fbcm_Current_Threshold_Index = 0; gHcParms->LoadParmValues((DBRequest*)&list2, prefix); vector<string> bcm_names = vsplit(bcm_namelist); fBCM_Name = new char* [fNumBCMs]; for(Int_t i=0;i<fNumBCMs;i++) { fBCM_Name[i] = new char[bcm_names[i].length()+1]; strcpy(fBCM_Name[i], bcm_names[i].c_str()); - cout << fBCM_Gain[i] << " " << fBCM_Offset[i] << " " << fBCM_Name[i] << endl; + // cout << fBCM_Gain[i] << " " << fBCM_Offset[i] << " " << fBCM_Name[i] << endl; + } + fTotalTime=0.; + fPrevTotalTime=0.; + fDeltaTime=-1.; + for(Int_t i=0;i<fNumBCMs;i++) { + fBCM_delta_charge[i]=0.; } // // @@ -299,7 +313,11 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) // The correspondance between dvars and the scaler and the channel // will be driven by a scaler.map file -- later - + Double_t scal_current=0; + fTotalTime = scalers[fNormIdx]->GetData(fClockChan)/fClockFreq; + fDeltaTime= fTotalTime - fPrevTotalTime; + fPrevTotalTime=fTotalTime; + 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; @@ -312,14 +330,20 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) if(fUseFirstEvent){ if (scalerloc[ivar]->ikind == ICOUNT){ dvars[ivar] = scalers[isca]->GetData(ichan); + scal_present_read.push_back(dvars[ivar]); + scal_prev_read.push_back(0.0); + dvarsFirst[ivar] = 0; + } + if (scalerloc[ivar]->ikind == ITIME){ + dvars[ivar] =fTotalTime; dvarsFirst[ivar] = 0; } if (scalerloc[ivar]->ikind == IRATE) { - dvars[ivar] = scalers[isca]->GetRate(ichan); - dvarsFirst[ivar] = dvars[ivar]; + dvars[ivar] = (scalers[isca]->GetData(ichan))/fDeltaTime; + dvarsFirst[ivar] = dvars[ivar]; //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan)); //checks } - if(scalerloc[ivar]->ikind == ICURRENT){ + if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE){ Int_t bcm_ind=0; for(Int_t itemp =0; itemp<fNumBCMs;itemp++) { @@ -329,19 +353,33 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) bcm_ind=itemp; } } - dvarsFirst[ivar]=(scalers[isca]->GetRate(ichan)-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; - printf("event %i index %i fBCMname %s scalerloc %s offset %f gain %f getrate %f computed%f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],scalers[isca]->GetRate(ichan),dvarsFirst[ivar]); + if (scalerloc[ivar]->ikind == ICURRENT) { + dvars[ivar]=((scalers[isca]->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) { + 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]); } if (fDebugFile) *fDebugFile << " dvarsFirst "<<scalerloc[ivar]->ikind<<" "<<dvarsFirst[ivar]<<endl; - } else { //ifnotusefirstevent-guessing it doesn't need changing since irate is the same as when you use fusefirstevent - if (scalerloc[ivar]->ikind == ICOUNT) dvarsFirst[ivar] = scalers[isca]->GetData(ichan); + } else { //ifnotusefirstevent + if (scalerloc[ivar]->ikind == ICOUNT) { + dvarsFirst[ivar] = scalers[isca]->GetData(ichan) ; + scal_present_read.push_back(dvarsFirst[ivar]); + scal_prev_read.push_back(0.0); + } + if (scalerloc[ivar]->ikind == ITIME){ + dvarsFirst[ivar] = fTotalTime; + } if (scalerloc[ivar]->ikind == IRATE) { - dvarsFirst[ivar] = scalers[isca]->GetRate(ichan); + dvarsFirst[ivar] = (scalers[isca]->GetData(ichan))/fDeltaTime; //printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan)); //checks } - if(scalerloc[ivar]->ikind == ICURRENT) + if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE) { Int_t bcm_ind=0; for(Int_t itemp =0; itemp<fNumBCMs;itemp++) @@ -352,8 +390,15 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) bcm_ind=itemp; } } - dvarsFirst[ivar]=(scalers[isca]->GetRate(ichan)-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; - printf("event %i index %i fBCM name %s scalerloc %s offset %f gain %f getrate%f\n", evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],scalers[isca]->GetRate(ichan)); + if (scalerloc[ivar]->ikind == ICURRENT) { + dvarsFirst[ivar]=((scalers[isca]->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) { + 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]; + } + printf("1st event %i index %i fBCM name %s scalerloc %s offset %f gain %f getrate%f\n", evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],dvarsFirst[ivar]); } if (fDebugFile) *fDebugFile << " dvarsFirst "<<scalerloc[ivar]->ikind<<" "<<dvarsFirst[ivar]<<endl; } @@ -366,12 +411,19 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) if ((ivar < scalerloc.size()) && (isca < scalers.size()) && (ichan < MAXCHAN)) { - if (scalerloc[ivar]->ikind == ICOUNT) dvars[ivar] = scalers[isca]->GetData(ichan)-dvarsFirst[ivar]; + if (scalerloc[ivar]->ikind == ICOUNT) { + dvars[ivar] = scalers[isca]->GetData(ichan)-dvarsFirst[ivar]; + scal_present_read[nscal]=dvars[ivar]; + nscal++; + } + if (scalerloc[ivar]->ikind == ITIME) { + dvars[ivar] = fTotalTime; + } if (scalerloc[ivar]->ikind == IRATE) { - dvars[ivar] = scalers[isca]->GetRate(ichan); + dvars[ivar] = (scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/fDeltaTime; // printf("%s %f\n",scalerloc[ivar]->name.Data(),scalers[isca]->GetRate(ichan));//checks } - if(scalerloc[ivar]->ikind == ICURRENT) + if(scalerloc[ivar]->ikind == ICURRENT || scalerloc[ivar]->ikind == ICHARGE) { Int_t bcm_ind=0; for(Int_t itemp =0; itemp<fNumBCMs;itemp++) @@ -382,9 +434,16 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) bcm_ind=itemp; } } - dvarsFirst[ivar]=(scalers[isca]->GetRate(ichan)-fBCM_Offset[bcm_ind])/fBCM_Gain[bcm_ind]; - printf("event %i index %i fBCMname %s scalerloc %s offset %f gain %f getrate %f computed%f\n",evcount, bcm_ind, fBCM_Name[bcm_ind],scalerloc[ivar]->name.Data(),fBCM_Offset[bcm_ind],fBCM_Gain[bcm_ind],scalers[isca]->GetRate(ichan),dvarsFirst[ivar]); - } + if (scalerloc[ivar]->ikind == ICURRENT) { + dvars[ivar]=((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/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) { + fBCM_delta_charge[bcm_ind]=fDeltaTime*((scalers[isca]->GetData(ichan)-scal_prev_read[nscal-1])/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]); + } if (fDebugFile) *fDebugFile << " dvars "<<scalerloc[ivar]->ikind<<" "<<dvars[ivar]<<endl; } else { cout << "THcScalerEvtHandler:: ERROR:: incorrect index "<<ivar<<" "<<isca<<" "<<ichan<<endl; @@ -392,10 +451,43 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata) } } - + // + for (size_t i = 0; i < scalerloc.size(); i++) { + size_t ivar = scalerloc[i]->ivar; + size_t isca = scalerloc[i]->iscaler; + size_t ichan = scalerloc[i]->ichan; + if (scalerloc[ivar]->ikind == ICUT+ICOUNT){ + if ( scal_current > fbcm_Current_Threshold) { + dvars[ivar] += (scalers[isca]->GetData(ichan)-dvars_prev_read[ivar]); + } + dvars_prev_read[ivar] = scalers[isca]->GetData(ichan); + } + if (scalerloc[ivar]->ikind == ICUT+ICHARGE){ + Int_t bcm_ind=0; + for(Int_t itemp =0; itemp<fNumBCMs;itemp++) + { + size_t match = string(scalerloc[ivar]->name.Data()).find(string(fBCM_Name[itemp])); + if (match!=string::npos) + { + bcm_ind=itemp; + } + } + if ( scal_current > fbcm_Current_Threshold) { + dvars[ivar] += fBCM_delta_charge[bcm_ind]; + } + } + if (scalerloc[ivar]->ikind == ICUT+ITIME){ + if ( scal_current > fbcm_Current_Threshold) { + dvars[ivar] += fDeltaTime; + } + } + } + // evcount = evcount + 1; evcountR = evcount; - + // + for (size_t j=0; j<scal_prev_read.size(); j++) scal_prev_read[j]=scal_present_read[j]; + // for (size_t j=0; j<scalers.size(); j++) scalers[j]->Clear(""); if (fDebugFile) *fDebugFile << "scaler tree ptr "<<fScalerTree<<endl; @@ -459,14 +551,19 @@ 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]; - Int_t isca = atoi(dbline[1].c_str()); - Int_t ichan = atoi(dbline[2].c_str()); - Int_t ikind = atoi(dbline[3].c_str()); + UInt_t isca = 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; TString tsname(dbline[4].c_str()); TString tsdesc(sdesc.c_str()); AddVars(tsname,tsdesc,isca,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); + } } pos1 = FindNoCase(dbline[0],smap); if (fDebugFile) *fDebugFile << "map ? "<<dbline[0]<<" "<<smap<<" "<<pos1<<" "<<dbline.size()<<endl; @@ -481,6 +578,8 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) if (dbline.size()>8) { clkchan = atoi(dbline[7].c_str()); clkfreq = 1.0*atoi(dbline[8].c_str()); + fClockChan=clkchan; + fClockFreq=clkfreq; } if (fDebugFile) { *fDebugFile << "map line "<<dec<<imodel<<" "<<icrate<<" "<<islot<<endl; @@ -602,11 +701,14 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) scalers[i]->DebugPrint(fDebugFile); } } + + + // return kOK; } -void THcScalerEvtHandler::AddVars(TString name, TString desc, Int_t iscal, - Int_t ichan, Int_t ikind) +void THcScalerEvtHandler::AddVars(TString name, TString desc, UInt_t iscal, + 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; @@ -621,9 +723,11 @@ void THcScalerEvtHandler::DefVars() // called after AddVars has finished being called. Nvars = scalerloc.size(); if (Nvars == 0) return; + dvars_prev_read = 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 memset(dvars, 0, Nvars*sizeof(Double_t)); + memset(dvars_prev_read, 0, Nvars*sizeof(Double_t)); memset(dvarsFirst, 0, Nvars*sizeof(Double_t)); if (gHaVars) { if(fDebugFile) *fDebugFile << "THcScalerEVtHandler:: Have gHaVars "<<gHaVars<<endl; diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h index 6a56e78f587a2e87c5d0ce44a172228a3ae360d7..5e151bd601e2a5379dd6321ab487e79dabc0ffa2 100644 --- a/src/THcScalerEvtHandler.h +++ b/src/THcScalerEvtHandler.h @@ -20,7 +20,7 @@ class HCScalerLoc { // Utility class used by THaScalerEvtHandler public: - HCScalerLoc(TString nm, TString desc, Int_t isc, Int_t ich, Int_t iki) : + 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 name, description; @@ -45,7 +45,7 @@ public: private: - void AddVars(TString name, TString desc, Int_t iscal, Int_t ichan, Int_t ikind); + void AddVars(TString name, TString desc, UInt_t iscal, UInt_t ichan, UInt_t ikind); void DefVars(); static size_t FindNoCase(const std::string& sdata, const std::string& skey); @@ -54,11 +54,22 @@ private: Int_t fNumBCMs; Double_t *fBCM_Gain; Double_t *fBCM_Offset; + Double_t *fBCM_delta_charge; + Double_t fTotalTime; + Double_t fDeltaTime; + Double_t fPrevTotalTime; + Double_t fbcm_Current_Threshold; + size_t fClockChan; + Double_t fClockFreq; + Int_t fbcm_Current_Threshold_Index; char** fBCM_Name; UInt_t evcount; Double_t evcountR; Int_t Nvars, ifound, fNormIdx, nscalers; Double_t *dvars; + Double_t *dvars_prev_read; + std::vector<Int_t> scal_prev_read; + std::vector<Int_t> scal_present_read; Double_t *dvarsFirst; TTree *fScalerTree; Bool_t fUseFirstEvent;