ATLAS Offline Software
CaloReadLCWeightsFile.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 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 
27 StatusCode 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(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;
83  types.push_back(CaloLocalHadDefs::DIM_EQUI);
84  types.push_back(CaloLocalHadDefs::DIM_EQUI);
85  types.push_back(CaloLocalHadDefs::DIM_EQUI);
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  data.setCoeff(data.getBin(isampmap[isamp],ibin),theData);
149  }
150  }
151  }
152  }
153  }
154  }
155  theKeyList->RemoveFirst();
156  }
157  if ( iread == 0 ) {
158  // create the data object from all areas
159  for(unsigned int jsamp=0;jsamp<theAreas.size();jsamp++) {
160  if ( theAreas[jsamp].getNdim() > 0 ) {
161  ATH_MSG_INFO( "adding Area for jsamp=" << jsamp << " with nDim = " << theAreas[jsamp].getNdim() );
162  data.addArea(theAreas[jsamp]);
163  }
164  }
165  }
166  theLCWeightFile->Close();
167  delete theLCWeightFile;
168  }
169  return StatusCode::SUCCESS;
170 }
171 
173  ATH_MSG_INFO( " Building CaloLocalHadCoeff object " );
174  auto data = std::make_unique<CaloLocalHadCoeff>();
176  ATH_CHECK( detStore()->record(std::move(data), m_key, false) );
177  return StatusCode::SUCCESS;
178 }
179 
180 
182 {
183  return StatusCode::SUCCESS;
184 }
185 
187 {
188  return StatusCode::SUCCESS;
189 }
CaloLocalHadCoeff::LocalHadDimension
Class defines binning for user dimension.
Definition: CaloLocalHadCoeff.h:47
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
CaloLocalHadDefs::BIN_ERROR
@ BIN_ERROR
Definition: CaloLocalHadDefs.h:30
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
CaloLocalHadDefs.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TProfile2D
Definition: rootspy.cxx:531
CaloReadLCWeightsFile::CaloReadLCWeightsFile
CaloReadLCWeightsFile(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CaloReadLCWeightsFile.cxx:17
CaloReadLCWeightsFile::initialize
StatusCode initialize()
Definition: CaloReadLCWeightsFile.cxx:172
CaloCell_ID.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
CaloLocalHadCoeff::LocalHadCoeff
std::vector< float > LocalHadCoeff
Correction parameters for one general bin.
Definition: CaloLocalHadCoeff.h:220
CaloLocalHadDefs::BIN_ENTRIES
@ BIN_ENTRIES
Definition: CaloLocalHadDefs.h:29
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloReadLCWeightsFile::m_LCWeightFileName
std::string m_LCWeightFileName
Definition: CaloReadLCWeightsFile.h:28
CaloLocalHadDefs::DIM_EQUI
@ DIM_EQUI
Definition: CaloLocalHadDefs.h:40
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
python.subdetectors.mmg.names
names
Definition: mmg.py:8
CaloLocalHadCoeff
Hold binned correction data for local hadronic calibration procedure.
Definition: CaloLocalHadCoeff.h:41
file
TFile * file
Definition: tile_monitor.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
CaloSamplingHelper.h
CaloReadLCWeightsFile::m_key
std::string m_key
Definition: CaloReadLCWeightsFile.h:27
AthAlgorithm
Definition: AthAlgorithm.h:47
CaloLocalHadDefs::DIM_LOG
@ DIM_LOG
Definition: CaloLocalHadDefs.h:38
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
CaloReadLCWeightsFile.h
TProfile2D::GetBinContent
double GetBinContent(int) const
Definition: rootspy.cxx:546
CaloSamplingHelper::getSamplingName
static const std::string & getSamplingName(const CaloSampling::CaloSample theSample)
Returns a string (name) for each CaloSampling.
Definition: CaloUtils/src/CaloSamplingHelper.cxx:42
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
CaloReadLCWeightsFile::finalize
StatusCode finalize()
Definition: CaloReadLCWeightsFile.cxx:186
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CaloReadLCWeightsFile::~CaloReadLCWeightsFile
~CaloReadLCWeightsFile()
Definition: CaloReadLCWeightsFile.cxx:25
CaloLocalHadCoeff::LocalHadArea
Definition of correction area.
Definition: CaloLocalHadCoeff.h:145
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
CaloLocalHadDefs::BIN_WEIGHT
@ BIN_WEIGHT
Definition: CaloLocalHadDefs.h:28
python.compressB64.c
def c
Definition: compressB64.py:93
CaloReadLCWeightsFile::execute
StatusCode execute()
Definition: CaloReadLCWeightsFile.cxx:181
CaloReadLCWeightsFile::initDataFromFile
StatusCode initDataFromFile(const std::string &theLCWeightFileName, CaloLocalHadCoeff &data)
Definition: CaloReadLCWeightsFile.cxx:27
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37