diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelConfigCondAlg.cxx b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelConfigCondAlg.cxx index 2ba97d9cfcb5ad4a85ae66cddd3cfab82a24626d..eb927777072fe85153bb4373ed629def07354395 100644 --- a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelConfigCondAlg.cxx +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelConfigCondAlg.cxx @@ -465,27 +465,51 @@ StatusCode PixelConfigCondAlg::execute(const EventContext& ctx) const { std::vector<PixelHistoConverter> distanceMap_h; for (unsigned int i=0; i<mapsPath_list.size(); i++) { ATH_MSG_INFO("Using maps located in: "<<mapsPath_list.at(i) << " for layer No." << i); - TFile* mapsFile = new TFile((mapsPath_list.at(i)).c_str()); //this is the ramo potential. + std::unique_ptr<TFile> mapsFile(TFile::Open((mapsPath_list.at(i)).c_str(), "READ")); //this is the ramo potential + + if (!mapsFile) { + ATH_MSG_FATAL("Cannot open file: " << mapsPath_list.at(i)); + return StatusCode::FAILURE; + } //Setup ramo weighting field map - TH3F* ramoPotentialMap_hold = 0; - ramoPotentialMap_hold = (TH3F*)mapsFile->Get("hramomap1"); - if (ramoPotentialMap_hold==0) { ramoPotentialMap_hold=(TH3F*)mapsFile->Get("ramo3d"); } - if (ramoPotentialMap_hold==0) { + std::unique_ptr<TH3F> ramoPotentialMap_hold(mapsFile->Get<TH3F>("hramomap1")); + if (!ramoPotentialMap_hold) { + ramoPotentialMap_hold.reset(mapsFile->Get<TH3F>("ramo3d")); + } + if (!ramoPotentialMap_hold) { ATH_MSG_FATAL("Did not find a Ramo potential map and an approximate form is available yet. Exit..."); return StatusCode::FAILURE; } + ramoPotentialMap_hold->SetDirectory(nullptr); + std::unique_ptr<TH2F> lorentzMap_e_hold(mapsFile->Get<TH2F>("lorentz_map_e")); + std::unique_ptr<TH2F> lorentzMap_h_hold(mapsFile->Get<TH2F>("lorentz_map_h")); + std::unique_ptr<TH2F> distanceMap_e_hold(mapsFile->Get<TH2F>("edistance")); + std::unique_ptr<TH2F> distanceMap_h_hold(mapsFile->Get<TH2F>("hdistance")); + + if (!lorentzMap_e_hold || !lorentzMap_h_hold || !distanceMap_e_hold || !distanceMap_h_hold) { + ATH_MSG_FATAL("Cannot read one of the histograms needed"); + return StatusCode::FAILURE; + } + + lorentzMap_e_hold->SetDirectory(nullptr); + lorentzMap_h_hold->SetDirectory(nullptr); + distanceMap_e_hold->SetDirectory(nullptr); + distanceMap_h_hold->SetDirectory(nullptr); + ramoPotentialMap.emplace_back(); - ATH_CHECK(ramoPotentialMap.back().setHisto3D(ramoPotentialMap_hold)); + ATH_CHECK(ramoPotentialMap.back().setHisto3D(ramoPotentialMap_hold.get())); lorentzMap_e.emplace_back(); lorentzMap_h.emplace_back(); distanceMap_e.emplace_back(); distanceMap_h.emplace_back(); - ATH_CHECK(lorentzMap_e.back().setHisto2D((TH2F*)mapsFile->Get("lorentz_map_e"))); - ATH_CHECK(lorentzMap_h.back().setHisto2D((TH2F*)mapsFile->Get("lorentz_map_h"))); - ATH_CHECK(distanceMap_e.back().setHisto2D((TH2F*)mapsFile->Get("edistance"))); - ATH_CHECK(distanceMap_h.back().setHisto2D((TH2F*)mapsFile->Get("hdistance"))); + ATH_CHECK(lorentzMap_e.back().setHisto2D(lorentzMap_e_hold.get())); + ATH_CHECK(lorentzMap_h.back().setHisto2D(lorentzMap_h_hold.get())); + ATH_CHECK(distanceMap_e.back().setHisto2D(distanceMap_e_hold.get())); + ATH_CHECK(distanceMap_h.back().setHisto2D(distanceMap_h_hold.get())); + + mapsFile->Close(); } writeCdo -> setLorentzMap_e(lorentzMap_e); writeCdo -> setLorentzMap_h(lorentzMap_h); @@ -499,7 +523,7 @@ StatusCode PixelConfigCondAlg::execute(const EventContext& ctx) const { EventIDRange rangeW{start, stop}; rangeW = rangeDeadMap; - if (rangeW.stop().isValid() and rangeW.start()>rangeW.stop()) { + if (rangeW.stop().isValid() && rangeW.start()>rangeW.stop()) { ATH_MSG_FATAL("Invalid intersection rangeW: " << rangeW); return StatusCode::FAILURE; } diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx index 6e36ec275af73a69a9bb84c73302ce886dcc12aa..9f47b73e27e1ebb617bf27f34d9c26d8bc4c2bbf 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSim3DTool.cxx @@ -23,6 +23,8 @@ #include "TFile.h" +#include <memory> + using namespace InDetDD; //=============================================== @@ -87,8 +89,11 @@ StatusCode SensorSim3DTool::initialize() { for (unsigned int i = 0; i < mapsPath_list.size(); i++) { ATH_MSG_INFO("Using maps located in: " << mapsPath_list.at(i)); - //std::unique_ptr<TFile> mapsFile=std::make_unique<TFile>( (mapsPath_list.at(i)).c_str() ); //this is the ramo potential. - TFile* mapsFile = new TFile((mapsPath_list.at(i)).c_str()); //this is the ramo potential. + std::unique_ptr<TFile> mapsFile(TFile::Open((mapsPath_list.at(i)).c_str(), "READ")); //this is the ramo potential. + if (!mapsFile) { + ATH_MSG_ERROR("Cannot open file: " << mapsPath_list.at(i)); + return StatusCode::FAILURE; + } std::pair < int, int > Layer; // index for layer/end cap position Layer.first = 0; //Barrel (0) or End Cap (1) - Now only for Barrel. If we want to add End Caps, put them at iayer.first=1 @@ -97,66 +102,77 @@ StatusCode SensorSim3DTool::initialize() { //May want to be changed in the future, since there's no point having an index with only one possible value //Setup ramo weighting field map - TH3F* ramoPotentialMap_hold; - ramoPotentialMap_hold = 0; - ramoPotentialMap_hold = (TH3F* ) mapsFile->Get("ramo"); - if (ramoPotentialMap_hold == 0) { - ATH_MSG_INFO("Did not find a Ramo potential map. Will use an approximate form."); + std::unique_ptr<TH2F> ramoPotentialMap_hold(mapsFile->Get<TH2F>("ramo")); + if (!ramoPotentialMap_hold) { + ATH_MSG_ERROR("Did not find a Ramo potential map. Will use an approximate form."); return StatusCode::FAILURE; //Obviously, remove this when gen. code is set up } - //ramoPotentialMap.push_back(ramoPotentialMap_hold); + ramoPotentialMap_hold->SetDirectory(nullptr); m_ramoPotentialMap.emplace_back(); - ATH_CHECK(m_ramoPotentialMap.back().setHisto3D(ramoPotentialMap_hold)); + ATH_CHECK(m_ramoPotentialMap.back().setHisto2D(ramoPotentialMap_hold.get())); ATH_MSG_INFO("Using fluence " << m_fluence_layers.at(i)); //Now setup the E-field. - TH2F* eFieldMap_hold; - eFieldMap_hold = 0; - eFieldMap_hold = (TH2F* ) mapsFile->Get("efield"); - if (eFieldMap_hold == 0) { - ATH_MSG_INFO("Unable to load sensor e-field map, so generating one using approximations."); + std::unique_ptr<TH2F> eFieldMap_hold(mapsFile->Get<TH2F>("efield")); + if (!eFieldMap_hold) { + ATH_MSG_ERROR("Unable to load sensor e-field map, so generating one using approximations."); return StatusCode::FAILURE; //Obviously, remove this when gen. code is set up } + eFieldMap_hold->SetDirectory(nullptr); m_eFieldMap.emplace_back(); - ATH_CHECK(m_eFieldMap.back().setHisto2D(eFieldMap_hold)); - - TH3F* xPositionMap_e_hold; - TH3F* xPositionMap_h_hold; - TH3F* yPositionMap_e_hold; - TH3F* yPositionMap_h_hold; - TH2F* timeMap_e_hold; - TH2F* timeMap_h_hold; - - xPositionMap_e_hold = 0; - xPositionMap_h_hold = 0; - yPositionMap_e_hold = 0; - yPositionMap_h_hold = 0; - timeMap_e_hold = 0; - timeMap_h_hold = 0; - xPositionMap_e_hold = (TH3F* ) mapsFile->Get("xPosition_e"); - xPositionMap_h_hold = (TH3F* ) mapsFile->Get("xPosition_h"); - yPositionMap_e_hold = (TH3F* ) mapsFile->Get("yPosition_e"); - yPositionMap_h_hold = (TH3F* ) mapsFile->Get("yPosition_h"); - timeMap_e_hold = (TH2F* ) mapsFile->Get("etimes"); - timeMap_h_hold = (TH2F* ) mapsFile->Get("htimes"); + ATH_CHECK(m_eFieldMap.back().setHisto2D(eFieldMap_hold.get())); + + std::unique_ptr<TH3F> xPositionMap_e_hold(mapsFile->Get<TH3F>("xPosition_e")); + std::unique_ptr<TH3F> xPositionMap_h_hold(mapsFile->Get<TH3F>("xPosition_h")); + std::unique_ptr<TH3F> yPositionMap_e_hold(mapsFile->Get<TH3F>("yPosition_e")); + std::unique_ptr<TH3F> yPositionMap_h_hold(mapsFile->Get<TH3F>("yPosition_h")); + std::unique_ptr<TH2F> timeMap_e_hold(mapsFile->Get<TH2F>("etimes")); + std::unique_ptr<TH2F> timeMap_h_hold(mapsFile->Get<TH2F>("htimes")); + + if (!xPositionMap_e_hold || !xPositionMap_h_hold || !yPositionMap_e_hold || !yPositionMap_h_hold || + !timeMap_e_hold || !timeMap_h_hold) { + ATH_MSG_ERROR("Cannot find one of the maps."); + return StatusCode::FAILURE; //Obviously, remove this when gen. code is set up + } + + xPositionMap_e_hold->SetDirectory(nullptr); + xPositionMap_h_hold->SetDirectory(nullptr); + yPositionMap_e_hold->SetDirectory(nullptr); + yPositionMap_h_hold->SetDirectory(nullptr); + timeMap_e_hold->SetDirectory(nullptr); + timeMap_h_hold->SetDirectory(nullptr); + //Now, determine the time to reach the electrode and the trapping position. m_xPositionMap_e.emplace_back(); m_xPositionMap_h.emplace_back(); m_yPositionMap_e.emplace_back(); m_yPositionMap_h.emplace_back(); - ATH_CHECK(m_xPositionMap_e.back().setHisto3D(xPositionMap_e_hold)); - ATH_CHECK(m_xPositionMap_h.back().setHisto3D(xPositionMap_h_hold)); - ATH_CHECK(m_yPositionMap_e.back().setHisto3D(yPositionMap_e_hold)); - ATH_CHECK(m_yPositionMap_h.back().setHisto3D(yPositionMap_h_hold)); + ATH_CHECK(m_xPositionMap_e.back().setHisto3D(xPositionMap_e_hold.get())); + ATH_CHECK(m_xPositionMap_h.back().setHisto3D(xPositionMap_h_hold.get())); + ATH_CHECK(m_yPositionMap_e.back().setHisto3D(yPositionMap_e_hold.get())); + ATH_CHECK(m_yPositionMap_h.back().setHisto3D(yPositionMap_h_hold.get())); m_timeMap_e.emplace_back(); m_timeMap_h.emplace_back(); - ATH_CHECK(m_timeMap_e.back().setHisto2D(timeMap_e_hold)); - ATH_CHECK(m_timeMap_h.back().setHisto2D(timeMap_h_hold)); + ATH_CHECK(m_timeMap_e.back().setHisto2D(timeMap_e_hold.get())); + ATH_CHECK(m_timeMap_h.back().setHisto2D(timeMap_h_hold.get())); + + std::unique_ptr<TH2F> avgCharge_e(mapsFile->Get<TH2F>("avgCharge_e")); + std::unique_ptr<TH2F> avgCharge_h(mapsFile->Get<TH2F>("avgCharge_h")); + + if (!avgCharge_e || !avgCharge_h) { + ATH_MSG_ERROR("Cannot find one of the charge maps."); + return StatusCode::FAILURE; //Obviously, remove this when gen. code is set up + } + + avgCharge_e->SetDirectory(nullptr); + avgCharge_h->SetDirectory(nullptr); // Get average charge data (for charge chunk effect correction) - ATH_CHECK(m_avgChargeMap_e.setHisto2D((TH2F*) mapsFile->Get("avgCharge_e"))); - ATH_CHECK(m_avgChargeMap_h.setHisto2D((TH2F*) mapsFile->Get("avgCharge_h"))); + ATH_CHECK(m_avgChargeMap_e.setHisto2D(avgCharge_e.get())); + ATH_CHECK(m_avgChargeMap_h.setHisto2D(avgCharge_h.get())); + + mapsFile->Close(); } return StatusCode::SUCCESS; diff --git a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx index 8622bf6ec9f0bec78d10776b965c10a98b6eebd7..e36e2165428816e4027ea5f6c9050717d9247f4e 100644 --- a/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx +++ b/InnerDetector/InDetDigitization/PixelDigitization/src/SensorSimPlanarTool.cxx @@ -22,6 +22,8 @@ #include "TFile.h" +#include <memory> + using namespace InDetDD; //=============================================== @@ -80,39 +82,43 @@ StatusCode SensorSimPlanarTool::initialize() { for (unsigned int i = 0; i < mapsPath_list.size(); i++) { ATH_MSG_INFO("Using maps located in: " << mapsPath_list.at(i) << " for layer No." << i); ATH_MSG_INFO("Create E field via interpolation based on files from: " << TCADpath_list.at(i)); - //std::unique_ptr<TFile> mapsFile=std::make_unique<TFile>( (mapsPath_list.at(i)).c_str() ); //this is the ramo - // potential. - TFile* mapsFile = new TFile((mapsPath_list.at(i)).c_str()); //this is the ramo potential. + std::unique_ptr<TFile> mapsFile(TFile::Open((mapsPath_list.at(i)).c_str(), "READ")); //this is the ramo potential. + if (!mapsFile) { + ATH_MSG_ERROR("Cannot open file: " << mapsPath_list.at(i)); + return StatusCode::FAILURE; + } //Setup ramo weighting field map - TH3F* ramoPotentialMap_hold; - ramoPotentialMap_hold = 0; - ramoPotentialMap_hold = (TH3F*) mapsFile->Get("hramomap1"); - if (ramoPotentialMap_hold == 0) ramoPotentialMap_hold = (TH3F*) mapsFile->Get("ramo3d"); - if (ramoPotentialMap_hold == 0) { + std::unique_ptr<TH3F> ramoPotentialMap_hold(mapsFile->Get<TH3F>("hramomap1")); + if (!ramoPotentialMap_hold) { + ramoPotentialMap_hold.reset(mapsFile->Get<TH3F>("ramo3d")); ATH_MSG_INFO("Did not find a Ramo potential map. Will use an approximate form."); + } + if (!ramoPotentialMap_hold) { ATH_MSG_WARNING("Not implemented yet - exit"); return StatusCode::FAILURE; //Obviously, remove this when gen. code is set up } + ramoPotentialMap_hold->SetDirectory(nullptr); m_ramoPotentialMap.emplace_back(); - ATH_CHECK(m_ramoPotentialMap.back().setHisto3D(ramoPotentialMap_hold)); + ATH_CHECK(m_ramoPotentialMap.back().setHisto3D(ramoPotentialMap_hold.get())); //Now setup the E-field. - TH1F* eFieldMap_hold; - eFieldMap_hold = new TH1F(); - //ATH_MSG_INFO("Generating E field maps using interpolation."); - CHECK(m_radDamageUtil->generateEfieldMap(eFieldMap_hold, NULL, m_fluenceLayer[i], m_voltageLayer[i], i, + TH1F* eFieldMap_hold(nullptr); + CHECK(m_radDamageUtil->generateEfieldMap(eFieldMap_hold, nullptr, m_fluenceLayer[i], m_voltageLayer[i], i, TCADpath_list.at(i), true)); - TH2F* lorentzMap_e_hold = new TH2F(); - TH2F* lorentzMap_h_hold = new TH2F(); - TH2F* distanceMap_h_hold = new TH2F(); - TH2F* distanceMap_e_hold = new TH2F(); - TH1F* timeMap_e_hold = new TH1F(); - TH1F* timeMap_h_hold = new TH1F(); + eFieldMap_hold->SetDirectory(nullptr); + + TH2F* lorentzMap_e_hold(nullptr); + TH2F* lorentzMap_h_hold(nullptr); + TH2F* distanceMap_h_hold(nullptr); + TH2F* distanceMap_e_hold(nullptr); + TH1F* timeMap_e_hold(nullptr); + TH1F* timeMap_h_hold(nullptr); ATH_CHECK(m_radDamageUtil->generateDistanceTimeMap(distanceMap_e_hold, distanceMap_h_hold, timeMap_e_hold, timeMap_h_hold, lorentzMap_e_hold, lorentzMap_h_hold, - eFieldMap_hold, NULL)); + eFieldMap_hold, nullptr)); + // For debugging and documentation: uncomment to save different maps which are based on the interpolated E field if (m_radDamageUtil->saveDebugMaps()) { TString prename = "map_layer_"; @@ -131,11 +137,19 @@ StatusCode SensorSimPlanarTool::initialize() { lorentzMap_h_hold->SaveAs(prename); } //Safetycheck - if (distanceMap_e_hold == 0 || distanceMap_h_hold == 0 || timeMap_e_hold == 0 || timeMap_h_hold == 0 || - lorentzMap_e_hold == 0 || lorentzMap_h_hold == 0) { - ATH_MSG_INFO("Unable to load at least one of the distance/time/Lorentz angle maps."); + if (!distanceMap_e_hold || !distanceMap_h_hold || !timeMap_e_hold || !timeMap_h_hold || + !lorentzMap_e_hold || !lorentzMap_h_hold) { + ATH_MSG_ERROR("Unable to load at least one of the distance/time/Lorentz angle maps."); return StatusCode::FAILURE;//Obviously, remove this when gen. code is set up } + + lorentzMap_e_hold->SetDirectory(nullptr); + lorentzMap_h_hold->SetDirectory(nullptr); + distanceMap_e_hold->SetDirectory(nullptr); + distanceMap_h_hold->SetDirectory(nullptr); + timeMap_e_hold->SetDirectory(nullptr); + timeMap_h_hold->SetDirectory(nullptr); + m_distanceMap_e.emplace_back(); m_distanceMap_h.emplace_back(); ATH_CHECK(m_distanceMap_e.back().setHisto2D(distanceMap_e_hold)); @@ -144,6 +158,16 @@ StatusCode SensorSimPlanarTool::initialize() { m_lorentzMap_h.emplace_back(); ATH_CHECK(m_lorentzMap_e.back().setHisto2D(lorentzMap_e_hold)); ATH_CHECK(m_lorentzMap_h.back().setHisto2D(lorentzMap_h_hold)); + + delete eFieldMap_hold; + delete lorentzMap_e_hold; + delete lorentzMap_h_hold; + delete distanceMap_e_hold; + delete distanceMap_h_hold; + delete timeMap_e_hold; + delete timeMap_h_hold; + + mapsFile->Close(); } } return StatusCode::SUCCESS;