ROOT logo
/********************************************************************
 
 Bad Chunks Checking code, 15th April 2013
 
 --- This version is a bit more "automatized" in that you give it a
 dataset string as a parameter and it spits out appropriately named 
 text files. Some small customization for each usage case (output 
 directory, in the first lines of the function below) may still 
 be needed when being used in general. 
 
 --- Also note: the code expects to find an "output" directory to 
 store text files with summaries. If it does not exist, please create
 it or also chang the path!
 
********************************************************************/
 

#include <iostream>
#include <fstream>

#include "TFile.h"
#include "TTree.h"
#include "TString.h"

using namespace std;

int ProcessBadChunks02(TString lDataset ){
  
  //Path to output files: change as needed
  TString lFileName = "/Volumes/MyPassport/work/download/badchunk/";
  lFileName.Append(lDataset.Data());
  lFileName.Append(".root");
  
  //Print out "I'm alive"
  cout<<"----------------------------------------------------"<<endl;
  cout<<" Bad Chunk Analysis Macro"<<endl;
  cout<<"----------------------------------------------------"<<endl;
  cout<<" Dataset identified as......: "<<lDataset<<endl;
  cout<<" Filename to open...........: "<<lFileName<<endl;
  
  //Open...
  // Open the file
  TFile* file = TFile::Open(lFileName, "READ");
  if (!file || !file->IsOpen()) {
    cout<<"File not found!"<<endl;
    return 1;
  }
  // Get the tree
  TTree* ftree = (TTree*)file->FindObjectAny("fTree");
  if (!ftree) {
    cout<<"File doesn't contain fTree!"<<endl;
    return 2;
  }
  
  cout<<" Entries in Event Tree......: "<<ftree->GetEntries()<<endl;
  cout<<"----------------------------------------------------"<<endl;
  //return 0;
  Int_t llRunNumber = 0;
  TString * llFileName = 0x0;
  Int_t llNTracks = 0;
  Int_t llNGlobalTracks = 0;
  
  ftree->SetBranchAddress("fRunNumber"      ,&llRunNumber     );
  ftree->SetBranchAddress("fFileName"       , &llFileName   );
  ftree->SetBranchAddress("fNTracks"        ,&llNTracks       );
  ftree->SetBranchAddress("fNGlobalTracks"  ,&llNGlobalTracks );

  //Output ostreams: text files with chunk location, good and bad
  
  //Save by default to "output" directory
  TString lGoodName = "output/GoodChunks-";
  lGoodName.Append(lDataset.Data());
  lGoodName.Append(".txt");
  TString lBadName = "output/BadChunks-";
  lBadName.Append(lDataset.Data());
  lBadName.Append(".txt");

  TString lReport = "output/Datasetreport-";
  lReport.Append(lDataset.Data());
  lReport.Append(".txt");
  
  filebuf fbgood;
  fbgood.open (lGoodName,ios::out);
  ostream osgood(&fbgood);

  filebuf fbbad;
  fbbad.open (lBadName,ios::out);
  ostream osbad(&fbbad);

  filebuf fbreport;
  fbreport.open (lReport,ios::out);
  ostream osreport(&fbreport);
  
  //Main Tree Loop
  Long_t lProcessedChunks = 0;
  Long_t lProcessedChunksGood = 0;
  Long_t lProcessedChunksBad = 0;
  Long_t lTracks = 0;
  Long_t lGlobalTracks = 0;
  TString *lChunkName = new TString();
  
  //First Chunk entry
  ftree->GetEntry(0);
  *lChunkName = *llFileName;
  
  cout<<"TEST  "<<lChunkName->Data() <<", track = "<<lTracks<<", globals = "<<lGlobalTracks<<" " << llFileName->Data()  << endl;
  
  for(Long_t iEvent = 1; iEvent<ftree->GetEntries(); iEvent++){
    ftree->GetEntry(iEvent);
    if( !llFileName->EqualTo(*lChunkName) ){
      lProcessedChunks++;
      //Change Chunk
      if( lTracks > 0 && lGlobalTracks ==0){
        //Candidate bad chunk found!
        cout<<"BAD CHUNK at "<<lChunkName->Data() <<", track = "<<lTracks<<", globals = "<<lGlobalTracks<< endl;
        osbad<<lChunkName->Data()<<endl;
        lProcessedChunksBad++;
      }else{
        //This looks OK...
        //cout<<"GOOD CHUNK at "<<lChunkName<<endl;
        osgood<<lChunkName->Data()<<endl;
        lProcessedChunksGood++;
      }
      //Get ready to loop over new chunk
      *lChunkName = *llFileName;
      lTracks = llNTracks;
      lGlobalTracks = llNGlobalTracks;
      if(lProcessedChunks%5000==0) cout<<"---> Processed "<<lProcessedChunks<<"..."<<endl;
    }else{
      lTracks        += llNTracks;
      lGlobalTracks  += llNGlobalTracks;
    }
  }
  //CLOSE the processing: one extra pass...
  lProcessedChunks++;
  if( lTracks > 0 && lGlobalTracks ==0){
    //Candidate bad chunk found!
    cout<<"BAD CHUNK at "<<lChunkName->Data()<<endl;
    osbad<<lChunkName->Data() <<endl;
    lProcessedChunksBad++;
  }else{
    //This looks OK...
    //cout<<"GOOD CHUNK at "<<lChunkName<<endl;
    osgood<<lChunkName->Data()<<endl;
    lProcessedChunksGood++;
  }
  fbgood.close();
  fbbad.close();

  cout<<"----------------------------------------------------"<<endl;
  cout<<"Processed chunks, total..: "<<lProcessedChunks<<endl;
  cout<<"Processed chunks, good...: "<<lProcessedChunksGood<<endl;
  cout<<"Processed chunks, bad....: "<<lProcessedChunksBad<<endl;
  cout<<"Corruption rate..........: "<<((double)lProcessedChunksBad)/((double)lProcessedChunks)<<endl;
  cout<<"Corruption rate, percent.: "<<100.*((double)lProcessedChunksBad)/((double)lProcessedChunks)<<" percent"<<endl;
  cout<<"----------------------------------------------------"<<endl;

  //Write report file 
  osreport<<"----------------------------------------------------"<<endl;
  osreport<<" "<<lDataset<<" Processed chunks, total..: "<<lProcessedChunks<<endl;
  osreport<<" "<<lDataset<<" Processed chunks, good...: "<<lProcessedChunksGood<<endl;
  osreport<<" "<<lDataset<<" Processed chunks, bad....: "<<lProcessedChunksBad<<endl;
  osreport<<" "<<lDataset<<" Corruption rate..........: "<<((double)lProcessedChunksBad)/((double)lProcessedChunks)<<endl;
  osreport<<" "<<lDataset<<" Corruption rate, percent.: "<<100.*((double)lProcessedChunksBad)/((double)lProcessedChunks)<<" percent"<<endl;
  osreport<<"----------------------------------------------------"<<endl;
  
  
  fbreport.close();
  cout<<endl;
  cout<<"---> Good chunks saved to \"goodguys.txt\""<<endl;
  cout<<"---> Bad chunks saved to \"badguys.txt\""<<endl;
  cout<<endl;
  cout<<"DONE!"<<endl;
  return 0;
   
}
 ProcessBadChunks02.C:1
 ProcessBadChunks02.C:2
 ProcessBadChunks02.C:3
 ProcessBadChunks02.C:4
 ProcessBadChunks02.C:5
 ProcessBadChunks02.C:6
 ProcessBadChunks02.C:7
 ProcessBadChunks02.C:8
 ProcessBadChunks02.C:9
 ProcessBadChunks02.C:10
 ProcessBadChunks02.C:11
 ProcessBadChunks02.C:12
 ProcessBadChunks02.C:13
 ProcessBadChunks02.C:14
 ProcessBadChunks02.C:15
 ProcessBadChunks02.C:16
 ProcessBadChunks02.C:17
 ProcessBadChunks02.C:18
 ProcessBadChunks02.C:19
 ProcessBadChunks02.C:20
 ProcessBadChunks02.C:21
 ProcessBadChunks02.C:22
 ProcessBadChunks02.C:23
 ProcessBadChunks02.C:24
 ProcessBadChunks02.C:25
 ProcessBadChunks02.C:26
 ProcessBadChunks02.C:27
 ProcessBadChunks02.C:28
 ProcessBadChunks02.C:29
 ProcessBadChunks02.C:30
 ProcessBadChunks02.C:31
 ProcessBadChunks02.C:32
 ProcessBadChunks02.C:33
 ProcessBadChunks02.C:34
 ProcessBadChunks02.C:35
 ProcessBadChunks02.C:36
 ProcessBadChunks02.C:37
 ProcessBadChunks02.C:38
 ProcessBadChunks02.C:39
 ProcessBadChunks02.C:40
 ProcessBadChunks02.C:41
 ProcessBadChunks02.C:42
 ProcessBadChunks02.C:43
 ProcessBadChunks02.C:44
 ProcessBadChunks02.C:45
 ProcessBadChunks02.C:46
 ProcessBadChunks02.C:47
 ProcessBadChunks02.C:48
 ProcessBadChunks02.C:49
 ProcessBadChunks02.C:50
 ProcessBadChunks02.C:51
 ProcessBadChunks02.C:52
 ProcessBadChunks02.C:53
 ProcessBadChunks02.C:54
 ProcessBadChunks02.C:55
 ProcessBadChunks02.C:56
 ProcessBadChunks02.C:57
 ProcessBadChunks02.C:58
 ProcessBadChunks02.C:59
 ProcessBadChunks02.C:60
 ProcessBadChunks02.C:61
 ProcessBadChunks02.C:62
 ProcessBadChunks02.C:63
 ProcessBadChunks02.C:64
 ProcessBadChunks02.C:65
 ProcessBadChunks02.C:66
 ProcessBadChunks02.C:67
 ProcessBadChunks02.C:68
 ProcessBadChunks02.C:69
 ProcessBadChunks02.C:70
 ProcessBadChunks02.C:71
 ProcessBadChunks02.C:72
 ProcessBadChunks02.C:73
 ProcessBadChunks02.C:74
 ProcessBadChunks02.C:75
 ProcessBadChunks02.C:76
 ProcessBadChunks02.C:77
 ProcessBadChunks02.C:78
 ProcessBadChunks02.C:79
 ProcessBadChunks02.C:80
 ProcessBadChunks02.C:81
 ProcessBadChunks02.C:82
 ProcessBadChunks02.C:83
 ProcessBadChunks02.C:84
 ProcessBadChunks02.C:85
 ProcessBadChunks02.C:86
 ProcessBadChunks02.C:87
 ProcessBadChunks02.C:88
 ProcessBadChunks02.C:89
 ProcessBadChunks02.C:90
 ProcessBadChunks02.C:91
 ProcessBadChunks02.C:92
 ProcessBadChunks02.C:93
 ProcessBadChunks02.C:94
 ProcessBadChunks02.C:95
 ProcessBadChunks02.C:96
 ProcessBadChunks02.C:97
 ProcessBadChunks02.C:98
 ProcessBadChunks02.C:99
 ProcessBadChunks02.C:100
 ProcessBadChunks02.C:101
 ProcessBadChunks02.C:102
 ProcessBadChunks02.C:103
 ProcessBadChunks02.C:104
 ProcessBadChunks02.C:105
 ProcessBadChunks02.C:106
 ProcessBadChunks02.C:107
 ProcessBadChunks02.C:108
 ProcessBadChunks02.C:109
 ProcessBadChunks02.C:110
 ProcessBadChunks02.C:111
 ProcessBadChunks02.C:112
 ProcessBadChunks02.C:113
 ProcessBadChunks02.C:114
 ProcessBadChunks02.C:115
 ProcessBadChunks02.C:116
 ProcessBadChunks02.C:117
 ProcessBadChunks02.C:118
 ProcessBadChunks02.C:119
 ProcessBadChunks02.C:120
 ProcessBadChunks02.C:121
 ProcessBadChunks02.C:122
 ProcessBadChunks02.C:123
 ProcessBadChunks02.C:124
 ProcessBadChunks02.C:125
 ProcessBadChunks02.C:126
 ProcessBadChunks02.C:127
 ProcessBadChunks02.C:128
 ProcessBadChunks02.C:129
 ProcessBadChunks02.C:130
 ProcessBadChunks02.C:131
 ProcessBadChunks02.C:132
 ProcessBadChunks02.C:133
 ProcessBadChunks02.C:134
 ProcessBadChunks02.C:135
 ProcessBadChunks02.C:136
 ProcessBadChunks02.C:137
 ProcessBadChunks02.C:138
 ProcessBadChunks02.C:139
 ProcessBadChunks02.C:140
 ProcessBadChunks02.C:141
 ProcessBadChunks02.C:142
 ProcessBadChunks02.C:143
 ProcessBadChunks02.C:144
 ProcessBadChunks02.C:145
 ProcessBadChunks02.C:146
 ProcessBadChunks02.C:147
 ProcessBadChunks02.C:148
 ProcessBadChunks02.C:149
 ProcessBadChunks02.C:150
 ProcessBadChunks02.C:151
 ProcessBadChunks02.C:152
 ProcessBadChunks02.C:153
 ProcessBadChunks02.C:154
 ProcessBadChunks02.C:155
 ProcessBadChunks02.C:156
 ProcessBadChunks02.C:157
 ProcessBadChunks02.C:158
 ProcessBadChunks02.C:159
 ProcessBadChunks02.C:160
 ProcessBadChunks02.C:161
 ProcessBadChunks02.C:162
 ProcessBadChunks02.C:163
 ProcessBadChunks02.C:164
 ProcessBadChunks02.C:165
 ProcessBadChunks02.C:166
 ProcessBadChunks02.C:167
 ProcessBadChunks02.C:168
 ProcessBadChunks02.C:169
 ProcessBadChunks02.C:170
 ProcessBadChunks02.C:171
 ProcessBadChunks02.C:172
 ProcessBadChunks02.C:173
 ProcessBadChunks02.C:174
 ProcessBadChunks02.C:175
 ProcessBadChunks02.C:176
 ProcessBadChunks02.C:177