diff --git a/src/THcAerogel.cxx b/src/THcAerogel.cxx index 3b53d464d25481e83701a50dec76ca3a64cd4a4d..2addeded249a0f044cbc46ee0761c9ffb91f27fe 100644 --- a/src/THcAerogel.cxx +++ b/src/THcAerogel.cxx @@ -36,51 +36,56 @@ using namespace std; //_____________________________________________________________________________ THcAerogel::THcAerogel( const char* name, const char* description, THaApparatus* apparatus ) : - THaNonTrackingDetector(name,description,apparatus) + THaNonTrackingDetector(name,description,apparatus), fPresentP(0), + fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0), + fAdcNegTimeWindowMax(0), fRegionValue(0), fPosGain(0), fNegGain(0), + frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0), + frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0), + frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0), + frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0), + frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0), + frNegAdcPulseTime(0), fPosAdcErrorFlag(0), + fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0), + fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0), + fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0), + fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0), + fNegThresh(0), fPosPedMean(0), fNegPedMean(0), + fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0) { - - InitArrays(); - } //_____________________________________________________________________________ THcAerogel::THcAerogel( ) : - THaNonTrackingDetector() + THaNonTrackingDetector(), + fAdcPosTimeWindowMin(0), fAdcPosTimeWindowMax(0), fAdcNegTimeWindowMin(0), + fAdcNegTimeWindowMax(0), fRegionValue(0), fPosGain(0), fNegGain(0), + frPosAdcPedRaw(0), frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0), + frPosAdcPulseTimeRaw(0), frPosAdcPed(0), frPosAdcPulseInt(0), + frPosAdcPulseAmp(0), frPosAdcPulseTime(0), frNegAdcPedRaw(0), + frNegAdcPulseIntRaw(0), frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0), + frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0), + frNegAdcPulseTime(0), fPosAdcErrorFlag(0), + fNegAdcErrorFlag(0), fPosPedSum(0), fPosPedSum2(0), fPosPedLimit(0), + fPosPedCount(0), fNegPedSum(0), fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0), + fA_Pos(0), fA_Neg(0), fA_Pos_p(0), fA_Neg_p(0), fT_Pos(0), fT_Neg(0), + fPosPed(0), fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0), + fNegThresh(0), fPosPedMean(0), fNegPedMean(0), + fPosTDCHits(0), fNegTDCHits(0), fPosADCHits(0), fNegADCHits(0) { - // Constructor - frPosAdcPedRaw = NULL; - frPosAdcPulseIntRaw = NULL; - frPosAdcPulseAmpRaw = NULL; - frPosAdcPulseTimeRaw = NULL; - frPosAdcPed = NULL; - frPosAdcPulseInt = NULL; - frPosAdcPulseAmp = NULL; - frPosAdcPulseTime = NULL; - frNegAdcPedRaw = NULL; - frNegAdcPulseIntRaw = NULL; - frNegAdcPulseAmpRaw = NULL; - frNegAdcPulseTimeRaw = NULL; - frNegAdcPed = NULL; - frNegAdcPulseInt = NULL; - frNegAdcPulseAmp = NULL; - frNegAdcPulseTime = NULL; - fPosAdcErrorFlag = NULL; - fNegAdcErrorFlag = NULL; - - // 6 GeV variables - fPosTDCHits = NULL; - fNegTDCHits = NULL; - fPosADCHits = NULL; - fNegADCHits = NULL; - - InitArrays(); - } //_____________________________________________________________________________ THcAerogel::~THcAerogel() { // Destructor + DeleteArrays(); +} + +//_____________________________________________________________________________ +void THcAerogel::DeleteArrays() +{ + // Delete all dynamically allocated memory + delete frPosAdcPedRaw; frPosAdcPedRaw = NULL; delete frPosAdcPulseIntRaw; frPosAdcPulseIntRaw = NULL; delete frPosAdcPulseAmpRaw; frPosAdcPulseAmpRaw = NULL; @@ -100,59 +105,37 @@ THcAerogel::~THcAerogel() delete fPosAdcErrorFlag; fPosAdcErrorFlag = NULL; delete fNegAdcErrorFlag; fNegAdcErrorFlag = NULL; + delete [] fRegionValue; fRegionValue = 0; + delete [] fAdcPosTimeWindowMin; fAdcPosTimeWindowMin = 0; + delete [] fAdcPosTimeWindowMax; fAdcPosTimeWindowMax = 0; + delete [] fAdcNegTimeWindowMin; fAdcNegTimeWindowMin = 0; + delete [] fAdcNegTimeWindowMax; fAdcNegTimeWindowMax = 0; + // 6 GeV variables delete fPosTDCHits; fPosTDCHits = NULL; delete fNegTDCHits; fNegTDCHits = NULL; delete fPosADCHits; fPosADCHits = NULL; delete fNegADCHits; fNegADCHits = NULL; - DeleteArrays(); - -} - -//_____________________________________________________________________________ -void THcAerogel::InitArrays() -{ - 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; - fPosPedSum = NULL; - fPosPedSum2 = NULL; - fPosPedCount = NULL; - fNegPedSum = NULL; - fNegPedSum2 = NULL; - fNegPedCount = NULL; - fPosPed = NULL; - fPosSig = NULL; - fPosThresh = NULL; - fNegPed = NULL; - fNegSig = NULL; - fNegThresh = NULL; -} -//_____________________________________________________________________________ -void THcAerogel::DeleteArrays() -{ 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; + + if (fSixGevData) + DeletePedestalArrays(); +} + +//_____________________________________________________________________________ +void THcAerogel::DeletePedestalArrays() +{ + // Delete all dynamically allocated memory for pedestal processing + delete [] fPosPedLimit; fPosPedLimit = NULL; delete [] fNegPedLimit; fNegPedLimit = NULL; delete [] fPosPedMean; fPosPedMean = NULL; @@ -232,26 +215,24 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) gHcParms->LoadParmValues((DBRequest*)&listextra, prefix); - Bool_t optional = true ; + Bool_t optional = true; cout << "Created aerogel detector " << GetApparatus()->GetName() << "." << GetName() << " with " << fNelem << " PMT pairs" << endl; + DeleteArrays(); // avoid memory leak when reinitializing + 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]; 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]; // Normal constructor with name and description frPosAdcPedRaw = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse); @@ -273,28 +254,28 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) fPosAdcErrorFlag = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse); fNegAdcErrorFlag = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse); - fNumPosAdcHits = vector<Int_t> (fNelem, 0.0); - fNumGoodPosAdcHits = vector<Int_t> (fNelem, 0.0); - fNumNegAdcHits = vector<Int_t> (fNelem, 0.0); - fNumGoodNegAdcHits = vector<Int_t> (fNelem, 0.0); - fNumTracksMatched = vector<Int_t> (fNelem, 0.0); - fNumTracksFired = vector<Int_t> (fNelem, 0.0); - fPosNpe = vector<Double_t> (fNelem, 0.0); - fNegNpe = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcPed = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcMult = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcPulseInt = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcPulseAmp = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcPulseTime = vector<Double_t> (fNelem, 0.0); - fGoodPosAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcPed = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcMult = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcPulseInt = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcPulseIntRaw = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcPulseAmp = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcPulseTime = vector<Double_t> (fNelem, 0.0); - fGoodNegAdcTdcDiffTime = vector<Double_t> (fNelem, 0.0); + fNumPosAdcHits.assign(fNelem, 0); + fNumGoodPosAdcHits.assign(fNelem, 0); + fNumNegAdcHits.assign(fNelem, 0); + fNumGoodNegAdcHits.assign(fNelem, 0); + fNumTracksMatched.assign(fNelem, 0); + fNumTracksFired.assign(fNelem, 0); + fPosNpe.assign(fNelem, 0.0); + fNegNpe.assign(fNelem, 0.0); + fGoodPosAdcPed.assign(fNelem, 0.0); + fGoodPosAdcMult.assign(fNelem, 0.0); + fGoodPosAdcPulseInt.assign(fNelem, 0.0); + fGoodPosAdcPulseIntRaw.assign(fNelem, 0.0); + fGoodPosAdcPulseAmp.assign(fNelem, 0.0); + fGoodPosAdcPulseTime.assign(fNelem, 0.0); + fGoodPosAdcTdcDiffTime.assign(fNelem, 0.0); + fGoodNegAdcPed.assign(fNelem, 0.0); + fGoodNegAdcMult.assign(fNelem, 0.0); + fGoodNegAdcPulseInt.assign(fNelem, 0.0); + fGoodNegAdcPulseIntRaw.assign(fNelem, 0.0); + fGoodNegAdcPulseAmp.assign(fNelem, 0.0); + fGoodNegAdcPulseTime.assign(fNelem, 0.0); + fGoodNegAdcTdcDiffTime.assign(fNelem, 0.0); // 6 GeV variables fPosTDCHits = new TClonesArray("THcSignalHit", fNelem*16); @@ -302,15 +283,12 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) fPosADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse); fNegADCHits = new TClonesArray("THcSignalHit", fNelem*MaxNumAdcPulse); - fPosNpeSixGev = vector<Double_t> (fNelem, 0.0); - fNegNpeSixGev = vector<Double_t> (fNelem, 0.0); - - // Create arrays to hold pedestal results - if (fSixGevData) InitializePedestals(); + fPosNpeSixGev.assign(fNelem, 0.0); + fNegNpeSixGev.assign(fNelem, 0.0); // Region parameters fRegionsValueMax = fNRegions * 8; - fRegionValue = new Double_t[fRegionsValueMax]; + fRegionValue = new Double_t[fRegionsValueMax]; fAdcPosTimeWindowMin = new Double_t [fNelem]; fAdcPosTimeWindowMax = new Double_t [fNelem]; @@ -340,12 +318,7 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) {"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}, {"aero_adcrefcut", &fADC_RefTimeCut, kInt, 0, 1}, {0} @@ -365,7 +338,22 @@ Int_t THcAerogel::ReadDatabase( const TDatime& date ) gHcParms->LoadParmValues((DBRequest*)&list, prefix); - if (fSixGevData) cout << "6 GeV Data Analysis Flag Set To TRUE" << endl; + if (fSixGevData) { + // Create arrays to hold pedestal results + InitializePedestals(); + + DBRequest list2[]={ + {"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_min_peds", &fMinPeds, kInt, 0, optional}, + {0} + }; + gHcParms->LoadParmValues((DBRequest*)&list2, prefix); + + cout << "6 GeV Data Analysis Flag Set To TRUE" << endl; + } fIsInit = true; @@ -700,7 +688,7 @@ Int_t THcAerogel::CoarseProcess( TClonesArray& ) //tracks { Double_t StartTime = 0.0; if( fglHod ) StartTime = fglHod->GetStartTime(); - //cout << " starttime = " << StartTime << endl ; + //cout << " starttime = " << StartTime << endl; // Loop over the elements in the TClonesArray for(Int_t ielem = 0; ielem < frPosAdcPulseInt->GetEntries(); ielem++) { @@ -946,17 +934,20 @@ void THcAerogel::InitializePedestals() fNPedestalEvents = 0; fMinPeds = 0; // Do not calculate pedestals by default + DeletePedestalArrays(); + fPosPedLimit = new Int_t [fNelem]; + fNegPedLimit = new Int_t [fNelem]; + fPosPedMean = new Double_t[fNelem]; + fNegPedMean = new Double_t[fNelem]; 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]; - 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]; + fNegPed = new Double_t [fNelem]; fNegThresh = new Double_t [fNelem]; for(Int_t i = 0;i < fNelem; i++) { @@ -1052,14 +1043,16 @@ 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 << "\t" << fNegPedMean[i] << "\t" << fPosPedMean[i] << endl; - cout << endl; - cout << " fMinPeds = " << fMinPeds << endl; - cout << endl; + if (fSixGevData) { + cout << endl; + cout << "Aerogel Pedestals" << endl; + cout << "No. Neg Pos" << 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; + } } //_____________________________________________________________________________ Int_t THcAerogel::End(THaRunBase* run) diff --git a/src/THcAerogel.h b/src/THcAerogel.h index a3e7176b52a8a2b3990eb427df1e6d234920b8e2..5177cfe93449aec21398b0bde6c23257dfdf9dd8 100644 --- a/src/THcAerogel.h +++ b/src/THcAerogel.h @@ -32,8 +32,6 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { virtual EStatus Init(const TDatime& run_time); Int_t End(THaRunBase* run=0); - void InitArrays(); - void DeleteArrays(); Int_t GetIndex(Int_t nRegion, Int_t nValue); THcAerogel(); // for ROOT I/O @@ -131,7 +129,7 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { vector<Double_t> fGoodNegAdcPulseIntRaw; vector<Double_t> fGoodNegAdcPulseAmp; vector<Double_t> fGoodNegAdcPulseTime; - vector<Double_t> fGoodNegAdcTdcDiffTime; + vector<Double_t> fGoodNegAdcTdcDiffTime; // 6 GeV era variables Int_t fAnalyzePedestals; @@ -179,8 +177,10 @@ class THcAerogel : public THaNonTrackingDetector, public THcHitList { vector<Double_t> fNegNpeSixGev; void Setup(const char* name, const char* description); + void DeleteArrays(); + void DeletePedestalArrays(); virtual void InitializePedestals( ); - THcHodoscope* fglHod; // Hodoscope to get start time + THcHodoscope* fglHod; // Hodoscope to get start time ClassDef(THcAerogel,0) // Generic aerogel class } diff --git a/src/THcAnalyzer.cxx b/src/THcAnalyzer.cxx index e4101d6293ec9d1f7cb9b3ec3f605272946d26c1..3f2b619010fdbe93feff0aa5e055926a1de57780 100644 --- a/src/THcAnalyzer.cxx +++ b/src/THcAnalyzer.cxx @@ -103,6 +103,7 @@ void THcAnalyzer::PrintReport(const char* templatefile, const char* ofile) } else { THcFormula* formula = new THcFormula("temp",expression.c_str(),gHcParms,gHaVars,gHaCuts); Double_t value=formula->Eval(); + delete formula; formula = 0; // If the value is close to integer and no format is defined // use "%.0f" to print out integer if(format.empty()) { diff --git a/src/THcCherenkov.cxx b/src/THcCherenkov.cxx index b1042b46cebe6c8afba08b5a98f9964e078b2e43..c0cdd177be1e14175f13544499b3f144177287ac 100644 --- a/src/THcCherenkov.cxx +++ b/src/THcCherenkov.cxx @@ -135,6 +135,10 @@ void THcCherenkov::DeleteArrays() delete [] fPedCount; fPedCount = NULL; delete [] fPed; fPed = NULL; delete [] fThresh; fThresh = NULL; + + delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0; + delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0; + delete [] fRegionValue; fRegionValue = 0; } //_____________________________________________________________________________ @@ -166,7 +170,7 @@ THaAnalysisObject::EStatus THcCherenkov::Init( const TDatime& date ) Warning(Here(here),"Hodoscope \"%s\" not found. ","hod"); } - fPresentP = 0; + fPresentP = 0; THaVar* vpresent = gHaVars->Find(Form("%s.present",GetApparatus()->GetName())); if(vpresent) { fPresentP = (Bool_t *) vpresent->GetValuePointer(); diff --git a/src/THcConfigEvtHandler.cxx b/src/THcConfigEvtHandler.cxx index a6d13335d2af741cb70ae6af29ca730278a7e856..1ecb3e754bd06421bac06435eb64a37577cd2711 100644 --- a/src/THcConfigEvtHandler.cxx +++ b/src/THcConfigEvtHandler.cxx @@ -41,6 +41,9 @@ THcConfigEvtHandler::THcConfigEvtHandler(const char *name, const char* descripti THcConfigEvtHandler::~THcConfigEvtHandler() { + // TODO: remove the parameters we've added to gHcParms + + DeleteCrateInfoMap(); } //Float_t THcConfigEvtHandler::GetData(const std::string& tag) @@ -51,6 +54,26 @@ THcConfigEvtHandler::~THcConfigEvtHandler() // return theDataMap[tag]; //} +void THcConfigEvtHandler::DeleteCrateInfoMap() +{ + // Clear the CrateInfoMap, deallocating its elements' dynamic memory + + //TODO: don't manage memory manually, contain the object, use STL vectors + typedef std::map<Int_t, CrateInfo_t *> cmap_t; + typedef std::map<Int_t, Int_t *> imap_t; + for( cmap_t::iterator it = CrateInfoMap.begin(); + it != CrateInfoMap.end(); ++it ) { + CrateInfo_t* cinfo = it->second; + if( cinfo ) { + for( imap_t::iterator jt = cinfo->FADC250.thresholds.begin(); + jt != cinfo->FADC250.thresholds.end(); ++jt ) { + delete [] jt->second; + } + delete cinfo; + } + } + CrateInfoMap.clear(); +} Int_t THcConfigEvtHandler::Analyze(THaEvData *evdata) { @@ -73,6 +96,7 @@ Int_t THcConfigEvtHandler::Analyze(THaEvData *evdata) cinfo->FADC250.present=0; cinfo->CAEN1190.present=0; cinfo->TI.present=0; + // FIXME: check if entry for this roc already present in the map CrateInfoMap.insert(std::make_pair(roc, cinfo)); ip++; // Three possible blocks of config data @@ -199,12 +223,13 @@ void THcConfigEvtHandler::MakeParms(Int_t roc) while(itt != cinfo->FADC250.thresholds.end()) { Int_t slot = itt->first; - Int_t *threshp = itt->second; - Int_t *thresholds = new Int_t[16]; - for(Int_t ichan=0;ichan<16;ichan++) { - thresholds[ichan] = threshp[ichan]; - } - gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*thresholds); + // this memory would leak +// Int_t *thresholds = new Int_t[16]; +// memcpy(thresholds,itt->second,16*sizeof(Int_t)); +// gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*thresholds); + // Define the variable directly on the CrateInfo_t that resides in CrateInfoMap where it will stay + // until the end of the life of this object + gHcParms->Define(Form("g%s_adc_thresholds_%d_%d[16]",fName.Data(),roc,slot),"ADC Thresholds",*itt->second); Int_t mode = cinfo->FADC250.mode; gHcParms->Define(Form("g%s_adc_mode_%d_%d",fName.Data(),roc,slot),"ADC Mode",mode); @@ -359,7 +384,7 @@ THaAnalysisObject::EStatus THcConfigEvtHandler::Init(const TDatime& date) eventtypes.push_back(125); // what events to look for } - CrateInfoMap.clear(); + DeleteCrateInfoMap(); fStatus = kOK; return kOK; diff --git a/src/THcConfigEvtHandler.h b/src/THcConfigEvtHandler.h index d72c7a1dadc551dd07100689fa4579a9f333a9fb..e62ece45ec1ddf49db72c345a75898bfb5760144 100644 --- a/src/THcConfigEvtHandler.h +++ b/src/THcConfigEvtHandler.h @@ -72,6 +72,8 @@ private: std::map<Int_t, CrateInfo_t *> CrateInfoMap; + void DeleteCrateInfoMap(); + THcConfigEvtHandler(const THcConfigEvtHandler& fh); THcConfigEvtHandler& operator=(const THcConfigEvtHandler& fh); diff --git a/src/THcDC.cxx b/src/THcDC.cxx index 67a9039831a11de00efb5d40ac25fcd218186bf9..25c71281f4bb2d5f53e3f46ea5870eaa8a5fe071 100644 --- a/src/THcDC.cxx +++ b/src/THcDC.cxx @@ -302,9 +302,6 @@ Int_t THcDC::ReadDatabase( const TDatime& date ) delete [] fSigma; fSigma = new Double_t [fNPlanes]; Bool_t optional = true; - fReadoutLR = new Int_t[fNPlanes]; - fReadoutTB = new Int_t[fNPlanes]; - DBRequest list[]={ {"dc_tdc_time_per_channel",&fNSperChan, kDouble}, @@ -484,6 +481,15 @@ void THcDC::DeleteArrays() delete [] fNChamHits; fNChamHits = NULL; delete [] fPlaneEvents; fPlaneEvents = NULL; + for( Int_t i = 0; i<fNPlanes; ++i ) + delete [] fPlaneNames[i]; + delete [] fPlaneNames; + + delete [] fPlaneCoeffs; fPlaneCoeffs = 0; + delete [] fResiduals; fResiduals = 0; + delete [] fResidualsExclPlane; fResidualsExclPlane = 0; + delete [] fWire_hit_did; fWire_hit_did = 0; + delete [] fWire_hit_should; fWire_hit_should = 0; } //_____________________________________________________________________________ diff --git a/src/THcDCLookupTTDConv.cxx b/src/THcDCLookupTTDConv.cxx index cfedc55685ecd2df41beded7c620ce6b85501113..01c49cd622df83840d71b0f1f56a831a1809a3ab 100644 --- a/src/THcDCLookupTTDConv.cxx +++ b/src/THcDCLookupTTDConv.cxx @@ -5,7 +5,8 @@ */ #include "THcDCLookupTTDConv.h" - +#include <cstring> +#include <cassert> ClassImp(THcDCLookupTTDConv) @@ -18,18 +19,17 @@ fT0(T0), fMaxDriftDistance(MaxDriftDistance), fBinSize(BinSize), { //Normal constructor + assert( fNumBins > 0 ); fTable = new Double_t[fNumBins]; - for(Int_t i=0;i<fNumBins;i++) { - fTable[i] = Table[i]; - } - + memcpy( fTable, Table, fNumBins*sizeof(Double_t) ); } //______________________________________________________________________________ THcDCLookupTTDConv::~THcDCLookupTTDConv() { - // Destructor. Remove variables from global list. + // Destructor + delete [] fTable; } //______________________________________________________________________________ diff --git a/src/THcDriftChamber.cxx b/src/THcDriftChamber.cxx index a47dea84f6143fb494246dc86190543c1d4167cc..6f2dac9964fdd2e2362f6684e90c53980b6e3c0e 100644 --- a/src/THcDriftChamber.cxx +++ b/src/THcDriftChamber.cxx @@ -196,22 +196,23 @@ Int_t THcDriftChamber::ReadDatabase( const TDatime& date ) for(Int_t ipm1=0;ipm1<fNPlanes+1;ipm1++) { // Loop over missing plane1 for(Int_t ipm2=ipm1;ipm2<fNPlanes+1;ipm2++) { if(ipm1==ipm2 && ipm1<fNPlanes) continue; - TMatrixD* AA3 = new TMatrixD(3,3); + TMatrixD AA3(3,3); for(Int_t i=0;i<3;i++) { for(Int_t j=i;j<3;j++) { - (*AA3)[i][j] = 0.0; + AA3[i][j] = 0.0; for(Int_t ip=0;ip<fNPlanes;ip++) { if(ipm1 != ip && ipm2 != ip) { - (*AA3)[i][j] += fStubCoefs[ip][i]*fStubCoefs[ip][j]; + AA3[i][j] += fStubCoefs[ip][i]*fStubCoefs[ip][j]; } } - (*AA3)[j][i] = (*AA3)[i][j]; + AA3[j][i] = AA3[i][j]; } } Int_t bitpat = allplanes & ~(1<<ipm1) & ~(1<<ipm2); // Should check that it is invertable // if (fhdebugflagpr) cout << bitpat << " Determinant: " << AA3->Determinant() << endl; - AA3->Invert(); + AA3.Invert(); + fAA3Inv[bitpat].ResizeTo(AA3); fAA3Inv[bitpat] = AA3; } } @@ -1326,11 +1327,11 @@ Double_t THcDriftChamber::FindStub(Int_t nhits, THcSpacePoint *sp, /fSigma[plane_list[ihit]]; } } - // fAA3Inv[bitpat]->Print(); + // fAA3Inv[bitpat].Print(); // if (fhdebugflagpr) cout << TT[0] << " " << TT[1] << " " << TT[2] << endl; - // TT->Print(); + // TT.Print(); - TT *= *fAA3Inv[bitpat]; + TT *= fAA3Inv[bitpat]; // if (fhdebugflagpr) cout << TT[0] << " " << TT[1] << " " << TT[2] << endl; // Calculate Chi2. Remember one power of sigma is in fStubCoefs @@ -1373,14 +1374,12 @@ THcDriftChamber::~THcDriftChamber() void THcDriftChamber::DeleteArrays() { // Delete member arrays. Used by destructor. - delete fCosBeta; fCosBeta = NULL; - delete fSinBeta; fSinBeta = NULL; - delete fTanBeta; fTanBeta = NULL; - delete fSigma; fSigma = NULL; - delete fPsi0; fPsi0 = NULL; - delete fStubCoefs; fStubCoefs = NULL; - - // Need to delete each element of the fAA3Inv map + delete [] fCosBeta; fCosBeta = NULL; + delete [] fSinBeta; fSinBeta = NULL; + delete [] fTanBeta; fTanBeta = NULL; + delete [] fSigma; fSigma = NULL; + delete [] fPsi0; fPsi0 = NULL; + delete [] fStubCoefs; fStubCoefs = NULL; } diff --git a/src/THcDriftChamber.h b/src/THcDriftChamber.h index 91f102dbda38f689b861ea00d7d47dae83555b94..f04b024d746588418e95679fd6a45a908e3338f6 100644 --- a/src/THcDriftChamber.h +++ b/src/THcDriftChamber.h @@ -135,7 +135,7 @@ protected: Int_t fEasySpacePoint; /* This event is an easy space point */ Double_t* stubcoef[4]; - std::map<int,TMatrixD*> fAA3Inv; + std::map<int,TMatrixD> fAA3Inv; THaDetectorBase* fParent; diff --git a/src/THcDriftChamberPlane.cxx b/src/THcDriftChamberPlane.cxx index 8e9ef6f41d56a5b6ed3bbb8ce737fd00f60eb3ab..e6f97ebb86546569cfa06838f0acb678b76e7bff 100644 --- a/src/THcDriftChamberPlane.cxx +++ b/src/THcDriftChamberPlane.cxx @@ -33,15 +33,13 @@ THcDriftChamberPlane::THcDriftChamberPlane( const char* name, const char* description, const Int_t planenum, THaDetectorBase* parent ) - : THaSubDetector(name,description,parent) +: THaSubDetector(name,description,parent), fTTDConv(0) { // Normal constructor with name and description fHits = new TClonesArray("THcDCHit",100); fRawHits = new TClonesArray("THcDCHit",100); fWires = new TClonesArray("THcDCWire", 100); - fTTDConv = NULL; - fPlaneNum = planenum; } @@ -59,6 +57,8 @@ THcDriftChamberPlane::THcDriftChamberPlane() : THcDriftChamberPlane::~THcDriftChamberPlane() { // Destructor + delete [] fTzeroWire; + delete [] fSigmaWire; delete fWires; delete fHits; delete fRawHits; diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx index a9070e25f3e504baed2dd77fb690679b206beae5..d977987922cb5d8da2a4c3308a66f1d146605eb5 100644 --- a/src/THcHallCSpectrometer.cxx +++ b/src/THcHallCSpectrometer.cxx @@ -762,8 +762,8 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() if ( fNtracks > 0 ) { chi2Min = 10000000000.0; fGoodTrack = 0; - Bool_t* keep = new Bool_t [fNtracks]; - Int_t* reject = new Int_t [fNtracks]; + vector<bool> keep(fNtracks); + vector<Int_t> reject(fNtracks); THaTrack *testTracks[fNtracks]; @@ -772,7 +772,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() keep[ptrack] = kTRUE; reject[ptrack] = 0; testTracks[ptrack] = static_cast<THaTrack*>( fTracks->At(ptrack) ); - if (!testTracks[ptrack]) {delete[] keep; delete[] reject; return -1;} + if (!testTracks[ptrack]) return -1; } // ! Prune on xptar @@ -786,7 +786,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) >= fPruneXp ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 1; + reject[ptrack] += 1; } } } @@ -802,7 +802,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) >= fPruneYp ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 2; + reject[ptrack] += 2; } } @@ -819,7 +819,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( TMath::Abs( testTracks[ptrack]->GetTY() ) >= fPruneYtar ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 10; + reject[ptrack] += 10; } } } @@ -835,7 +835,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( TMath::Abs( testTracks[ptrack]->GetDp() ) >= fPruneDelta ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 20; + reject[ptrack] += 20; } } } @@ -855,7 +855,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() Double_t betaP = p / TMath::Sqrt( p * p + fPartMass * fPartMass ); if ( TMath::Abs( testTracks[ptrack]->GetBeta() - betaP ) >= fPruneBeta ) { keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 100; + reject[ptrack] += 100; } } } @@ -871,7 +871,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( testTracks[ptrack]->GetNDoF() < fPruneDf ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 200; + reject[ptrack] += 200; } } } @@ -887,7 +887,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( testTracks[ptrack]->GetNPMT() < fPruneNPMT ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 100000; + reject[ptrack] += 100000; } } } @@ -905,7 +905,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() if ( ( testTracks[ptrack]->GetBetaChi2() >= fPruneChiBeta ) || ( testTracks[ptrack]->GetBetaChi2() <= 0.01 ) ){ keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 1000; + reject[ptrack] += 1000; } } } @@ -922,7 +922,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) >= fPruneFpTime ) { keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 2000; + reject[ptrack] += 2000; } } } @@ -938,7 +938,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( testTracks[ptrack]->GetGoodPlane4() != 1 ) { keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 10000; + reject[ptrack] += 10000; } } } @@ -954,7 +954,7 @@ Int_t THcHallCSpectrometer::BestTrackUsingPrune() for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){ if ( testTracks[ptrack]->GetGoodPlane3() != 1 ) { keep[ptrack] = kFALSE; - reject[ptrack] = reject[ptrack] + 20000; + reject[ptrack] += 20000; } } } diff --git a/src/THcHitList.cxx b/src/THcHitList.cxx index 8422139db38f86c6dc2f2e238db95cc394349346..6b7ed91f86ceec5ee051edff16017f6ae773aaf5 100644 --- a/src/THcHitList.cxx +++ b/src/THcHitList.cxx @@ -33,7 +33,8 @@ THcHitList::THcHitList() : fMap(0), fTISlot(0), fDisableSlipCorrection(kFALSE) THcHitList::~THcHitList() { /// Destructor - delete fSignalTypes; + delete fRawHitList; + delete [] fSignalTypes; } /** diff --git a/src/THcHodoEff.cxx b/src/THcHodoEff.cxx index 9bb9d5fe40f8e41d6ac5d5e4de8ee2bb7e6fe756..d40453b415e914829153ef15aa2ded6a5aa932ca 100644 --- a/src/THcHodoEff.cxx +++ b/src/THcHodoEff.cxx @@ -36,6 +36,24 @@ THcHodoEff::~THcHodoEff() { // Destructor + delete [] fPlanes; fPlanes = 0; + delete [] fPosZ; fPosZ = 0; + delete [] fSpacing; fSpacing = 0; + delete [] fCenterFirst; fCenterFirst = 0; + delete [] fNCounters; fNCounters = 0; + delete [] fHodoSlop; fHodoSlop = 0; + delete [] fStatTrkSum; fStatTrkSum = 0; + delete [] fStatAndSum; fStatAndSum = 0; + delete [] fStatAndEff; fStatAndEff = 0; + + delete [] fHodoPosEffi; fHodoPosEffi = 0; + delete [] fHodoNegEffi; fHodoNegEffi = 0; + delete [] fHodoOrEffi; fHodoOrEffi = 0; + delete [] fHodoAndEffi; fHodoAndEffi = 0; + delete [] fStatTrk; fStatTrk = 0; + + delete [] fHitPlane; fHitPlane = 0; + RemoveVariables(); } diff --git a/src/THcHodoscope.cxx b/src/THcHodoscope.cxx index 7d5ee6dff8e55cd97857237a409476f3c2e6b173..1a8061b8184f9e89f588244d9a570edf85a118e9 100644 --- a/src/THcHodoscope.cxx +++ b/src/THcHodoscope.cxx @@ -566,10 +566,13 @@ THcHodoscope::~THcHodoscope() RemoveVariables(); if( fIsInit ) DeleteArrays(); - if (fTrackProj) { - fTrackProj->Clear(); - delete fTrackProj; fTrackProj = 0; + + for( int i = 0; i < fNPlanes; ++i ) { + delete fPlanes[i]; + delete [] fPlaneNames[i]; } + delete [] fPlanes; + delete [] fPlaneNames; } //_____________________________________________________________________________ @@ -584,6 +587,8 @@ void THcHodoscope::DeleteArrays() delete [] fxLoScin; fxLoScin = NULL; delete [] fxHiScin; fxHiScin = NULL; + delete [] fyLoScin; fyLoScin = NULL; + delete [] fyHiScin; fyHiScin = NULL; delete [] fHodoSlop; fHodoSlop = NULL; delete [] fNPaddle; fNPaddle = NULL; @@ -603,11 +608,13 @@ void THcHodoscope::DeleteArrays() delete [] fHodoPosInvAdcLinear; fHodoPosInvAdcLinear = NULL; delete [] fHodoNegInvAdcLinear; fHodoNegInvAdcLinear = NULL; delete [] fHodoPosInvAdcAdc; fHodoPosInvAdcAdc = NULL; + delete [] fHodoNegInvAdcAdc; fHodoNegInvAdcAdc = NULL; delete [] fGoodPlaneTime; fGoodPlaneTime = NULL; delete [] fNPlaneTime; fNPlaneTime = NULL; delete [] fSumPlaneTime; fSumPlaneTime = NULL; delete [] fNScinHits; fNScinHits = NULL; delete [] fTdcOffset; fTdcOffset = NULL; + delete [] fAdcTdcOffset; fAdcTdcOffset = NULL; delete [] fHodoNegAdcTimeWindowMin; fHodoNegAdcTimeWindowMin = NULL; delete [] fHodoNegAdcTimeWindowMax; fHodoNegAdcTimeWindowMax = NULL; delete [] fHodoPosAdcTimeWindowMin; fHodoPosAdcTimeWindowMin = NULL; @@ -973,8 +980,8 @@ Int_t THcHodoscope::CoarseProcess( TClonesArray& tracks ) if (tracks.GetLast()+1 > 0 ) { // **MAIN LOOP: Loop over all tracks and get corrected time, tof, beta... - Double_t* nPmtHit = new Double_t [ntracks]; - Double_t* timeAtFP = new Double_t [ntracks]; + vector<Double_t> nPmtHit(ntracks); + vector<Double_t> timeAtFP(ntracks); for ( Int_t itrack = 0; itrack < ntracks; itrack++ ) { // Line 133 nPmtHit[itrack]=0; timeAtFP[itrack]=0; diff --git a/src/THcParmList.cxx b/src/THcParmList.cxx index 445b1ea57c9b817b007cdfea8a5b2d47ef2f47a5..240344ce5a66838db2c0015aaf1af5f6f9f52cd7 100644 --- a/src/THcParmList.cxx +++ b/src/THcParmList.cxx @@ -56,10 +56,17 @@ An instance of THaTextvars is created to hold the string parameters. #include <cassert> #include <cstdlib> #include <stdexcept> +#include <memory> using namespace std; Int_t fDebug = 1; // Keep this at one while we're working on the code +#if __cplusplus < 201103L +# define SMART_PTR auto_ptr +#else +# define SMART_PTR unique_ptr +#endif + ClassImp(THcParmList) /// Create empty numerical and string parameter lists @@ -261,7 +268,7 @@ The ENGINE CTP support parameter "blocks" which were marked with if(line.find_first_not_of("0123456789-,")==string::npos) { // Interpret as runnum range // Interpret line as a list of comma separated run numbers or ranges TString runnums(line.c_str()); - TObjArray *runnumarr = runnums.Tokenize(","); + SMART_PTR<TObjArray> runnumarr( runnums.Tokenize(",") ); Int_t nranges=runnumarr->GetLast()+1; InRunRange = 0; diff --git a/src/THcScalerEvtHandler.cxx b/src/THcScalerEvtHandler.cxx index f5170eb670ab11852d19fda62735f9da558597b5..aeaabd8c658c8284fba984462696ef75785c0c5d 100644 --- a/src/THcScalerEvtHandler.cxx +++ b/src/THcScalerEvtHandler.cxx @@ -50,6 +50,7 @@ To enable debugging you may try this in the setup script #include "TNamed.h" #include "TMath.h" #include "TString.h" +#include "TROOT.h" #include <cstring> #include <cstdio> #include <cstdlib> @@ -59,6 +60,7 @@ To enable debugging you may try this in the setup script #include <iterator> #include "THaVarList.h" #include "VarDef.h" +#include "Helper.h" using namespace std; using namespace Decoder; @@ -73,7 +75,9 @@ static const UInt_t MAXCHAN = 32; static const UInt_t defaultDT = 4; THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* description) - : THaEvtTypeHandler(name,description), evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1), + : THaEvtTypeHandler(name,description), + fBCM_Gain(0), fBCM_Offset(0), fBCM_delta_charge(0), + evcount(0), evcountR(0.0), ifound(0), fNormIdx(-1), fNormSlot(-1), dvars(0),dvars_prev_read(0), dvarsFirst(0), fScalerTree(0), fUseFirstEvent(kTRUE), fOnlySyncEvents(kFALSE), fOnlyBanks(kFALSE), fDelayedType(-1), @@ -88,9 +92,24 @@ THcScalerEvtHandler::THcScalerEvtHandler(const char *name, const char* descripti THcScalerEvtHandler::~THcScalerEvtHandler() { - if (fScalerTree) { + // The tree object is owned by ROOT since it gets associated wth the output + // file, so DO NOT delete it here. + if (!TROOT::Initialized()) { delete fScalerTree; } + Podd::DeleteContainer(scalers); + Podd::DeleteContainer(scalerloc); + delete [] dvars_prev_read; + delete [] dvars; + delete [] dvarsFirst; + delete [] fBCM_Gain; + delete [] fBCM_Offset; + delete [] fBCM_delta_charge; + + for( vector<UInt_t*>::iterator it = fDelayedEvents.begin(); + it != fDelayedEvents.end(); ++it ) + delete [] *it; + fDelayedEvents.clear(); } Int_t THcScalerEvtHandler::End( THaRunBase* ) @@ -107,7 +126,10 @@ Int_t THcScalerEvtHandler::End( THaRunBase* ) evNumberR = -1; if (fScalerTree) fScalerTree->Fill(); - fDelayedEvents.clear(); // Does this free the arrays? + for( vector<UInt_t*>::iterator it = fDelayedEvents.begin(); + it != fDelayedEvents.end(); ++it ) + delete [] *it; + fDelayedEvents.clear(); if (fScalerTree) fScalerTree->Write(); return 0; @@ -222,9 +244,7 @@ Int_t THcScalerEvtHandler::Analyze(THaEvData *evdata) UInt_t *datacopy = new UInt_t[evlen]; fDelayedEvents.push_back(datacopy); - for(Int_t i=0;i<evlen;i++) { - datacopy[i] = rdata[i]; - } + memcpy(datacopy,rdata,evlen*sizeof(UInt_t)); return 1; } else { // A normal event if (fDebugFile) *fDebugFile<<"\n\nTHcScalerEvtHandler :: Debugging event type "<<dec<<evdata->GetEvType()<< " event num = " << evdata->GetEvNum() << endl<<endl; @@ -535,7 +555,7 @@ Int_t THcScalerEvtHandler::AnalyzeBuffer(UInt_t* rdata, Bool_t onlysync) UInt_t scaldata = scalers[idx]->GetData(ichan); if ( scal_current > fbcm_Current_Threshold) { UInt_t diff; - if(scaldata < scal_prev_read[nscal-1]) { + if(nscal > 0 && scaldata < scal_prev_read[nscal-1]) { diff = (kMaxUInt-(dvars_prev_read[ivar] - 1)) + scaldata; } else { diff = scaldata - dvars_prev_read[ivar]; @@ -586,6 +606,9 @@ THaAnalysisObject::EStatus THcScalerEvtHandler::Init(const TDatime& date) fStatus = kOK; fNormIdx = -1; + for( vector<UInt_t*>::iterator it = fDelayedEvents.begin(); + it != fDelayedEvents.end(); ++it ) + delete [] *it; fDelayedEvents.clear(); cout << "Howdy ! We are initializing THcScalerEvtHandler !! name = " diff --git a/src/THcScalerEvtHandler.h b/src/THcScalerEvtHandler.h index 41ce88c40416f21d83feb7b06546651694e7ff0b..c4749ffcb6a2393f9e664f6a9884ca7472b48b26 100644 --- a/src/THcScalerEvtHandler.h +++ b/src/THcScalerEvtHandler.h @@ -26,7 +26,7 @@ class HCScalerLoc { // Utility class used by THcScalerEvtHandler UInt_t iki, Int_t iv) : name(nm), description(desc), index(idx), islot(s1), ichan(ich), ikind(iki), ivar(iv) { }; - ~HCScalerLoc(); + ~HCScalerLoc() {} TString name, description; UInt_t index, islot, ichan, ikind, ivar; }; diff --git a/src/THcScintillatorPlane.cxx b/src/THcScintillatorPlane.cxx index 38033103faf6282a290bc04b300eea391a3faa2b..175ab79d04d556d24da87c1591bf99a7572abff4 100644 --- a/src/THcScintillatorPlane.cxx +++ b/src/THcScintillatorPlane.cxx @@ -33,7 +33,30 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, const char* description, const Int_t planenum, THaDetectorBase* parent ) -: THaSubDetector(name,description,parent) +: THaSubDetector(name,description,parent), + fParentHitList(0), frPosAdcErrorFlag(0), frNegAdcErrorFlag(0), + frPosTDCHits(0), frNegTDCHits(0), frPosADCHits(0), frNegADCHits(0), + frPosADCSums(0), frNegADCSums(0), frPosADCPeds(0), frNegADCPeds(0), + fHodoHits(0), frPosTdcTimeRaw(0), frPosAdcPedRaw(0), + frPosAdcPulseIntRaw(0), frPosAdcPulseAmpRaw(0), + frPosAdcPulseTimeRaw(0), frPosTdcTime(0), frPosAdcPed(0), + frPosAdcPulseInt(0), frPosAdcPulseAmp(0), frPosAdcPulseTime(0), + frNegTdcTimeRaw(0), frNegAdcPedRaw(0), frNegAdcPulseIntRaw(0), + frNegAdcPulseAmpRaw(0), frNegAdcPulseTimeRaw(0), frNegTdcTime(0), + frNegAdcPed(0), frNegAdcPulseInt(0), frNegAdcPulseAmp(0), + frNegAdcPulseTime(0), fPosCenter(0), fHodoPosMinPh(0), + fHodoNegMinPh(0), fHodoPosPhcCoeff(0), fHodoNegPhcCoeff(0), + fHodoPosTimeOffset(0), fHodoNegTimeOffset(0), fHodoVelLight(0), + fHodoPosInvAdcOffset(0), fHodoNegInvAdcOffset(0), + fHodoPosAdcTimeWindowMin(0), fHodoPosAdcTimeWindowMax(0), + fHodoNegAdcTimeWindowMin(0), fHodoNegAdcTimeWindowMax(0), + fHodoPosInvAdcLinear(0), fHodoNegInvAdcLinear(0), + fHodoPosInvAdcAdc(0), fHodoNegInvAdcAdc(0), fHodoVelFit(0), + fHodoCableFit(0), fHodo_LCoeff(0), fHodoPos_c1(0), fHodoNeg_c1(0), + fHodoPos_c2(0), fHodoNeg_c2(0), fHodoSigma(0), fPosPedSum(0), + fPosPedSum2(0), fPosPedLimit(0), fPosPedCount(0), fNegPedSum(0), + fNegPedSum2(0), fNegPedLimit(0), fNegPedCount(0), fPosPed(0), + fPosSig(0), fPosThresh(0), fNegPed(0), fNegSig(0), fNegThresh(0) { // Normal constructor with name and description fHodoHits = new TClonesArray("THcHodoHit",16); @@ -77,14 +100,14 @@ THcScintillatorPlane::THcScintillatorPlane( const char* name, fPlaneNum = planenum; fTotPlanes = planenum; fNScinHits = 0; - - fPosCenter = NULL; } //______________________________________________________________________________ THcScintillatorPlane::~THcScintillatorPlane() { // Destructor + if( fIsSetup ) + RemoveVariables(); delete frPosAdcErrorFlag; frPosAdcErrorFlag = NULL; delete frNegAdcErrorFlag; frNegAdcErrorFlag = NULL; @@ -122,7 +145,7 @@ THcScintillatorPlane::~THcScintillatorPlane() delete frNegAdcPulseAmp; delete frNegAdcPulseTime; - delete [] fPosCenter; + delete [] fPosCenter; fPosCenter = 0; delete [] fHodoPosMinPh; fHodoPosMinPh = NULL; delete [] fHodoNegMinPh; fHodoNegMinPh = NULL; @@ -153,6 +176,18 @@ THcScintillatorPlane::~THcScintillatorPlane() delete [] fHodoVelLight; fHodoVelLight = NULL; delete [] fHodoSigma; fHodoSigma = NULL; + delete [] fPosPedSum; fPosPedSum = 0; + delete [] fPosPedSum2; fPosPedSum2 = 0; + delete [] fPosPedLimit; fPosPedLimit = 0; + delete [] fPosPedCount; fPosPedCount = 0; + delete [] fNegPedSum; fNegPedSum = 0; + delete [] fNegPedSum2; fNegPedSum2 = 0; + delete [] fNegPedLimit; fNegPedLimit = 0; + delete [] fNegPedCount; fNegPedCount = 0; + delete [] fPosPed; fPosPed = 0; + delete [] fNegPed; fNegPed = 0; + delete [] fPosThresh; fPosThresh = 0; + delete [] fNegThresh; fNegThresh = 0; } //______________________________________________________________________________ diff --git a/src/THcShower.cxx b/src/THcShower.cxx index ae23af024489e6cf8e2729c43a3dba4d17ed8210..bdaf6084e7ba152ccba87527dcb44f1dd9801509 100644 --- a/src/THcShower.cxx +++ b/src/THcShower.cxx @@ -19,19 +19,26 @@ #include "TClonesArray.h" #include "THaTrackProj.h" #include "TMath.h" +#include "Helper.h" #include <cstring> #include <cstdio> #include <cstdlib> #include <iostream> #include <numeric> +#include <cassert> using namespace std; //_____________________________________________________________________________ THcShower::THcShower( const char* name, const char* description, THaApparatus* apparatus ) : - THaNonTrackingDetector(name,description,apparatus) + THaNonTrackingDetector(name,description,apparatus), + fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0), + fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0), + fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0), + fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0), + fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0) { // Constructor fNLayers = 0; // No layers until we make them @@ -43,7 +50,12 @@ THcShower::THcShower( const char* name, const char* description, //_____________________________________________________________________________ THcShower::THcShower( ) : - THaNonTrackingDetector() + THaNonTrackingDetector(), + fPosAdcTimeWindowMin(0), fNegAdcTimeWindowMin(0), + fPosAdcTimeWindowMax(0), fNegAdcTimeWindowMax(0), + fShPosPedLimit(0), fShNegPedLimit(0), fPosGain(0), fNegGain(0), + fClusterList(0), fLayerNames(0), fLayerZPos(0), BlockThick(0), + fNBlocks(0), fXPos(0), fYPos(0), fZPos(0), fPlanes(0), fArray(0) { // Constructor } @@ -572,14 +584,24 @@ THcShower::~THcShower() { // Destructor. Remove variables from global list. + Clear(); if( fIsSetup ) RemoveVariables(); if( fIsInit ) DeleteArrays(); - if (fTrackProj) { - fTrackProj->Clear(); - delete fTrackProj; fTrackProj = 0; + + for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end(); + ++i) { + Podd::DeleteContainer(**i); + delete *i; + } + delete fClusterList; fClusterList = 0; + + for( UInt_t i = 0; i<fNLayers; ++i) { + delete fPlanes[i]; } + delete [] fPlanes; fPlanes = 0; + delete fArray; fArray = 0; } //_____________________________________________________________________________ @@ -587,10 +609,25 @@ void THcShower::DeleteArrays() { // Delete member arrays. Used by destructor. + for (UInt_t i = 0; i<fNTotLayers; ++i) + delete [] fLayerNames[i]; + delete [] fLayerNames; fLayerNames = 0; + + delete [] fPosAdcTimeWindowMin; fPosAdcTimeWindowMin = 0; + delete [] fNegAdcTimeWindowMin; fNegAdcTimeWindowMin = 0; + delete [] fPosAdcTimeWindowMax; fPosAdcTimeWindowMax = 0; + delete [] fNegAdcTimeWindowMax; fNegAdcTimeWindowMax = 0; + delete [] fShPosPedLimit; fShPosPedLimit = 0; + delete [] fShNegPedLimit; fShNegPedLimit = 0; + delete [] fPosGain; fPosGain = 0; + delete [] fNegGain; fNegGain = 0; delete [] BlockThick; BlockThick = NULL; delete [] fNBlocks; fNBlocks = NULL; delete [] fLayerZPos; fLayerZPos = NULL; + for (UInt_t i = 0; i<fNLayers; ++i) + delete [] fXPos[i]; delete [] fXPos; fXPos = NULL; + delete [] fYPos; fYPos = NULL; delete [] fZPos; fZPos = NULL; } @@ -635,11 +672,10 @@ void THcShower::Clear(Option_t* opt) for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end(); ++i) { + Podd::DeleteContainer(**i); delete *i; - *i = 0; } fClusterList->clear(); - } //_____________________________________________________________________________ @@ -766,6 +802,7 @@ Int_t THcShower::CoarseProcess( TClonesArray& tracks) // Fill list of clusters. ClusterHits(HitSet, fClusterList); + assert( HitSet.empty() ); // else bug in ClusterHits() fNclust = (*fClusterList).size(); //number of clusters diff --git a/src/THcShower.h b/src/THcShower.h index c03fa438c21b47eec961d19e619ec121d8cd6030..9b39f4e69ebd6d6ea893a59fc8068f801129a0b1 100644 --- a/src/THcShower.h +++ b/src/THcShower.h @@ -268,8 +268,6 @@ protected: THcShowerPlane** fPlanes; // [fNLayers] Shower Plane objects THcShowerArray* fArray; - TClonesArray* fTrackProj; // projection of track onto plane - void ClearEvent(); void DeleteArrays(); virtual Int_t ReadDatabase( const TDatime& date ); diff --git a/src/THcShowerArray.cxx b/src/THcShowerArray.cxx index 2efd325caaeca442f5dd1e0019de1cada25971a7..4c5fedf5269b6161f65705e9640ff507613a35a1 100644 --- a/src/THcShowerArray.cxx +++ b/src/THcShowerArray.cxx @@ -20,12 +20,13 @@ #include "THaTrackProj.h" #include "THcCherenkov.h" //for efficiency calculations #include "THcHallCSpectrometer.h" +#include "Helper.h" #include <cstring> #include <cstdio> #include <cstdlib> #include <iostream> - +#include <cassert> #include <fstream> using namespace std; @@ -61,11 +62,15 @@ THcShowerArray::~THcShowerArray() { // Destructor + Clear(); // deletes allocations in fClusterList for (UInt_t i=0; i<fNRows; i++) { delete [] fXPos[i]; delete [] fYPos[i]; delete [] fZPos[i]; } + delete [] fXPos; fXPos = 0; + delete [] fYPos; fYPos = 0; + delete [] fZPos; fZPos = 0; delete [] fPedLimit; delete [] fGain; @@ -95,6 +100,11 @@ THcShowerArray::~THcShowerArray() //delete [] fE; delete [] fBlock_ClusterID; + + delete fClusterList; fClusterList = 0; + + delete [] fAdcTimeWindowMin; fAdcTimeWindowMin = 0; + delete [] fAdcTimeWindowMax; fAdcTimeWindowMax = 0; } //_____________________________________________________________________________ @@ -479,8 +489,8 @@ void THcShowerArray::Clear( Option_t* ) for (THcShowerClusterListIt i=fClusterList->begin(); i!=fClusterList->end(); ++i) { + Podd::DeleteContainer(**i); delete *i; - *i = 0; } fClusterList->clear(); @@ -570,6 +580,7 @@ Int_t THcShowerArray::CoarseProcess( TClonesArray& tracks ) // Cluster hits and fill list of clusters. static_cast<THcShower*>(fParent)->ClusterHits(HitSet, fClusterList); + assert( HitSet.empty() ); // else bug in ClusterHits() fNclust = (*fClusterList).size(); //number of clusters