1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 ////////////////////////////////////////////////////////////////////////////
17 // support classes for the QA histogram viewer
19 // origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
21 ///////////////////////////////////////////////////////////////////////////
25 #include <Riostream.h>
30 #include <TObjString.h>
35 #include "AliQAHistNavigator.h"
40 ClassImp(AliQAHistNavigator)
42 //_________________________________________________________________________
43 AliQAHistNavigator::AliQAHistNavigator(Int_t run):
46 fPQAResultFile( NULL ),
49 fPCurrDetector( NULL ),
52 fPListOfFiles( new AliQADirList() ),
54 fLoopAllDetectors(kTRUE),
55 fLoopAllLevels(kTRUE),
58 fExpertDirName("Expert"),
59 fPEmptyList(new TList())
62 fPEmptyList->AddLast(new AliQADirListItem(""));
66 //_________________________________________________________________________
67 AliQAHistNavigator::~AliQAHistNavigator()
72 //_________________________________________________________________________
73 Bool_t AliQAHistNavigator::GetHistogram(TH1*& hist)
75 //get histogram from file
76 TString file = GetFileName();
77 TString dir = GetDirName();
78 TString histname = GetItemName();
79 cout<<"GetHistogram: "<<file<<":"<<dir<<"/"<<histname<<endl;
80 if (file==""||dir==""||histname=="")
82 printf("GetItem: nothing to fetch...\n");
85 if (!OpenCurrentDirectory()) return kFALSE;
86 hist = dynamic_cast<TH1*>( gDirectory->FindKey(histname)->ReadObj() );
89 printf("GetItem: null pointer returned by gDirectory\n");
95 //_________________________________________________________________________
96 Bool_t AliQAHistNavigator::Next()
98 //move to the next histogram
99 if (!fPCurrFile||!fPCurrDetector||!fPCurrLevel) return kFALSE;
100 if (!(fPCurrItem=(AliQADirListItem*)GetItemList()->After(fPCurrItem)))
102 if (!(fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->After(fPCurrLevel)))
104 if (!(fPCurrDetector=(AliQADirList*)fPCurrFile->GetDirs()->After(fPCurrDetector)))
106 if (!(fPCurrFile=(AliQADirList*)fPListOfFiles->GetDirs()->After(fPCurrFile)))
108 //we're at the end of everything
111 //rewind to the beginning
112 fPCurrFile = (AliQADirList*)fPListOfFiles->GetDirs()->First();
113 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->First();
114 fPCurrLevel = (AliQADirList*) fPCurrDetector->GetDirs()->First();
115 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
117 OpenCurrentDirectory();
118 printf("----------------back at the beginning!\n");
119 } else return kFALSE; //no rewind, we finish
120 } else //if there is a next file
122 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->First();
123 fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->First();
124 fPCurrItem=(AliQADirListItem*)GetItemList()->First();
126 OpenCurrentDirectory();
128 } else //if there is a next detector
130 fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->First();
131 fPCurrItem=(AliQADirListItem*)GetItemList()->First();
132 OpenCurrentDirectory();
134 } else //if there is a next level
136 fPCurrItem=(AliQADirListItem*)GetItemList()->First();
137 OpenCurrentDirectory();
139 } else //if there is a next histgram
145 //_________________________________________________________________________
146 Bool_t AliQAHistNavigator::Prev()
148 //move to the previous histrogram
149 if (!fPCurrLevel||!fPCurrDetector||!fPCurrFile) return kFALSE;
150 if (!(fPCurrItem=(AliQADirListItem*)GetItemList()->Before(fPCurrItem)))
152 if (!(fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->Before(fPCurrLevel)))
154 if (!(fPCurrDetector=(AliQADirList*)fPCurrFile->GetDirs()->Before(fPCurrDetector)))
156 if (!(fPCurrFile=(AliQADirList*)fPListOfFiles->GetDirs()->Before(fPCurrFile)))
158 //we're at the end of everything
161 //rewind to the beginning
162 fPCurrFile = (AliQADirList*)fPListOfFiles->GetDirs()->Last();
163 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->Last();
164 fPCurrLevel = (AliQADirList*) fPCurrDetector->GetDirs()->Last();
165 fPCurrItem = (AliQADirListItem*)GetItemList()->Last();
167 OpenCurrentDirectory();
168 printf("----------------back at the end!\n");
169 } else return kFALSE; //no rewind, we finish
170 } else //if there is a next file
172 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->Last();
173 fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->Last();
174 fPCurrItem=(AliQADirListItem*)GetItemList()->Last();
176 OpenCurrentDirectory();
178 } else //if there is a next detector
180 fPCurrLevel=(AliQADirList*)fPCurrDetector->GetDirs()->Last();
181 fPCurrItem=(AliQADirListItem*)GetItemList()->Last();
182 OpenCurrentDirectory();
184 } else //if there is a next level
186 fPCurrItem=(AliQADirListItem*)GetItemList()->Last();
187 OpenCurrentDirectory();
189 } else //if there is a next histgram
195 //_________________________________________________________________________
196 void AliQAHistNavigator::SetExpertMode(Bool_t mode)
198 //sets the expert mode
199 Bool_t oldmode = fExpertMode;
201 if (fExpertMode!=oldmode) fPCurrItem = (AliQADirListItem*)GetItemList()->First();
205 //_________________________________________________________________________
206 Bool_t AliQAHistNavigator::OpenCurrentFile()
209 if (fPFile) fPFile->Close();
210 if (!(fPFile->Open(GetFileName(),"READ")))
212 cout<<"There is no file: "<<GetFileName()<<endl;
218 //_________________________________________________________________________
219 Bool_t AliQAHistNavigator::OpenCurrentDirectory()
221 //Open current directory
222 if (!gDirectory->cd(GetDirName())) return kFALSE;
226 //_________________________________________________________________________
227 Bool_t AliQAHistNavigator::SetFile( TString file )
229 //Set a new file to read from
230 AliQADirList* tmp = (AliQADirList*)fPListOfFiles->GetDirs()->FindObject ( file.Data() );
231 if (!tmp) return kFALSE;
234 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->First();
235 fPCurrLevel = (AliQADirList*)fPCurrDetector->GetDirs()->First();
236 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
240 //_________________________________________________________________________
241 Bool_t AliQAHistNavigator::SetFile( Int_t file )
243 //Set a new file to read from
244 printf("AliQAHistNavigator::SetFile(%i)\n",file);
245 AliQADirList* tmp = (AliQADirList*)fPListOfFiles->GetDirs()->At(file);
246 if (!tmp) return kFALSE;
249 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->First();
250 fPCurrLevel = (AliQADirList*)fPCurrDetector->GetDirs()->First();
251 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
252 OpenCurrentDirectory();
256 //_________________________________________________________________________
257 Bool_t AliQAHistNavigator::SetDetector( TString det )
260 AliQADirList* tmp = (AliQADirList*)fPCurrFile->GetDirs()->FindObject( det.Data() );
261 if (!tmp) return kFALSE;
262 fPCurrDetector = tmp;
263 fPCurrLevel = (AliQADirList*)fPCurrDetector->GetDirs()->First();
264 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
265 OpenCurrentDirectory();
269 //_________________________________________________________________________
270 Bool_t AliQAHistNavigator::SetDetector( Int_t det )
273 printf("AliQAHistNavigator::SetDetector(%i)\n",det);
274 AliQADirList* tmp = (AliQADirList*)fPCurrFile->GetDirs()->At( det );
275 if (!tmp) return kFALSE;
276 fPCurrDetector = tmp;
277 fPCurrLevel = (AliQADirList*)fPCurrDetector->GetDirs()->First();
278 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
279 OpenCurrentDirectory();
283 //_________________________________________________________________________
284 Bool_t AliQAHistNavigator::SetLevel( TString level )
287 AliQADirList* tmp = (AliQADirList*)fPCurrDetector->GetDirs()->FindObject( level.Data() );
288 if (!tmp) return kFALSE;
290 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
291 OpenCurrentDirectory();
295 //_________________________________________________________________________
296 Bool_t AliQAHistNavigator::SetLevel( Int_t level )
299 AliQADirList* tmp = (AliQADirList*)fPCurrDetector->GetDirs()->At( level );
300 if (!tmp) return kFALSE;
302 fPCurrItem = (AliQADirListItem*)GetItemList()->First();
303 OpenCurrentDirectory();
307 //_________________________________________________________________________
308 Bool_t AliQAHistNavigator::SetItem( TString hist )
311 AliQADirListItem* tmp = (AliQADirListItem*)GetItemList()->FindObject( hist.Data() );
312 if (!tmp) return kFALSE;
317 //_________________________________________________________________________
318 Bool_t AliQAHistNavigator::SetItem( Int_t hist )
321 AliQADirListItem* tmp = (AliQADirListItem*)GetItemList()->At( hist );
322 if (!tmp) return kFALSE;
327 //_________________________________________________________________________
328 TList* AliQAHistNavigator::GetItemList()
330 //returns the current list of histograms, if none, returns empty list
331 TList* itemlist=NULL;
334 AliQADirList* expertlist = (AliQADirList*)fPCurrLevel->GetDirs()->FindObject(fExpertDirName);
335 if (expertlist) itemlist = expertlist->GetItems();
338 //this is a bit of a hack, but it will always return something sensible
339 AliQADirListItem* it = (AliQADirListItem*)fPEmptyList->First();
340 it->SetParent(fPCurrLevel);
341 itemlist = fPEmptyList;
345 itemlist = fPCurrLevel->GetItems();
350 //_________________________________________________________________________
351 TString AliQAHistNavigator::GetDetectorName()
353 //Get name of current detector
354 if (!fPCurrDetector) return "";
355 TString name = fPCurrDetector->GetName();
359 //_________________________________________________________________________
360 TString AliQAHistNavigator::GetLevelName()
362 //Get name of current leve
363 if (!fPCurrLevel) return "";
364 TString name = fPCurrLevel->GetName();
368 //_________________________________________________________________________
369 TString AliQAHistNavigator::GetFileName()
371 //Get name of current file
372 if (!fPCurrFile) return "";
373 TString file = fPCurrFile->GetName();
377 //_________________________________________________________________________
378 TString AliQAHistNavigator::GetDirName()
380 //get the name of dir containing current item
381 if (!fPCurrItem) return "";
382 AliQADirList* d=(AliQADirList*)fPCurrItem->GetParent();
386 path = d->GetName() + path;
390 while (d->GetParent());
394 //_________________________________________________________________________
395 TString AliQAHistNavigator::GetPath(AliQADirListItem* const item)
397 //Get the full path to teh directory containing item
398 AliQADirList* d=item->GetParent();
399 TString path = "";//item->GetString();
402 TString sep = (d->GetParent()) ? "/" : ":/" ;
403 path = d->GetName() + sep + path;
405 while ((d=d->GetParent()));
409 //_________________________________________________________________________
410 TString AliQAHistNavigator::GetItemName()
412 //Get name of current item
413 if (!fPCurrItem) return "";
414 return fPCurrItem->GetString();
417 //_________________________________________________________________________
418 Bool_t AliQAHistNavigator::GetListOfFiles()
420 //scan directory for QA files
421 delete fPListOfFiles;
422 fPListOfFiles = new AliQADirList();
424 TString fileNameCORR;
425 TString fileNameQAResult;
428 gSystem->ExpandPathName(macdir);
430 void* dirhandle = gSystem->OpenDirectory(macdir.Data());
433 const char* filename;
439 reg+= (fRun==0) ? "[0-9].*" : revstr.Data();
441 TPRegexp reHist(reg);
442 TPRegexp reMerged("Merged.QA.Data.[0-9]*.root");
443 TPRegexp reCORR("CORR.QA.[0-9]*.root");
444 TPRegexp reQA("QA.root");
445 std::list<string> names;
446 while((filename = gSystem->GetDirEntry(dirhandle)) != 0)
448 if (reCORR.Match(filename))
450 fileNameCORR = filename;
453 if (reQA.Match(filename))
455 fileNameQAResult = filename;
458 if (reMerged.Match(filename))
461 names.push_back(filename);
464 if (reHist.Match(filename))
466 names.push_back(filename);
469 if (!fPCORRFile) fPCORRFile = new TFile(fileNameCORR,"READ");
470 if (!fPQAResultFile) fPQAResultFile = new TFile(fileNameQAResult,"READ");
473 printf("GetListOfFiles: no files matching...\n");
478 for (std::list<string>::iterator si=names.begin(); si!=names.end(); ++si)
480 snprintf(fullName,sizeof(fullName),"%s", si->c_str());
481 AliQADirList* f = new AliQADirList();
482 f->SetName(fullName);
483 fPListOfFiles->GetDirs()->AddLast(f);
488 gSystem->FreeDirectory(dirhandle);
494 //_________________________________________________________________________
495 Bool_t AliQAHistNavigator::CloneDirStructure()
498 if (!GetListOfFiles()) return kFALSE;
499 if (fPListOfFiles->GetDirs()->GetEntries()==0) return kFALSE;
500 TIter fileiter(fPListOfFiles->GetDirs());
502 while ((f = (AliQADirList*)fileiter.Next()))
504 TString filename = f->GetName();
505 TFile file(filename);
506 if (!Crawl(f)) continue;
511 //_________________________________________________________________________
512 Bool_t AliQAHistNavigator::Crawl(AliQADirList* dir)
514 //scans the current directory and puts result in dir
515 //returns false if dir in file empty
518 TString pwd = gDirectory->GetPath();
519 TList* keys = gDirectory->GetListOfKeys();
520 if (!keys) return kFALSE;
521 if (keys->GetEntries()==0) return kFALSE;
524 while ((key = dynamic_cast <TKey* > (keyiter.Next()) ))
526 keyname = key->GetName();
527 if (keyname==oldkeyname) continue; //do not copy cycles
528 oldkeyname = keyname;
529 TString classname=key->GetClassName();
530 if (!classname) return kFALSE;
531 if (classname=="TDirectoryFile")
533 gDirectory->cd(key->GetName());
534 AliQADirList* newdir = new AliQADirList();
542 newdir->SetName(keyname);
543 newdir->SetParent(dir);
544 dir->GetDirs()->AddLast(newdir);
548 AliQADirListItem* item = new AliQADirListItem(keyname);
549 item->SetParent(dir);
550 dir->GetItems()->AddLast(item);
556 //_________________________________________________________________________
557 Bool_t AliQAHistNavigator::ReReadFiles()
559 //close, open and rescan the files
560 if (!CloneDirStructure())
562 printf("AliQAHistNavigator::AliQAHistNavigator(): error reading files\n");
565 fPCurrFile = (AliQADirList*)fPListOfFiles->GetDirs()->First();
568 fPCurrDetector = (AliQADirList*)fPCurrFile->GetDirs()->First();
571 fPCurrLevel = (AliQADirList*) fPCurrDetector->GetDirs()->First();
574 fPCurrItem = (AliQADirListItem*) GetItemList()->First();
579 OpenCurrentDirectory();
587 //_________________________________________________________________________
588 //_________________________________________________________________________
589 ClassImp(AliQADirList)
590 //_________________________________________________________________________
591 AliQADirList::AliQADirList():
594 fPItems(new TList()),
600 //_________________________________________________________________________
601 AliQADirList::~AliQADirList()
604 if (fPParent) delete fPParent;
609 //_________________________________________________________________________
610 ClassImp(AliQADirListItem)
611 //_________________________________________________________________________
612 AliQADirListItem::AliQADirListItem(const char* s):
619 //_________________________________________________________________________
620 AliQADirListItem::~AliQADirListItem()
623 if (fPParent) delete fPParent;