diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx index 11c74d9eca121e13cfa0e53b61fc0f804ba6e00a..2b0cffc557f57ef18a5da4f7d43359cd5f971c12 100644 --- a/src/THcAerogel.cxx +++ b/src/THcAerogel.cxx @@ -1,11 +1,10 @@ /** \class THcAerogel \ingroup Detectors -Class for an Aerogel detector consisting of pairs of PMT's -attached to a diffuser box -Will have a fixed number of pairs, but need to later make this -configurable. - + Class for an Aerogel detector consisting of pairs of PMT's + attached to a diffuser box + Will have a fixed number of pairs, but need to later make this + configurable. */ #include "THcAerogel.h" @@ -24,7 +23,6 @@ configurable. #include "THaTrack.h" #include "TClonesArray.h" #include "TMath.h" - #include "THaTrackProj.h" #include "THcRawAdcHit.h" @@ -40,33 +38,55 @@ THcAerogel::THcAerogel( const char* name, const char* description, THaApparatus* apparatus ) : THaNonTrackingDetector(name,description,apparatus) { - // Normal constructor with name and description - fPosTDCHits = new TClonesArray("THcSignalHit",16); - fNegTDCHits = new TClonesArray("THcSignalHit",16); - fPosADCHits = new TClonesArray("THcSignalHit",16); - fNegADCHits = new TClonesArray("THcSignalHit",16); - - frPosAdcPedRaw = new TClonesArray("THcSignalHit", 16); - frPosAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16); - frPosAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16); - frPosAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16); - - frPosAdcPed = new TClonesArray("THcSignalHit", 16); - frPosAdcPulseInt = new TClonesArray("THcSignalHit", 16); - frPosAdcPulseAmp = new TClonesArray("THcSignalHit", 16); - frNegAdcPedRaw = new TClonesArray("THcSignalHit", 16); - frNegAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16); - frNegAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16); - frNegAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16); - - frNegAdcPed = new TClonesArray("THcSignalHit", 16); - frNegAdcPulseInt = new TClonesArray("THcSignalHit", 16); - frNegAdcPulseAmp = new TClonesArray("THcSignalHit", 16); + // Normal constructor with name and description + frPosAdcPedRaw = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPulseIntRaw = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPulseAmpRaw = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPulseTimeRaw = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPed = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPulseInt = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frPosAdcPulseAmp = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + frNegAdcPedRaw = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPulseIntRaw = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPulseAmpRaw = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPulseTimeRaw = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPed = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPulseInt = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + frNegAdcPulseAmp = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + fPosAdcErrorFlag = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + fNegAdcErrorFlag = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + + fNumPosAdcHits = vector<Int_t> (MaxNumPosAeroPmt, 0.0); + fNumGoodPosAdcHits = vector<Int_t> (MaxNumPosAeroPmt, 0.0); + fNumNegAdcHits = vector<Int_t> (MaxNumNegAeroPmt, 0.0); + fNumGoodNegAdcHits = vector<Int_t> (MaxNumNegAeroPmt, 0.0); + fNumTracksMatched = vector<Int_t> (MaxNumPosAeroPmt, 0.0); + fNumTracksFired = vector<Int_t> (MaxNumPosAeroPmt, 0.0); + fPosNpe = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fNegNpe = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodPosAdcPed = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodPosAdcPulseInt = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodPosAdcPulseIntRaw = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodPosAdcPulseAmp = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodPosAdcPulseTime = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fGoodNegAdcPed = vector<Double_t> (MaxNumNegAeroPmt, 0.0); + fGoodNegAdcPulseInt = vector<Double_t> (MaxNumNegAeroPmt, 0.0); + fGoodNegAdcPulseIntRaw = vector<Double_t> (MaxNumNegAeroPmt, 0.0); + fGoodNegAdcPulseAmp = vector<Double_t> (MaxNumNegAeroPmt, 0.0); + fGoodNegAdcPulseTime = vector<Double_t> (MaxNumNegAeroPmt, 0.0); + + // 6 GeV variables + fPosTDCHits = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*16); + fNegTDCHits = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*16); + fPosADCHits = new TClonesArray("THcSignalHit", MaxNumPosAeroPmt*MaxNumAdcPulse); + fNegADCHits = new TClonesArray("THcSignalHit", MaxNumNegAeroPmt*MaxNumAdcPulse); + + fPosNpeSixGev = vector<Double_t> (MaxNumPosAeroPmt, 0.0); + fNegNpeSixGev = vector<Double_t> (MaxNumPosAeroPmt, 0.0); InitArrays(); -// fTrackProj = new TClonesArray( "THaTrackProj", 5 ); } //_____________________________________________________________________________ @@ -74,29 +94,29 @@ THcAerogel::THcAerogel( ) : THaNonTrackingDetector() { // Constructor + frPosAdcPedRaw = NULL; + frPosAdcPulseIntRaw = NULL; + frPosAdcPulseAmpRaw = NULL; + frPosAdcPulseTimeRaw = NULL; + frPosAdcPed = NULL; + frPosAdcPulseInt = NULL; + frPosAdcPulseAmp = NULL; + frNegAdcPedRaw = NULL; + frNegAdcPulseIntRaw = NULL; + frNegAdcPulseAmpRaw = NULL; + frNegAdcPulseTimeRaw = NULL; + frNegAdcPed = NULL; + frNegAdcPulseInt = NULL; + frNegAdcPulseAmp = NULL; + fPosAdcErrorFlag = NULL; + fNegAdcErrorFlag = NULL; + + // 6 GeV variables fPosTDCHits = NULL; fNegTDCHits = NULL; fPosADCHits = NULL; fNegADCHits = NULL; - frPosAdcPedRaw = NULL; - frPosAdcPulseIntRaw = NULL; - frPosAdcPulseAmpRaw = NULL; - frPosAdcPulseTimeRaw = NULL; - - frPosAdcPed = NULL; - frPosAdcPulseInt = NULL; - frPosAdcPulseAmp = NULL; - - frNegAdcPedRaw = NULL; - frNegAdcPulseIntRaw = NULL; - frNegAdcPulseAmpRaw = NULL; - frNegAdcPulseTimeRaw = NULL; - - frNegAdcPed = NULL; - frNegAdcPulseInt = NULL; - frNegAdcPulseAmp = NULL; - InitArrays(); } @@ -105,98 +125,99 @@ THcAerogel::THcAerogel( ) : THcAerogel::~THcAerogel() { // Destructor - DeleteArrays(); + delete frPosAdcPedRaw; frPosAdcPedRaw = NULL; + delete frPosAdcPulseIntRaw; frPosAdcPulseIntRaw = NULL; + delete frPosAdcPulseAmpRaw; frPosAdcPulseAmpRaw = NULL; + delete frPosAdcPulseTimeRaw; frPosAdcPulseTimeRaw = NULL; + delete frPosAdcPed; frPosAdcPed = NULL; + delete frPosAdcPulseInt; frPosAdcPulseInt = NULL; + delete frPosAdcPulseAmp; frPosAdcPulseAmp = NULL; + delete frNegAdcPedRaw; frNegAdcPedRaw = NULL; + delete frNegAdcPulseIntRaw; frNegAdcPulseIntRaw = NULL; + delete frNegAdcPulseAmpRaw; frNegAdcPulseAmpRaw = NULL; + delete frNegAdcPulseTimeRaw; frNegAdcPulseTimeRaw = NULL; + delete frNegAdcPed; frNegAdcPed = NULL; + delete frNegAdcPulseInt; frNegAdcPulseInt = NULL; + delete frNegAdcPulseAmp; frNegAdcPulseAmp = NULL; + delete fPosAdcErrorFlag; fPosAdcErrorFlag = NULL; + delete fNegAdcErrorFlag; fNegAdcErrorFlag = NULL; + // 6 GeV variables delete fPosTDCHits; fPosTDCHits = NULL; delete fNegTDCHits; fNegTDCHits = NULL; delete fPosADCHits; fPosADCHits = NULL; delete fNegADCHits; fNegADCHits = NULL; - delete frPosAdcPedRaw; frPosAdcPedRaw = NULL; - delete frPosAdcPulseIntRaw; frPosAdcPulseIntRaw = NULL; - delete frPosAdcPulseAmpRaw; frPosAdcPulseAmpRaw = NULL; - delete frPosAdcPulseTimeRaw; frPosAdcPulseTimeRaw = NULL; - - delete frPosAdcPed; frPosAdcPed = NULL; - delete frPosAdcPulseInt; frPosAdcPulseInt = NULL; - delete frPosAdcPulseAmp; frPosAdcPulseAmp = NULL; - - delete frNegAdcPedRaw; frNegAdcPedRaw = NULL; - delete frNegAdcPulseIntRaw; frNegAdcPulseIntRaw = NULL; - delete frNegAdcPulseAmpRaw; frNegAdcPulseAmpRaw = NULL; - delete frNegAdcPulseTimeRaw; frNegAdcPulseTimeRaw = NULL; + DeleteArrays(); - delete frNegAdcPed; frNegAdcPed = NULL; - delete frNegAdcPulseInt; frNegAdcPulseInt = NULL; - delete frNegAdcPulseAmp; frNegAdcPulseAmp = NULL; } //_____________________________________________________________________________ void THcAerogel::InitArrays() { - fA_Pos = NULL; - fA_Neg = NULL; - fA_Pos_p = NULL; - fA_Neg_p = NULL; - fT_Pos = NULL; - fT_Neg = NULL; fPosGain = NULL; fNegGain = NULL; + + // 6 GeV variables + fA_Pos = NULL; + fA_Neg = NULL; + fA_Pos_p = NULL; + fA_Neg_p = NULL; + fT_Pos = NULL; + fT_Neg = NULL; fPosPedLimit = NULL; fNegPedLimit = NULL; - fPosPedMean = NULL; - fNegPedMean = NULL; - fPosNpe = NULL; - fNegNpe = NULL; - fPosPedSum = NULL; - fPosPedSum2 = NULL; + fPosPedMean = NULL; + fNegPedMean = NULL; + fPosPedSum = NULL; + fPosPedSum2 = NULL; fPosPedCount = NULL; - fNegPedSum = NULL; - fNegPedSum2 = NULL; + fNegPedSum = NULL; + fNegPedSum2 = NULL; fNegPedCount = NULL; - fPosPed = NULL; - fPosSig = NULL; - fPosThresh = NULL; - fNegPed = NULL; - fNegSig = NULL; - fNegThresh = NULL; + fPosPed = NULL; + fPosSig = NULL; + fPosThresh = NULL; + fNegPed = NULL; + fNegSig = NULL; + fNegThresh = NULL; } //_____________________________________________________________________________ void THcAerogel::DeleteArrays() { - delete [] fA_Pos; fA_Pos = NULL; - delete [] fA_Neg; fA_Neg = NULL; - delete [] fA_Pos_p; fA_Pos_p = NULL; - delete [] fA_Neg_p; fA_Neg_p = NULL; - delete [] fT_Pos; fT_Pos = NULL; - delete [] fT_Neg; fT_Neg = NULL; delete [] fPosGain; fPosGain = NULL; delete [] fNegGain; fNegGain = NULL; + + // 6 GeV variables + delete [] fA_Pos; fA_Pos = NULL; + delete [] fA_Neg; fA_Neg = NULL; + delete [] fA_Pos_p; fA_Pos_p = NULL; + delete [] fA_Neg_p; fA_Neg_p = NULL; + delete [] fT_Pos; fT_Pos = NULL; + delete [] fT_Neg; fT_Neg = NULL; delete [] fPosPedLimit; fPosPedLimit = NULL; delete [] fNegPedLimit; fNegPedLimit = NULL; - delete [] fPosPedMean; fPosPedMean = NULL; - delete [] fNegPedMean; fNegPedMean = NULL; - delete [] fPosNpe; fPosNpe = NULL; - delete [] fNegNpe; fNegNpe = NULL; - delete [] fPosPedSum; fPosPedSum = NULL; - delete [] fPosPedSum2; fPosPedSum2 = NULL; + delete [] fPosPedMean; fPosPedMean = NULL; + delete [] fNegPedMean; fNegPedMean = NULL; + delete [] fPosPedSum; fPosPedSum = NULL; + delete [] fPosPedSum2; fPosPedSum2 = NULL; delete [] fPosPedCount; fPosPedCount = NULL; - delete [] fNegPedSum; fNegPedSum = NULL; - delete [] fNegPedSum2; fNegPedSum2 = NULL; + delete [] fNegPedSum; fNegPedSum = NULL; + delete [] fNegPedSum2; fNegPedSum2 = NULL; delete [] fNegPedCount; fNegPedCount = NULL; - delete [] fPosPed; fPosPed = NULL; - delete [] fPosSig; fPosSig = NULL; - delete [] fPosThresh; fPosThresh = NULL; - delete [] fNegPed; fNegPed = NULL; - delete [] fNegSig; fNegSig = NULL; - delete [] fNegThresh; fNegThresh = NULL; + delete [] fPosPed; fPosPed = NULL; + delete [] fPosSig; fPosSig = NULL; + delete [] fPosThresh; fPosThresh = NULL; + delete [] fNegPed; fNegPed = NULL; + delete [] fNegSig; fNegSig = NULL; + delete [] fNegThresh; fNegThresh = NULL; } //_____________________________________________________________________________ THaAnalysisObject::EStatus THcAerogel::Init( const TDatime& date ) { - cout << "THcAerogel::Init " << GetName() << endl; + cout << "THcAerogel::Init for: " << GetName() << endl; char EngineDID[] = "xAERO"; EngineDID[0] = toupper(GetApparatus()->GetName()[0]); @@ -223,55 +244,94 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) // This function is called by THaDetectorBase::Init() once at the beginning // of the analysis. - cout << "THcAerogel::ReadDatabase " << GetName() << endl; + cout << "THcAerogel::ReadDatabase for: " << GetName() << endl; char prefix[2]; - prefix[0]=tolower(GetApparatus()->GetName()[0]); prefix[1]='\0'; - fNelem = 8; // Default if not defined - Bool_t optional=true ; + fNRegions = 1; // Default if not set in parameter file + DBRequest listextra[]={ - {"aero_num_pairs", &fNelem, kInt,0,optional}, + {"aero_num_pairs", &fNelem, kInt}, {0} }; - gHcParms->LoadParmValues((DBRequest*)&listextra,prefix); - fA_Pos = new Float_t[fNelem]; - fA_Neg = new Float_t[fNelem]; - fA_Pos_p = new Float_t[fNelem]; - fA_Neg_p = new Float_t[fNelem]; - fT_Pos = new Float_t[fNelem]; - fT_Neg = new Float_t[fNelem]; + gHcParms->LoadParmValues((DBRequest*)&listextra, prefix); + + Bool_t optional = true ; + + cout << "Number of " << GetApparatus()->GetName() << "." + << GetName() << " PMT pairs defined = " << fNelem << endl; fPosGain = new Double_t[fNelem]; fNegGain = new Double_t[fNelem]; + + // 6 GeV variables + fTdcOffset = 0; // Offset to make reference time subtracted times positve fPosPedLimit = new Int_t[fNelem]; fNegPedLimit = new Int_t[fNelem]; - fPosPedMean = new Double_t[fNelem]; - fNegPedMean = new Double_t[fNelem]; - - fTdcOffset = 0; // Offset to make reference time subtracted times positve + fA_Pos = new Float_t[fNelem]; + fA_Neg = new Float_t[fNelem]; + fA_Pos_p = new Float_t[fNelem]; + fA_Neg_p = new Float_t[fNelem]; + fT_Pos = new Float_t[fNelem]; + fT_Neg = new Float_t[fNelem]; + fPosPedMean = new Double_t[fNelem]; + fNegPedMean = new Double_t[fNelem]; // Create arrays to hold pedestal results - InitializePedestals(); + if (fSixGevData) InitializePedestals(); + + // Region parameters + fRegionsValueMax = fNRegions * 8; + fRegionValue = new Double_t[fRegionsValueMax]; DBRequest list[]={ - {"aero_pos_gain", fPosGain, kDouble, (UInt_t) fNelem}, - {"aero_neg_gain", fNegGain, kDouble, (UInt_t) fNelem}, - {"aero_pos_ped_limit", fPosPedLimit, kInt, (UInt_t) fNelem}, - {"aero_neg_ped_limit", fNegPedLimit, kInt, (UInt_t) fNelem}, - {"aero_pos_ped_mean", fPosPedMean, kDouble, (UInt_t) fNelem,optional}, - {"aero_neg_ped_mean", fNegPedMean, kDouble, (UInt_t) fNelem,optional}, - {"aero_tdc_offset", &fTdcOffset, kInt, 0, optional}, - {"aero_min_peds", &fMinPeds, kInt, 0, optional}, + {"aero_num_regions", &fNRegions, kInt}, + {"aero_red_chi2_min", &fRedChi2Min, kDouble}, + {"aero_red_chi2_max", &fRedChi2Max, kDouble}, + {"aero_beta_min", &fBetaMin, kDouble}, + {"aero_beta_max", &fBetaMax, kDouble}, + {"aero_enorm_min", &fENormMin, kDouble}, + {"aero_enorm_max", &fENormMax, kDouble}, + {"aero_diff_box_zpos", &fDiffBoxZPos, kDouble}, + {"aero_npe_thresh", &fNpeThresh, kDouble}, + {"aero_adcTimeWindowMin", &fAdcTimeWindowMin, kDouble}, + {"aero_adcTimeWindowMax", &fAdcTimeWindowMax, kDouble}, + {"aero_debug_adc", &fDebugAdc, kInt, 0, 1}, + {"aero_six_gev_data", &fSixGevData, kInt, 0, 1}, + {"aero_pos_gain", fPosGain, kDouble, (UInt_t) fNelem}, + {"aero_neg_gain", fNegGain, kDouble, (UInt_t) fNelem}, + {"aero_pos_ped_limit", fPosPedLimit, kInt, (UInt_t) fNelem, optional}, + {"aero_neg_ped_limit", fNegPedLimit, kInt, (UInt_t) fNelem, optional}, + {"aero_pos_ped_mean", fPosPedMean, kDouble, (UInt_t) fNelem, optional}, + {"aero_neg_ped_mean", fNegPedMean, kDouble, (UInt_t) fNelem, optional}, + {"aero_tdc_offset", &fTdcOffset, kInt, 0, optional}, + {"aero_min_peds", &fMinPeds, kInt, 0, optional}, + {"aero_region", &fRegionValue[0], kDouble, (UInt_t) fRegionsValueMax}, + {0} }; - gHcParms->LoadParmValues((DBRequest*)&list,prefix); + + fSixGevData = 0; // Set 6 GeV data parameter to false unless set in parameter file + fDebugAdc = 0; // Set ADC debug parameter to false unless set in parameter file + + gHcParms->LoadParmValues((DBRequest*)&list, prefix); + + if (fSixGevData) cout << "6 GeV Data Analysis Flag Set To TRUE" << endl; fIsInit = true; + cout << "Track Matching Parameters for: " << GetApparatus()->GetName() + << "." << GetName() << endl; + for (Int_t iregion = 0; iregion < fNRegions; iregion++) { + cout << "Region = " << iregion + 1 << endl; + for (Int_t ivalue = 0; ivalue < 8; ivalue++) + cout << fRegionValue[GetIndex(iregion, ivalue)] << " "; + cout << endl; + } + return kOK; } @@ -280,7 +340,7 @@ Int_t THcAerogel::DefineVariables( EMode mode ) { // Initialize global variables for histogramming and tree - cout << "THcAerogel::DefineVariables called " << GetName() << endl; + cout << "THcAerogel::DefineVariables called for: " << GetName() << endl; if( mode == kDefine && fIsSetup ) return kOK; fIsSetup = ( mode == kDefine ); @@ -290,100 +350,119 @@ Int_t THcAerogel::DefineVariables( EMode mode ) // Do we need to put the number of pos/neg TDC/ADC hits into the variables? // No. They show up in tree as Ndata.H.aero.postdchits for example - RVarDef vars[] = { - {"postdchits", "List of Positive TDC hits", - "fPosTDCHits.THcSignalHit.GetPaddleNumber()"}, - {"negtdchits", "List of Negative TDC hits", - "fNegTDCHits.THcSignalHit.GetPaddleNumber()"}, - {"posadchits", "List of Positive ADC hits", - "fPosADCHits.THcSignalHit.GetPaddleNumber()"}, - {"negadchits", "List of Negative ADC hits", - "fNegADCHits.THcSignalHit.GetPaddleNumber()"}, - {"apos", "Raw Positive ADC Amplitudes", "fA_Pos"}, - {"aneg", "Raw Negative ADC Amplitudes", "fA_Neg"}, - {"apos_p", "Ped-subtracted Positive ADC Amplitudes", "fA_Pos_p"}, - {"aneg_p", "Ped-subtracted Negative ADC Amplitudes", "fA_Neg_p"}, - {"tpos", "Raw Positive TDC", "fT_Pos"}, - {"tneg", "Raw Negative TDC", "fT_Neg"}, - {"pos_npe","PEs Positive Tube","fPosNpe"}, - {"neg_npe","PEs Negative Tube","fNegNpe"}, - {"pos_npe_sum", "Total Positive Tube PEs", "fPosNpeSum"}, - {"neg_npe_sum", "Total Negative Tube PEs", "fNegNpeSum"}, - {"npe_sum", "Total PEs", "fNpeSum"}, - {"ntdc_pos_hits", "Number of Positive Tube Hits", "fNTDCPosHits"}, - {"ntdc_neg_hits", "Number of Negative Tube Hits", "fNTDCNegHits"}, - {"ngood_hits", "Total number of good hits", "fNGoodHits"}, - - {"posGain", "List of positive PMT gains.", "fPosGain"}, - {"negGain", "List of negative PMT gains.", "fNegGain"}, - - {"posAdcCounter", "List of positive ADC counter numbers.", "frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}, - {"negAdcCounter", "List of negative ADC counter numbers.", "frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}, - - {"posAdcPedRaw", "List of positive raw ADC pedestals", "frPosAdcPedRaw.THcSignalHit.GetData()"}, - {"posAdcPulseIntRaw", "List of positive raw ADC pulse integrals.", "frPosAdcPulseIntRaw.THcSignalHit.GetData()"}, - {"posAdcPulseAmpRaw", "List of positive raw ADC pulse amplitudes.", "frPosAdcPulseAmpRaw.THcSignalHit.GetData()"}, - {"posAdcPulseTimeRaw", "List of positive raw ADC pulse times.", "frPosAdcPulseTimeRaw.THcSignalHit.GetData()"}, - - {"posAdcPed", "List of positive ADC pedestals", "frPosAdcPed.THcSignalHit.GetData()"}, - {"posAdcPulseInt", "List of positive ADC pulse integrals.", "frPosAdcPulseInt.THcSignalHit.GetData()"}, - {"posAdcPulseAmp", "List of positive ADC pulse amplitudes.", "frPosAdcPulseAmp.THcSignalHit.GetData()"}, - - {"negAdcPedRaw", "List of negative raw ADC pedestals", "frNegAdcPedRaw.THcSignalHit.GetData()"}, - {"negAdcPulseIntRaw", "List of negative raw ADC pulse integrals.", "frNegAdcPulseIntRaw.THcSignalHit.GetData()"}, - {"negAdcPulseAmpRaw", "List of negative raw ADC pulse amplitudes.", "frNegAdcPulseAmpRaw.THcSignalHit.GetData()"}, - {"negAdcPulseTimeRaw", "List of negative raw ADC pulse times.", "frNegAdcPulseTimeRaw.THcSignalHit.GetData()"}, - - {"negAdcPed", "List of negative ADC pedestals", "frNegAdcPed.THcSignalHit.GetData()"}, - {"negAdcPulseInt", "List of negative ADC pulse integrals.", "frNegAdcPulseInt.THcSignalHit.GetData()"}, - {"negAdcPulseAmp", "List of negative ADC pulse amplitudes.", "frNegAdcPulseAmp.THcSignalHit.GetData()"}, - - { 0 } - }; + vector<RVarDef> vars; + + vars.push_back({"posAdcCounter", "Positive ADC counter numbers", "frPosAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"negAdcCounter", "Negative ADC counter numbers", "frNegAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"posAdcErrorFlag", "Error Flag for When FPGA Fails", "fPosAdcErrorFlag.THcSignalHit.GetData()"}); + vars.push_back({"negAdcErrorFlag", "Error Flag for When FPGA Fails", "fNegAdcErrorFlag.THcSignalHit.GetData()"}); + + vars.push_back({"numGoodPosAdcHits", "Number of Good Positive ADC Hits Per PMT", "fNumGoodPosAdcHits"}); // Aerogel occupancy + vars.push_back({"numGoodNegAdcHits", "Number of Good Negative ADC Hits Per PMT", "fNumGoodNegAdcHits"}); // Aerogel occupancy + vars.push_back({"totNumGoodPosAdcHits", "Total Number of Good Positive ADC Hits", "fTotNumGoodPosAdcHits"}); // Aerogel multiplicity + vars.push_back({"totNumGoodNegAdcHits", "Total Number of Good Negative ADC Hits", "fTotNumGoodNegAdcHits"}); // Aerogel multiplicity + + vars.push_back({"totnumGoodAdcHits", "TotalNumber of Good ADC Hits Per PMT", "fTotNumGoodAdcHits"}); // Aerogel multiplicity + vars.push_back({"numTracksMatched", "Number of Tracks Matched Per Region", "fNumTracksMatched"}); + vars.push_back({"numTracksFired", "Number of Tracks that Fired Per Region", "fNumTracksFired"}); + vars.push_back({"totNumTracksMatched", "Total Number of Tracks Matched Per Region", "fTotNumTracksMatched"}); + vars.push_back({"totNumTracksFired", "Total Number of Tracks that Fired", "fTotNumTracksFired"}); + + vars.push_back({"posNpe", "Number of Positive PEs", "fPosNpe"}); + vars.push_back({"negNpe", "Number of Negative PEs", "fNegNpe"}); + vars.push_back({"posNpeSum", "Total Number of Positive PEs", "fPosNpeSum"}); + vars.push_back({"negNpeSum", "Total Number of Negative PEs", "fNegNpeSum"}); + vars.push_back({"npeSum", "Total Number of PEs", "fNpeSum"}); + + vars.push_back({"goodPosAdcPed", "Good Negative ADC pedestals", "fGoodPosAdcPed"}); + vars.push_back({"goodPosAdcPulseInt", "Good Negative ADC pulse integrals", "fGoodPosAdcPulseInt"}); + vars.push_back({"goodPosAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodPosAdcPulseIntRaw"}); + vars.push_back({"goodPosAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodPosAdcPulseAmp"}); + vars.push_back({"goodPosAdcPulseTime", "Good Negative ADC pulse times", "fGoodPosAdcPulseTime"}); + + vars.push_back({"goodNegAdcPed", "Good Negative ADC pedestals", "fGoodNegAdcPed"}); + vars.push_back({"goodNegAdcPulseInt", "Good Negative ADC pulse integrals", "fGoodNegAdcPulseInt"}); + vars.push_back({"goodNegAdcPulseIntRaw", "Good Negative ADC raw pulse integrals", "fGoodNegAdcPulseIntRaw"}); + vars.push_back({"goodNegAdcPulseAmp", "Good Negative ADC pulse amplitudes", "fGoodNegAdcPulseAmp"}); + vars.push_back({"goodNegAdcPulseTime", "Good Negative ADC pulse times", "fGoodNegAdcPulseTime"}); + + if (fDebugAdc) { + vars.push_back({"posGain", "Positive PMT gains", "fPosGain"}); + vars.push_back({"negGain", "Negative PMT gains", "fNegGain"}); + + vars.push_back({"numPosAdcHits", "Number of Positive ADC Hits Per PMT", "fNumPosAdcHits"}); // Aerogel occupancy + vars.push_back({"totNumPosAdcHits", "Total Number of Positive ADC Hits", "fTotNumPosAdcHits"}); // Aerogel multiplicity + vars.push_back({"numNegAdcHits", "Number of Negative ADC Hits Per PMT", "fNumNegAdcHits"}); // Aerogel occupancy + vars.push_back({"totNumNegAdcHits", "Total Number of Negative ADC Hits", "fTotNumNegAdcHits"}); // Aerogel multiplicity + vars.push_back({"totnumAdcHits", "Total Number of ADC Hits Per PMT", "fTotNumAdcHits"}); // Aerogel multiplicity + + vars.push_back({"posAdcPedRaw", "Positive Raw ADC pedestals", "frPosAdcPedRaw.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPulseIntRaw", "Positive Raw ADC pulse integrals", "frPosAdcPulseIntRaw.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPulseAmpRaw", "Positive Raw ADC pulse amplitudes", "frPosAdcPulseAmpRaw.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPulseTimeRaw", "Positive Raw ADC pulse times", "frPosAdcPulseTimeRaw.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPed", "Positive ADC pedestals", "frPosAdcPed.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPulseInt", "Positive ADC pulse integrals", "frPosAdcPulseInt.THcSignalHit.GetData()"}); + vars.push_back({"posAdcPulseAmp", "Positive ADC pulse amplitudes", "frPosAdcPulseAmp.THcSignalHit.GetData()"}); + + vars.push_back({"negAdcPedRaw", "Negative Raw ADC pedestals", "frNegAdcPedRaw.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPulseIntRaw", "Negative Raw ADC pulse integrals", "frNegAdcPulseIntRaw.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPulseAmpRaw", "Negative Raw ADC pulse amplitudes", "frNegAdcPulseAmpRaw.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPulseTimeRaw", "Negative Raw ADC pulse times", "frNegAdcPulseTimeRaw.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPed", "Negative ADC pedestals", "frNegAdcPed.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPulseInt", "Negative ADC pulse integrals", "frNegAdcPulseInt.THcSignalHit.GetData()"}); + vars.push_back({"negAdcPulseAmp", "Negative ADC pulse amplitudes", "frNegAdcPulseAmp.THcSignalHit.GetData()"}); + } + + if (fSixGevData) { + vars.push_back({"apos", "Positive Raw ADC Amplitudes", "fA_Pos"}); + vars.push_back({"aneg", "Negative Raw ADC Amplitudes", "fA_Neg"}); + vars.push_back({"apos_p", "Positive Ped-subtracted ADC Amplitudes", "fA_Pos_p"}); + vars.push_back({"aneg_p", "Negative Ped-subtracted ADC Amplitudes", "fA_Neg_p"}); + vars.push_back({"tpos", "Positive Raw TDC", "fT_Pos"}); + vars.push_back({"tneg", "Negative Raw TDC", "fT_Neg"}); + vars.push_back({"ntdc_pos_hits", "Number of Positive Tube Hits", "fNTDCPosHits"}); + vars.push_back({"ntdc_neg_hits", "Number of Negative Tube Hits", "fNTDCNegHits"}); + vars.push_back({"posadchits", "Positive ADC hits", "fPosADCHits.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"negadchits", "Negative ADC hits", "fNegADCHits.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"postdchits", "Positive TDC hits", "fPosTDCHits.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"negtdchits", "Negative TDC hits", "fNegTDCHits.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"nGoodHits", "Total number of good hits", "fNGoodHits"}); + vars.push_back({"posNpeSixGev", "Number of Positive PEs", "fPosNpeSixGev"}); + vars.push_back({"negNpeSixGev", "Number of Negative PEs", "fNegNpeSixGev"}); + vars.push_back({"posNpeSumSixGev", "Total Number of Positive PEs", "fPosNpeSumSixGev"}); + vars.push_back({"negNpeSumSixGev", "Total Number of Negative PEs", "fNegNpeSumSixGev"}); + vars.push_back({"npeSumSixGev", "Total Number of PEs", "fNpeSumSixGev"}); + } + + RVarDef end {0}; + vars.push_back(end); + + return DefineVarsFromList(vars.data(), mode); - return DefineVarsFromList( vars, mode ); } //_____________________________________________________________________________ inline void THcAerogel::Clear(Option_t* opt) { // Clear the hit lists - fPosTDCHits->Clear(); - fNegTDCHits->Clear(); - fPosADCHits->Clear(); - fNegADCHits->Clear(); - - // Clear Aerogel variables from h_aero.f - - fNhits = 0; // Don't really need to do this. (Be sure this called before Decode) - + fNhits = 0; + fTotNumAdcHits = 0; + fTotNumGoodAdcHits = 0; + fTotNumPosAdcHits = 0; + fTotNumNegAdcHits = 0; + fTotNumGoodPosAdcHits = 0; + fTotNumGoodNegAdcHits = 0; + fTotNumTracksMatched = 0; + fTotNumTracksFired = 0; + + fNpeSum = 0.0; fPosNpeSum = 0.0; fNegNpeSum = 0.0; - fNpeSum = 0.0; - - fNGoodHits = 0; - - fNADCPosHits = 0; - fNADCNegHits = 0; - fNTDCPosHits = 0; - fNTDCNegHits = 0; - - for(Int_t itube = 0;itube < fNelem;itube++) { - fA_Pos[itube] = 0; - fA_Neg[itube] = 0; - fA_Pos_p[itube] = 0; - fA_Neg_p[itube] = 0; - fT_Pos[itube] = 0; - fT_Neg[itube] = 0; - fPosNpe[itube] = 0.0; - fNegNpe[itube] = 0.0; - } frPosAdcPedRaw->Clear(); frPosAdcPulseIntRaw->Clear(); frPosAdcPulseAmpRaw->Clear(); frPosAdcPulseTimeRaw->Clear(); - frPosAdcPed->Clear(); frPosAdcPulseInt->Clear(); frPosAdcPulseAmp->Clear(); @@ -392,209 +471,146 @@ void THcAerogel::Clear(Option_t* opt) frNegAdcPulseIntRaw->Clear(); frNegAdcPulseAmpRaw->Clear(); frNegAdcPulseTimeRaw->Clear(); - frNegAdcPed->Clear(); frNegAdcPulseInt->Clear(); frNegAdcPulseAmp->Clear(); -} -//_____________________________________________________________________________ -Int_t THcAerogel::Decode( const THaEvData& evdata ) -{ - // Get the Hall C style hitlist (fRawHitList) for this event - fNhits = DecodeToHitList(evdata); + fPosAdcErrorFlag->Clear(); + fNegAdcErrorFlag->Clear(); + + for (UInt_t ielem = 0; ielem < fNumPosAdcHits.size(); ielem++) + fNumPosAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumNegAdcHits.size(); ielem++) + fNumNegAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumGoodPosAdcHits.size(); ielem++) + fNumGoodPosAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumGoodNegAdcHits.size(); ielem++) + fNumGoodNegAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumTracksMatched.size(); ielem++) + fNumTracksMatched.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumTracksFired.size(); ielem++) + fNumTracksFired.at(ielem) = 0; + + for (UInt_t ielem = 0; ielem < fGoodPosAdcPed.size(); ielem++) { + fGoodPosAdcPed.at(ielem) = 0.0; + fGoodPosAdcPulseInt.at(ielem) = 0.0; + fGoodPosAdcPulseIntRaw.at(ielem) = 0.0; + fGoodPosAdcPulseAmp.at(ielem) = 0.0; + fGoodPosAdcPulseTime.at(ielem) = 0.0; + fPosNpe.at(ielem) = 0.0; + } + for (UInt_t ielem = 0; ielem < fGoodNegAdcPed.size(); ielem++) { + fGoodNegAdcPed.at(ielem) = 0.0; + fGoodNegAdcPulseInt.at(ielem) = 0.0; + fGoodNegAdcPulseIntRaw.at(ielem) = 0.0; + fGoodNegAdcPulseAmp.at(ielem) = 0.0; + fGoodNegAdcPulseTime.at(ielem) = 0.0; + fNegNpe.at(ielem) = 0.0; + } - if(gHaCuts->Result("Pedestal_event")) { + // 6 GeV variables + fNGoodHits = 0; + fNADCPosHits = 0; + fNADCNegHits = 0; + fNTDCPosHits = 0; + fNTDCNegHits = 0; + fNpeSumSixGev = 0.0; + fPosNpeSumSixGev = 0.0; + fNegNpeSumSixGev = 0.0; + fPosTDCHits->Clear(); + fNegTDCHits->Clear(); + fPosADCHits->Clear(); + fNegADCHits->Clear(); - AccumulatePedestals(fRawHitList); + for (UInt_t ielem = 0; ielem < fPosNpeSixGev.size(); ielem++) + fPosNpeSixGev.at(ielem) = 0.0; + for (UInt_t ielem = 0; ielem < fNegNpeSixGev.size(); ielem++) + fNegNpeSixGev.at(ielem) = 0.0; - fAnalyzePedestals = 1; // Analyze pedestals first normal events - return(0); + for(Int_t itube = 0;itube < fNelem;itube++) { + fA_Pos[itube] = 0; + fA_Neg[itube] = 0; + fA_Pos_p[itube] = 0; + fA_Neg_p[itube] = 0; + fT_Pos[itube] = 0; + fT_Neg[itube] = 0; } - if(fAnalyzePedestals) { +} - CalculatePedestals(); - Print(""); +//_____________________________________________________________________________ +Int_t THcAerogel::Decode( const THaEvData& evdata ) +{ + // Get the Hall C style hitlist (fRawHitList) for this event + fNhits = DecodeToHitList(evdata); - fAnalyzePedestals = 0; // Don't analyze pedestals next event + if (fSixGevData) { + if(gHaCuts->Result("Pedestal_event")) { + AccumulatePedestals(fRawHitList); + fAnalyzePedestals = 1; // Analyze pedestals first normal events + return(0); + } + if(fAnalyzePedestals) { + CalculatePedestals(); + Print(""); + fAnalyzePedestals = 0; // Don't analyze pedestals next event + } } - - Int_t ihit = 0; - Int_t nPosTDCHits=0; - Int_t nNegTDCHits=0; - Int_t nPosADCHits=0; - Int_t nNegADCHits=0; - + Int_t ihit = 0; UInt_t nrPosAdcHits = 0; UInt_t nrNegAdcHits = 0; while(ihit < fNhits) { - THcAerogelHit* hit = (THcAerogelHit *) fRawHitList->At(ihit); - - Int_t padnum = hit->fCounter; + THcAerogelHit* hit = (THcAerogelHit*) fRawHitList->At(ihit); + Int_t npmt = hit->fCounter; + THcRawAdcHit& rawPosAdcHit = hit->GetRawAdcHitPos(); + THcRawAdcHit& rawNegAdcHit = hit->GetRawAdcHitNeg(); - THcRawAdcHit& rawPosAdcHit = hit->GetRawAdcHitPos(); 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()); - - ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseIntRaw(thit)); - ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseInt(thit)); - - ((THcSignalHit*) frPosAdcPulseAmpRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseAmpRaw(thit)); - ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseAmp(thit)); - - ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(nrPosAdcHits))->Set(padnum, rawPosAdcHit.GetPulseTimeRaw(thit)); - - ++nrPosAdcHits; - } - THcRawAdcHit& rawNegAdcHit = hit->GetRawAdcHitNeg(); - 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()); - - ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseIntRaw(thit)); - ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseInt(thit)); - - ((THcSignalHit*) frNegAdcPulseAmpRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseAmpRaw(thit)); - ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseAmp(thit)); - ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(nrNegAdcHits))->Set(padnum, rawNegAdcHit.GetPulseTimeRaw(thit)); + ((THcSignalHit*) frPosAdcPedRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPedRaw()); + ((THcSignalHit*) frPosAdcPed->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPed()); - ++nrNegAdcHits; - } + ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseIntRaw(thit)); + ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseInt(thit)); - Int_t adc_pos; - Int_t adc_neg; - Int_t tdc_pos=-1; - Int_t tdc_neg=-1; - // TDC positive hit - if(hit->GetRawTdcHitPos().GetNHits() > 0) { - THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++); - tdc_pos = hit->GetRawTdcHitPos().GetTime()+fTdcOffset; - sighit->Set(hit->fCounter, tdc_pos); - } - - // TDC negative hit - if(hit->GetRawTdcHitNeg().GetNHits() > 0) { - THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); - tdc_neg = hit->GetRawTdcHitNeg().GetTime()+fTdcOffset; - sighit->Set(hit->fCounter, tdc_neg); - } + ((THcSignalHit*) frPosAdcPulseAmpRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseAmpRaw(thit)); + ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseAmp(thit)); - // ADC positive hit - if((adc_pos = hit->GetRawAdcHitPos().GetPulseInt()) > 0) { - THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); - sighit->Set(hit->fCounter, adc_pos); - } + ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(nrPosAdcHits))->Set(npmt, rawPosAdcHit.GetPulseTimeRaw(thit)); - // ADC negative hit - if((adc_neg = hit->GetRawAdcHitNeg().GetPulseInt()) > 0) { - THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); - sighit->Set(hit->fCounter, adc_neg); - } + if (rawPosAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(npmt, 0); + if (rawPosAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(nrPosAdcHits))->Set(npmt, 1); - // For each TDC, identify the first hit that is positive. - tdc_pos = -1; - tdc_neg = -1; - for(UInt_t thit=0; thit<hit->GetRawTdcHitPos().GetNHits(); thit++) { - Int_t tdc = hit->GetRawTdcHitPos().GetTime(thit); - if(tdc >=0 ) { - tdc_pos = tdc; - break; - } - } - for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) { - Int_t tdc = hit->GetRawTdcHitNeg().GetTime(thit); - if(tdc >= 0) { - tdc_neg = tdc; - break; - } + ++nrPosAdcHits; + fTotNumAdcHits++; + fTotNumPosAdcHits++; + fNumPosAdcHits.at(npmt-1) = npmt; } - // Fill the the per detector ADC and TDC arrays - Int_t npmt = hit->fCounter - 1; + for (UInt_t thit=0; thit<rawNegAdcHit.GetNPulses(); ++thit) { + ((THcSignalHit*) frNegAdcPedRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPedRaw()); + ((THcSignalHit*) frNegAdcPed->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPed()); - fA_Pos[npmt] = adc_pos; - fA_Neg[npmt] = adc_neg; - fA_Pos_p[npmt] = fA_Pos[npmt] - fPosPedMean[npmt]; - fA_Neg_p[npmt] = fA_Neg[npmt] - fNegPedMean[npmt]; - fT_Pos[npmt] = tdc_pos; - fT_Neg[npmt] = tdc_neg; + ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseIntRaw(thit)); + ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseInt(thit)); - if(fA_Pos[npmt] < 8000) { - fPosNpe[npmt] = fPosGain[npmt]*fA_Pos_p[npmt]; - } else { - fPosNpe[npmt] = 100.0; - } + ((THcSignalHit*) frNegAdcPulseAmpRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseAmpRaw(thit)); + ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseAmp(thit)); - if(fA_Neg[npmt] < 8000) { - fNegNpe[npmt] = fNegGain[npmt]*fA_Neg_p[npmt]; - } else { - fNegNpe[npmt] = 100.0; - } + ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(nrNegAdcHits))->Set(npmt, rawNegAdcHit.GetPulseTimeRaw(thit)); - fPosNpeSum += fPosNpe[npmt]; - fNegNpeSum += fNegNpe[npmt]; + if (rawNegAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(npmt, 0); + if (rawNegAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(nrNegAdcHits))->Set(npmt, 1); - // Sum positive and negative hits to fill tot_good_hits - if(fPosNpe[npmt] > 0.3) { - fNADCPosHits++; - fNGoodHits++; - } - if(fNegNpe[npmt] > 0.3) { - fNADCNegHits++; - fNGoodHits++; - } - if(fT_Pos[npmt] > 0 && fT_Pos[npmt] < 8000) { - fNTDCPosHits++; - } - if(fT_Neg[npmt] > 0 && fT_Neg[npmt] < 8000) { - fNTDCNegHits++; + ++nrNegAdcHits; + fTotNumAdcHits++; + fTotNumNegAdcHits++; + fNumNegAdcHits.at(npmt-1) = npmt; } - ihit++; } - - if(fPosNpeSum > 0.5 || fNegNpeSum > 0.5) { - fNpeSum = fPosNpeSum + fNegNpeSum; - } else { - fNpeSum = 0.0; - } - - // If total hits are 0, then give a noticable ridiculous NPE - if(fNhits < 1) { - fNpeSum = 0.0; - } - - // The following code is in the fortran. It probably doesn't work - // right because the arrays are not cleared first and the aero_ep, - // aero_en, ... lines make no sense. - - //* Next, fill the rawadc variables with the actual tube values - //* mainly for diagnostic purposes. - // - // do ihit=1,haero_tot_hits - // - // npmt=haero_pair_num(ihit) - // - // haero_rawadc_pos(npmt)=haero_adc_pos(ihit) - // aero_ep(npmt)=haero_rawadc_pos(ihit) - // - // haero_rawadc_neg(npmt)=haero_adc_neg(ihit) - // aero_en(npmt)=haero_rawadc_neg(ihit) - // - // haero_rawtdc_neg(npmt)=haero_tdc_neg(ihit) - // aero_tn(npmt)= haero_tdc_neg(ihit) - // - // haero_rawtdc_pos(npmt)=haero_tdc_pos(ihit) - // aero_tp(npmt)= haero_tdc_pos(ihit) - // - // enddo - - return ihit; } @@ -608,96 +624,300 @@ Int_t THcAerogel::ApplyCorrections( void ) Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks { - // All code previously here moved into decode + // Loop over the elements in the TClonesArray + for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) { + + Int_t npmt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; + Double_t pulsePed = ((THcSignalHit*) frPosAdcPed->ConstructedAt(ielem))->GetData(); + Double_t pulseInt = ((THcSignalHit*) frPosAdcPulseInt->ConstructedAt(ielem))->GetData(); + Double_t pulseIntRaw = ((THcSignalHit*) frPosAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); + Double_t pulseAmp = ((THcSignalHit*) frPosAdcPulseAmp->ConstructedAt(ielem))->GetData(); + Double_t pulseTime = ((THcSignalHit*) frPosAdcPulseTimeRaw->ConstructedAt(ielem))->GetData(); + Bool_t errorFlag = ((THcSignalHit*) fPosAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + + // By default, the last hit within the timing cut will be considered "good" + if (!errorFlag && pulseTimeCut) { + fGoodPosAdcPed.at(npmt) = pulsePed; + fGoodPosAdcPulseInt.at(npmt) = pulseInt; + fGoodPosAdcPulseIntRaw.at(npmt) = pulseIntRaw; + fGoodPosAdcPulseAmp.at(npmt) = pulseAmp; + fGoodPosAdcPulseTime.at(npmt) = pulseTime; + + fPosNpe.at(npmt) = fPosGain[npmt]*fGoodPosAdcPulseInt.at(npmt); + fPosNpeSum += fPosNpe.at(npmt); + fNpeSum += fPosNpeSum; + + fTotNumGoodAdcHits++; + fTotNumGoodPosAdcHits++; + fNumGoodPosAdcHits.at(npmt) = npmt + 1; + } + } - ApplyCorrections(); + // Loop over the elements in the TClonesArray + for(Int_t ielem = 0; ielem < frNegAdcPulseInt->GetEntries(); ielem++) { + + Int_t npmt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; + Double_t pulsePed = ((THcSignalHit*) frNegAdcPed->ConstructedAt(ielem))->GetData(); + Double_t pulseInt = ((THcSignalHit*) frNegAdcPulseInt->ConstructedAt(ielem))->GetData(); + Double_t pulseIntRaw = ((THcSignalHit*) frNegAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); + Double_t pulseAmp = ((THcSignalHit*) frNegAdcPulseAmp->ConstructedAt(ielem))->GetData(); + Double_t pulseTime = ((THcSignalHit*) frNegAdcPulseTimeRaw->ConstructedAt(ielem))->GetData(); + Bool_t errorFlag = ((THcSignalHit*) fNegAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + + // By default, the last hit within the timing cut will be considered "good" + if (!errorFlag && pulseTimeCut) { + fGoodNegAdcPed.at(npmt) = pulsePed; + fGoodNegAdcPulseInt.at(npmt) = pulseInt; + fGoodNegAdcPulseIntRaw.at(npmt) = pulseIntRaw; + fGoodNegAdcPulseAmp.at(npmt) = pulseAmp; + fGoodNegAdcPulseTime.at(npmt) = pulseTime; + + fNegNpe.at(npmt) = fNegGain[npmt]*fGoodNegAdcPulseInt.at(npmt); + fNegNpeSum += fNegNpe.at(npmt); + fNpeSum += fNegNpeSum; + + fTotNumGoodAdcHits++; + fTotNumGoodNegAdcHits++; + fNumGoodNegAdcHits.at(npmt) = npmt + 1; + } + } - return 0; + for(Int_t ihit=0; ihit < fNhits; ihit++) { + + Int_t nPosTDCHits = 0; + Int_t nNegTDCHits = 0; + Int_t nPosADCHits = 0; + Int_t nNegADCHits = 0; + + // 6 GeV calculations + Int_t adc_pos; + Int_t adc_neg; + Int_t tdc_pos = -1; + Int_t tdc_neg = -1; + if (fSixGevData) { + THcAerogelHit* hit = (THcAerogelHit*) fRawHitList->At(ihit); + Int_t npmt = hit->fCounter - 1; + + // Sum positive and negative hits to fill tot_good_hits + if(fPosNpe.at(npmt) > 0.3) {fNADCPosHits++; fNGoodHits++;} + if(fNegNpe.at(npmt) > 0.3) {fNADCNegHits++; fNGoodHits++;} + + // ADC positive hit + if((adc_pos = hit->GetRawAdcHitPos().GetPulseInt()) > 0) { + THcSignalHit *sighit = (THcSignalHit*) fPosADCHits->ConstructedAt(nPosADCHits++); + sighit->Set(hit->fCounter, adc_pos); + } + // ADC negative hit + if((adc_neg = hit->GetRawAdcHitNeg().GetPulseInt()) > 0) { + THcSignalHit *sighit = (THcSignalHit*) fNegADCHits->ConstructedAt(nNegADCHits++); + sighit->Set(hit->fCounter, adc_neg); + } + // TDC positive hit + if(hit->GetRawTdcHitPos().GetNHits() > 0) { + THcSignalHit *sighit = (THcSignalHit*) fPosTDCHits->ConstructedAt(nPosTDCHits++); + tdc_pos = hit->GetRawTdcHitPos().GetTime()+fTdcOffset; + sighit->Set(hit->fCounter, tdc_pos); + } + // TDC negative hit + if(hit->GetRawTdcHitNeg().GetNHits() > 0) { + THcSignalHit *sighit = (THcSignalHit*) fNegTDCHits->ConstructedAt(nNegTDCHits++); + tdc_neg = hit->GetRawTdcHitNeg().GetTime()+fTdcOffset; + sighit->Set(hit->fCounter, tdc_neg); + } + // For each TDC, identify the first hit that is positive. + tdc_pos = -1; + tdc_neg = -1; + for(UInt_t thit=0; thit<hit->GetRawTdcHitPos().GetNHits(); thit++) { + Int_t tdc = hit->GetRawTdcHitPos().GetTime(thit); + if(tdc >=0 ) { + tdc_pos = tdc; + break; + } + } + for(UInt_t thit=0; thit<hit->GetRawTdcHitNeg().GetNHits(); thit++) { + Int_t tdc = hit->GetRawTdcHitNeg().GetTime(thit); + if(tdc >= 0) { + tdc_neg = tdc; + break; + } + } + + fA_Pos[npmt] = adc_pos; + fA_Neg[npmt] = adc_neg; + fA_Pos_p[npmt] = fA_Pos[npmt] - fPosPedMean[npmt]; + fA_Neg_p[npmt] = fA_Neg[npmt] - fNegPedMean[npmt]; + fT_Pos[npmt] = tdc_pos; + fT_Neg[npmt] = tdc_neg; + + if(fA_Pos[npmt] < 8000) fPosNpeSixGev[npmt] = fPosGain[npmt]*fA_Pos_p[npmt]; + else fPosNpeSixGev[npmt] = 100.0; + + if(fA_Neg[npmt] < 8000) fNegNpeSixGev[npmt] = fNegGain[npmt]*fA_Neg_p[npmt]; + else fNegNpeSixGev[npmt] = 100.0; + + fPosNpeSumSixGev += fPosNpeSixGev[npmt]; + fNegNpeSumSixGev += fNegNpeSixGev[npmt]; + + // Sum positive and negative hits to fill tot_good_hits + if(fPosNpeSixGev[npmt] > 0.3) {fNADCPosHits++; fNGoodHits++;} + if(fNegNpeSixGev[npmt] > 0.3) {fNADCNegHits++; fNGoodHits++;} + + if(fT_Pos[npmt] > 0 && fT_Pos[npmt] < 8000) fNTDCPosHits++; + if(fT_Neg[npmt] > 0 && fT_Neg[npmt] < 8000) fNTDCNegHits++; + } + + if (fPosNpeSumSixGev > 0.5 || fNegNpeSumSixGev > 0.5) + fNpeSumSixGev = fPosNpeSumSixGev + fNegNpeSumSixGev; + else fNpeSumSixGev = 0.0; + // If total hits are 0, then give a noticable ridiculous NPE + if (fNhits < 1) fNpeSumSixGev = 0.0; + + } + return 0; } //_____________________________________________________________________________ Int_t THcAerogel::FineProcess( TClonesArray& tracks ) { + Int_t nTracks = tracks.GetLast() + 1; + + for (Int_t itrack = 0; itrack < nTracks; itrack++) { + + THaTrack* track = dynamic_cast<THaTrack*> (tracks[itrack]); + if (track->GetIndex() != 0) continue; // Select the best track + + Double_t trackChi2 = track->GetChi2(); + Int_t trackNDoF = track->GetNDoF(); + Double_t trackRedChi2 = trackChi2/trackNDoF; + Double_t trackBeta = track->GetBeta(); + Double_t trackEnergy = track->GetEnergy(); + Double_t trackMom = track->GetP(); + Double_t trackENorm = trackEnergy/trackMom; + Double_t trackXfp = track->GetX(); + Double_t trackYfp = track->GetY(); + Double_t trackTheta = track->GetTheta(); + Double_t trackPhi = track->GetPhi(); + + Bool_t trackRedChi2Cut = trackRedChi2 > fRedChi2Min && trackRedChi2 < fRedChi2Max; + Bool_t trackBetaCut = trackBeta > fBetaMin && trackBeta < fBetaMax; + Bool_t trackENormCut = trackENorm > fENormMin && trackENorm < fENormMax; + + if (trackRedChi2Cut && trackBetaCut && trackENormCut) { + + // Project the track to the Aerogel diffuser box plane + Double_t xAtAero = trackXfp + trackTheta * fDiffBoxZPos; + Double_t yAtAero = trackYfp + trackPhi * fDiffBoxZPos; + + // cout << "Aerogel Detector: " << GetName() << endl; + // cout << "nTracks = " << nTracks << "\t" << "trackChi2 = " << trackChi2 + // << "\t" << "trackNDof = " << trackNDoF << "\t" << "trackRedChi2 = " << trackRedChi2 << endl; + // cout << "trackBeta = " << trackBeta << "\t" << "trackEnergy = " << trackEnergy << "\t" + // << "trackMom = " << trackMom << "\t" << "trackENorm = " << trackENorm << endl; + // cout << "trackXfp = " << trackXfp << "\t" << "trackYfp = " << trackYfp << "\t" + // << "trackTheta = " << trackTheta << "\t" << "trackPhi = " << trackPhi << endl; + // cout << "fDiffBoxZPos = " << fDiffBoxZPos << "\t" << "xAtAero = " << xAtAero << "\t" << "yAtAero = " << yAtAero << endl; + // cout << "=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:" << endl; + + + for (Int_t iregion = 0; iregion < fNRegions; iregion++) { + + if ((TMath::Abs(fRegionValue[GetIndex(iregion, 0)] - xAtAero) < fRegionValue[GetIndex(iregion, 4)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 1)] - yAtAero) < fRegionValue[GetIndex(iregion, 5)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 2)] - trackTheta) < fRegionValue[GetIndex(iregion, 6)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 3)] - trackPhi) < fRegionValue[GetIndex(iregion, 7)])) { + + fTotNumTracksMatched++; + fNumTracksMatched.at(iregion) = iregion + 1; + + if (fNpeSum > fNpeThresh) { + fTotNumTracksFired++; + fNumTracksFired.at(iregion) = iregion + 1; + } // NPE threshold cut + } // Regional cuts + } // Loop over regions + } // Tracking cuts + } // Track loop + return 0; } //_____________________________________________________________________________ -void THcAerogel::InitializePedestals( ) +// Method for initializing pedestals in the 6 GeV era +void THcAerogel::InitializePedestals() { fNPedestalEvents = 0; - fMinPeds = 0; // Do not calculate pedestals by default - fPosPedSum = new Int_t [fNelem]; - fPosPedSum2 = new Int_t [fNelem]; + fMinPeds = 0; // Do not calculate pedestals by default + + fPosPedSum = new Int_t [fNelem]; + fPosPedSum2 = new Int_t [fNelem]; fPosPedLimit = new Int_t [fNelem]; fPosPedCount = new Int_t [fNelem]; - fNegPedSum = new Int_t [fNelem]; - fNegPedSum2 = new Int_t [fNelem]; + fNegPedSum = new Int_t [fNelem]; + fNegPedSum2 = new Int_t [fNelem]; fNegPedLimit = new Int_t [fNelem]; fNegPedCount = new Int_t [fNelem]; - - fPosPed = new Double_t [fNelem]; - fNegPed = new Double_t [fNelem]; - fPosThresh = new Double_t [fNelem]; - fNegThresh = new Double_t [fNelem]; - for(Int_t i=0;i<fNelem;i++) { - fPosPedSum[i] = 0; - fPosPedSum2[i] = 0; + fPosPed = new Double_t [fNelem]; + fNegPed = new Double_t [fNelem]; + fPosThresh = new Double_t [fNelem]; + fNegThresh = 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; - fNegPedSum[i] = 0; - fNegPedSum2[i] = 0; + fNegPedSum[i] = 0; + fNegPedSum2[i] = 0; fNegPedLimit[i] = 1000; // In engine, this are set in parameter file fNegPedCount[i] = 0; - fPosPedMean[i] = 0; // Default pedestal values - fNegPedMean[i] = 0; // Default pedestal values + fPosPedMean[i] = 0; // Default pedestal values + fNegPedMean[i] = 0; // Default pedestal values } - fPosNpe = new Double_t [fNelem]; - fNegNpe = new Double_t [fNelem]; } //_____________________________________________________________________________ +// Method for accumulating pedestals in the 6 GeV era void THcAerogel::AccumulatePedestals(TClonesArray* rawhits) { // Extract data from the hit list, accumulating into arrays for // calculating pedestals Int_t nrawhits = rawhits->GetLast()+1; + Int_t ihit = 0; - Int_t ihit = 0; while(ihit < nrawhits) { THcAerogelHit* hit = (THcAerogelHit *) rawhits->At(ihit); Int_t element = hit->fCounter - 1; - Int_t adcpos = hit->GetRawAdcHitPos().GetPulseInt(); - Int_t adcneg = hit->GetRawAdcHitNeg().GetPulseInt(); + Int_t adcpos = hit->GetRawAdcHitPos().GetPulseInt(); + Int_t adcneg = hit->GetRawAdcHitNeg().GetPulseInt(); if(adcpos <= fPosPedLimit[element]) { - fPosPedSum[element] += adcpos; + fPosPedSum[element] += adcpos; fPosPedSum2[element] += adcpos*adcpos; fPosPedCount[element]++; - if(fPosPedCount[element] == fMinPeds/5) { + if(fPosPedCount[element] == fMinPeds/5) fPosPedLimit[element] = 100 + fPosPedSum[element]/fPosPedCount[element]; - } } if(adcneg <= fNegPedLimit[element]) { fNegPedSum[element] += adcneg; fNegPedSum2[element] += adcneg*adcneg; fNegPedCount[element]++; - if(fNegPedCount[element] == fMinPeds/5) { + if(fNegPedCount[element] == fMinPeds/5) fNegPedLimit[element] = 100 + fNegPedSum[element]/fNegPedCount[element]; - } } ihit++; } - fNPedestalEvents++; - return; } //_____________________________________________________________________________ -void THcAerogel::CalculatePedestals( ) +// Method for calculating pedestals in the 6 GeV era +void THcAerogel::CalculatePedestals() { // Use the accumulated pedestal data to calculate pedestals // Later add check to see if pedestals have drifted ("Danger Will Robinson!") @@ -705,13 +925,11 @@ void THcAerogel::CalculatePedestals( ) for(Int_t i=0; i<fNelem;i++) { // Positive tubes - fPosPed[i] = ((Double_t) fPosPedSum[i]) / TMath::Max(1, fPosPedCount[i]); + fPosPed[i] = ((Double_t) fPosPedSum[i]) / TMath::Max(1, fPosPedCount[i]); fPosThresh[i] = fPosPed[i] + 15; - // Negative tubes - fNegPed[i] = ((Double_t) fNegPedSum[i]) / TMath::Max(1, fNegPedCount[i]); + fNegPed[i] = ((Double_t) fNegPedSum[i]) / TMath::Max(1, fNegPedCount[i]); fNegThresh[i] = fNegPed[i] + 15; - // cout << i+1 << " " << fPosPed[i] << " " << fNegPed[i] << endl; // Just a copy for now, but allow the possibility that fXXXPedMean is set @@ -719,35 +937,34 @@ void THcAerogel::CalculatePedestals( ) // pedestal events. (So that pedestals are sensible even if the pedestal events were // not acquired.) if(fMinPeds > 0) { - if(fPosPedCount[i] > fMinPeds) { + if(fPosPedCount[i] > fMinPeds) fPosPedMean[i] = fPosPed[i]; - } - if(fNegPedCount[i] > fMinPeds) { + if(fNegPedCount[i] > fMinPeds) fNegPedMean[i] = fNegPed[i]; - } } } +} - // cout << " " << endl; - +//_____________________________________________________________________________ +Int_t THcAerogel::GetIndex(Int_t nRegion, Int_t nValue) +{ + return fNRegions * nValue + nRegion; } -void THcAerogel::Print( const Option_t* opt) const { + +//_____________________________________________________________________________ +void THcAerogel::Print(const Option_t* opt) const +{ THaNonTrackingDetector::Print(opt); // Print out the pedestals - cout << endl; cout << "Aerogel Pedestals" << endl; cout << "No. Neg Pos" << endl; - for(Int_t i=0; i<fNelem; i++){ - cout << " " << i << " " << fNegPedMean[i] << " " << fPosPedMean[i] - << endl; - } + for(Int_t i=0; i<fNelem; i++) + cout << " " << i << "\t" << fNegPedMean[i] << "\t" << fPosPedMean[i] << endl; cout << endl; - cout << " fMinPeds = " << fMinPeds << endl; cout << endl; - } ClassImp(THcAerogel) diff --git a/src/THcAerogel.h b/src/THcAerogel.h index fb40ebf1e813449eb459123d6f11c31180920e5a..1e68df1677a58993da6152d135a761bc9171a919 100644 --- a/src/THcAerogel.h +++ b/src/THcAerogel.h @@ -15,109 +15,154 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { public: - THcAerogel( const char* name, const char* description = "", - THaApparatus* a = NULL ); + THcAerogel(const char* name, const char* description = "", THaApparatus* a = NULL); virtual ~THcAerogel(); - virtual void Clear( Option_t* opt="" ); - virtual Int_t Decode( const THaEvData& ); - void InitArrays(); - void DeleteArrays(); - virtual EStatus Init( const TDatime& run_time ); - virtual Int_t ReadDatabase( const TDatime& date ); - virtual Int_t DefineVariables( EMode mode = kDefine ); - virtual Int_t CoarseProcess( TClonesArray& tracks ); - virtual Int_t FineProcess( TClonesArray& tracks ); - - virtual void AccumulatePedestals(TClonesArray* rawhits); - virtual void CalculatePedestals(); - - virtual Int_t ApplyCorrections( void ); - - virtual void Print(const Option_t* opt) const; + virtual void Clear(Option_t* opt=""); + virtual void Print(const Option_t* opt) const; + virtual void AccumulatePedestals(TClonesArray* rawhits); + virtual void CalculatePedestals(); + virtual Int_t Decode(const THaEvData&); + virtual Int_t ReadDatabase(const TDatime& date); + virtual Int_t DefineVariables(EMode mode = kDefine); + virtual Int_t CoarseProcess(TClonesArray& tracks); + virtual Int_t FineProcess(TClonesArray& tracks); + virtual Int_t ApplyCorrections(void); + virtual EStatus Init(const TDatime& run_time); + + void InitArrays(); + void DeleteArrays(); + Int_t GetIndex(Int_t nRegion, Int_t nValue); THcAerogel(); // for ROOT I/O - protected: - Int_t fAnalyzePedestals; - // Parameters - Double_t* fPosGain; - Double_t* fNegGain; + protected: // 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 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 - - // Hits - TClonesArray* fPosTDCHits; - TClonesArray* fNegTDCHits; - TClonesArray* fPosADCHits; - TClonesArray* fNegADCHits; - - // 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 fTdcOffset; /* Global TDC offset */ - + // 12 GeV variables + // Vector/TClonesArray length parameters + static const Int_t MaxNumPosAeroPmt = 7; + static const Int_t MaxNumNegAeroPmt = 7; + static const Int_t MaxNumAdcPulse = 4; + // Tracking variables + Int_t fNRegions; + Int_t fRegionsValueMax; + Int_t fDebugAdc; + Double_t fRedChi2Min; + Double_t fRedChi2Max; + Double_t fBetaMin; + Double_t fBetaMax; + Double_t fENormMin; + Double_t fENormMax; + Double_t fDiffBoxZPos; + Double_t fNpeThresh; + Double_t fAdcTimeWindowMin; + Double_t fAdcTimeWindowMax; + Double_t *fRegionValue; + // Counting variables + Int_t fTotNumAdcHits; + Int_t fTotNumGoodAdcHits; + Int_t fTotNumPosAdcHits; + Int_t fTotNumGoodPosAdcHits; + Int_t fTotNumNegAdcHits; + Int_t fTotNumGoodNegAdcHits; + Int_t fTotNumTracksMatched; + Int_t fTotNumTracksFired; + // NPE variables + Double_t fPosNpeSum; + Double_t fNegNpeSum; + Double_t fNpeSum; + Double_t *fPosGain; + Double_t *fNegGain; + // FADC data objects TClonesArray* frPosAdcPedRaw; TClonesArray* frPosAdcPulseIntRaw; TClonesArray* frPosAdcPulseAmpRaw; TClonesArray* frPosAdcPulseTimeRaw; - TClonesArray* frPosAdcPed; TClonesArray* frPosAdcPulseInt; TClonesArray* frPosAdcPulseAmp; - TClonesArray* frNegAdcPedRaw; TClonesArray* frNegAdcPulseIntRaw; TClonesArray* frNegAdcPulseAmpRaw; TClonesArray* frNegAdcPulseTimeRaw; - TClonesArray* frNegAdcPed; TClonesArray* frNegAdcPulseInt; TClonesArray* frNegAdcPulseAmp; + TClonesArray* fPosAdcErrorFlag; + TClonesArray* fNegAdcErrorFlag; + // Individual PMT data objects + vector<Int_t> fNumPosAdcHits; + vector<Int_t> fNumNegAdcHits; + vector<Int_t> fNumGoodPosAdcHits; + vector<Int_t> fNumGoodNegAdcHits; + vector<Int_t> fNumTracksMatched; + vector<Int_t> fNumTracksFired; + vector<Double_t> fPosNpe; + vector<Double_t> fNegNpe; + vector<Double_t> fGoodPosAdcPed; + vector<Double_t> fGoodPosAdcPulseInt; + vector<Double_t> fGoodPosAdcPulseIntRaw; + vector<Double_t> fGoodPosAdcPulseAmp; + vector<Double_t> fGoodPosAdcPulseTime; + vector<Double_t> fGoodNegAdcPed; + vector<Double_t> fGoodNegAdcPulseInt; + vector<Double_t> fGoodNegAdcPulseIntRaw; + vector<Double_t> fGoodNegAdcPulseAmp; + vector<Double_t> fGoodNegAdcPulseTime; + + // 6 GeV era variables + Int_t fAnalyzePedestals; + Int_t fSixGevData; + Int_t fNGoodHits; + Int_t fNADCPosHits; + Int_t fNADCNegHits; + Int_t fNTDCPosHits; + Int_t fNTDCNegHits; + Int_t fTdcOffset; /* Global TDC offset */ + Int_t fNPedestalEvents; + Int_t fMinPeds; + Double_t fPosNpeSumSixGev; + Double_t fNegNpeSumSixGev; + Double_t fNpeSumSixGev; + 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; + 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 *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 */ + + TClonesArray *fPosTDCHits; + TClonesArray *fNegTDCHits; + TClonesArray *fPosADCHits; + TClonesArray *fNegADCHits; + + vector<Double_t> fPosNpeSixGev; + vector<Double_t> fNegNpeSixGev; void Setup(const char* name, const char* description); virtual void InitializePedestals( ); ClassDef(THcAerogel,0) // Generic aerogel class -}; +} +; #endif diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index ceb1aefb914a07c4cac2882c3711037016a901ce..cea6b3d7df8ff2d6632a2571655f9739d23edc39 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -1,9 +1,7 @@ /** \class THcCherenkov \ingroup Detectors -Class for an Cherenkov detector consisting of two PMT's - -\author Zafar Ahmed + Class for Cherenkov detectors */ @@ -23,7 +21,6 @@ Class for an Cherenkov detector consisting of two PMT's #include "THaTrack.h" #include "TClonesArray.h" #include "TMath.h" - #include "THaTrackProj.h" #include <algorithm> @@ -32,14 +29,13 @@ Class for an Cherenkov detector consisting of two PMT's #include <cstdlib> #include <iostream> #include <string> +#include <iomanip> using namespace std; using std::cout; using std::cin; using std::endl; - -#include <iomanip> using std::setw; using std::setprecision; @@ -49,20 +45,27 @@ THcCherenkov::THcCherenkov( const char* name, const char* description, THaNonTrackingDetector(name,description,apparatus) { // Normal constructor with name and description - fADCHits = new TClonesArray("THcSignalHit",16); - - frAdcPedRaw = new TClonesArray("THcSignalHit", 16); - frAdcPulseIntRaw = new TClonesArray("THcSignalHit", 16); - frAdcPulseAmpRaw = new TClonesArray("THcSignalHit", 16); - frAdcPulseTimeRaw = new TClonesArray("THcSignalHit", 16); - - frAdcPed = new TClonesArray("THcSignalHit", 16); - frAdcPulseInt = new TClonesArray("THcSignalHit", 16); - frAdcPulseAmp = new TClonesArray("THcSignalHit", 16); + frAdcPedRaw = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPulseIntRaw = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPulseAmpRaw = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPulseTimeRaw = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPed = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPulseInt = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + frAdcPulseAmp = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + fAdcErrorFlag = new TClonesArray("THcSignalHit", MaxNumCerPmt*MaxNumAdcPulse); + + fNumAdcHits = vector<Int_t> (MaxNumCerPmt, 0.0); + fNumGoodAdcHits = vector<Int_t> (MaxNumCerPmt, 0.0); + fNumTracksMatched = vector<Int_t> (MaxNumCerPmt, 0.0); + fNumTracksFired = vector<Int_t> (MaxNumCerPmt, 0.0); + fNpe = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcPed = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcPulseInt = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcPulseIntRaw = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcPulseAmp = vector<Double_t> (MaxNumCerPmt, 0.0); + fGoodAdcPulseTime = vector<Double_t> (MaxNumCerPmt, 0.0); InitArrays(); - - } //_____________________________________________________________________________ @@ -70,81 +73,69 @@ THcCherenkov::THcCherenkov( ) : THaNonTrackingDetector() { // Constructor - fADCHits = NULL; - - frAdcPedRaw = NULL; - frAdcPulseIntRaw = NULL; - frAdcPulseAmpRaw = NULL; + frAdcPedRaw = NULL; + frAdcPulseIntRaw = NULL; + frAdcPulseAmpRaw = NULL; frAdcPulseTimeRaw = NULL; - - frAdcPed = NULL; - frAdcPulseInt = NULL; - frAdcPulseAmp = NULL; + frAdcPed = NULL; + frAdcPulseInt = NULL; + frAdcPulseAmp = NULL; + fAdcErrorFlag = NULL; InitArrays(); } +//_____________________________________________________________________________ +THcCherenkov::~THcCherenkov() +{ + // Destructor + delete frAdcPedRaw; frAdcPedRaw = NULL; + delete frAdcPulseIntRaw; frAdcPulseIntRaw = NULL; + delete frAdcPulseAmpRaw; frAdcPulseAmpRaw = NULL; + delete frAdcPulseTimeRaw; frAdcPulseTimeRaw = NULL; + delete frAdcPed; frAdcPed = NULL; + delete frAdcPulseInt; frAdcPulseInt = NULL; + delete frAdcPulseAmp; frAdcPulseAmp = NULL; + delete fAdcErrorFlag; fAdcErrorFlag = NULL; + + DeleteArrays(); +} + //_____________________________________________________________________________ void THcCherenkov::InitArrays() { - fGain = NULL; - fCerWidth = NULL; - fNPMT = NULL; - fADC = NULL; - fADC_P = NULL; - fNPE = NULL; - fPedSum = NULL; - fPedSum2 = NULL; + fGain = NULL; + fPedSum = NULL; + fPedSum2 = NULL; fPedLimit = NULL; - fPedMean = NULL; + fPedMean = NULL; fPedCount = NULL; - fPed = NULL; - fThresh = NULL; + fPed = NULL; + fThresh = NULL; } //_____________________________________________________________________________ void THcCherenkov::DeleteArrays() { delete [] fGain; fGain = NULL; - delete [] fCerWidth; fCerWidth = NULL; - delete [] fNPMT; fNPMT = NULL; - delete [] fADC; fADC = NULL; - delete [] fADC; fADC_P = NULL; - delete [] fNPE; fNPE = NULL; - delete [] fPedSum; fPedSum = NULL; - delete [] fPedSum2; fPedSum2 = NULL; + + // 6 Gev variables + delete [] fPedSum; fPedSum = NULL; + delete [] fPedSum2; fPedSum2 = NULL; delete [] fPedLimit; fPedLimit = NULL; - delete [] fPedMean; fPedMean = NULL; + delete [] fPedMean; fPedMean = NULL; delete [] fPedCount; fPedCount = NULL; - delete [] fPed; fPed = NULL; - delete [] fThresh; fThresh = NULL; -} -//_____________________________________________________________________________ -THcCherenkov::~THcCherenkov() -{ - // Destructor - delete fADCHits; fADCHits = NULL; - - delete frAdcPedRaw; frAdcPedRaw = NULL; - delete frAdcPulseIntRaw; frAdcPulseIntRaw = NULL; - delete frAdcPulseAmpRaw; frAdcPulseAmpRaw = NULL; - delete frAdcPulseTimeRaw; frAdcPulseTimeRaw = NULL; - - delete frAdcPed; frAdcPed = NULL; - delete frAdcPulseInt; frAdcPulseInt = NULL; - delete frAdcPulseAmp; frAdcPulseAmp = NULL; - - DeleteArrays(); - + delete [] fPed; fPed = NULL; + delete [] fThresh; fThresh = NULL; } //_____________________________________________________________________________ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date ) { - cout << "THcCherenkov::Init " << GetName() << endl; + cout << "THcCherenkov::Init for: " << GetName() << endl; string EngineDID = string(GetApparatus()->GetName()).substr(0, 1) + GetName(); std::transform(EngineDID.begin(), EngineDID.end(), EngineDID.begin(), ::toupper); - if( gHcDetectorMap->FillMap(fDetMap, EngineDID.c_str()) < 0 ) { + if(gHcDetectorMap->FillMap(fDetMap, EngineDID.c_str()) < 0) { static const char* const here = "Init()"; Error(Here(here), "Error filling detectormap for %s.", EngineDID.c_str()); return kInitError; @@ -155,7 +146,7 @@ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date ) InitHitList(fDetMap, "THcCherenkovHit", fDetMap->GetTotNumChan()+1); EStatus status; - if( (status = THaNonTrackingDetector::Init( date )) ) + if((status = THaNonTrackingDetector::Init( date ))) return fStatus=status; return fStatus = kOK; @@ -167,70 +158,67 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) // This function is called by THaDetectorBase::Init() once at the beginning // of the analysis. - cout << "THcCherenkov::ReadDatabase " << GetName() << endl; // Ahmed + cout << "THcCherenkov::ReadDatabase for: " << GetName() << endl; // Ahmed string prefix = string(GetApparatus()->GetName()).substr(0, 1) + GetName(); std::transform(prefix.begin(), prefix.end(), prefix.begin(), ::tolower); + fNRegions = 4; // Defualt if not set in paramter file + DBRequest list_1[] = { {"_tot_pmts", &fNelem, kInt}, {0} }; + gHcParms->LoadParmValues(list_1, prefix.c_str()); - // fNelem = 2; // Default if not defined - fCerNRegions = 3; + Bool_t optional = true; - fNPMT = new Int_t[fNelem]; - fADC_hit = new Int_t[fNelem]; - fADC = new Double_t[fNelem]; - fADC_P = new Double_t[fNelem]; - fNPE = new Double_t[fNelem]; + cout << "Number of " << GetApparatus()->GetName() << "." + << GetName() << " PMTs defined = " << fNelem << endl; - fCerWidth = new Double_t[fNelem]; - fGain = new Double_t[fNelem]; + // 6 GeV pedestal paramters fPedLimit = new Int_t[fNelem]; - fPedMean = new Double_t[fNelem]; + fGain = new Double_t[fNelem]; + fPedMean = new Double_t[fNelem]; - - - fCerTrackCounter = new Int_t [fCerNRegions]; - fCerFiredCounter = new Int_t [fCerNRegions]; - for ( Int_t ireg = 0; ireg < fCerNRegions; ireg++ ) { - fCerTrackCounter[ireg] = 0; - fCerFiredCounter[ireg] = 0; - } - - fCerRegionsValueMax = fCerNRegions * 8; // This value 8 should also be in paramter file - fCerRegionValue = new Double_t [fCerRegionsValueMax]; + // Region parameters + fRegionsValueMax = fNRegions * 8; + fRegionValue = new Double_t[fRegionsValueMax]; DBRequest list[]={ - {"_adc_to_npe", fGain, kDouble, (UInt_t) fNelem}, - {"_ped_limit", fPedLimit, kInt, (UInt_t) fNelem}, - {"_width", fCerWidth, kDouble, (UInt_t) fNelem}, - {"_chi2max", &fCerChi2Max, kDouble}, - {"_beta_min", &fCerBetaMin, kDouble}, - {"_beta_max", &fCerBetaMax, kDouble}, - {"_et_min", &fCerETMin, kDouble}, - {"_et_max", &fCerETMax, kDouble}, - {"_mirror_zpos", &fCerMirrorZPos, kDouble}, - {"_region", &fCerRegionValue[0], kDouble, (UInt_t) fCerRegionsValueMax}, - {"_threshold", &fCerThresh, kDouble}, - // {"cer_regions", &fCerNRegions, kInt}, + {"_ped_limit", fPedLimit, kInt, (UInt_t) fNelem, optional}, + {"_adc_to_npe", fGain, kDouble, (UInt_t) fNelem}, + {"_red_chi2_min", &fRedChi2Min, kDouble}, + {"_red_chi2_max", &fRedChi2Max, kDouble}, + {"_beta_min", &fBetaMin, kDouble}, + {"_beta_max", &fBetaMax, kDouble}, + {"_enorm_min", &fENormMin, kDouble}, + {"_enorm_max", &fENormMax, kDouble}, + {"_mirror_zpos", &fMirrorZPos, kDouble}, + {"_npe_thresh", &fNpeThresh, kDouble}, + {"_debug_adc", &fDebugAdc, kInt, 0, 1}, + {"_adcTimeWindowMin", &fAdcTimeWindowMin, kDouble}, + {"_adcTimeWindowMax", &fAdcTimeWindowMax, kDouble}, + {"_num_regions", &fNRegions, kInt}, + {"_region", &fRegionValue[0], kDouble, (UInt_t) fRegionsValueMax}, {0} }; - gHcParms->LoadParmValues((DBRequest*)&list,prefix.c_str()); + fDebugAdc = 0; // Set ADC debug parameter to false unless set in parameter file - fIsInit = true; + gHcParms->LoadParmValues((DBRequest*)&list, prefix.c_str()); + if (fDebugAdc) cout << "Cherenkov ADC Debug Flag Set To TRUE" << endl; - for (Int_t i1 = 0; i1 < fCerNRegions; i1++ ) { - cout << "Region " << i1 << endl; - for (Int_t i2 = 0; i2 < 8; i2++ ) { - cout << fCerRegionValue[GetCerIndex( i1, i2 )] << " "; - } - cout <<endl; + fIsInit = true; + + cout << "Track Matching Parameters for: " << GetName() << endl; + for (Int_t iregion = 0; iregion < fNRegions; iregion++) { + cout << "Region = " << iregion + 1 << endl; + for (Int_t ivalue = 0; ivalue < 8; ivalue++) + cout << fRegionValue[GetIndex(iregion, ivalue)] << " "; + cout << endl; } // Create arrays to hold pedestal results @@ -243,64 +231,64 @@ Int_t THcCherenkov::ReadDatabase( const TDatime& date ) Int_t THcCherenkov::DefineVariables( EMode mode ) { // Initialize global variables for histogramming and tree - - cout << "THcCherenkov::DefineVariables called " << GetName() << endl; + cout << "THcCherenkov::DefineVariables called for: " << GetName() << endl; if( mode == kDefine && fIsSetup ) return kOK; fIsSetup = ( mode == kDefine ); // Register variables in global list + vector<RVarDef> vars; + + vars.push_back({"adcCounter", "ADC counter numbers", "frAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}); + vars.push_back({"adcErrorFlag", "Error Flag for When FPGA Fails", "fAdcErrorFlag.THcSignalHit.GetData()"}); + + vars.push_back({"numGoodAdcHits", "Number of Good ADC Hits Per PMT", "fNumGoodAdcHits"}); // Cherenkov occupancy + vars.push_back({"totNumGoodAdcHits", "Total Number of Good ADC Hits", "fTotNumGoodAdcHits"}); // Cherenkov multiplicity + + vars.push_back({"numTracksMatched", "Number of Tracks Matched Per Region", "fNumTracksMatched"}); + vars.push_back({"numTracksFired", "Number of Tracks that Fired Per Region", "fNumTracksFired"}); + vars.push_back({"totNumTracksMatched", "Total Number of Tracks Matched Per Region", "fTotNumTracksMatched"}); + vars.push_back({"totNumTracksFired", "Total Number of Tracks that Fired", "fTotNumTracksFired"}); + + vars.push_back({"npe", "Number of PEs", "fNpe"}); + vars.push_back({"npeSum", "Total Number of PEs", "fNpeSum"}); + + vars.push_back({"goodAdcPed", "Good ADC pedestals", "fGoodAdcPed"}); + vars.push_back({"goodAdcPulseInt", "Good ADC pulse integrals", "fGoodAdcPulseInt"}); + vars.push_back({"goodAdcPulseIntRaw", "Good ADC raw pulse integrals", "fGoodAdcPulseIntRaw"}); + vars.push_back({"goodAdcPulseAmp", "Good ADC pulse amplitudes", "fGoodAdcPulseAmp"}); + vars.push_back({"goodAdcPulseTime", "Good ADC pulse times", "fGoodAdcPulseTime"}); + + if (fDebugAdc) { + vars.push_back({"numAdcHits", "Number of ADC Hits Per PMT", "fNumAdcHits"}); // Cherenkov occupancy + vars.push_back({"totNumAdcHits", "Total Number of ADC Hits", "fTotNumAdcHits"}); // Cherenkov multiplicity + vars.push_back({"adcPedRaw", "Raw ADC pedestals", "frAdcPedRaw.THcSignalHit.GetData()"}); + vars.push_back({"adcPulseIntRaw", "Raw ADC pulse integrals", "frAdcPulseIntRaw.THcSignalHit.GetData()"}); + vars.push_back({"adcPulseAmpRaw", "Raw ADC pulse amplitudes", "frAdcPulseAmpRaw.THcSignalHit.GetData()"}); + vars.push_back({"adcPulseTimeRaw", "Raw ADC pulse times", "frAdcPulseTimeRaw.THcSignalHit.GetData()"}); + vars.push_back({"adcPed", "ADC pedestals", "frAdcPed.THcSignalHit.GetData()"}); + vars.push_back({"adcPulseInt", "ADC pulse integrals", "frAdcPulseInt.THcSignalHit.GetData()"}); + vars.push_back({"adcPulseAmp", "ADC pulse amplitudes", "frAdcPulseAmp.THcSignalHit.GetData()"}); + } - // Do we need to put the number of pos/neg TDC/ADC hits into the variables? - // No. They show up in tree as Ndata.H.aero.postdchits for example - - RVarDef vars[] = { - {"phototubes", "Nuber of Cherenkov photo tubes", "fNPMT"}, - {"adc", "Raw ADC values", "fADC"}, - {"adc_hit", "ADC hit flag =1 means hit", "fADC_hit"}, - {"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"}, - {"certrackcounter", "Tracks inside Cherenkov region", "fCerTrackCounter"}, - {"cerfiredcounter", "Tracks with engough Cherenkov NPEs ", "fCerFiredCounter"}, - - {"adcCounter", "List of ADC counter numbers.", "frAdcPulseIntRaw.THcSignalHit.GetPaddleNumber()"}, - - {"adcPedRaw", "List of raw ADC pedestals", "frAdcPedRaw.THcSignalHit.GetData()"}, - {"adcPulseIntRaw", "List of raw ADC pulse integrals.", "frAdcPulseIntRaw.THcSignalHit.GetData()"}, - {"adcPulseAmpRaw", "List of raw ADC pulse amplitudes.", "frAdcPulseAmpRaw.THcSignalHit.GetData()"}, - {"adcPulseTimeRaw", "List of raw ADC pulse times.", "frAdcPulseTimeRaw.THcSignalHit.GetData()"}, + RVarDef end {}; + vars.push_back(end); - {"adcPed", "List of ADC pedestals", "frAdcPed.THcSignalHit.GetData()"}, - {"adcPulseInt", "List of ADC pulse integrals.", "frAdcPulseInt.THcSignalHit.GetData()"}, - {"adcPulseAmp", "List of ADC pulse amplitudes.", "frAdcPulseAmp.THcSignalHit.GetData()"}, + return DefineVarsFromList(vars.data(), mode); - { 0 } - }; - - return DefineVarsFromList( vars, mode ); } //_____________________________________________________________________________ inline void THcCherenkov::Clear(Option_t* opt) { // Clear the hit lists - fADCHits->Clear(); - - // Clear Cherenkov variables from h_trans_cer.f + fNhits = 0; + fTotNumAdcHits = 0; + fTotNumGoodAdcHits = 0; + fTotNumTracksMatched = 0; + fTotNumTracksFired = 0; - fNhits = 0; - fNPEsum = 0.0; - fNCherHit = 0; - - for(Int_t itube = 0;itube < fNelem;itube++) { - fNPMT[itube] = 0; - fADC[itube] = 0; - fADC_P[itube] = 0; - fNPE[itube] = 0; - fADC_hit[itube] = 0; - } + fNpeSum = 0.0; frAdcPedRaw->Clear(); frAdcPulseIntRaw->Clear(); @@ -310,6 +298,24 @@ void THcCherenkov::Clear(Option_t* opt) frAdcPed->Clear(); frAdcPulseInt->Clear(); frAdcPulseAmp->Clear(); + fAdcErrorFlag->Clear(); + + for (UInt_t ielem = 0; ielem < fNumAdcHits.size(); ielem++) + fNumAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumGoodAdcHits.size(); ielem++) + fNumGoodAdcHits.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumTracksMatched.size(); ielem++) + fNumTracksMatched.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fNumTracksFired.size(); ielem++) + fNumTracksFired.at(ielem) = 0; + for (UInt_t ielem = 0; ielem < fGoodAdcPed.size(); ielem++) { + fGoodAdcPed.at(ielem) = 0.0; + fGoodAdcPulseInt.at(ielem) = 0.0; + fGoodAdcPulseIntRaw.at(ielem) = 0.0; + fGoodAdcPulseAmp.at(ielem) = 0.0; + fGoodAdcPulseTime.at(ielem) = 0.0; + fNpe.at(ielem) = 0.0; + } } @@ -330,40 +336,35 @@ Int_t THcCherenkov::Decode( const THaEvData& evdata ) fAnalyzePedestals = 0; // Don't analyze pedestals next event } - - Int_t ihit = 0; - Int_t nADCHits=0; - + Int_t ihit = 0; UInt_t nrAdcHits = 0; while(ihit < fNhits) { - THcCherenkovHit* hit = (THcCherenkovHit *) fRawHitList->At(ihit); - Int_t padnum = hit->fCounter; + THcCherenkovHit* hit = (THcCherenkovHit*) fRawHitList->At(ihit); + Int_t npmt = hit->fCounter; + THcRawAdcHit& rawAdcHit = hit->GetRawAdcHitPos(); - THcRawAdcHit& rawAdcHit = hit->GetRawAdcHitPos(); - for (UInt_t thit=0; thit<rawAdcHit.GetNPulses(); ++thit) { - ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPedRaw()); - ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPed()); + for (UInt_t thit = 0; thit < rawAdcHit.GetNPulses(); thit++) { - ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseIntRaw(thit)); - ((THcSignalHit*) frAdcPulseInt->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseInt(thit)); + ((THcSignalHit*) frAdcPedRaw->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPedRaw()); + ((THcSignalHit*) frAdcPed->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPed()); - ((THcSignalHit*) frAdcPulseAmpRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseAmpRaw(thit)); - ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseAmp(thit)); + ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPulseIntRaw(thit)); + ((THcSignalHit*) frAdcPulseInt->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPulseInt(thit)); - ((THcSignalHit*) frAdcPulseTimeRaw->ConstructedAt(nrAdcHits))->Set(padnum, rawAdcHit.GetPulseTimeRaw(thit)); - fADC_hit[padnum-1]=1; // - // cout << dec << "thit = " << thit << " " << padnum << " " << rawAdcHit.GetPulseInt(thit)<< " " << rawAdcHit.GetPulseIntRaw(thit) << " " << rawAdcHit.GetPedRaw() << " " << rawAdcHit.GetPedRaw()*28./4.<< endl; - ++nrAdcHits; - } + ((THcSignalHit*) frAdcPulseAmpRaw->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPulseAmpRaw(thit)); + ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPulseAmp(thit)); - // ADC hit - if(hit->GetRawAdcHitPos().GetPulseIntRaw() > 0) { - THcSignalHit *sighit = (THcSignalHit*) fADCHits->ConstructedAt(nADCHits++); - sighit->Set(hit->fCounter, hit->GetRawAdcHitPos().GetPulseIntRaw()); - } + ((THcSignalHit*) frAdcPulseTimeRaw->ConstructedAt(nrAdcHits))->Set(npmt, rawAdcHit.GetPulseTimeRaw(thit)); + if (rawAdcHit.GetPulseAmpRaw(thit) > 0) ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(npmt, 0); + if (rawAdcHit.GetPulseAmpRaw(thit) <= 0) ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(nrAdcHits))->Set(npmt, 1); + + ++nrAdcHits; + fTotNumAdcHits++; + fNumAdcHits.at(npmt-1) = npmt; + } ihit++; } return ihit; @@ -376,24 +377,36 @@ Int_t THcCherenkov::ApplyCorrections( void ) } //_____________________________________________________________________________ -Int_t THcCherenkov::CoarseProcess( TClonesArray& ) //tracks +Int_t THcCherenkov::CoarseProcess( TClonesArray& ) { - for(Int_t ihit=0; ihit < fNhits; ihit++) { - THcCherenkovHit* hit = (THcCherenkovHit *) fRawHitList->At(ihit); // nhit = 1, hcer_tot_hits - - // Pedestal subtraction and gain adjustment - - Int_t npmt = hit->fCounter - 1; // tube = hcer_tube_num(nhit) - fNPMT[npmt] = hit->fCounter; - fADC[npmt] = hit->GetRawAdcHitPos().GetPulseIntRaw(); - fADC_P[npmt] = hit->GetRawAdcHitPos().GetPulseInt(); - fNPE[npmt] = fGain[npmt]*fADC_P[npmt]; - fNCherHit ++; - fNPEsum += fNPE[npmt]; + // Loop over the elements in the TClonesArray + for(Int_t ielem = 0; ielem < frAdcPulseInt->GetEntries(); ielem++) { + + Int_t npmt = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetPaddleNumber() - 1; + Double_t pulsePed = ((THcSignalHit*) frAdcPed->ConstructedAt(ielem))->GetData(); + Double_t pulseInt = ((THcSignalHit*) frAdcPulseInt->ConstructedAt(ielem))->GetData(); + Double_t pulseIntRaw = ((THcSignalHit*) frAdcPulseIntRaw->ConstructedAt(ielem))->GetData(); + Double_t pulseAmp = ((THcSignalHit*) frAdcPulseAmp->ConstructedAt(ielem))->GetData(); + Double_t pulseTime = ((THcSignalHit*) frAdcPulseTimeRaw->ConstructedAt(ielem))->GetData(); + Bool_t errorFlag = ((THcSignalHit*) fAdcErrorFlag->ConstructedAt(ielem))->GetData(); + Bool_t pulseTimeCut = pulseTime > fAdcTimeWindowMin && pulseTime < fAdcTimeWindowMax; + + // By default, the last hit within the timing cut will be considered "good" + if (!errorFlag && pulseTimeCut) { + fGoodAdcPed.at(npmt) = pulsePed; + fGoodAdcPulseInt.at(npmt) = pulseInt; + fGoodAdcPulseIntRaw.at(npmt) = pulseIntRaw; + fGoodAdcPulseAmp.at(npmt) = pulseAmp; + fGoodAdcPulseTime.at(npmt) = pulseTime; + + fNpe.at(npmt) = fGain[npmt]*fGoodAdcPulseInt.at(npmt); + fNpeSum += fNpe.at(npmt); + + fTotNumGoodAdcHits++; + fNumGoodAdcHits.at(npmt) = npmt + 1; + } } - - return 0; } @@ -401,69 +414,82 @@ Int_t THcCherenkov::CoarseProcess( TClonesArray& ) //tracks Int_t THcCherenkov::FineProcess( TClonesArray& tracks ) { - if ( tracks.GetLast() > -1 ) { - - THaTrack* theTrack = dynamic_cast<THaTrack*>( tracks.At(0) ); - if (!theTrack) return -1; - - if ( ( ( tracks.GetLast() + 1 ) == 1 ) && - ( theTrack->GetChi2()/theTrack->GetNDoF() > 0. ) && - ( theTrack->GetChi2()/theTrack->GetNDoF() < fCerChi2Max ) && - ( theTrack->GetBeta() > fCerBetaMin ) && - ( theTrack->GetBeta() < fCerBetaMax ) && - ( ( theTrack->GetEnergy() / theTrack->GetP() ) > fCerETMin ) && - ( ( theTrack->GetEnergy() / theTrack->GetP() ) < fCerETMax ) - ) { - - Double_t cerX = theTrack->GetX() + theTrack->GetTheta() * fCerMirrorZPos; - Double_t cerY = theTrack->GetY() + theTrack->GetPhi() * fCerMirrorZPos; - - for ( Int_t ir = 0; ir < fCerNRegions; ir++ ) { - - // * hit must be inside the region in order to continue. - - if ( ( TMath::Abs( fCerRegionValue[GetCerIndex( ir, 0 )] - cerX ) < - fCerRegionValue[GetCerIndex( ir, 4 )] ) && - ( TMath::Abs( fCerRegionValue[GetCerIndex( ir, 1 )] - cerY ) < - fCerRegionValue[GetCerIndex( ir, 5 )] ) && - ( TMath::Abs( fCerRegionValue[GetCerIndex( ir, 2 )] - theTrack->GetTheta() ) < - fCerRegionValue[GetCerIndex( ir, 6 )] ) && - ( TMath::Abs( fCerRegionValue[GetCerIndex( ir, 3 )] - theTrack->GetPhi() ) < - fCerRegionValue[GetCerIndex( ir, 7 )] ) - ) { - - // * increment the 'should have fired' counters - fCerTrackCounter[ir] ++; - - // * increment the 'did fire' counters - if ( fNPEsum > fCerThresh ) { - fCerFiredCounter[ir] ++; - } - } - } // loop over regions - } - } + Int_t nTracks = tracks.GetLast() + 1; + + for (Int_t itrack = 0; itrack < nTracks; itrack++) { + + THaTrack* track = dynamic_cast<THaTrack*> (tracks[itrack]); + if (track->GetIndex() != 0) continue; // Select the best track + + Double_t trackChi2 = track->GetChi2(); + Int_t trackNDoF = track->GetNDoF(); + Double_t trackRedChi2 = trackChi2/trackNDoF; + Double_t trackBeta = track->GetBeta(); + Double_t trackEnergy = track->GetEnergy(); + Double_t trackMom = track->GetP(); + Double_t trackENorm = trackEnergy/trackMom; + Double_t trackXfp = track->GetX(); + Double_t trackYfp = track->GetY(); + Double_t trackTheta = track->GetTheta(); + Double_t trackPhi = track->GetPhi(); + + Bool_t trackRedChi2Cut = trackRedChi2 > fRedChi2Min && trackRedChi2 < fRedChi2Max; + Bool_t trackBetaCut = trackBeta > fBetaMin && trackBeta < fBetaMax; + Bool_t trackENormCut = trackENorm > fENormMin && trackENorm < fENormMax; + + if (trackRedChi2Cut && trackBetaCut && trackENormCut) { + + // Project the track to the Cherenkov mirror planes + Double_t xAtCher = trackXfp + trackTheta * fMirrorZPos; + Double_t yAtCher = trackYfp + trackPhi * fMirrorZPos; + + // cout << "Cherenkov Detector: " << GetName() << " has fNRegions = " << fNRegions << endl; + // cout << "nTracks = " << nTracks << "\t" << "trackChi2 = " << trackChi2 + // << "\t" << "trackNDof = " << trackNDoF << "\t" << "trackRedChi2 = " << trackRedChi2 << endl; + // cout << "trackBeta = " << trackBeta << "\t" << "trackEnergy = " << trackEnergy << "\t" + // << "trackMom = " << trackMom << "\t" << "trackENorm = " << trackENorm << endl; + // cout << "trackXfp = " << trackXfp << "\t" << "trackYfp = " << trackYfp << "\t" + // << "trackTheta = " << trackTheta << "\t" << "trackPhi = " << trackPhi << endl; + // cout << "fMirrorZPos = " << fMirrorZPos << "\t" << "xAtCher = " << xAtCher << "\t" << "yAtCher = " << yAtCher << endl; + // cout << "=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:" << endl; + + for (Int_t iregion = 0; iregion < fNRegions; iregion++) { + + if ((TMath::Abs(fRegionValue[GetIndex(iregion, 0)] - xAtCher) < fRegionValue[GetIndex(iregion, 4)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 1)] - yAtCher) < fRegionValue[GetIndex(iregion, 5)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 2)] - trackTheta) < fRegionValue[GetIndex(iregion, 6)]) && + (TMath::Abs(fRegionValue[GetIndex(iregion, 3)] - trackPhi) < fRegionValue[GetIndex(iregion, 7)])) { + + fTotNumTracksMatched++; + fNumTracksMatched.at(iregion) = iregion + 1; + + if (fNpeSum > fNpeThresh) { + fTotNumTracksFired++; + fNumTracksFired.at(iregion) = iregion + 1; + } // NPE threshold cut + } // Regional cuts + } // Loop over regions + } // Tracking cuts + } // Track loop return 0; } //_____________________________________________________________________________ -void THcCherenkov::InitializePedestals( ) +void THcCherenkov::InitializePedestals() { fNPedestalEvents = 0; - fMinPeds = 500; // In engine, this is set in parameter file - fPedSum = new Int_t [fNelem]; - fPedSum2 = new Int_t [fNelem]; - fPedCount = new Int_t [fNelem]; - - fPed = new Double_t [fNelem]; - fThresh = new Double_t [fNelem]; - for(Int_t i=0;i<fNelem;i++) { - fPedSum[i] = 0; - fPedSum2[i] = 0; + fMinPeds = 500; // In engine, this is set in parameter file + fPedSum = new Int_t [fNelem]; + fPedSum2 = new Int_t [fNelem]; + fPedCount = new Int_t [fNelem]; + fPed = new Double_t [fNelem]; + fThresh = new Double_t [fNelem]; + for(Int_t i = 0; i < fNelem; i++) { + fPedSum[i] = 0; + fPedSum2[i] = 0; fPedCount[i] = 0; } - } //_____________________________________________________________________________ @@ -481,7 +507,7 @@ void THcCherenkov::AccumulatePedestals(TClonesArray* rawhits) Int_t element = hit->fCounter - 1; Int_t nadc = hit->GetRawAdcHitPos().GetPulseIntRaw(); if(nadc <= fPedLimit[element]) { - fPedSum[element] += nadc; + fPedSum[element] += nadc; fPedSum2[element] += nadc*nadc; fPedCount[element]++; if(fPedCount[element] == fMinPeds/5) { @@ -497,7 +523,7 @@ void THcCherenkov::AccumulatePedestals(TClonesArray* rawhits) } //_____________________________________________________________________________ -void THcCherenkov::CalculatePedestals( ) +void THcCherenkov::CalculatePedestals() { // Use the accumulated pedestal data to calculate pedestals // Later add check to see if pedestals have drifted ("Danger Will Robinson!") @@ -523,34 +549,30 @@ void THcCherenkov::CalculatePedestals( ) } //_____________________________________________________________________________ -Int_t THcCherenkov::GetCerIndex( Int_t nRegion, Int_t nValue ) { - - return fCerNRegions * nValue + nRegion; +Int_t THcCherenkov::GetIndex(Int_t nRegion, Int_t nValue) +{ + return fNRegions * nValue + nRegion; } //_____________________________________________________________________________ -void THcCherenkov::Print( const Option_t* opt) const { +void THcCherenkov::Print(const Option_t* opt) const +{ THaNonTrackingDetector::Print(opt); - // Print out the pedestals - cout << endl; cout << "Cherenkov Pedestals" << endl; - // Ahmed cout << "No. ADC" << endl; - for(Int_t i=0; i<fNelem; i++){ + for(Int_t i=0; i<fNelem; i++) cout << " " << i << " " << fPed[i] << endl; - } - cout << endl; } //_____________________________________________________________________________ -Double_t THcCherenkov::GetCerNPE() { - - return fNPEsum; +Double_t THcCherenkov::GetCerNPE() +{ + return fNpeSum; } ClassImp(THcCherenkov) diff --git a/src/THcCherenkov.h b/src/THcCherenkov.h index 2a02df87f187a0c64d3bad22d527556121c301ed..80d18e1fd11201c6984ac6230f83f89ffd6020f9 100644 --- a/src/THcCherenkov.h +++ b/src/THcCherenkov.h @@ -15,85 +15,91 @@ class THcCherenkov : public THaNonTrackingDetector, public THcHitList { public: - THcCherenkov( const char* name, const char* description = "", - THaApparatus* a = NULL ); + THcCherenkov(const char* name, const char* description = "", THaApparatus* a = NULL); virtual ~THcCherenkov(); - virtual void Clear( Option_t* opt="" ); - virtual Int_t Decode( const THaEvData& ); - virtual EStatus Init( const TDatime& run_time ); - void InitArrays(); - void DeleteArrays(); - virtual Int_t ReadDatabase( const TDatime& date ); - virtual Int_t DefineVariables( EMode mode = kDefine ); - virtual Int_t CoarseProcess( TClonesArray& tracks ); - virtual Int_t FineProcess( TClonesArray& tracks ); - - virtual void AccumulatePedestals(TClonesArray* rawhits); - virtual void CalculatePedestals(); - - virtual Int_t ApplyCorrections( void ); - - virtual void Print(const Option_t* opt) const; - - Int_t GetCerIndex(Int_t nRegion, Int_t nValue); + virtual void Clear(Option_t* opt=""); + virtual void Print(const Option_t* opt) const; + virtual void AccumulatePedestals(TClonesArray* rawhits); + virtual void CalculatePedestals(); + virtual Int_t Decode(const THaEvData&); + virtual Int_t ReadDatabase(const TDatime& date); + virtual Int_t DefineVariables(EMode mode = kDefine); + virtual Int_t CoarseProcess(TClonesArray& tracks); + virtual Int_t FineProcess(TClonesArray& tracks); + virtual Int_t ApplyCorrections( void ); + virtual EStatus Init(const TDatime& run_time); + + void InitArrays(); + void DeleteArrays(); + Int_t GetIndex(Int_t nRegion, Int_t nValue); // Double_t GetCerNPE() { return fNPEsum;} Double_t GetCerNPE(); + // Vector/TClonesArray length parameters + static const Int_t MaxNumCerPmt = 4; + static const Int_t MaxNumAdcPulse = 4; + THcCherenkov(); // for ROOT I/O protected: - Int_t fAnalyzePedestals; - - // Parameters - Double_t* fGain; - Double_t* fCerWidth; - - // Event information - Int_t fNhits; - Int_t* fADC_hit; // [fNelem] Array of flag if ADC hit 1 means - 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; - Int_t fNCherHit; - - Double_t* fCerRegionValue; - Double_t fCerChi2Max; - Double_t fCerBetaMin; - Double_t fCerBetaMax; - Double_t fCerETMin; - Double_t fCerETMax; - Double_t fCerMirrorZPos; - Int_t fCerNRegions; - Int_t fCerRegionsValueMax; - Int_t* fCerTrackCounter; // [fCerNRegions] Array of Cher regions - Int_t* fCerFiredCounter; // [fCerNRegions] Array of Cher regions - Double_t fCerThresh; - - // Hits - TClonesArray* fADCHits; - - // Pedestals - 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; - + Int_t fAnalyzePedestals; + Int_t fDebugAdc; + Double_t* fWidth; + + Int_t fNhits; + Int_t fTotNumAdcHits; + Int_t fTotNumGoodAdcHits; + Int_t fTotNumTracksMatched; + Int_t fTotNumTracksFired; + Double_t fNpeSum; + Double_t* fGain; + + vector<Int_t> fNumAdcHits; + vector<Int_t> fNumGoodAdcHits; + vector<Int_t> fNumTracksMatched; + vector<Int_t> fNumTracksFired; + vector<Double_t> fGoodAdcPed; + vector<Double_t> fGoodAdcPulseInt; + vector<Double_t> fGoodAdcPulseIntRaw; + vector<Double_t> fGoodAdcPulseAmp; + vector<Double_t> fGoodAdcPulseTime; + vector<Double_t> fNpe; + + Int_t fNRegions; + Int_t fRegionsValueMax; + Double_t fRedChi2Min; + Double_t fRedChi2Max; + Double_t fBetaMin; + Double_t fBetaMax; + Double_t fENormMin; + Double_t fENormMax; + Double_t fMirrorZPos; + Double_t fNpeThresh; + Double_t fAdcTimeWindowMin; + Double_t fAdcTimeWindowMax; + Double_t* fRegionValue; + + // 6 Gev pedestal variables + Int_t fNPedestalEvents; + Int_t fMinPeds; + Int_t* fPedSum; /* Accumulators for pedestals */ + Int_t* fPedSum2; + Int_t* fPedLimit; + Int_t* fPedCount; + Double_t* fPedMean; /* Can be supplied in parameters and then */ + Double_t* fPed; + Double_t* fThresh; + + // 12 Gev FADC variables TClonesArray* frAdcPedRaw; TClonesArray* frAdcPulseIntRaw; TClonesArray* frAdcPulseAmpRaw; TClonesArray* frAdcPulseTimeRaw; - TClonesArray* frAdcPed; TClonesArray* frAdcPulseInt; TClonesArray* frAdcPulseAmp; + TClonesArray* fAdcErrorFlag; void Setup(const char* name, const char* description); virtual void InitializePedestals( );