]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ANALYSIS/BadChunkFilter/ProcessBadChunks02.C
Updates from David (improved automatization).
[u/mrichter/AliRoot.git] / ANALYSIS / BadChunkFilter / ProcessBadChunks02.C
1 /********************************************************************\r
2  \r
3  Bad Chunks Checking code, 15th April 2013\r
4  \r
5  --- This version is a bit more "automatized" in that you give it a\r
6  dataset string as a parameter and it spits out appropriately named \r
7  text files. Some small customization for each usage case (output \r
8  directory, in the first lines of the function below) may still \r
9  be needed when being used in general. \r
10  \r
11  --- Also note: the code expects to find an "output" directory to \r
12  store text files with summaries. If it does not exist, please create\r
13  it or also chang the path!\r
14  \r
15 ********************************************************************/\r
16  \r
17 \r
18 #include <iostream>\r
19 #include <fstream>\r
20 \r
21 #include "TFile.h"\r
22 #include "TTree.h"\r
23 #include "TString.h"\r
24 \r
25 using namespace std;\r
26 \r
27 int ProcessBadChunks02(TString lDataset ){\r
28   \r
29   //Path to output files: change as needed\r
30   TString lFileName = "/Volumes/MyPassport/work/download/badchunk/";\r
31   lFileName.Append(lDataset.Data());\r
32   lFileName.Append(".root");\r
33   \r
34   //Print out "I'm alive"\r
35   cout<<"----------------------------------------------------"<<endl;\r
36   cout<<" Bad Chunk Analysis Macro"<<endl;\r
37   cout<<"----------------------------------------------------"<<endl;\r
38   cout<<" Dataset identified as......: "<<lDataset<<endl;\r
39   cout<<" Filename to open...........: "<<lFileName<<endl;\r
40   \r
41   //Open...\r
42   // Open the file\r
43   TFile* file = TFile::Open(lFileName, "READ");\r
44   if (!file || !file->IsOpen()) {\r
45     cout<<"File not found!"<<endl;\r
46     return 1;\r
47   }\r
48   // Get the tree\r
49   TTree* ftree = (TTree*)file->FindObjectAny("fTree");\r
50   if (!ftree) {\r
51     cout<<"File doesn't contain fTree!"<<endl;\r
52     return 2;\r
53   }\r
54   \r
55   cout<<" Entries in Event Tree......: "<<ftree->GetEntries()<<endl;\r
56   cout<<"----------------------------------------------------"<<endl;\r
57   //return 0;\r
58   Int_t llRunNumber = 0;\r
59   TString * llFileName = 0x0;\r
60   Int_t llNTracks = 0;\r
61   Int_t llNGlobalTracks = 0;\r
62   \r
63   ftree->SetBranchAddress("fRunNumber"      ,&llRunNumber     );\r
64   ftree->SetBranchAddress("fFileName"       , &llFileName   );\r
65   ftree->SetBranchAddress("fNTracks"        ,&llNTracks       );\r
66   ftree->SetBranchAddress("fNGlobalTracks"  ,&llNGlobalTracks );\r
67 \r
68   //Output ostreams: text files with chunk location, good and bad\r
69   \r
70   //Save by default to "output" directory\r
71   TString lGoodName = "output/GoodChunks-";\r
72   lGoodName.Append(lDataset.Data());\r
73   lGoodName.Append(".txt");\r
74   TString lBadName = "output/BadChunks-";\r
75   lBadName.Append(lDataset.Data());\r
76   lBadName.Append(".txt");\r
77 \r
78   TString lReport = "output/Datasetreport-";\r
79   lReport.Append(lDataset.Data());\r
80   lReport.Append(".txt");\r
81   \r
82   filebuf fbgood;\r
83   fbgood.open (lGoodName,ios::out);\r
84   ostream osgood(&fbgood);\r
85 \r
86   filebuf fbbad;\r
87   fbbad.open (lBadName,ios::out);\r
88   ostream osbad(&fbbad);\r
89 \r
90   filebuf fbreport;\r
91   fbreport.open (lReport,ios::out);\r
92   ostream osreport(&fbreport);\r
93   \r
94   //Main Tree Loop\r
95   Long_t lProcessedChunks = 0;\r
96   Long_t lProcessedChunksGood = 0;\r
97   Long_t lProcessedChunksBad = 0;\r
98   Long_t lTracks = 0;\r
99   Long_t lGlobalTracks = 0;\r
100   TString *lChunkName = new TString();\r
101   \r
102   //First Chunk entry\r
103   ftree->GetEntry(0);\r
104   *lChunkName = *llFileName;\r
105   \r
106   cout<<"TEST  "<<lChunkName->Data() <<", track = "<<lTracks<<", globals = "<<lGlobalTracks<<" " << llFileName->Data()  << endl;\r
107   \r
108   for(Long_t iEvent = 1; iEvent<ftree->GetEntries(); iEvent++){\r
109     ftree->GetEntry(iEvent);\r
110     if( !llFileName->EqualTo(*lChunkName) ){\r
111       lProcessedChunks++;\r
112       //Change Chunk\r
113       if( lTracks > 0 && lGlobalTracks ==0){\r
114         //Candidate bad chunk found!\r
115         cout<<"BAD CHUNK at "<<lChunkName->Data() <<", track = "<<lTracks<<", globals = "<<lGlobalTracks<< endl;\r
116         osbad<<lChunkName->Data()<<endl;\r
117         lProcessedChunksBad++;\r
118       }else{\r
119         //This looks OK...\r
120         //cout<<"GOOD CHUNK at "<<lChunkName<<endl;\r
121         osgood<<lChunkName->Data()<<endl;\r
122         lProcessedChunksGood++;\r
123       }\r
124       //Get ready to loop over new chunk\r
125       *lChunkName = *llFileName;\r
126       lTracks = llNTracks;\r
127       lGlobalTracks = llNGlobalTracks;\r
128       if(lProcessedChunks%5000==0) cout<<"---> Processed "<<lProcessedChunks<<"..."<<endl;\r
129     }else{\r
130       lTracks        += llNTracks;\r
131       lGlobalTracks  += llNGlobalTracks;\r
132     }\r
133   }\r
134   //CLOSE the processing: one extra pass...\r
135   lProcessedChunks++;\r
136   if( lTracks > 0 && lGlobalTracks ==0){\r
137     //Candidate bad chunk found!\r
138     cout<<"BAD CHUNK at "<<lChunkName->Data()<<endl;\r
139     osbad<<lChunkName->Data() <<endl;\r
140     lProcessedChunksBad++;\r
141   }else{\r
142     //This looks OK...\r
143     //cout<<"GOOD CHUNK at "<<lChunkName<<endl;\r
144     osgood<<lChunkName->Data()<<endl;\r
145     lProcessedChunksGood++;\r
146   }\r
147   fbgood.close();\r
148   fbbad.close();\r
149 \r
150   cout<<"----------------------------------------------------"<<endl;\r
151   cout<<"Processed chunks, total..: "<<lProcessedChunks<<endl;\r
152   cout<<"Processed chunks, good...: "<<lProcessedChunksGood<<endl;\r
153   cout<<"Processed chunks, bad....: "<<lProcessedChunksBad<<endl;\r
154   cout<<"Corruption rate..........: "<<((double)lProcessedChunksBad)/((double)lProcessedChunks)<<endl;\r
155   cout<<"Corruption rate, percent.: "<<100.*((double)lProcessedChunksBad)/((double)lProcessedChunks)<<" percent"<<endl;\r
156   cout<<"----------------------------------------------------"<<endl;\r
157 \r
158   //Write report file \r
159   osreport<<"----------------------------------------------------"<<endl;\r
160   osreport<<" "<<lDataset<<" Processed chunks, total..: "<<lProcessedChunks<<endl;\r
161   osreport<<" "<<lDataset<<" Processed chunks, good...: "<<lProcessedChunksGood<<endl;\r
162   osreport<<" "<<lDataset<<" Processed chunks, bad....: "<<lProcessedChunksBad<<endl;\r
163   osreport<<" "<<lDataset<<" Corruption rate..........: "<<((double)lProcessedChunksBad)/((double)lProcessedChunks)<<endl;\r
164   osreport<<" "<<lDataset<<" Corruption rate, percent.: "<<100.*((double)lProcessedChunksBad)/((double)lProcessedChunks)<<" percent"<<endl;\r
165   osreport<<"----------------------------------------------------"<<endl;\r
166   \r
167   \r
168   fbreport.close();\r
169   cout<<endl;\r
170   cout<<"---> Good chunks saved to \"goodguys.txt\""<<endl;\r
171   cout<<"---> Bad chunks saved to \"badguys.txt\""<<endl;\r
172   cout<<endl;\r
173   cout<<"DONE!"<<endl;\r
174   return 0;\r
175    \r
176 }\r