]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MONITOR/AliQAHistNavigator.cxx
remove debugging MC label calculations
[u/mrichter/AliRoot.git] / MONITOR / AliQAHistNavigator.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 ////////////////////////////////////////////////////////////////////////////
17 //
18 //  support class for the QA histogram viewer
19 //
20 //  origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
21 //
22 ///////////////////////////////////////////////////////////////////////////
23
24 #include "AliQAHistNavigator.h"
25
26 ClassImp(AliQAHistNavigator)
27
28 //_________________________________________________________________________
29 AliQAHistNavigator::AliQAHistNavigator(Int_t run, Int_t rev):
30     fPFile( NULL ),
31     fRun( run ),
32     fCyc( rev ),
33     fPCurrFile( NULL ),
34     fPCurrDetector( NULL ),
35     fPCurrLevel( NULL ),
36     fPCurrHistName( NULL ),
37     fPListOfFiles( new TList() ),
38     fLoopAllFiles(kTRUE),
39     fLoopAllDetectors(kTRUE),
40     fLoopAllLevels(kTRUE),
41     fInitOK(kFALSE)
42 {
43     ReReadFiles();
44 }
45
46 //_________________________________________________________________________
47 Bool_t AliQAHistNavigator::GetNextHistogram(TH1*& hist)
48 {
49     //moves to the next histogram from the list and tries to get it.
50     if (!Next()) 
51     {
52         hist = NULL;
53         return kFALSE;
54     }
55     if (GetHistName()=="")
56         if (!Next())
57         {
58             hist = NULL;
59             return kTRUE;
60         }
61     return GetHistogram(hist);
62 }
63
64 //_________________________________________________________________________
65 Bool_t AliQAHistNavigator::GetHistogram(TH1*& hist)
66 {
67     TString file = GetFileName();
68     TString dir = GetDirName();
69     TString histname = GetHistName();
70     if (file==""||dir==""||histname=="") 
71     {
72         printf("GetHistogram: nothing to fetch...\n");
73         return kFALSE;
74     }
75     gDirectory->GetObject(file+":"+dir+"/"+histname,hist);
76     if (!hist)
77     {
78         printf("GetHistogram: null pointer returned by gDirectory\n");
79         return kFALSE;
80     }
81     return kTRUE;
82 }
83
84 //_________________________________________________________________________
85 Bool_t AliQAHistNavigator::GetPrevHistogram(TH1*& hist)
86 {
87     //moves to the prev histogram from the list and tries to get it.
88     if (!Prev()) 
89     {
90         hist = NULL;
91         return kFALSE;
92     }
93     if (GetHistName()=="")
94         if (!Prev())
95         {
96             hist = NULL;
97             return kTRUE;
98         }
99     return GetHistogram(hist);
100 }
101
102 //_________________________________________________________________________
103 Bool_t AliQAHistNavigator::Next()
104 {
105     if (!fPCurrHistName||!fPCurrFile||!fPCurrDetector||!fPCurrLevel) return kFALSE;
106     if (!(fPCurrHistName=(TObjString*)fPCurrLevel->After(fPCurrHistName)))
107     {
108         if (!(fPCurrLevel=(TList*)fPCurrDetector->After(fPCurrLevel)))
109         {
110             if (!(fPCurrDetector=(TList*)fPCurrFile->After(fPCurrDetector)))
111             {
112                 if (!(fPCurrFile=(TList*)fPListOfFiles->After(fPCurrFile)))
113                 {
114                     //we're at the end of everything
115                     if (fLoopAllFiles)
116                     {
117                         //rewind to the beginning
118                         fPCurrFile = (TList*)fPListOfFiles->First();
119                         fPCurrDetector = (TList*)fPCurrFile->First();
120                         fPCurrLevel = (TList*) fPCurrDetector->First();
121                         fPCurrHistName = (TObjString*) fPCurrLevel->First();
122                         OpenCurrentFile();
123                         OpenCurrentDirectory();
124                         printf("----------------back at the beginning!\n");
125                     } else return kFALSE; //no rewind, we finish
126                 } else //if there is a next file
127                 {
128                     fPCurrDetector = (TList*)fPCurrFile->First();
129                     fPCurrLevel=(TList*)fPCurrDetector->First();
130                     fPCurrHistName=(TObjString*)fPCurrLevel->First();
131                     cout<<GetFileName()<<":"<<GetDetectorName()<<"/"<<GetLevelName()<<"/"<<GetHistName()<<endl;
132                     OpenCurrentFile();
133                     OpenCurrentDirectory();
134                 }
135             } else //if there is a next detector
136             {
137                 fPCurrLevel=(TList*)fPCurrDetector->First();
138                 fPCurrHistName=(TObjString*)fPCurrLevel->First();
139                 cout<<GetDetectorName()<<"/"<<GetLevelName()<<"/"<<GetHistName()<<endl;
140                 OpenCurrentDirectory();
141             }
142         } else //if there is a next level
143         {
144             fPCurrHistName=(TObjString*)fPCurrLevel->First();
145             cout<<GetLevelName()<<"/"<<GetHistName()<<endl;
146             OpenCurrentDirectory();
147             cout<<GetHistName()<<endl;
148         }
149     } else //if there is a next histgram
150     {
151         cout<<GetHistName()<<endl;
152     }
153     return kTRUE;
154 }
155
156 //_________________________________________________________________________
157 Bool_t AliQAHistNavigator::Prev()
158 {
159     if (!fPCurrHistName) return kFALSE;
160     if (!(fPCurrHistName=(TObjString*)fPCurrLevel->Before(fPCurrHistName)))
161     {
162         if (!(fPCurrLevel=(TList*)fPCurrDetector->Before(fPCurrLevel)))
163         {
164             if (!(fPCurrDetector=(TList*)fPCurrFile->Before(fPCurrDetector)))
165             {
166                 if (!(fPCurrFile=(TList*)fPListOfFiles->Before(fPCurrFile)))
167                 {
168                     //we're at the end of everything
169                     if (fLoopAllFiles)
170                     {
171                         //rewind to the beginning
172                         fPCurrFile = (TList*)fPListOfFiles->Last();
173                         fPCurrDetector = (TList*)fPCurrFile->Last();
174                         fPCurrLevel = (TList*) fPCurrDetector->Last();
175                         fPCurrHistName = (TObjString*) fPCurrLevel->Last();
176                         OpenCurrentFile();
177                         OpenCurrentDirectory();
178                         printf("----------------back at the end!\n");
179                     } else return kFALSE; //no rewind, we finish
180                 } else //if there is a next file
181                 {
182                     fPCurrDetector = (TList*)fPCurrFile->Last();
183                     fPCurrLevel=(TList*)fPCurrDetector->Last();
184                     fPCurrHistName=(TObjString*)fPCurrLevel->Last();
185                     cout<<GetFileName()<<":"<<GetDetectorName()<<"/"<<GetLevelName()<<"/"<<GetHistName()<<endl;
186                     OpenCurrentFile();
187                     OpenCurrentDirectory();
188                 }
189             } else //if there is a next detector
190             {
191                 fPCurrLevel=(TList*)fPCurrDetector->Last();
192                 fPCurrHistName=(TObjString*)fPCurrLevel->Last();
193                 cout<<GetDetectorName()<<"/"<<GetLevelName()<<"/"<<GetHistName()<<endl;
194                 OpenCurrentDirectory();
195             }
196         } else //if there is a next level
197         {
198             fPCurrHistName=(TObjString*)fPCurrLevel->Last();
199             cout<<GetLevelName()<<"/"<<GetHistName()<<endl;
200             OpenCurrentDirectory();
201             cout<<GetHistName()<<endl;
202         }
203     } else //if there is a next histgram
204     {
205         cout<<GetHistName()<<endl;
206     }
207     return kTRUE;
208 }
209
210 //_________________________________________________________________________
211 Bool_t AliQAHistNavigator::OpenCurrentFile()
212 {
213     if (fPFile) fPFile->Close();
214     if (!(fPFile->Open(GetFileName(),"READ")))
215     {
216         return kFALSE;
217         cout<<"There is no file: "<<GetFileName()<<endl;
218     }
219     return kTRUE;
220 }
221
222 //_________________________________________________________________________
223 Bool_t AliQAHistNavigator::OpenCurrentDirectory()
224 {
225     if (!gDirectory->cd(GetDirName())) return kFALSE;
226     return kTRUE;
227 }
228
229 //_________________________________________________________________________
230 Bool_t AliQAHistNavigator::SetFile( TString file )
231 {
232     TList* tmp = (TList*)fPListOfFiles->FindObject ( file.Data() );
233     if (!tmp) return kFALSE;
234     fPCurrFile = tmp;
235     OpenCurrentFile();
236     fPCurrDetector = (TList*)fPCurrFile->First();
237     fPCurrLevel = (TList*)fPCurrDetector->First();
238     fPCurrHistName = (TObjString*)fPCurrLevel->First();
239     return kTRUE;
240 }
241
242 //_________________________________________________________________________
243 Bool_t AliQAHistNavigator::SetFile( Int_t file )
244 {
245     printf("AliQAHistNavigator::SetFile(%i)\n",file);
246     TList* tmp = (TList*)fPListOfFiles->At(file);
247     if (!tmp) return kFALSE;
248     fPCurrFile = tmp;
249     OpenCurrentFile();
250     fPCurrDetector = (TList*)fPCurrFile->First();
251     fPCurrLevel = (TList*)fPCurrDetector->First();
252     fPCurrHistName = (TObjString*)fPCurrLevel->First();
253     OpenCurrentDirectory();
254     return kTRUE;
255 }
256
257 //_________________________________________________________________________
258 Bool_t AliQAHistNavigator::SetDetector( TString det )
259 {
260     TList* tmp = (TList*)fPCurrFile->FindObject( det.Data() );
261     if (!tmp) return kFALSE;
262     fPCurrDetector = tmp;
263     fPCurrLevel = (TList*)fPCurrDetector->First();
264     fPCurrHistName = (TObjString*)fPCurrLevel->First();
265     OpenCurrentDirectory();
266     return kTRUE;
267 }
268
269 //_________________________________________________________________________
270 Bool_t AliQAHistNavigator::SetDetector( Int_t det )
271 {
272     printf("AliQAHistNavigator::SetDetector(%i)\n",det);
273     TList* tmp = (TList*)fPCurrFile->At( det );
274     if (!tmp) return kFALSE;
275     fPCurrDetector = tmp;
276     fPCurrLevel = (TList*)fPCurrDetector->First();
277     fPCurrHistName = (TObjString*)fPCurrLevel->First();
278     OpenCurrentDirectory();
279     return kTRUE;
280 }
281
282 //_________________________________________________________________________
283 Bool_t AliQAHistNavigator::SetLevel( TString level )
284 {
285     TList* tmp = (TList*)fPCurrDetector->FindObject( level.Data() );
286     if (!tmp) return kFALSE;
287     fPCurrLevel = tmp;
288     fPCurrHistName = (TObjString*)fPCurrLevel->First();
289     OpenCurrentDirectory();
290     return kTRUE;
291 }
292
293 //_________________________________________________________________________
294 Bool_t AliQAHistNavigator::SetLevel( Int_t level )
295 {
296     TList* tmp = (TList*)fPCurrDetector->At( level );
297     if (!tmp) return kFALSE;
298     fPCurrLevel = tmp;
299     fPCurrHistName = (TObjString*)fPCurrLevel->First();
300     OpenCurrentDirectory();
301     return kTRUE;
302 }
303
304 //_________________________________________________________________________
305 Bool_t AliQAHistNavigator::SetHist( TString hist )
306 {
307     TObjString* tmp = (TObjString*)fPCurrLevel->FindObject( hist.Data() );
308     if (!tmp) return kFALSE;
309     fPCurrHistName = tmp;
310     return kTRUE;
311 }
312
313 //_________________________________________________________________________
314 Bool_t AliQAHistNavigator::SetHist( Int_t hist )
315 {
316     TObjString* tmp = (TObjString*)fPCurrLevel->At( hist );
317     if (!tmp) return kFALSE;
318     fPCurrHistName = tmp;
319     return kTRUE;
320 }
321
322 //_________________________________________________________________________
323 void AliQAHistNavigator::PrintDebugInfo()
324 {
325     if (!fPCurrHistName) {cout<<"no more histograms"<<endl;return;};
326     if (!fPCurrLevel) {cout<<"no more levels"<<endl;return;};
327     if (!fPCurrDetector) {cout<<"no more detectors"<<endl;return;};
328     cout<<"AliQAHistNavigator state information:"<<endl;
329     cout<<"hist: "<<GetHistName()<<endl;
330     cout<<"dir:  "<<GetDirName()<<endl;
331     cout<<"$PWD: ";gDirectory->pwd();cout<<endl;
332 }
333
334 //_________________________________________________________________________
335 TString AliQAHistNavigator::GetDetectorName()
336 {
337     if (!fPCurrDetector) return "";
338     TString name = fPCurrDetector->GetName();
339     return name;
340 }
341
342 //_________________________________________________________________________
343 TString AliQAHistNavigator::GetLevelName()
344 {
345     if (!fPCurrLevel) return "";
346     TString name = fPCurrLevel->GetName();
347     return name;
348 }
349
350 //_________________________________________________________________________
351 TString AliQAHistNavigator::GetFileName()
352 {
353     if (!fPCurrFile) return "";
354     TString file = fPCurrFile->GetName();
355     return file;
356 }
357
358 //_________________________________________________________________________
359 TString AliQAHistNavigator::GetDirName()
360 {
361     TString detector = GetDetectorName();
362     TString level = GetLevelName();
363     if (detector==""||level=="") return "";
364     TString dir = "/"+ detector +"/"+ level;
365     return dir;
366 }
367
368 //_________________________________________________________________________
369 TString AliQAHistNavigator::GetHistName()
370 {
371     if (!fPCurrHistName) return "";
372     return fPCurrHistName->GetString();
373 }
374
375 //_________________________________________________________________________
376 Bool_t AliQAHistNavigator::DumpList( TString filename )
377 {
378     ofstream fout(filename);
379     if (fout.bad()) return kFALSE;
380     TString lastlevel="";
381     TString lastdet="";
382     if (!Next()) return kTRUE;
383     do
384     {
385         if (GetLevelName()!=lastlevel)
386         {
387             fout<<GetDetectorName()<<"/"<<GetLevelName()<<":"<<endl;
388             lastlevel=GetLevelName();
389         }
390         fout << GetHistName() << endl;
391     } while (Next());
392     fout.close();
393     return kTRUE;
394 }
395
396 //_________________________________________________________________________
397 Bool_t AliQAHistNavigator::ReadList( TString filename )
398 {
399     TString line = filename;
400     //TString level="";
401     //TString lastlevel="";
402     //TString det="";
403     //TString lastdet="";
404     //TRegexp detRegexp("^[a-zA-Z0-9]*");
405     //TRegexp typRegexp("[a-zA-Z0-9]*");
406
407     //ifstream fin(filename);
408     //if (fin.bad()) return kFALSE;
409     //delete fPListOfFiles;
410     //fPListOfFiles = new TList();
411     //TList* pDetector=new TList();
412     //TList* pLevel=new TList();
413     //
414     //line.ReadLine(fin,kFALSE);
415     //if (line=="") return kFALSE;
416     //cout<<"read line: "<<line<<endl;
417     //det = line(detRegexp);
418     //level = line(typRegexp, line.Index("/")+1);
419     //pDetector->SetName(det);
420     //lastdet = det;
421     //pLevel->SetName(level);
422     //lastlevel = level;
423     //pLevel->AddLast(new TObjString("DO NOT REMOVE THIS LINE"));
424     //
425     //while (!fin.eof())
426     //{
427     //    line.ReadLine(fin,kFALSE);
428     //    cout<<"read line: "<<line<<endl;
429     //    if (line.EndsWith(":"))
430     //    {
431     //        det = line(detRegexp);
432     //        level = line(typRegexp, line.Index("/")+1);
433     //        if (det!=lastdet)
434     //        {
435     //            pDetector->AddLast(pLevel);
436     //            fPListOfFiles->AddLast(pDetector);
437     //            pDetector = new TList();
438     //            pDetector->SetName(det);
439     //            cout<<"new detector: "<<det<<endl;
440     //            lastdet = det;
441     //            pLevel = new TList();
442     //            pLevel->SetName(level);
443     //            cout<<"new level: "<<level<<endl;
444     //            lastlevel = level;
445     //            continue;
446     //        }
447     //        if (level!=lastlevel)
448     //        {
449     //            pDetector->AddLast(pLevel);
450     //            pLevel = new TList();
451     //            pLevel->SetName(level);
452     //            cout<<"new level: "<<level<<endl;
453     //            lastlevel = level;
454     //            continue;
455     //        }
456     //    }
457     //    if (line.BeginsWith("//")) continue;
458     //    if (line.BeginsWith("#")) continue;
459     //    pLevel->AddLast(new TObjString(line));        
460     //    cout<<"added line: "<<line<<endl;
461     //}
462     //
463     //fPCurrDetector = (TList*)fPListOfFiles->First();
464     //fPCurrLevel = (TList*) fPCurrDetector->First();
465     //fPCurrHistName = (TObjString*) fPCurrLevel->First();
466     //OpenCurrentFile();
467     //OpenCurrentDirectory();
468     //fPListOfFiles->Print();
469     return kFALSE;
470 }
471
472 //_________________________________________________________________________
473 Bool_t AliQAHistNavigator::GetListOfFiles()
474 {
475     delete fPListOfFiles;
476     fPListOfFiles = new TList();
477
478     TString macdir(".");
479     gSystem->ExpandPathName(macdir);
480
481     void* dirhandle = gSystem->OpenDirectory(macdir.Data());
482     if(dirhandle != 0)
483     {
484         const char* filename;
485         TString runstr = "";
486         TString revstr = "";
487         runstr += fRun;
488         revstr += fCyc;
489         TString reg;
490         reg+= ".*QA\\.";
491         reg+= (fRun==0) ? "[0-9].*" : runstr.Data();
492         reg+= "\\.";
493         reg+= (fRun==0) ? "[0-9].*" : revstr.Data();
494         reg+= "\\.root$";
495         cout<<reg<<endl;
496         TPRegexp re(reg);
497         std::list<string> names;
498         while((filename = gSystem->GetDirEntry(dirhandle)) != 0)
499         {
500             if(re.Match(filename))
501             {
502                 names.push_back(filename);
503             }
504         }
505         if (names.empty())
506         {
507             printf("GetListOfFiles: no files matching...\n");
508             return kFALSE;
509         }
510         names.sort();
511         char fullName[1000];
512         for (std::list<string>::iterator si=names.begin(); si!=names.end(); ++si)
513         {
514           sprintf(fullName,"%s", si->c_str());
515           TList* f = new TList();
516           f->SetName(fullName);
517           fPListOfFiles->AddLast(f);
518         }
519     }
520     else
521     {
522         gSystem->FreeDirectory(dirhandle);
523         return kFALSE;
524     }
525     return kTRUE;
526 }
527
528 //_________________________________________________________________________
529 Bool_t AliQAHistNavigator::CloneDirStructure()
530 {
531     if (!GetListOfFiles()) return kFALSE;
532     if (fPListOfFiles->GetEntries()==0) return kFALSE;
533     TIter fileiter(fPListOfFiles);
534     TList* f;
535     while ((f = (TList*)fileiter.Next()))
536     {
537         TString filename = f->GetName();
538         cout<<filename<<endl;
539         TFile file(filename);
540         if (!Crawl(f)) continue;
541     }
542     return kTRUE;
543 }
544
545 //_________________________________________________________________________
546 Bool_t AliQAHistNavigator::Crawl(TList* dir)
547 {
548     TString pwd = gDirectory->GetPath();
549     //returns false if dir in file empty
550     TList* keys = gDirectory->GetListOfKeys();
551     if (!keys) return kFALSE;
552     if (keys->GetEntries()==0) return kFALSE;
553     TIter keyiter(keys);
554     TKey* key;
555     while ((key = dynamic_cast <TKey* > (keyiter.Next()) ))
556     {
557         TString classname=key->GetClassName();
558         if (!classname) return kFALSE;
559         if (classname=="TDirectoryFile")
560         {
561             gDirectory->cd(key->GetName());
562             gDirectory->pwd();
563             TList* newdir = new TList();
564             if (!Crawl(newdir))
565             {
566                 gDirectory->cd(pwd);
567                 continue;
568             }
569             gDirectory->cd(pwd);
570
571             newdir->SetName(key->GetName());
572             dir->AddLast(newdir);
573         }
574         else
575         {
576             cout<<key->GetName()<<endl;
577             dir->AddLast(new TObjString(key->GetName()));
578         }
579     }
580     return kTRUE;
581 }
582
583 Bool_t AliQAHistNavigator::ReReadFiles()
584 {
585     if (CloneDirStructure())
586     {
587         fPCurrFile = (TList*)fPListOfFiles->First();
588         if (fPCurrFile)
589         {
590             fPCurrDetector = (TList*)fPCurrFile->First();
591             if (fPCurrDetector)
592             {
593                 fPCurrLevel = (TList*) fPCurrDetector->First();
594                 if (fPCurrLevel)
595                 {
596                     fPCurrHistName = (TObjString*) fPCurrLevel->First();
597                     if (fPCurrHistName)
598                     {
599                         fInitOK = kTRUE;
600                         OpenCurrentFile();
601                         OpenCurrentDirectory();
602                     }
603                 }
604             }
605         }
606     } else
607     {
608         printf("AliQAHistNavigator::AliQAHistNavigator(): error reading files\n");
609         return kFALSE;
610     }
611     return kTRUE;
612 }
613