ATLAS Offline Software
Loading...
Searching...
No Matches
histCollection Class Reference
Collaboration diagram for histCollection:

Classes

class  histPerDir_t
struct  histDir_t

Public Member Functions

 histCollection (bool debug=false)
void addDirectory (TDirectory *dir, const std::string &dirName)
size_t size ()
void addFile (TFile *in)
void print ()
void write (TFile *out)
void addExclusion (const std::string &dir)

Private Member Functions

bool isExcluded (const std::string &dir)

Private Attributes

std::map< std::string, histDir_t, std::less<> > m_data
bool m_dbg
std::vector< std::string > m_exclusion

Detailed Description

Definition at line 51 of file LArQuickHistMerge.cxx.

Constructor & Destructor Documentation

◆ histCollection()

histCollection::histCollection ( bool debug = false)
inlineexplicit

Definition at line 55 of file LArQuickHistMerge.cxx.

55: m_dbg(debug) {};
const bool debug

Member Function Documentation

◆ addDirectory()

void histCollection::addDirectory ( TDirectory * dir,
const std::string & dirName )

Definition at line 297 of file LArQuickHistMerge.cxx.

297 {
298 TIter next( dir->GetListOfKeys() );
299 TKey* key;
300 while((key=(TKey*)next())) {
301 const char* name=key->GetName();
302 const char* classname=key->GetClassName();
303 if (m_dbg) std::cout << "Found name " << name << ", classname=" << classname << std::endl;
304 const std::string newName=dirName+"/"+name;
305
306 if (this->isExcluded(newName)) {
307 std::cout << "Path " << newName << " excluded" << std::endl;
308 return;
309 }
310
311 if (!strncmp(classname,"TH1",3) || !strncmp(classname,"TH2",3) || !strncmp(classname,"TProfile",8)) {
312 auto mIt=m_data.find("dirName");
313
314 if (mIt==m_data.end()) { // New top-level directory
315 TTree* md=(TTree*)dir->Get("metadata");
316 if (!md) std::cout << "ERROR: Did not find metadata tree in directroy " << dirName << std::endl;
317 mIt=m_data.insert(std::make_pair(dirName,histDir_t(md))).first;
318 }
319 histPerDir_t histo(name,key->ReadObj(),mIt->second.md,m_dbg);
320
321 // Check if we already have this histogram in the list
322 bool found = 0;
323 for (auto it1=mIt->second.histos.begin(); it1!=mIt->second.histos.end();++it1) {
324 if( it1->name == name){
325 found=1;
326 break;
327 }
328 }
329 if ( found == 0 ){ // Add the histrogam if we didn't already have it
330 mIt->second.histos.push_back(std::move(histo));
331 }
332
333 }
334 else if (!strncmp(classname,"TDirectory",10)) {
335 TObject* obj = key->ReadObj();
336 TDirectory* subdir = dynamic_cast<TDirectory*>( obj );
337 if (subdir) {
338 this->addDirectory(subdir,newName);
339 }
340 }
341 else if (!strcmp(classname,"TTree") && (!strcmp(name,"metadata"))) {
342 //std::cout << "Found Metadata tree" << std::endl;
343 }
344 else {
345 std::cout << "Ignored objects '" << name << "' of type "<< classname << std::endl;
346 }
347 }
348 return;
349}
bool isExcluded(const std::string &dir)
void addDirectory(TDirectory *dir, const std::string &dirName)
std::map< std::string, histDir_t, std::less<> > m_data

◆ addExclusion()

void histCollection::addExclusion ( const std::string & dir)

Definition at line 89 of file LArQuickHistMerge.cxx.

89 {
90 m_exclusion.push_back(dir);
91 return;
92}
std::vector< std::string > m_exclusion

◆ addFile()

void histCollection::addFile ( TFile * in)

Definition at line 352 of file LArQuickHistMerge.cxx.

352 {
353 auto it=m_data.begin();
354 auto it_e=m_data.end();
355 for(;it!=it_e;++it) {
356 const std::string& dirName=it->first;
357 const histDir_t& hd=it->second;
358 std::vector<histPerDir_t>::const_iterator it1=hd.histos.begin();
359 std::vector<histPerDir_t>::const_iterator it1_e=hd.histos.end();
360 for (;it1!=it1_e;++it1) {
361 const std::string fullName=dirName+"/"+it1->name;
362 if (!it1->obj) {
363 std::cout << "Object " << fullName << " not properly set up. Not merged." << std::endl;
364 continue;
365 }
366 TObject* obj=in->Get(fullName.c_str());
367 if (!obj) {
368 std::cout << "ERROR: Could not access path " << fullName <<" in file " << in->GetName() << std::endl;
369 }
370 else
371 (*it1->mergeMethod)(it1->obj,obj);
372 }//End loop over histograms in directory
373 }//End loop over directory names
374 return;
375}

◆ isExcluded()

bool histCollection::isExcluded ( const std::string & dir)
private

Definition at line 94 of file LArQuickHistMerge.cxx.

94 {
95
96 const size_t firstSlash=dir.find('/',1);
97 if (firstSlash==std::string::npos) return false;
98
99 std::vector<std::string>::const_iterator it=m_exclusion.begin();
100 std::vector<std::string>::const_iterator it_e=m_exclusion.end();
101 for(;it!=it_e;++it) {
102 const std::string& excl=*it;
103 const size_t s=excl.size();
104 //std::cout << "Comparing " << dir << " (index "<< firstSlash <<") with " << excl << std::endl;
105 if (dir.compare(firstSlash,s,excl)==0) {
106 return true;
107 }
108 }
109 return false;
110}

◆ print()

void histCollection::print ( )

Definition at line 113 of file LArQuickHistMerge.cxx.

113 {
114 auto it=m_data.begin();
115 auto it_e=m_data.end();
116 for(;it!=it_e;++it) {
117 const histDir_t& hd=it->second;
118 std::cout << "Dir: " << it->first <<" has "<<hd.histos.size()<<" histos"<<std::endl;
119 std::vector<histPerDir_t>::const_iterator it1=hd.histos.begin();
120 std::vector<histPerDir_t>::const_iterator it1_e=hd.histos.end();
121 for (;it1!=it1_e;++it1)
122 std::cout << "\t" << it1->name << std::endl;
123 }
124
125 std::cout << "\nExclusion List: " << std::endl;
126 std::vector<std::string>::const_iterator sit=m_exclusion.begin();
127 std::vector<std::string>::const_iterator sit_e=m_exclusion.end();
128 for(;sit!=sit_e;++sit)
129 std::cout << "\t" << *sit << std::endl;
130
131 return;
132}

◆ size()

size_t histCollection::size ( )
inline

Definition at line 57 of file LArQuickHistMerge.cxx.

57{return m_data.size();};

◆ write()

void histCollection::write ( TFile * out)

Definition at line 377 of file LArQuickHistMerge.cxx.

377 {
378 unsigned nWritten=0;
379 unsigned nIgnored=0;
380 TDirectory* histDir=nullptr;
381 std::string lastDir;
382 auto it=m_data.begin();
383 auto it_e=m_data.end();
384 for(;it!=it_e;++it) {
385 const std::string fulldir=it->first + "/";
386 //Create dirs if necessary
387 std::string::size_type j=0,j1=0;
388 while (j1!=std::string::npos) {
389 do {
390 j=j1+1;
391 j1=fulldir.find('/',j);
392 //std::cout << "Inner loop " << fulldir.substr(0,j1) << " << ==? " << lastDir.substr(0,j1) << std::endl;
393 }
394 while(j1!=std::string::npos && !fulldir.compare(0,j1,lastDir,0,j1));
395 const std::string currDirAtLevel(fulldir.substr(j,j1-j));
396 const std::string currFullDir(fulldir.substr(0,j1));
397 const std::string currBaseDir(fulldir.substr(0,j));
398 //std::cout << "Working on dir " << fulldir << " [" << currFullDir << " " << currBaseDir << " " << currDirAtLevel << std::endl;
399 lastDir=std::move(currFullDir);
400 out->cd(currBaseDir.c_str());
401 gDirectory->mkdir(currDirAtLevel.c_str());
402 }//End outer while loop - full directory created
403 //std::cout << "Done creating " << fulldir << std::endl;
404 out->cd(fulldir.c_str());
405 it->second.md->SetDirectory(histDir);
406 it->second.md->Write(nullptr,TObject::kOverwrite);
407 std::vector<histPerDir_t>::const_iterator ith=it->second.histos.begin();
408 std::vector<histPerDir_t>::const_iterator ith_e=it->second.histos.end();
409 for (;ith!=ith_e;++ith) {
410 if (ith->obj) {
411 ith->obj->Write();
412 std::cout << "Writing " << ith->name << " to dir " << fulldir << std::endl;
413 ++nWritten;
414 }
415 else {
416 std::cout << "NOT writing " << ith->name << ". Invalid." << std::endl;
417 ++nIgnored;
418 }
419 }//End loop over histograms in one directory
420 }//End loop over directories;
421 std::cout << "Wrote " << nWritten << " histograms to output file.";
422 if (nIgnored)
423 std::cout << " Omitting " << nIgnored << " histograms." << std::endl;
424 else
425 std::cout << std::endl;
426 return;
427}
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
int nWritten
Definition fitman.py:420

Member Data Documentation

◆ m_data

std::map<std::string,histDir_t, std::less<> > histCollection::m_data
private

Definition at line 82 of file LArQuickHistMerge.cxx.

◆ m_dbg

bool histCollection::m_dbg
private

Definition at line 83 of file LArQuickHistMerge.cxx.

◆ m_exclusion

std::vector<std::string> histCollection::m_exclusion
private

Definition at line 84 of file LArQuickHistMerge.cxx.


The documentation for this class was generated from the following file: