467 {
468
469 if (argc<2 || (argc>1 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help")))) {
470 std::cout <<
"Syntax:\n" <<
argv[0] <<
" [-v ] [-i inputTextFile] [-d directroy] <outfile> <infile1> <infile2> .... " << std::endl;
471 std::cout << " -v verbose " << std::endl;
472 return -1;
473 }
474
478 std::vector<std::string> baseDirs;
479
480 for(
int iArg=1;iArg<
argc;++iArg) {
481 if (!strcmp(argv[iArg],"-v")) {
483 continue;
484 }
485
486 if (!strcmp(argv[iArg],"-d")) {
487 ++iArg;
488 if (argc<=iArg) {
489 std::cout << "ERROR: Expected a parameter (directory name) after '-d'" << std::endl;
490 return -1;
491 }
492 baseDirs.push_back(std::string(argv[iArg]));
493 continue;
494 }
495
496
497 if (!strcmp(argv[iArg],"-i")) {
498 ++iArg;
499 if (argc<=iArg) {
500 std::cout << "ERROR: Expected text file name after '-i'" << std::endl;
501 return -1;
502 }
504 continue;
505 }
508 else
510 }
511
512
514 std::cout << "ERROR: No output file name given!" << std::endl;
515 return -1;
516 }
517
518 if (!gSystem->AccessPathName(
outFileName.c_str())) {
519 std::cout <<
"ERROR: Output file " <<
outFileName <<
" exists already!" << std::endl;
520 return -1;
521 }
522
524 std::cout << "WARNING: No input files given! Will produce empty output file" << std::endl;
525 }
526
527
528 std::cout <<
"Number of input files: " <<
inFileNames.size() << std::endl;
529 std::cout <<
"Output file: " <<
outFileName << std::endl;
530
531 if (baseDirs.empty()) {
532 baseDirs.push_back("LAr");
533 baseDirs.push_back("CaloMonitoring/LArCellMon_NoTrigSel");
534 baseDirs.push_back("CaloTopoClusters/CalBAR");
535 baseDirs.push_back("CaloTopoClusters/CalECA");
536 baseDirs.push_back("CaloTopoClusters/CalECC");
537 baseDirs.push_back("CaloTopoClusters/CalEMBAR");
538 baseDirs.push_back("CaloTopoClusters/CalEMECA");
539 baseDirs.push_back("CaloTopoClusters/CalEMECC");
540
541 }
542 else {
543
544 for (
size_t i=0;
i<baseDirs.size();++
i) {
545 const std::vector<std::string> & dirtok=
splitString(baseDirs[i],
"/");
546 if (dirtok.empty()) {
548 continue;
549 }
550 baseDirs[
i]=dirtok[0];
551 for (
size_t j=1;
j<dirtok.size();++
j) {
552 baseDirs[
i]+=
"/"+dirtok[
j];
553 }
554 }
555 }
556
557
558 std::vector<std::string> foundDirs;
559
561 listOfHists.addExclusion("/CaloMonitoring/LArCellMon_NoTrigSel/Sporadic");
562
563 TFile* in1=nullptr;
564 std::string runDir("/");
565 size_t fileIndex=0;
566 unsigned nSkippedFiles=0;
567
569
570
571
572 for (;fileIndex<
nFiles && foundDirs.size()!=baseDirs.size() ;++fileIndex) {
573
575 if (!in1) {
576 std::cout <<
"ERROR: Could not open first file " <<
inFileNames[fileIndex] <<
"after all attempts" << std::endl;
578 std::cout << "Failed to read " << nSkippedFiles << " input files. Abort job ..." << std::endl;
579 return -1;
580 }
582 std::cout <<
"Failed to read " << 100.0*nSkippedFiles/
nFiles <<
"% of input files. Abort job ..." << std::endl;
583 return -1;
584 }
585 ++nSkippedFiles;
586 std::cout << "Continue without this file. Skipped " << nSkippedFiles << " input files so far." << std::endl;
587 continue;
588 }
589
590 std::cout <<
"First loop: Working on file " <<
inFileNames[fileIndex] <<std::endl;
591
592 TIter
next(in1->GetListOfKeys() );
594 while((key=(TKey*)
next())) {
595 const char*
name=
key->GetName();
596 if (!strncmp(name,"run_",4)) {
597 if (runDir.size()>1) {
598 std::cout <<
"ERROR More than one run_XXX directory found! Ignoring " <<
name << std::endl;
599 }
600 else
601 runDir.append(name);
602 }
603 }
604
605 if (runDir.size()==1) {
606 std::cout << "WARNING: No run_XXXX directory found. Empty File? Ignored." << std::endl;
607 in1->Close();
608 continue;
609 }
610
611
612 std::vector<std::string>::const_iterator dIt=baseDirs.begin();
613 std::vector<std::string>::const_iterator dIt_e=baseDirs.end();
614
615 for (;dIt!=dIt_e;++dIt) {
616 std::string
dirName=runDir+
"/"+(*dIt);
617
618
619 TDirectory*
dir=
dynamic_cast<TDirectory*
>(in1->Get(
dirName.c_str()));
620 if (!dir) {
621 std::cout <<
"Did not find directory " <<
dirName <<
" in file "<<
inFileNames[fileIndex].c_str()<<
" !" << std::endl;
622 continue;
623 }
624 if (std::find(foundDirs.begin(), foundDirs.end(), dirName) != foundDirs.end())
625 {
626 std::cout<<
"Already found "<<
dirName<<
" before"<<std::endl;
627
628 }else{
629 foundDirs.push_back(dirName);
630 }
631 if (
debug) std::cout <<
"Found directory " <<
dirName <<
" in file "<<
inFileNames[fileIndex].c_str()<<
" !" << std::endl;
632 listOfHists.addDirectory(dir,dirName);
633 }
634
635 std::cout << "Number of directories: " << listOfHists.size() << std::endl;
636 std::cout<<"SIZE "<< listOfHists.size() <<std::endl;
637
638 if (
debug) listOfHists.print();
639
640
641
642
643 }
644
645 for (;fileIndex<
nFiles;++fileIndex) {
647
649 if (!in) {
650 std::cout <<
"ERROR: Could not open file " <<
filename <<
"after all attempts" << std::endl;
652 std::cout << "Failed to read " << nSkippedFiles << " input files. Abort job ..." << std::endl;
653 return -1;
654 }
656 std::cout <<
"Failed to read " << 100.0*nSkippedFiles/
nFiles <<
"% of input files. Abort job ..." << std::endl;
657 return -1;
658 }
659 ++nSkippedFiles;
660 std::cout << "Continue without this file. Skipped " << nSkippedFiles << " input files so far." << std::endl;
661 continue;
662 }
663 std::cout <<
"Working on file " <<
filename << std::endl;
664 TObject* dirObj=in->Get(runDir.c_str()+1);
665 if (!dirObj) {
666 std::cout << "Directory " << runDir << " not found. Ignoring apprently empty file" << std::endl;
667 }
668 else
669 listOfHists.addFile(in);
670 in->Close();
671 delete in;
672 }
673
675 if (!out || !
out->IsOpen()) {
676 std::cout <<
"ERROR: Failed to open output file " <<
outFileName <<
" for writing" << std::endl;
677 return -1;
678 }
679 listOfHists.write(out);
682
683 if (in1 && in1->IsOpen()) {
684 in1->Close();
685 delete in1;
686 }
687
688 if (nSkippedFiles>0) {
689 std::cout << "WARNING: Skipped " << nSkippedFiles << " input file(s)." << std::endl;
690 }
691
692 return 0;
693}
const int MAXSKIPPEDFILES
std::vector< std::string > splitString(const std::string &in, std::string_view delim)
TFile * openWithRetry(const char *path, const unsigned nTrys=3)
bool readFromTextFile(const char *filename, std::vector< std::string > &out)
const float MAXSKIPPEDFILESFRACTION
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)