diff --git a/examples/PARAM/hcana.param b/examples/PARAM/hcana.param index 47b4766b5526cbf1fd9f0da9393347d6fe98188a..e437cdfb4e56c3aa9468c98c6eec7e5e5b970938 100644 --- a/examples/PARAM/hcana.param +++ b/examples/PARAM/hcana.param @@ -77,3 +77,7 @@ sdc_fix_lr = 0 # If 1, don't do the the propagation along the wire each time the hit # appears in a space point. (Which means the correction accumulates) sdc_fix_propcorr = 0 + +# Total number of PMTs in Gas Cherenkov detector. +hcer_tot_pmts = 2 + diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index 5587a54c3a50baaa1a4e345c350cea433e37cb35..fe32f7eb2c632abe31bedaabe08708f03915b69c 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -4,14 +4,7 @@ // // // Class for an Cherenkov detector consisting of onw pair of PMT's // // // -// Zafar Ahmed. Updated on December 24 2013. // -// Four more variables are added. // -// // -// npe Total Number of photo electrons // -// hit_1 Total hits in adc 1 // -// hit_2 Total hits in adc 2 // -// hit Total hits in adc 1 and 2 // -// // +// Zafar Ahmed. Second attempt. November 14 2013. // // Comment:No need to cahnge the Map file but may need to change the parameter file // // // // This code is written for following variables: // @@ -65,9 +58,8 @@ THcCherenkov::THcCherenkov( const char* name, const char* description, THaNonTrackingDetector(name,description,apparatus) { // Normal constructor with name and description - fPosADCHits = new TClonesArray("THcSignalHit",16); + fADCHits = new TClonesArray("THcSignalHit",16); -// fTrackProj = new TClonesArray( "THaTrackProj", 5 ); } //_____________________________________________________________________________ @@ -81,9 +73,15 @@ THcCherenkov::THcCherenkov( ) : THcCherenkov::~THcCherenkov() { // Destructor - delete [] fPosGain; - delete [] fPosPedLimit; - delete [] fPosPedMean; + delete [] fNPMT; + delete [] fADC; + delete [] fADC_P; + delete [] fNPE; + + delete [] fCerWidth; + delete [] fGain; + delete [] fPedLimit; + delete [] fPedMean; } //_____________________________________________________________________________ @@ -121,21 +119,34 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) cout << "THcCherenkov::ReadDatabase " << GetName() << endl; // Ahmed char prefix[2]; + char parname[100]; prefix[0]=tolower(GetApparatus()->GetName()[0]); prefix[1]='\0'; - fNelem = 2; // Default if not defined - - fPosGain = new Double_t[fNelem]; - fPosPedLimit = new Int_t[fNelem]; - fPosPedMean = new Double_t[fNelem]; + strcpy(parname,prefix); // This is taken from + strcat(parname,"cer_tot_pmts"); // THcScintillatorPlane + fNelem = (Int_t)gHcParms->Find(parname)->GetValue(); // class. + + // fNelem = 2; // Default if not defined + + fNPMT = new Int_t[fNelem]; + fADC = new Double_t[fNelem]; + fADC_P = new Double_t[fNelem]; + fNPE = new Double_t[fNelem]; + + fCerWidth = new Double_t[fNelem]; + fGain = new Double_t[fNelem]; + fPedLimit = new Int_t[fNelem]; + fPedMean = new Double_t[fNelem]; DBRequest list[]={ - {"cer_adc_to_npe", fPosGain, kDouble, fNelem}, // Ahmed - {"cer_ped_limit", fPosPedLimit, kInt, fNelem}, // Ahmed + {"cer_adc_to_npe", fGain, kDouble, fNelem}, // Ahmed + {"cer_ped_limit", fPedLimit, kInt, fNelem}, // Ahmed + {"cer_width", fCerWidth, kDouble, fNelem}, // Ahmed {0} }; + gHcParms->LoadParmValues((DBRequest*)&list,prefix); fIsInit = true; @@ -162,17 +173,12 @@ Int_t THcCherenkov::DefineVariables( EMode mode ) // No. They show up in tree as Ndata.H.aero.postdchits for example RVarDef vars[] = { - {"adc_1", "Raw First ADC Amplitude", "fA_1"}, - {"adc_2", "Raw Second ADC Amplitude", "fA_2"}, - {"adc_p_1", "Pedestal Subtracted First ADC Amplitude", "fA_p_1"}, - {"adc_p_2", "Pedestal Subtracted Second ADC Amplitude", "fA_p_2"}, - {"npe_1", "PEs of First Tube", "fNpe_1"}, - {"npe_2", "PEs of Second Tube", "fNpe_2"}, - {"npe", "Total number of PEs", "fNpe"}, - {"hit_1", "ADC hits First Tube", "fNHits_1"}, - {"hit_2", "ADC hits Second Tube", "fNHits_2"}, - {"hit", "Total ADC hits", "fNHits"}, - {"posadchits", "List of Positive ADC hits","fPosADCHits.THcSignalHit.GetPaddleNumber()"}, + {"PhotoTubes", "Nuber of Cherenkov photo tubes", "fNPMT"}, + {"ADC", "Raw ADC values", "fADC"}, + {"ADC_P", "Pedestal Subtracted ADC values", "fADC_P"}, + {"NPE", "Number of Photo electrons", "fNPE"}, + {"NPEsum", "Sum of Number of Photo electrons", "fNPEsum"}, + {"NCherHit", "Number of Hits(Cherenkov)", "fNCherHit"}, { 0 } }; @@ -183,22 +189,20 @@ inline void THcCherenkov::Clear(Option_t* opt) { // Clear the hit lists - fPosADCHits->Clear(); + fADCHits->Clear(); // Clear Cherenkov variables from h_trans_cer.f fNhits = 0; // Don't really need to do this. (Be sure this called before Decode) - - fA_1 = 0; - fA_2 = 0; - fA_p_1 = 0; - fA_p_2 = 0; - fNpe_1 = 0; - fNpe_2 = 0; - fNpe = 0; - fNHits_1 = 0; - fNHits_2 = 0; - fNHits = 0; + fNPEsum = 0; + fNCherHit = 0; + + for(Int_t itube = 0;itube < fNelem;itube++) { + fNPMT[itube] = 0; + fADC[itube] = 0; + fADC_P[itube] = 0; + fNPE[itube] = 0; + } } @@ -209,29 +213,25 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata ) fNhits = DecodeToHitList(evdata); if(gHaCuts->Result("Pedestal_event")) { - AccumulatePedestals(fRawHitList); - fAnalyzePedestals = 1; // Analyze pedestals first normal events return(0); } if(fAnalyzePedestals) { - CalculatePedestals(); - fAnalyzePedestals = 0; // Don't analyze pedestals next event } Int_t ihit = 0; - Int_t nPosADCHits=0; + Int_t nADCHits=0; while(ihit < fNhits) { THcCherenkovHit* hit = (THcCherenkovHit *) fRawHitList->At(ihit); - // ADC positive hit + // ADC hit if(hit->fADC_pos > 0) { - THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); + THcSignalHit *sighit = (THcSignalHit*) fADCHits->ConstructedAt(nADCHits++); sighit->Set(hit->fCounter, hit->fADC_pos); } @@ -274,7 +274,6 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) //tracks enddo ------------------------------------------------------------------------------------------------------------------ */ - for(Int_t ihit=0; ihit < fNhits; ihit++) { THcCherenkovHit* hit = (THcCherenkovHit *) fRawHitList->At(ihit); // nhit = 1, hcer_tot_hits @@ -291,42 +290,21 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) //tracks if ( ihit != npmt ) cout << "ihit != npmt " << endl; - if ( npmt == 0 ) { - fA_1 = hit->fADC_pos; - fA_p_1 = hit->fADC_pos - fPosPedMean[npmt]; - if ( ( fA_p_1 > 50 ) && ( hit->fADC_pos < 8000 ) ) { - fNpe_1 = fPosGain[npmt]*fA_p_1; - fNHits_1 ++; - } else if ( hit->fADC_pos > 8000 ) { - fNpe_1 = 100.0; - } else { - fNpe_1 = 0.0; - } - } - - if ( npmt == 1 ) { - fA_2 = hit->fADC_pos; - fA_p_2 = hit->fADC_pos - fPosPedMean[npmt]; - if ( ( fA_p_2 > 50 ) && ( hit->fADC_pos < 8000 ) ) { - fNpe_2 = fPosGain[npmt]*fA_p_2; - fNHits_2 ++; - } else if ( hit->fADC_pos > 8000 ) { - fNpe_2 = 100.0; - } else { - fNpe_2 = 0.0; - } - } - - if ( npmt == 0 ) { - fNpe += fNpe_1; - fNHits += fNHits_1; - } + fNPMT[npmt] = hit->fCounter; + fADC[npmt] = hit->fADC_pos; + fADC_P[npmt] = hit->fADC_pos - fPedMean[npmt]; - if ( npmt == 1 ) { - fNpe += fNpe_2; - fNHits += fNHits_2; + if ( ( fADC_P[npmt] > fCerWidth[npmt] ) && ( hit->fADC_pos < 8000 ) ) { + fNPE[npmt] = fGain[npmt]*fADC_P[npmt]; + fNCherHit ++; + } else if ( hit->fADC_pos > 8000 ) { + fNPE[npmt] = 100.0; + } else { + fNPE[npmt] = 0.0; } + fNPEsum += fNPE[npmt]; + } ApplyCorrections(); @@ -346,18 +324,16 @@ void THcCherenkov::InitializePedestals( ) { fNPedestalEvents = 0; fMinPeds = 500; // In engine, this is set in parameter file - fPosPedSum = new Int_t [fNelem]; - fPosPedSum2 = new Int_t [fNelem]; - fPosPedLimit = new Int_t [fNelem]; - fPosPedCount = new Int_t [fNelem]; + fPedSum = new Int_t [fNelem]; + fPedSum2 = new Int_t [fNelem]; + fPedCount = new Int_t [fNelem]; - fPosPed = new Double_t [fNelem]; - fPosThresh = new Double_t [fNelem]; + fPed = new Double_t [fNelem]; + fThresh = new Double_t [fNelem]; for(Int_t i=0;i<fNelem;i++) { - fPosPedSum[i] = 0; - fPosPedSum2[i] = 0; - fPosPedLimit[i] = 1000; // In engine, this are set in parameter file - fPosPedCount[i] = 0; + fPedSum[i] = 0; + fPedSum2[i] = 0; + fPedCount[i] = 0; } } @@ -375,13 +351,13 @@ void THcCherenkov::AccumulatePedestals(TClonesArray* rawhits) THcCherenkovHit* hit = (THcCherenkovHit *) rawhits->At(ihit); Int_t element = hit->fCounter - 1; - Int_t adcpos = hit->fADC_pos; - if(adcpos <= fPosPedLimit[element]) { - fPosPedSum[element] += adcpos; - fPosPedSum2[element] += adcpos*adcpos; - fPosPedCount[element]++; - if(fPosPedCount[element] == fMinPeds/5) { - fPosPedLimit[element] = 100 + fPosPedSum[element]/fPosPedCount[element]; + Int_t nadc = hit->fADC_pos; + if(nadc <= fPedLimit[element]) { + fPedSum[element] += nadc; + fPedSum2[element] += nadc*nadc; + fPedCount[element]++; + if(fPedCount[element] == fMinPeds/5) { + fPedLimit[element] = 100 + fPedSum[element]/fPedCount[element]; } } ihit++; @@ -400,19 +376,17 @@ void THcCherenkov::CalculatePedestals( ) // cout << "Plane: " << fPlaneNum << endl; for(Int_t i=0; i<fNelem;i++) { - // Positive tubes - fPosPed[i] = ((Double_t) fPosPedSum[i]) / TMath::Max(1, fPosPedCount[i]); - fPosThresh[i] = fPosPed[i] + 15; - - // cout << i+1 << " " << fPosPed[i] << " " << fNegPed[i] << endl; + // PMT tubes + fPed[i] = ((Double_t) fPedSum[i]) / TMath::Max(1, fPedCount[i]); + fThresh[i] = fPed[i] + 15; // Just a copy for now, but allow the possibility that fXXXPedMean is set // in a parameter file and only overwritten if there is a sufficient number of // pedestal events. (So that pedestals are sensible even if the pedestal events were // not acquired.) if(fMinPeds > 0) { - if(fPosPedCount[i] > fMinPeds) { - fPosPedMean[i] = fPosPed[i]; + if(fPedCount[i] > fMinPeds) { + fPedMean[i] = fPed[i]; } } } @@ -428,9 +402,9 @@ void THcCherenkov::Print( const Option_t* opt) const { cout << "Cherenkov Pedestals" << endl; // Ahmed - cout << "No. Pos" << endl; + cout << "No. ADC" << endl; for(Int_t i=0; i<fNelem; i++){ - cout << " " << i << " " << fPosPed[i] << endl; + cout << " " << i << " " << fPed[i] << endl; } cout << endl; diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h index 4040a56e54056154d27831e17dd32c1e4e026c10..3196321072bab83b612f6ba02603384c6935b5dc 100644 --- a/src/THcCherenkov.h +++ b/src/THcCherenkov.h @@ -36,78 +36,39 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { THcCherenkov(); // for ROOT I/O protected: - Int_t fAnalyzePedestals; + Int_t fAnalyzePedestals; // Parameters - Double_t* fPosGain; - Double_t* fNegGain; + Double_t* fGain; + Double_t* fCerWidth; // Event information - Int_t fNhits; - - Float_t* fA_Pos; // [fNelem] Array of ADC amplitudes - Float_t* fA_Neg; // [fNelem] Array of ADC amplitudes - Float_t* fA_Pos_p; // [fNelem] Array of ped-subtracted ADC amplitudes - Float_t* fA_Neg_p; // [fNelem] Array of ped-subtracted ADC amplitudes - Float_t* fT_Pos; // [fNelem] Array of TDCs - Float_t* fT_Neg; // [fNelem] Array of TDCs - - Double_t fA_1; // Ahmed - Double_t fA_2; // Ahmed - Double_t fNHits_1; // Ahmed - Double_t fNHits_2; // Ahmed - Double_t fNHits; // Ahmed - Double_t fA_p_1; // Ahmed - Double_t fA_p_2; // Ahmed - Double_t fNpe_1; // Ahmed - Double_t fNpe_2; // Ahmed - Double_t fNpe; // Ahmed - - Double_t fPosNpeSum; - Double_t fNegNpeSum; - Double_t fNpeSum; - Int_t fNGoodHits; - Int_t fNADCPosHits; - Int_t fNADCNegHits; - Int_t fNTDCPosHits; - Int_t fNTDCNegHits; - - Double_t* fPosNpe; // [fNelem] # Photoelectrons per positive tube - Double_t* fNegNpe; // [fNelem] # Photoelectrons per negative tube - + Int_t fNhits; + Int_t* fNPMT; // [fNelem] Array of ADC amplitudes + Double_t* fADC; // [fNelem] Array of ADC amplitudes + Double_t* fADC_P; // [fNelem] Array of ADC amplitudes + Double_t* fNPE; // [fNelem] Array of ADC amplitudes + Double_t fNPEsum; // [fNelem] Array of ADC amplitudes + Double_t fNCherHit; // [fNelem] Array of ADC amplitudes // Hits - TClonesArray* fPosTDCHits; - TClonesArray* fNegTDCHits; - TClonesArray* fPosADCHits; - TClonesArray* fNegADCHits; + TClonesArray* fADCHits; // Pedestals - Int_t fNPedestalEvents; - Int_t fMinPeds; - Int_t *fPosPedSum; /* Accumulators for pedestals */ - Int_t *fPosPedSum2; - Int_t *fPosPedLimit; - Int_t *fPosPedCount; - Int_t *fNegPedSum; - Int_t *fNegPedSum2; - Int_t *fNegPedLimit; - Int_t *fNegPedCount; - - Double_t *fPosPed; - Double_t *fPosSig; - Double_t *fPosThresh; - Double_t *fNegPed; - Double_t *fNegSig; - Double_t *fNegThresh; - - Double_t *fPosPedMean; /* Can be supplied in parameters and then */ - Double_t *fNegPedMean; /* be overwritten from ped analysis */ + Int_t fNPedestalEvents; + Int_t fMinPeds; + Int_t* fPedSum; /* Accumulators for pedestals */ + Int_t* fPedSum2; + Int_t* fPedLimit; + Double_t* fPedMean; /* Can be supplied in parameters and then */ + Int_t* fPedCount; + Double_t* fPed; + Double_t* fThresh; void Setup(const char* name, const char* description); virtual void InitializePedestals( ); - ClassDef(THcCherenkov,0) // Generic cherenkov class + ClassDef(THcCherenkov,0) // Generic cherenkov class }; #endif