/////////////////////////////////////////////////////////////////////////////// // // uses cdfopr/OfflineMon/scripts/format_prod_summary_data // to parse log files in a given directory and create a text file with // the summary // // TProdSummary::UpdateNtuple runs on this file // // root [0] .L shlib/Linux2_SL-GCC_3_4/libStntuple_oracle.so // root [1] .L shlib/Linux2_SL-GCC_3_4/libOfflineMon.so // root [2] TProdSummary* s = new TProdSummary() // root [3] s->SetInputDirName("ProductionExe_0i_bphysr_206990_210011.dat") // root [4] s->SetNtupleFileName("ProductionExe_0i_bphysr_206990_210011.root") // root [5] s->UpdateNtuple() /////////////////////////////////////////////////////////////////////////////// #include "TROOT.h" #include "TFile.h" #include "TTree.h" #include "OfflineMon/TProdSummary.hh" #include "Stntuple/oracle/TCdfOracle.hh" #include "Stntuple/base/TCdf2Files.hh" ClassImp(TProdCrashData) ClassImp(TProdOutputFileData) ClassImp(TProdSummary) ClassImp(TProdSummary::Data_t) //_____________________________________________________________________________ TProdSummary::TProdSummary(const char* Name): TOfflineMonitor(Name) { fData = new TProdSummary::Data_t(); } //_____________________________________________________________________________ TProdSummary::~TProdSummary() { delete fData; } //_____________________________________________________________________________ Char_t TProdSummary::Stream() { // returns CPU clock speed in GHz return fData->fInputFileName[0]; } //_____________________________________________________________________________ Int_t TProdSummary::RunNumber() { // returns CPU clock speed in GHz char buf[10]; TString s("0x"); s += fData->fInputFileName(3,5); sprintf(buf,"%i",s.Data()); int run_number = atoi(buf); return run_number; } //_____________________________________________________________________________ Float_t TProdSummary::CpuClock() { // returns CPU clock speed in GHz int node (0); float cpu_speed(0); if (fData->fNodeName.Index("fncdf") == 0) { // Production Farm node = atoi(fData->fNodeName(5,3).Data()); if (node < 202) cpu_speed = 1.666 ; else if (node == 202) cpu_speed = 2.000 ; else if (node <= 266) cpu_speed = 2.666 ; else if (node <= 346) cpu_speed = 3.000 ; else { // nodes do not yet exist cpu_speed = 0.; } } return cpu_speed; } //_____________________________________________________________________________ int TProdSummary::UpdateNtuple() { // input file is always a raw data file... TFile* ntuple_file = new TFile(fNtupleFileName.Data(),"recreate"); TTree* tree = new TTree("prod_summary","Production Summary"); TBranch* br = tree->Branch("ProdSummary","TProdSummary::Data_t", &fData); TCdf2Files* file = new TCdf2Files(); //----------------------------------------------------------------------------- // read the data file and fill the ntuple //----------------------------------------------------------------------------- FILE* f = fopen(fInputDirName.Data(),"r"); char c[200], buf1[200], buf2[100]; float x[100]; int n = 200; while (fgets(c,n,f) > 0) { fData->fListOfCrashes->Delete(); fData->fListOfOutputFiles->Delete(); if (c[0] != '#') { sscanf(c,"%s %i %i %s %i %f %f %i", buf1, &fData->fNInputEvents, &fData->fNSevereErrors, buf2, &fData->fNCrashes, &fData->fCpuTime, &fData->fClkTime, &fData->fNOutputFiles ); fData->fInputFileName = buf1; fData->fNodeName = buf2; fCdfofprd->GetFileLuminosity(buf1,fData->fInstLumi,x[1],x[2],x[3]); fCdfofprd->GetFile(buf1,"filecatalog",file); fData->fInputFileSize=file->fFILE_SIZE; //----------------------------------------------------------------------------- // output files //----------------------------------------------------------------------------- for (int i=0; ifNOutputFiles; i++) { fgets(c,n,f); TProdOutputFileData* dt = new ((*fData->fListOfOutputFiles)[i]) TProdOutputFileData(); sscanf(c,"%s %i %i %f", buf1,&dt->fNRecords, &dt->fNEvents,&dt->fAverageEventSize); dt->fName = buf1; } //----------------------------------------------------------------------------- // crashes //----------------------------------------------------------------------------- for (int i=0; ifNCrashes; i++) { fgets(c,n,f); TProdCrashData* cr = new ((*fData->fListOfCrashes)[i]) TProdCrashData(); sscanf(c,"%i %i", &cr->fRunNumber,&cr->fEventNumber); } tree->Fill(); } } ntuple_file->Write(); delete ntuple_file; return 0; }