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 **************************************************************************/
10 #include "AliEveTRDLoader.h"
11 #include "AliEveTRDModuleImp.h"
12 #include "EveBase/AliEveEventManager.h"
14 #include <TEveManager.h>
15 #include <TEveGValuators.h>
17 #include "TGeoManager.h"
21 #include "TObjString.h"
22 #include "TObjArray.h"
23 #include "TClonesArray.h"
27 #include <TGTextEntry.h>
28 #include <TGFileDialog.h>
31 #include "AliCDBManager.h"
33 #include "AliTRDhit.h"
34 #include "AliTRDcluster.h"
35 #include "AliTRDdigitsManager.h"
36 #include "AliTRDgeometry.h"
38 ClassImp(AliEveTRDLoader)
39 ClassImp(AliEveTRDLoaderEditor)
41 ///////////////////////////////////////////////////////////
42 ///////////// AliEveTRDLoader /////////////////////
43 ///////////////////////////////////////////////////////////
46 //______________________________________________________________________________
47 AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) : TEveElementList(n, t)
59 AliEveEventManager::AssertGeometry();
61 fGeo = new AliTRDgeometry();
62 //fGeo->CreateClusterMatrixArray();
65 //______________________________________________________________________________
66 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
68 // Add specified chambers.
70 fSM=sm; fStack=stk; fLy=ly;
71 Int_t ismStart = (sm == -1) ? 0 : sm;
72 Int_t ismStop = (sm == -1) ? 18 : sm+1;
73 Int_t istkStart= (stk == -1)? 0 : stk;
74 Int_t istkStop = (stk == -1)? 5 : stk+1;
75 Int_t ilyStart = (ly == -1) ? 0 : ly;
76 Int_t ilyStop = (ly == -1) ? 6 : ly+1;
79 ichmb = fChildren.begin();
80 while(ichmb != fChildren.end()){
81 (*ichmb)->SetRnrSelf(kFALSE);
85 AliEveTRDNode *lSM=0x0, *lSTK=0x0;
86 AliEveTRDChamber *lCHMB = 0x0;
88 for (int ism=ismStart; ism<ismStop; ism++){
89 if(!(lSM = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))){
90 AddElement(lSM = new AliEveTRDNode("SM", ism));
91 lSM->SetElementTitle(Form("Supermodule %2d", ism));
93 lSM->SetRnrSelf(kTRUE);
95 for (int istk=istkStart; istk<istkStop; istk++) {
96 if(!(lSTK = (AliEveTRDNode*)lSM->FindChild("Stack%03d"))){
97 lSM->AddElement(lSTK = new AliEveTRDNode("Stack", istk));
98 lSTK->SetElementTitle(Form("SM %2d Stack %1d", ism, istk));
100 lSTK->SetRnrSelf(kTRUE);
102 for (int ily=ilyStart; ily<ilyStop; ily++) {
103 det = fGeo->GetDetector(ily, istk, ism);
104 if(!(lCHMB = (AliEveTRDChamber*)lSTK->FindChild(Form("Chmb%03d", det)))){
105 lSTK->AddElement(lCHMB = new AliEveTRDChamber(det));
106 lCHMB->SetGeometry(fGeo);
107 lCHMB->SetElementTitle(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
109 lCHMB->SetRnrSelf(kTRUE);
116 //______________________________________________________________________________
117 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
119 // Get given chamber.
121 Int_t ism = fGeo->GetSector(d),
122 istk = fGeo->GetStack(d);
124 AliEveTRDNode *node = 0x0;
125 if(!(node = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))) return 0x0;
126 if(!(node = (AliEveTRDNode*)node->FindChild(Form("Stack%03d", istk)))) return 0x0;
127 return (AliEveTRDChamber*)node->FindChild(Form("Chmb%03d", d));
130 //______________________________________________________________________________
131 Bool_t AliEveTRDLoader::GoToEvent(int ev)
133 // Go to given event.
135 if(!fChildren.size()){
136 AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
144 TTree *t(NULL); TFile *f(NULL);
145 if(!(f = TFile::Open(Form("%s/%s", fDir.Data(), fFilename.Data())))){
146 AliWarning(Form("File not found \"%s/%s\".", fDir.Data(), fFilename.Data()));
149 if(!f->cd(Form("Event%d", ev))){
150 AliError(Form("Event[%d] not found in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
151 f->Close(); //delete f;
155 if(fDataType&kTRDHits){
156 if(!(t = (TTree*)gDirectory->Get("TreeH"))){
157 AliError(Form("Tree[TreeH] not found for Event[%d].", ev));
160 if(!LoadHits(t)) return kFALSE;
162 if(fDataType&kTRDDigits){
163 if(!(t = (TTree*)gDirectory->Get("TreeD"))){
164 AliError(Form("Tree[TreeD] not found for Event[%d].", ev));
167 if(!LoadDigits(t)) return kFALSE;
169 if(fDataType&kTRDClusters){
170 if(!(t = (TTree*)gDirectory->Get("TreeR"))){
171 AliError(Form("Tree[TreeR] not found for Event[%d].", ev));
174 if(!LoadClusters(t)) return kFALSE;
176 if(fDataType&kTRDTracklets){
177 if(!(t = (TTree*)gDirectory->Get("tracklets"))){
178 AliError(Form("Tree[tracklets] not found for Event[%d].", ev));
181 if(!LoadTracklets(t)) return kFALSE;
182 }// else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
184 f->Close(); //delete f;
192 //______________________________________________________________________________
193 Bool_t AliEveTRDLoader::LoadHits(TTree *tH)
197 AliInfo("Loading ...");
198 if(!fChildren.size()) return kFALSE;
200 AliEveTRDChamber *chmb = 0x0;
201 TClonesArray *hits = new TClonesArray("AliTRDhit", 100);
202 tH->SetBranchAddress("TRD", &hits);
204 for(int iTrack=0; iTrack<tH->GetEntries(); iTrack++){
205 if(!tH->GetEvent(iTrack)) continue;
206 if(!(nhits = hits->GetEntriesFast())) continue;
210 Int_t det = ((AliTRDhit*)hits->UncheckedAt(idx))->GetDetector();
211 chmb = GetChamber(det);
212 if(chmb) chmb->LoadHits(hits, idx);
214 AliTRDhit *hit = 0x0;
216 hit = (AliTRDhit*)hits->UncheckedAt(idx);
217 if(hit->GetDetector() != det) break;
228 //______________________________________________________________________________
229 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
233 AliInfo("Loading ...");
234 if(!fChildren.size()) return kFALSE;
236 TObjArray *clusters = new TObjArray();
237 tC->SetBranchAddress("TRDcluster", &clusters);
239 AliEveTRDChamber *chmb(NULL);
240 AliTRDcluster *c(NULL);
241 for(int idet=0; idet<AliTRDgeometry::kNdet; idet++){
243 if(!clusters->GetEntriesFast()) continue;
244 if(!(c = (AliTRDcluster*)clusters->UncheckedAt(0))) continue;
245 if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
251 //______________________________________________________________________________
252 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
256 AliInfo("Loading ...");
258 if(!fChildren.size()) return kFALSE;
260 AliEveTRDChamber *chmb;
261 AliTRDdigitsManager dm;
263 for(int idet=0; idet<AliTRDgeometry::kNdet; idet++){
264 if(!(chmb=GetChamber(idet))) continue;
265 // digits = dm.GetDigits(idet);
266 // if(!digits) continue;
267 // chmb->LoadDigits(digits);
268 chmb->LoadDigits(&dm);
274 //______________________________________________________________________________
275 Bool_t AliEveTRDLoader::LoadTracklets(TTree *trklTree)
279 AliInfo("Loading ...");
280 if(!fChildren.size()) return kFALSE;
283 AliEveTRDChamber *chmb = 0x0;
285 for(int idet=0; idet<540; idet++){
286 if((chmb = GetChamber(idet)))
287 chmb->LoadTracklets(trklTree);
294 //______________________________________________________________________________
295 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
297 // Open given file in given directory.
299 fFilename = filename;
302 count += fDataType&kTRDHits;
303 count += fDataType&kTRDDigits;
304 count += fDataType&kTRDClusters;
305 count += fDataType&kTRDTracklets;
307 TObjArray *so = fFilename.Tokenize(".");
309 if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
310 AliError("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
314 if(((TObjString*)(*so)[1])->GetString().CompareTo("Hits") == 0){
315 if(count && !(fDataType&kTRDHits)){
316 AliWarning("Data type set to HITS according to file name. Previous settings will be overwritten.");
320 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
321 if(count && !(fDataType&kTRDDigits)){
322 AliWarning("Data type set to DIGITS according to file name. Previous settings will be overwritten.");
325 fDataType|=kTRDDigits;
326 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
327 if(count && !(fDataType&kTRDClusters)){
328 AliWarning("Data type set to CLUSTERS according to file name. Previous settings will be overwritten.");
331 fDataType|=kTRDClusters;
332 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracklets") == 0){
333 if(count && !(fDataType&kTRDTracklets)){
334 AliWarning("Data type set to TRACKLETS according to file name. Previous settings will be overwritten.");
337 fDataType|=kTRDTracklets;
339 AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
347 //______________________________________________________________________________
348 void AliEveTRDLoader::Paint(Option_t *option)
352 AliEveTRDModule *module(NULL);
353 List_i ichmb = fChildren.begin();
354 while(ichmb != fChildren.end()){
355 if((module = dynamic_cast<AliEveTRDModule*>(*ichmb))) module->Paint(option);
361 //______________________________________________________________________________
362 void AliEveTRDLoader::Unload()
364 // Unload module data.
366 List_i ichmb = fChildren.begin();
367 while(ichmb != fChildren.end()){
368 //(dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
373 ///////////////////////////////////////////////////////////
374 ///////////// AliEveTRDLoaderEditor /////////////////////
375 ///////////////////////////////////////////////////////////
377 //______________________________________________________________________________
378 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height,
379 UInt_t options, Pixel_t back) :
380 TGedFrame(p, width, height, options | kVerticalFrame, back),
381 fM(0), fFile(0), fBrowse(0x0), fEvent(0),
382 fSMNumber(0), fStackNumber(0), fPlaneNumber(0)
386 MakeTitle("AliEveTRDLoader");
388 // file browser frame
390 TGHorizontalFrame* f = new TGHorizontalFrame(this);
391 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
392 TGLabel* l = new TGLabel(g, "File: ");
393 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
395 fFile = new TGTextEntry(f);
396 fFile->SetToolTipText("Select TRD data file or galice.root");
397 fFile->SetWidth(140);
398 fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
401 fBrowse = new TGTextButton(f, "Browse");
402 f->AddFrame(fBrowse);
403 fBrowse->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
404 AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
407 // "Chamber(s) selector" group frame
408 TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
409 TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
411 fSMNumber = new TEveGValuator(fVerticalFrame1974, "SM:", 0, 0);
412 fSMNumber->SetShowSlider(kFALSE);
413 fSMNumber->SetLabelWidth(labelW);
414 fSMNumber->SetNELength(6);
416 fSMNumber->SetLimits(-1, 17);
417 fSMNumber->SetToolTip("Supermodule id [-1 for all]");
418 fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
420 fStackNumber = new TEveGValuator(fVerticalFrame1974, "Stack:", 0, 0);
421 fStackNumber->SetShowSlider(kFALSE);
422 fStackNumber->SetLabelWidth(labelW);
423 fStackNumber->SetNELength(6);
424 fStackNumber->Build();
425 fStackNumber->SetLimits(-1, 4);
426 fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
427 fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
429 fPlaneNumber = new TEveGValuator(fVerticalFrame1974, "Plane:", 0, 0);
430 fPlaneNumber->SetShowSlider(kFALSE);
431 fPlaneNumber->SetLabelWidth(labelW);
432 fPlaneNumber->SetNELength(6);
433 fPlaneNumber->Build();
434 fPlaneNumber->SetLimits(-1, 5);
435 fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
437 fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
439 fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
441 TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
442 fTextButton2037->SetTextJustify(36);
443 fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
444 fTextButton2037->SetToolTipText("Apply selection", 400);
445 fTextButton2037->Connect("Clicked()",
446 "AliEveTRDLoaderEditor", this, "AddChambers()");
448 fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
449 AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
452 // Event steering frame
453 f = new TGHorizontalFrame(this);
454 TGTextButton *fGoTo = new TGTextButton(f, "GoTo");
455 fGoTo->SetTextJustify(36);
456 fGoTo->Resize(164,22);
457 f->AddFrame(fGoTo, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
458 fGoTo->SetToolTipText("Skip to event", 400);
459 fGoTo->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "GoTo()");
461 fEvent = new TEveGValuator(f, "Event:", 110, 0);
462 fEvent->SetShowSlider(kFALSE);
463 fEvent->SetLabelWidth(labelW);
464 fEvent->SetNELength(6);
466 fEvent->SetLimits(-1, 1000);
467 fEvent->SetToolTip("Set event number to be monitored");
468 fEvent->Connect("ValueSet(Double_t)",
469 "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
470 f->AddFrame(fEvent, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2,2,2,2));
472 TGTextButton *fNext = new TGTextButton(f, "Next");
473 fNext->SetTextJustify(36);
474 fNext->Resize(164,22);
475 f->AddFrame(fNext, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
476 fNext->SetToolTipText("Next event", 400);
477 fNext->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Next()");
479 AddFrame(f,new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
483 //______________________________________________________________________________
484 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
488 if(!(fM = dynamic_cast<AliEveTRDLoader*>(obj))) return;
490 fFile->SetEnabled(!fM->IsDataLinked());
491 fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
492 fBrowse->SetEnabled(!fM->IsDataLinked());
494 fEvent->SetEnabled(fM->IsDataLinked());
495 fEvent->GetEntry()->SetIntNumber(fM->fEvent);
497 fSMNumber->SetEnabled(fM->IsDataLinked());
498 fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
501 fStackNumber->SetEnabled(fM->IsDataLinked());
502 fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
505 fPlaneNumber->SetEnabled(fM->IsDataLinked());
506 fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
509 //______________________________________________________________________________
510 void AliEveTRDLoaderEditor::AddChambers()
512 // Slot to add chambers.
514 fM->fSM = (int)fSMNumber->GetEntry()->GetNumber();
515 fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
516 fM->fLy = (int)fPlaneNumber->GetEntry()->GetNumber();
517 fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
520 //______________________________________________________________________________
521 void AliEveTRDLoaderEditor::FileOpen()
523 // Slot for opening of file.
526 fi.fIniDir = StrDup(gSystem->DirName (fM->fFilename.Data()));
527 fi.fFilename = StrDup(gSystem->BaseName(fM->fFilename.Data()));
528 // fi.fFileTypes = tpcfiletypes;
530 new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
531 if (!fi.fFilename) return;
533 if(fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename))){
534 fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
535 fFile->SetText (gSystem->BaseName(fi.fFilename));
536 } else fFile->Clear();
541 void AliEveTRDLoaderEditor::GoTo()
543 // Slot for loading of event.
545 fM->GoToEvent(fM->fEvent);
548 void AliEveTRDLoaderEditor::Next()
550 // Slot for loading of event.