CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DQMFileLoader.cc
Go to the documentation of this file.
2 
4 
5 // framework & common header files
8 
9 //DQM services
12 
13 #include <TFile.h>
14 #include <TList.h>
15 #include <TKey.h>
16 #include <TH1.h>
17 
18 #include <iostream>
19 
21 
22 const double defaultScaleFactor = 1.;
23 
24 const int verbosity = 0;
25 
26 void mapSubDirectoryStructure(TDirectory* directory, std::string directoryName, std::set<std::string>& subDirectories) {
27  //std::cout << "<mapSubDirectoryStructure>:" << std::endl;
28  //std::cout << " directoryName = " << directoryName << std::endl;
29 
30  TList* subDirectoryNames = directory->GetListOfKeys();
31  if (!subDirectoryNames)
32  return;
33 
34  TIter next(subDirectoryNames);
35  while (TKey* key = dynamic_cast<TKey*>(next())) {
36  //std::cout << " key->GetName = " << key->GetName() << std::endl;
37  TObject* obj = directory->Get(key->GetName());
38  //std::cout << " obj = " << obj << std::endl;
39  if (TDirectory* subDirectory = dynamic_cast<TDirectory*>(obj)) {
40  std::string subDirectoryName = dqmDirectoryName(directoryName).append(key->GetName());
41  //std::cout << " subDirectoryName = " << subDirectoryName << std::endl;
42 
43  subDirectories.insert(subDirectoryName);
44 
45  mapSubDirectoryStructure(subDirectory, subDirectoryName, subDirectories);
46  }
47  }
48 }
49 
50 //
51 //-----------------------------------------------------------------------------------------------------------------------
52 //
53 
55  //std::cout << "<TauDQMFileLoader::cfgEntryFileSet>" << std::endl;
56 
57  name_ = name;
58 
59  vstring inputFileList = cfg.getParameter<vstring>("inputFileNames");
60  for (vstring::const_iterator inputFile = inputFileList.begin(); inputFile != inputFileList.end(); ++inputFile) {
61  if (inputFile->find(rangeKeyword) != std::string::npos) {
62  size_t posRangeStart = inputFile->find(rangeKeyword) + rangeKeyword.length();
63  size_t posRangeEnd = inputFile->find('#', posRangeStart);
64 
65  size_t posRangeSeparator = inputFile->find('-', posRangeStart);
66 
67  if ((posRangeEnd == std::string::npos) || (posRangeSeparator >= posRangeEnd)) {
68  edm::LogError("TauDQMFileLoader::cfgEntryFileSet")
69  << " Invalid range specification in inputFile = " << (*inputFile) << " !!";
70  continue;
71  }
72 
73  std::string firstFile = std::string(*inputFile, posRangeStart, posRangeSeparator - posRangeStart);
74  //std::cout << "firstFile = " << firstFile << std::endl;
75  std::string lastFile = std::string(*inputFile, posRangeSeparator + 1, posRangeEnd - (posRangeSeparator + 1));
76  //std::cout << "lastFile = " << lastFile << std::endl;
77 
78  if (firstFile.length() != lastFile.length()) {
79  edm::LogError("TauDQMFileLoader::cfgEntryFileSet")
80  << " Invalid range specification in inputFile = " << (*inputFile) << " !!";
81  continue;
82  }
83 
84  int numFirstFile = atoi(firstFile.data());
85  int numLastFile = atoi(lastFile.data());
86  for (int iFile = numFirstFile; iFile <= numLastFile; ++iFile) {
87  std::ostringstream fileName;
88  fileName << std::string(*inputFile, 0, inputFile->find(rangeKeyword));
89  fileName << std::setfill('0') << std::setw(firstFile.length()) << iFile;
90  fileName << std::string(*inputFile, posRangeEnd + 1);
91  //std::cout << "iFile = " << iFile << ", fileName = " << fileName.str() << std::endl;
92  inputFileNames_.push_back(fileName.str());
93  }
94  } else {
95  inputFileNames_.push_back(*inputFile);
96  }
97  }
98 
99  scaleFactor_ = (cfg.exists("scaleFactor")) ? cfg.getParameter<double>("scaleFactor") : defaultScaleFactor;
100 
101  //dqmDirectory_store_ = ( cfg.exists("dqmDirectory_store") ) ? cfg.getParameter<std::string>("dqmDirectory_store") : name_;
102  dqmDirectory_store_ = (cfg.exists("dqmDirectory_store")) ? cfg.getParameter<std::string>("dqmDirectory_store") : "";
103 
104  if (verbosity)
105  print();
106 }
107 
109  std::cout << "<cfgEntryFileSet::print>:" << std::endl;
110  std::cout << " name = " << name_ << std::endl;
111  std::cout << " inputFileNames = " << format_vstring(inputFileNames_) << std::endl;
112  std::cout << " scaleFactor = " << scaleFactor_ << std::endl;
113  std::cout << " dqmDirectory_store = " << dqmDirectory_store_ << std::endl;
114 }
115 
116 //
117 //-----------------------------------------------------------------------------------------------------------------------
118 //
119 
121  std::cout << "<TauDQMFileLoader::TauDQMFileLoader>:" << std::endl;
122 
123  cfgError_ = 0;
124 
125  //--- configure fileSets
126  //std::cout << "--> configuring fileSets..." << std::endl;
127  readCfgParameter<cfgEntryFileSet>(cfg, fileSets_);
128 
129  //--- check that dqmDirectory_store configuration parameters are specified for all fileSets,
130  // unless there is only one fileSet to be loaded
131  // (otherwise histograms of different fileSets get overwritten,
132  // once histograms of the next fileSet are loaded)
133  for (std::map<std::string, cfgEntryFileSet>::const_iterator fileSet = fileSets_.begin(); fileSet != fileSets_.end();
134  ++fileSet) {
135  if (fileSet->second.dqmDirectory_store_.empty() && fileSets_.size() > 1) {
136  edm::LogError("TauDQMFileLoader") << " dqmDirectory_store undefined for fileSet = " << fileSet->second.name_
137  << " !!";
138  cfgError_ = 1;
139  break;
140  }
141  }
142 
143  std::cout << "done." << std::endl;
144 }
145 
147  // nothing to be done yet...
148 }
149 
151  // nothing to be done yet...
152 }
153 
155  std::cout << "<TauDQMFileLoader::endJob>:" << std::endl;
156 
157  //--- check that configuration parameters contain no errors
158  if (cfgError_) {
159  edm::LogError("endJob") << " Error in Configuration ParameterSet"
160  << " --> histograms will NOT be loaded !!";
161  return;
162  }
163 
164  //--- check that DQMStore service is available
165  if (!edm::Service<DQMStore>().isAvailable()) {
166  edm::LogError("endJob") << " Failed to access dqmStore"
167  << " --> histograms will NOT be loaded !!";
168  return;
169  }
170 
171  //--- stop ROOT from keeping references to all histograms
172  //TH1::AddDirectory(false);
173 
174  //--- check that inputFiles exist;
175  // store list of directories existing in inputFile,
176  // in order to separate histogram directories existing in the inputFile from directories existing in DQMStore
177  // when calling recursive function dqmCopyRecursively
178  for (std::map<std::string, cfgEntryFileSet>::const_iterator fileSet = fileSets_.begin(); fileSet != fileSets_.end();
179  ++fileSet) {
180  for (vstring::const_iterator inputFileName = fileSet->second.inputFileNames_.begin();
181  inputFileName != fileSet->second.inputFileNames_.end();
182  ++inputFileName) {
183  //std::cout << " checking inputFile = " << (*inputFileName) << std::endl;
184  TFile inputFile(inputFileName->data());
185  if (inputFile.IsZombie()) {
186  edm::LogError("endJob") << " Failed to open inputFile = " << (*inputFileName)
187  << "--> histograms will NOT be loaded !!";
188  return;
189  }
190 
191  TObject* obj = inputFile.Get(dqmRootDirectory_inTFile.data());
192  //std::cout << " obj = " << obj << std::endl;
193  if (TDirectory* directory = dynamic_cast<TDirectory*>(obj)) {
195  } else {
196  edm::LogError("endJob") << " Failed to access " << dqmRootDirectory_inTFile
197  << " in inputFile = " << (*inputFileName) << "--> histograms will NOT be loaded !!";
198  return;
199  }
200 
201  inputFile.Close();
202  }
203  }
204 
205  //for ( std::map<std::string, sstring>::const_iterator inputFile = subDirectoryMap_.begin();
206  // inputFile != subDirectoryMap_.end(); ++inputFile ) {
207  // std::cout << "inputFile = " << inputFile->first << ":" << std::endl;
208  // for ( sstring::const_iterator directory = inputFile->second.begin();
209  // directory != inputFile->second.end(); ++directory ) {
210  // std::cout << " " << (*directory) << std::endl;
211  // }
212  //}
213 
214  //--- load histograms from file
215  //std::cout << "--> loading histograms from file..." << std::endl;
216  DQMStore& dqmStore = (*edm::Service<DQMStore>());
217  for (std::map<std::string, cfgEntryFileSet>::const_iterator fileSet = fileSets_.begin(); fileSet != fileSets_.end();
218  ++fileSet) {
219  for (vstring::const_iterator inputFileName = fileSet->second.inputFileNames_.begin();
220  inputFileName != fileSet->second.inputFileNames_.end();
221  ++inputFileName) {
222  if (verbosity)
223  std::cout << " opening inputFile = " << (*inputFileName) << std::endl;
224  dqmStore.open(*inputFileName, true);
225 
226  //--- if dqmDirectory_store specified in configuration parameters,
227  // move histograms from dqmRootDirectory to dqmDirectory_store
228  // (if the histograms are not moved, the histograms get overwritten,
229  // the next time DQMStore::open is called)
230  if (!fileSet->second.dqmDirectory_store_.empty()) {
231  std::string inputDirectory = dqmRootDirectory;
232  //std::cout << "inputDirectory = " << inputDirectory << std::endl;
233  std::string outputDirectory =
234  dqmDirectoryName(std::string(inputDirectory)).append(fileSet->second.dqmDirectory_store_);
235  //std::cout << "outputDirectory = " << outputDirectory << std::endl;
236 
237  dqmStore.setCurrentFolder(inputDirectory);
238  std::vector<std::string> dirNames = dqmStore.getSubdirs();
239  for (std::vector<std::string>::const_iterator dirName = dirNames.begin(); dirName != dirNames.end();
240  ++dirName) {
241  std::string subDirName = dqmSubDirectoryName_merged(inputDirectory, *dirName);
242  //std::cout << " subDirName = " << subDirName << std::endl;
243 
244  const sstring& subDirectories = subDirectoryMap_[*inputFileName];
245  if (subDirectories.find(subDirName) != subDirectories.end()) {
246  std::string inputDirName_full = dqmDirectoryName(inputDirectory).append(subDirName);
247  //std::cout << " inputDirName_full = " << inputDirName_full << std::endl;
248 
249  std::string outputDirName_full = dqmDirectoryName(outputDirectory).append(subDirName);
250  //std::cout << " outputDirName_full = " << outputDirName_full << std::endl;
251 
252  //--- load histograms contained in inputFile into inputDirectory;
253  // when processing first inputFile, check that histograms in outputDirectory do not yet exist;
254  // add histograms in inputFile to those in outputDirectory afterwards;
255  // clear inputDirectory once finished processing all inputFiles.
256  int mode = (inputFileName == fileSet->second.inputFileNames_.begin()) ? 1 : 3;
258  dqmStore, inputDirName_full, outputDirName_full, fileSet->second.scaleFactor_, mode, true);
259  }
260  }
261  }
262  }
263  }
264 
265  std::cout << "done." << std::endl;
266 }
267 
269 
const double defaultScaleFactor
const edm::EventSetup & c
tuple cfg
Definition: looper.py:296
virtual DQM_DEPRECATED std::vector< std::string > getSubdirs() const
Definition: DQMStore.cc:700
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:646
bool exists(std::string const &parameterName) const
checks if a parameter exists
std::set< std::string > sstring
Definition: DQMFileLoader.h:29
Log< level::Error, false > LogError
std::string dqmDirectoryName(const std::string &dqmRootDirectory, const std::string &dqmSubDirectory)
Definition: EwkTauDQM.cc:10
const std::string rangeKeyword
const std::string dqmRootDirectory_inTFile
std::string dqmSubDirectoryName_merged(const std::string &directory, const std::string &subdirectory)
std::map< std::string, sstring > subDirectoryMap_
Definition: DQMFileLoader.h:49
tuple key
prepare the HTCondor submission files and eventually submit them
void endRun(const edm::Run &r, const edm::EventSetup &c) override
std::vector< std::string > vstring
Definition: DQMFileLoader.h:28
void dqmCopyRecursively(dqm::legacy::DQMStore &dqmStore, const std::string &inputDirectory, const std::string &outputDirectory, double scaleFactor, int mode, bool rmInputDirectory)
tuple inputFileList
Definition: diJetCalib.py:17
std::string format_vstring(const std::vector< std::string > &vs)
cfgEntryFileSet(const std::string &, const edm::ParameterSet &)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::map< std::string, cfgEntryFileSet > fileSets_
Definition: DQMFileLoader.h:48
~TauDQMFileLoader() override
TauDQMFileLoader(const edm::ParameterSet &)
tuple cout
Definition: gather_cfg.py:144
const std::string dqmRootDirectory
void mapSubDirectoryStructure(TDirectory *directory, std::string directoryName, std::set< std::string > &subDirectories)
DQM_DEPRECATED bool open(std::string const &filename, bool overwrite=false, std::string const &path="", std::string const &prepend="", OpenRunDirs stripdirs=KeepRunDirs, bool fileMustExist=true)
Definition: DQMStore.cc:790
Definition: Run.h:45
void analyze(const edm::Event &, const edm::EventSetup &) override