ATLAS Offline Software
Loading...
Searching...
No Matches
CaloReadLCWeightsFile.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
10#include "TFile.h"
11#include "TList.h"
12#include "TAxis.h"
13#include "TProfile2D.h"
14#include <iostream>
15#include <sstream>
16
18 ISvcLocator * pSvcLocator) :
19 AthAlgorithm(name,pSvcLocator) {
20 declareProperty("LCWeightFileName",m_LCWeightFileName);
21 declareProperty("CorrectionKey",m_key="HadWeights");
22}
23
24
26
27StatusCode CaloReadLCWeightsFile::initDataFromFile(const std::string& theLCWeightFileName,
29{
30 // Find the full path to filename:
31 std::string file = PathResolver::find_file (theLCWeightFileName, "DATAPATH");
32 ATH_MSG_INFO( "Reading file " << file );
33
34 std::vector<int> isampmap(CaloSampling::Unknown,-1);
35 unsigned int nAreas(0);
36 std::vector<CaloLocalHadCoeff::LocalHadArea> theAreas;
37 for (unsigned int iArea=0;iArea<CaloSampling::Unknown;iArea++) {
39 theAreas.push_back(std::move(theArea));
40 }
41
42 for (int iread=0;iread<2;iread++) {
43 // first parse to define Areas; second to fill all data
44 TFile* theLCWeightFile = new TFile(file.c_str());
45 if ( !theLCWeightFile ) {
46 return StatusCode::FAILURE;
47 }
48 TList * theKeyList = theLCWeightFile->GetListOfKeys();
49 while ( theKeyList->GetEntries() ) {
50 TProfile2D * prof = (TProfile2D *)theLCWeightFile->Get(theKeyList->First()->GetTitle());
51 // parse histogram title to find sampling and bins
52 std::string sTitle(prof->GetTitle());
53 // first the Sampling
54 std::string key("_isamp_");
55 size_t found = sTitle.find(key);
56 if ( found == std::string::npos ) {
57 ATH_MSG_ERROR( "Could not find key " << key << " in current histogram." );
58 }
59 else {
60 std::istringstream tstr(sTitle.substr(found+key.length()));
61 int isamp(-1);
62 tstr >> isamp;
63 if ( isamp <= 0 || isamp >= CaloSampling::Unknown ) {
64 ATH_MSG_ERROR( "Found invalid sampling " << isamp << " in current histogram." );
65 }
66 else {
67 // now the other dimensions
68 bool allValid(true);
69
70 std::vector<std::string> keys;
71 keys.emplace_back("_iside_");
72 keys.emplace_back("_ieta_");
73 keys.emplace_back("_iphi_");
74
75 std::vector<std::string> names;
76 names.emplace_back("side");
77 names.emplace_back("|eta|");
78 names.emplace_back("phi");
79 names.emplace_back(prof->GetXaxis()->GetTitle());
80 names.emplace_back(prof->GetYaxis()->GetTitle());
81
82 std::vector<int> types;
88
89 std::vector<int> ibin(names.size(),-1);
90 std::vector<double> rmin(names.size(),-1);
91 std::vector<double> rmax(names.size(),-1);
92 std::vector<int> nbin(names.size(),-1);
93 unsigned int idim;
94
95 for (idim=0;idim<keys.size();idim++) {
96 found = sTitle.find(keys[idim]);
97 if ( found == std::string::npos ) {
98 ATH_MSG_ERROR( "Could not find key " << keys[idim] << " in current histogram." );
99 allValid = false;
100 }
101 else {
102 char c;
103 std::istringstream tstr(sTitle.substr(found+keys[idim].length()));
104 tstr >> ibin[idim] >> c >> c >> rmin[idim] >> c >> rmax[idim] >> c >> nbin[idim];
105 if ( ibin[idim] < 0 || ibin[idim] >= nbin[idim] ) {
106 ATH_MSG_ERROR( "Found invalid bin number " << ibin[idim] << " not in valid range [0," << nbin[idim] << " in current histogram." );
107 allValid = false;
108 }
109 }
110 }
111 if ( allValid ) {
112 // final 2 dimensions are from TProfile2D itself
113 nbin[names.size()-2] = prof->GetNbinsX();
114 rmin[names.size()-2] = prof->GetXaxis()->GetXmin();
115 rmax[names.size()-2] = prof->GetXaxis()->GetXmax();
116 nbin[names.size()-1] = prof->GetNbinsY();
117 rmin[names.size()-1] = prof->GetYaxis()->GetXmin();
118 rmax[names.size()-1] = prof->GetYaxis()->GetXmax();
119 // book new area from the first histo found for current sampling
120 if ( isampmap[isamp] < 0 ) {
121 isampmap[isamp] = nAreas;
122 nAreas++;
123 for (idim = 0;idim<names.size();idim++) {
124 CaloLocalHadCoeff::LocalHadDimension theDim(names[idim].c_str(),types[idim],nbin[idim],rmin[idim],rmax[idim]);
125 theAreas[isamp].addDimension(theDim);
126 }
127 }
128 else if ( iread == 1 ) {
129 // now fill all data for current histogram
130 TAxis * xax = prof->GetXaxis();
131 TAxis * yax = prof->GetYaxis();
132 for (ibin[names.size()-2]=0;ibin[names.size()-2]<prof->GetNbinsX();ibin[names.size()-2]++) {
133 for (ibin[names.size()-1]=0;ibin[names.size()-1]<prof->GetNbinsY();ibin[names.size()-1]++) {
134 float logEClus = xax->GetBinCenter(ibin[names.size()-2]+1);
135 float logEDensCell = yax->GetBinCenter(ibin[names.size()-1]+1);
136 int iBin = prof->FindBin(logEClus,logEDensCell);
137
139 theData[CaloLocalHadDefs::BIN_WEIGHT] = prof->GetBinContent(iBin);
140 theData[CaloLocalHadDefs::BIN_ENTRIES] = prof->GetBinEntries(iBin);
141 theData[CaloLocalHadDefs::BIN_ERROR] = prof->GetBinError(iBin);
142
143 msg() << MSG::INFO << "Now set data for isamp=" << isamp
144 << " and bins: ";
145 for(unsigned int ii=0;ii<ibin.size();ii++)
146 msg() << ibin[ii] << " ";
147 msg() << endmsg;
148 int bin = data.getBin(isampmap[isamp],ibin);
149 if (bin < 0) {
150 ATH_MSG_ERROR("Bad return from getBin");
151 return StatusCode::FAILURE;
152 }
153 data.setCoeff(bin,theData);
154 }
155 }
156 }
157 }
158 }
159 }
160 theKeyList->RemoveFirst();
161 }
162 if ( iread == 0 ) {
163 // create the data object from all areas
164 for(unsigned int jsamp=0;jsamp<theAreas.size();jsamp++) {
165 if ( theAreas[jsamp].getNdim() > 0 ) {
166 ATH_MSG_INFO( "adding Area for jsamp=" << jsamp << " with nDim = " << theAreas[jsamp].getNdim() );
167 data.addArea(theAreas[jsamp]);
168 }
169 }
170 }
171 theLCWeightFile->Close();
172 delete theLCWeightFile;
173 }
174 return StatusCode::SUCCESS;
175}
176
178 ATH_MSG_INFO( " Building CaloLocalHadCoeff object " );
179 auto data = std::make_unique<CaloLocalHadCoeff>();
181 ATH_CHECK( detStore()->record(std::move(data), m_key, false) );
182 return StatusCode::SUCCESS;
183}
184
185
187{
188 return StatusCode::SUCCESS;
189}
190
192{
193 return StatusCode::SUCCESS;
194}
#define endmsg
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
static const std::vector< std::string > types
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
const ServiceHandle< StoreGateSvc > & detStore() const
MsgStream & msg() const
Definition of correction area.
Class defines binning for user dimension.
Hold binned correction data for local hadronic calibration procedure.
std::vector< float > LocalHadCoeff
Correction parameters for one general bin.
CaloReadLCWeightsFile(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initDataFromFile(const std::string &theLCWeightFileName, CaloLocalHadCoeff &data)
static const std::string & getSamplingName(const CaloSampling::CaloSample theSample)
Returns a string (name) for each CaloSampling.
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
TFile * file