#include "hdiskspace.h" #include "TString.h" #include "TH1F.h" #include "TFile.h" #include "TSystem.h" #include "TROOT.h" #include "TRegexp.h" #include "TObjString.h" #include "drawDisk.C" #include #include using namespace std; void diskspaceComposite( TString dir = "/hera/hades", TString outdir = "/misc/kempter/projects/diskmon/out/hera/hades", Int_t level = 3, TString exclude="", // default "" TString include=".*" // default ".*" ) { // composite dir : select subdirs inside mother dir by // include,exclude (commasepared list of TRegexp, exclude evaluated first) : // default include all ".*" , exact matching "^dir1$,^dir2$,^dir#$" // default exclude none "" // for each subdir a discatalog and diskstat object will be created in an own file. // A master catalog is build by number of subleveldirs copied from subdir catalogs dir.ReplaceAll("//","/"); outdir.ReplaceAll("//","/"); if(outdir.EndsWith("/")){ outdir.Replace(outdir.Length()-1,1,""); } if(dir.EndsWith("/")){ dir.Replace(dir.Length()-1,1,""); } gROOT->SetBatch(); vector vlevel1names; vector vlevel1final; vector excludenames; vector includenames; //---------------------------------------------------------------- // retrieve a full list of level1 subdirs of dir // this list will be filtered by exclude later HFileSys::lsDirectory(dir,vlevel1names); //---------------------------------------------------------------- //---------------------------------------------------------------- // get list of excludes : comma separated. each entry can be a TRegexp TObjArray* ar = exclude.Tokenize(","); if(ar){ cout<<"adding exclude :------------------------------"<GetEntries(); i++){ TString name = ((TObjString*)ar->At(i))->GetString(); cout<Delete(); delete ar; } //---------------------------------------------------------------- //---------------------------------------------------------------- // get list of includes : comma separated. each entry can be a TRegexp ar = include.Tokenize(","); if(ar){ cout<<"adding include :------------------------------"<GetEntries(); i++){ TString name = ((TObjString*)ar->At(i))->GetString(); cout<Delete(); delete ar; } //---------------------------------------------------------------- //---------------------------------------------------------------- // filter the dir list by excludes and put them into final list // of subdirs cout<<"analyzing include/exclude : ------------------"<cd(); Bool_t createSuper = kTRUE; HDiskCatalog* catalogsuper = new HDiskCatalog(dir); catalogsuper->SetName(supername.Data()); HDiskDir basesuper(dir); basesuper.scan(0); // get list of files in base dir catalogsuper->addDir(&basesuper); time_t start = 0; time_t stop = 0; HDiskStat* statsuper = 0; if(gSystem->AccessPathName(Form("%s/dirdata%s.root",outdir.Data(),supername.Data()))==0) createSuper = kFALSE; cout<<"before input master :-----------------------------"<SetName(Form("stat%s",supername.Data())); } else { cout<<"Input file master "<cd(); statsuper = (HDiskStat*) gDirectory->Get(Form("stat%s",supername.Data())); } //---------------------------------------------------------------- // loop over subdirs and a catalog for each entry TString mothername = dir; mothername.ReplaceAll("/","_"); for(UInt_t i = 0 ; i < vlevel1final.size() ; i++) { HDiskCatalog* catalog = 0; HDiskStat* stat = 0; Bool_t create = kTRUE; TString level1name = vlevel1final[i]; level1name.ReplaceAll("/","_"); TString objname=Form("%s_%s",mothername.Data(),level1name.Data()); TString fname = Form("dirdata%s",objname.Data()); TString scandir=Form("%s/%s",dir.Data(),vlevel1final[i].Data()); TFile* fin=0; cout<<"PROCESSING : "<AccessPathName(Form("%s/%s.root",outdir.Data(),fname.Data()))==0) create = kFALSE; cout<<"before input : -----------------------------------"<cd(); catalog = (HDiskCatalog*) gDirectory->Get(objname.Data()); stat = (HDiskStat*) gDirectory->Get(Form("stat%s",objname.Data())); if(catalog && catalog->getDiskName().CompareTo(scandir)==0 ){ cout<<"\n\n\n"<printDisk(level,"size",8,"-"); } else { cout<<"Calatlog not found"<Close(); delete fin; } else { cout<<"\n\n\n"<SetName(objname.Data()); stat = new HDiskStat(scandir); stat ->SetName(Form("stat%s",objname.Data())); } cout<<"running scan : -------------------------------"<cd(); cout<<"\n\n\n"<scan(); cout<<"\n\n\n"<printDisk(level,"size",8,"-"); cout<<"adding to history : ------------------------"<getDir(catalog->getDiskName(),&oldindex); if (start == 0) start = catalog->getLastScanStart(); if (catalog->getLastScanStop() > stop) stop = catalog->getLastScanStop(); if(base){ vector daughters; stat ->addEntry(catalog->getLastScanStart(),base); catalog->getDaughterDirs(base,daughters); for(UInt_t i=0;iaddEntry(catalog->getLastScanStart(),daughters[i]); } //---------------------------------------------------------------- // master stat and catalog cout<<"ADD TO MASTER CATALOG :"<GetName()<addEntry(start,base); // master catalog TObjArray* list = catalog->getList() ; for(Int_t i=0;iGetEntries();i++){ HDiskDir* dold = (HDiskDir*) list->At(i); if(dold->getLevel() < level){ dold->print(); catalogsuper->addDir(dold); } } //---------------------------------------------------------------- } //---------------------------------------------------------------- cout<<"drawing disk : ------------------------"<cd(); catalog->Write(); stat ->Write(); fout->Save(); fout->Close(); delete fout; delete stat; delete catalog; cout<<"\n\n\n"<Exec(Form("mv %s/%s.root %s/%s_old.root",outdir.Data(),fname.Data(),outdir.Data(),fname.Data())); gSystem->Exec(Form("mv %s/%s_new.root %s/%s.root",outdir.Data(),fname.Data(),outdir.Data(),fname.Data())); cout<<"finished : -----------------------------------"<setLastScanStart(start); catalogsuper->setLastScanStop(stop); catalogsuper->setUserMap (HFileSys::getUserMap()); catalogsuper->setGroupMap(HFileSys::getGroupMap()); catalogsuper->updateDirIndices(); HDiskDir* base = catalogsuper->getDir(dir); statsuper ->addEntry(start,base); catalogsuper->printDisk(level,"size",8,"-"); drawDisk(catalogsuper,statsuper,outdir,level); ofstream fout(Form("%s/dirdata%s_dir_summary_1.log",outdir.Data(),catalogsuper->GetName())); if(1) { // scope for redirect HRedirect log(&cout,&fout);// cout -> base logfile catalogsuper->printDisk(1,"size",8,"-"); } fout.close(); ofstream fout2(Form("%s/dirdata%s_dir_summary_2.log",outdir.Data(),catalogsuper->GetName())); if(1) { // scope for redirect HRedirect log(&cout,&fout2);// cout -> base logfile catalogsuper->printDisk(2,"size",8,"-"); } fout2.close(); ofstream fout3(Form("%s/dirdata%s_dir_summary_3.log",outdir.Data(),catalogsuper->GetName())); if(1) { // scope for redirect HRedirect log(&cout,&fout3);// cout -> base logfile catalogsuper->printDisk(3,"size",8,"-"); } fout3.close(); ofstream fout4(Form("%s/scanned_dirs.log",outdir.Data())); for(UInt_t i = 0; i < vlevel1final.size(); i++){ fout4<cd(); catalogsuper->Write(); statsuper ->Write(); fsuper->Save(); fsuper->Close(); cout<<"\n\n\n"<Exec(Form("mv %s/dirdata%s.root %s/dirdata%s_old.root",outdir.Data(),supername.Data(),outdir.Data(),supername.Data())); gSystem->Exec(Form("mv %s/dirdata%s_new.root %s/dirdata%s.root",outdir.Data(),supername.Data(),outdir.Data(),supername.Data())); cout<<"finished : -----------------------------------"<