2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
9 #include "AliEveTRDLoader.h"
10 #include "AliEveTRDModuleImp.h"
12 #include <TEveManager.h>
13 #include <TEveGValuators.h>
19 #include "TObjString.h"
20 #include "TObjArray.h"
24 #include <TGTextEntry.h>
25 #include <TGNumberEntry.h>
26 #include <TGFileDialog.h>
27 #include <TGListTree.h>
28 #include <TGToolTip.h>
31 #include "AliCDBManager.h"
34 #include "AliTRDhit.h"
35 #include "AliTRDcluster.h"
36 #include "AliTRDmcmTracklet.h"
37 #include "AliTRDdigitsManager.h"
38 #include "AliTRDgeometry.h"
44 class AliTRDdataArrayI;
46 ClassImp(AliEveTRDLoader)
47 ClassImp(AliEveTRDLoaderEditor)
49 ///////////////////////////////////////////////////////////
50 ///////////// AliEveTRDLoader /////////////////////
51 ///////////////////////////////////////////////////////////
54 //________________________________________________________
55 AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) : TEveElementList(n, t), fSM(-1), fStack(-1), fLy(-1), fEvent(0)
59 kLoadClusters = kFALSE;
66 fGeo = new AliTRDgeometry();
68 AliCDBManager *fCDBManager=AliCDBManager::Instance();
69 fCDBManager->SetDefaultStorage("local://$ALICE_ROOT");
70 fCDBManager->SetRun(0);
73 //________________________________________________________
74 AliEveTRDLoader::~AliEveTRDLoader()
76 // if(fChambers) {fChambers->clear(); delete fChambers;}
79 //________________________________________________________
84 ID( int value ) : id(value) {}
85 bool operator()(const T &t) const {
86 return ((dynamic_cast<AliEveTRDModule*>(t))->GetID() == id);
91 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
93 Int_t ism_start = (sm == -1) ? 0 : sm;
94 Int_t ism_stop = (sm == -1) ? 18 : sm+1;
95 Int_t istk_start= (stk == -1)? 0 : stk;
96 Int_t istk_stop = (stk == -1)? 5 : stk+1;
97 Int_t ily_start = (ly == -1) ? 0 : ly;
98 Int_t ily_stop = (ly == -1) ? 6 : ly+1;
101 ichmb = fChildren.begin();
102 while(ichmb != fChildren.end()){
103 (*ichmb)->SetRnrSelf(kFALSE);
107 AliEveTRDNode *SM=0x0, *STK=0x0;
108 AliEveTRDChamber *CHMB = 0x0;
110 for(int ism=ism_start; ism<ism_stop; ism++){
111 ichmb = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(ism));
112 if(ichmb != fChildren.end()){
113 SM = (AliEveTRDNode*)(*ichmb);
114 SM->SetRnrSelf(kTRUE);
116 gEve->AddElement(SM = new AliEveTRDNode("SM", ism), this);
117 SM->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("Supermodule %2d", ism));
119 for(int istk=istk_start; istk<istk_stop; istk++){
120 ichmb = find_if(SM->begin(), SM->end(), ID<TEveElement*>(istk));
121 if(ichmb != SM->end()){
122 STK = (AliEveTRDNode*)(*ichmb);
123 STK->SetRnrSelf(kTRUE);
125 gEve->AddElement(STK = new AliEveTRDNode("Stack", istk), SM);
126 STK->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d", ism, istk));
128 for(int ily=ily_start; ily<ily_stop; ily++){
129 det = fGeo->GetDetector(ily, istk, ism);
130 ichmb = find_if(STK->begin(), STK->end(), ID<TEveElement*>(det));
131 if(ichmb != STK->end()) (*ichmb)->SetRnrSelf(kTRUE);
133 gEve->AddElement(CHMB = new AliEveTRDChamber(det), STK);
134 CHMB->SetGeometry(fGeo);
135 CHMB->FindListTreeItem(gEve->GetListTree())->SetTipText(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
143 //________________________________________________________
144 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
146 List_i ism, istack, ichmb;
148 ism = find_if(fChildren.begin(), fChildren.end(), ID<TEveElement*>(fGeo->GetSector(d)));
149 if(ism == fChildren.end()) return 0x0;
150 istack = find_if(((AliEveTRDNode*)(*ism))->begin(), ((AliEveTRDNode*)(*ism))->end(), ID<TEveElement*>(fGeo->GetChamber(d)));
151 if(istack == ((AliEveTRDNode*)(*ism))->end()) return 0x0;
152 ichmb = find_if(((AliEveTRDNode*)(*istack))->begin(), ((AliEveTRDNode*)(*istack))->end(), ID<TEveElement*>(d));
153 if(ichmb == ((AliEveTRDNode*)(*istack))->end()) return 0x0;
154 return dynamic_cast<AliEveTRDChamber*>(*ichmb);
157 //________________________________________________________
158 Bool_t AliEveTRDLoader::GoToEvent(int ev)
160 if(!fChildren.size()){
161 AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
170 TFile *f = new TFile(Form("%s/%s", fDir.Data(), fFilename.Data()));
171 if(! f->cd(Form("AliEveEventManager%d", ev))){
172 AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
173 f->Close(); delete f;
178 t = (TTree*)gDirectory->Get("TreeD");
179 if(!t) return kFALSE;
180 if(!LoadDigits(t)) return kFALSE;
181 } else if(kLoadClusters){
182 t = (TTree*)gDirectory->Get("TreeR");
183 if(!t) return kFALSE;
184 if(!LoadClusters(t)) return kFALSE;
185 } else if(kLoadTracks){
186 t = (TTree*)gDirectory->Get("TreeT");
187 if(!t) return kFALSE;
188 if(!LoadTracklets(t)) return kFALSE;
189 } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
191 f->Close(); delete f;
199 //________________________________________________________
200 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
202 AliInfo("Loading ...");
203 if(!fChildren.size()) return kTRUE;
205 TObjArray *clusters = new TObjArray();
206 tC->SetBranchAddress("TRDcluster", &clusters);
208 AliEveTRDChamber *chmb = 0x0;
209 AliTRDcluster *c=0x0;
210 for(int idet=0; idet<540; idet++){
212 if(!clusters->GetEntriesFast()) continue;
213 c = (AliTRDcluster*)clusters->UncheckedAt(0);
215 if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
221 //________________________________________________________
222 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
224 AliInfo("Loading ...");
226 if(!fChildren.size()) return kTRUE;
228 AliEveTRDChamber *chmb;
229 AliTRDdigitsManager dm;
231 for(int idet=0; idet<540; idet++){
232 if(!(chmb=GetChamber(idet))) continue;
233 // digits = dm.GetDigits(idet);
234 // if(!digits) continue;
235 // chmb->LoadDigits(digits);
236 chmb->LoadDigits(&dm);
242 //________________________________________________________
243 Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
245 AliInfo("Loading ...");
246 if(!fChildren.size()) return kTRUE;
248 TObjArray *tracks = new TObjArray();
249 tT->SetBranchAddress("TRDmcmTracklet",&tracks);
251 AliEveTRDChamber *chmb = 0x0;
252 AliTRDmcmTracklet *trk=0x0;
253 for(int idet=0; idet<540; idet++){
254 if(!tT->GetEntry(idet)) continue;
255 if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
256 if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
263 //________________________________________________________
264 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
266 fFilename = filename;
269 count += kLoadDigits ? 1 : 0;
270 count += kLoadClusters ? 1 : 0;
271 count += kLoadTracks ? 1 : 0;
273 TObjArray *so = fFilename.Tokenize(".");
275 if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
277 AliWarning("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
280 Warning("Open()", "Filename didn't fulfill naming conventions.");
284 if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
285 if(!kLoadDigits) AliWarning("Data type set to DIGITS according to file name. Previous settings with SetDataType() will be discarded.");
287 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
288 if(!kLoadClusters) AliWarning("Data type set to CLUSTERS according to file name. Previous settings with SetDataType() will be discarded.");
289 kLoadClusters = kTRUE;
290 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
291 if(!kLoadTracks) AliWarning("Data type set to TRACKLETS according to file name. Previous settings with SetDataType() will be discarded.");
294 AliWarning("Filename didn't fulfill naming conventions.");
297 AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
306 //________________________________________________________
307 void AliEveTRDLoader::Paint(Option_t *option)
309 List_i ichmb = fChildren.begin();
310 while(ichmb != fChildren.end()){
311 (dynamic_cast<AliEveTRDModule*>(*ichmb))->Paint(option);
316 //________________________________________________________
317 void AliEveTRDLoader::SetDataType(TRDDataTypes type)
320 kLoadDigits = kFALSE;
321 kLoadClusters = kFALSE;
322 kLoadTracks = kFALSE;
324 case kHits: kLoadHits = kTRUE; break;
325 case kDigits: kLoadDigits = kTRUE; break;
326 case kClusters: kLoadClusters = kTRUE; break;
327 case kTracks: kLoadTracks = kTRUE; break;
328 case kRawRoot: break;
329 case kRawData: break;
333 //________________________________________________________
334 void AliEveTRDLoader::Unload()
336 List_i ichmb = fChildren.begin();
337 while(ichmb != fChildren.end()){
338 (dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
343 ///////////////////////////////////////////////////////////
344 ///////////// AliEveTRDLoaderEditor /////////////////////
345 ///////////////////////////////////////////////////////////
347 //________________________________________________________
348 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height, UInt_t options, Pixel_t back) : TGedFrame(p, width, height, options | kVerticalFrame, back)
350 MakeTitle("AliEveTRDLoader");
353 TGTextButton *fOpenFile = 0x0;
356 TGHorizontalFrame* f = new TGHorizontalFrame(this);
357 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
358 TGLabel* l = new TGLabel(g, "File: ");
359 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
361 fFile = new TGTextEntry(f);
362 fFile->SetToolTipText("Select TRD data file or galice.root");
363 fFile->SetWidth(140);
364 fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
367 fOpenFile = new TGTextButton(f, "Browse");
368 f->AddFrame(fOpenFile);
369 fOpenFile->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
373 fEvent = new TEveGValuator(this, "AliEveEventManager:", 110, 0);
374 fEvent->SetShowSlider(kFALSE);
375 fEvent->SetLabelWidth(labelW);
376 fEvent->SetNELength(6);
378 fEvent->SetLimits(-1, 1000);
379 fEvent->SetToolTip("Set event number to be monitored");
380 fEvent->Connect("ValueSet(Double_t)",
381 "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
385 // "Chamber(s) selector" group frame
386 TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
387 TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
389 fSMNumber = new TEveGValuator(fVerticalFrame1974, "SM:", 0, 0);
390 fSMNumber->SetShowSlider(kFALSE);
391 fSMNumber->SetLabelWidth(labelW);
392 fSMNumber->SetNELength(6);
394 fSMNumber->SetLimits(-1, 17);
395 fSMNumber->SetToolTip("Supermodule id [-1 for all]");
396 fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
398 fStackNumber = new TEveGValuator(fVerticalFrame1974, "Stack:", 0, 0);
399 fStackNumber->SetShowSlider(kFALSE);
400 fStackNumber->SetLabelWidth(labelW);
401 fStackNumber->SetNELength(6);
402 fStackNumber->Build();
403 fStackNumber->SetLimits(-1, 4);
404 fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
405 fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
407 fPlaneNumber = new TEveGValuator(fVerticalFrame1974, "Plane:", 0, 0);
408 fPlaneNumber->SetShowSlider(kFALSE);
409 fPlaneNumber->SetLabelWidth(labelW);
410 fPlaneNumber->SetNELength(6);
411 fPlaneNumber->Build();
412 fPlaneNumber->SetLimits(-1, 5);
413 fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
415 fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
417 fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
419 TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
420 fTextButton2037->SetTextJustify(36);
421 fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
422 fTextButton2037->SetToolTipText("Apply selection", 400);
423 fTextButton2037->Connect("Clicked()",
424 "AliEveTRDLoaderEditor", this, "AddChambers()");
426 fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
427 AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
430 TGTextButton *fTextButton2004 = new TGTextButton(this,"Load");
431 fTextButton2004->SetTextJustify(36);
432 fTextButton2004->Resize(164,22);
433 AddFrame(fTextButton2004, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
434 fTextButton2004->SetToolTipText("Load data according to selection", 400);
435 fTextButton2004->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Load()");
438 //________________________________________________________
439 AliEveTRDLoaderEditor::~AliEveTRDLoaderEditor()
442 //_________________________________________________________
443 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
446 fM = dynamic_cast<AliEveTRDLoader*>(obj);
448 fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
450 Bool_t kFile = kTRUE;
451 if(fM->fFilename.CompareTo("") == 0) kFile = kFALSE;
453 fEvent->SetEnabled(kFile);
454 fEvent->GetEntry()->SetIntNumber(fM->fEvent);
456 fSMNumber->SetEnabled(kFile);
457 fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
460 fStackNumber->SetEnabled(kFile);
461 fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
464 fPlaneNumber->SetEnabled(kFile);
465 fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
468 //________________________________________________________
469 void AliEveTRDLoaderEditor::AddChambers()
471 fM->fSM = (int)fSMNumber->GetEntry()->GetNumber();
472 fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
473 fM->fLy = (int)fPlaneNumber->GetEntry()->GetNumber();
474 fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
477 //________________________________________________________
478 void AliEveTRDLoaderEditor::FileOpen()
481 fi.fIniDir = StrDup(gSystem->DirName (fM->fFilename.Data()));
482 fi.fFilename = StrDup(gSystem->BaseName(fM->fFilename.Data()));
483 // fi.fFileTypes = tpcfiletypes;
485 new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
486 if (!fi.fFilename) return;
488 fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
489 fFile->SetText (gSystem->BaseName(fi.fFilename));
491 fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename));
496 void AliEveTRDLoaderEditor::Load()
498 fM->GoToEvent(fM->fEvent);