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