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 "AliTRDmcmTracklet.h"
36 #include "AliTRDdigitsManager.h"
37 #include "AliTRDgeometry.h"
39 class AliTRDdataArrayI;
41 ClassImp(AliEveTRDLoader)
42 ClassImp(AliEveTRDLoaderEditor)
44 ///////////////////////////////////////////////////////////
45 ///////////// AliEveTRDLoader /////////////////////
46 ///////////////////////////////////////////////////////////
49 //______________________________________________________________________________
50 AliEveTRDLoader::AliEveTRDLoader(const Text_t* n, const Text_t* t) : TEveElementList(n, t)
62 AliEveEventManager::AssertGeometry();
64 fGeo = new AliTRDgeometry();
65 //fGeo->CreateClusterMatrixArray();
68 //______________________________________________________________________________
69 void AliEveTRDLoader::AddChambers(int sm, int stk, int ly)
71 // Add specified chambers.
73 fSM=sm; fStack=stk; fLy=ly;
74 Int_t ismStart = (sm == -1) ? 0 : sm;
75 Int_t ismStop = (sm == -1) ? 18 : sm+1;
76 Int_t istkStart= (stk == -1)? 0 : stk;
77 Int_t istkStop = (stk == -1)? 5 : stk+1;
78 Int_t ilyStart = (ly == -1) ? 0 : ly;
79 Int_t ilyStop = (ly == -1) ? 6 : ly+1;
82 ichmb = fChildren.begin();
83 while(ichmb != fChildren.end()){
84 (*ichmb)->SetRnrSelf(kFALSE);
88 AliEveTRDNode *lSM=0x0, *lSTK=0x0;
89 AliEveTRDChamber *lCHMB = 0x0;
91 for (int ism=ismStart; ism<ismStop; ism++){
92 if(!(lSM = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))){
93 AddElement(lSM = new AliEveTRDNode("SM", ism));
94 lSM->SetElementTitle(Form("Supermodule %2d", ism));
96 lSM->SetRnrSelf(kTRUE);
98 for (int istk=istkStart; istk<istkStop; istk++) {
99 if(!(lSTK = (AliEveTRDNode*)lSM->FindChild("Stack%03d"))){
100 lSM->AddElement(lSTK = new AliEveTRDNode("Stack", istk));
101 lSTK->SetElementTitle(Form("SM %2d Stack %1d", ism, istk));
103 lSTK->SetRnrSelf(kTRUE);
105 for (int ily=ilyStart; ily<ilyStop; ily++) {
106 det = fGeo->GetDetector(ily, istk, ism);
107 if(!(lCHMB = (AliEveTRDChamber*)lSTK->FindChild(Form("Chmb%03d", det)))){
108 lSTK->AddElement(lCHMB = new AliEveTRDChamber(det));
109 lCHMB->SetGeometry(fGeo);
110 lCHMB->SetElementTitle(Form("SM %2d Stack %1d Layer %1d", ism, istk, ily));
112 lCHMB->SetRnrSelf(kTRUE);
119 //______________________________________________________________________________
120 AliEveTRDChamber* AliEveTRDLoader::GetChamber(int d)
122 // Get given chamber.
124 Int_t ism = fGeo->GetSector(d),
125 istk = fGeo->GetStack(d);
127 AliEveTRDNode *node = 0x0;
128 if(!(node = (AliEveTRDNode*)FindChild(Form("SM%03d", ism)))) return 0x0;
129 if(!(node = (AliEveTRDNode*)node->FindChild(Form("Stack%03d", istk)))) return 0x0;
130 return (AliEveTRDChamber*)node->FindChild(Form("Chmb%03d", d));
133 //______________________________________________________________________________
134 Bool_t AliEveTRDLoader::GoToEvent(int ev)
136 // Go to given event.
138 if(!fChildren.size()){
139 AliWarning("Please select first the chamber that you want to monitor from \"Chamber(s) selector\".");
148 TFile *f = TFile::Open(Form("%s/%s", fDir.Data(), fFilename.Data()));
149 if(! f->cd(Form("Event%d", ev))){
150 AliError(Form("Couldn't find event %d in file \"%s/%s\".", ev, fDir.Data(), fFilename.Data()));
151 f->Close(); //delete f;
155 if(fDataType&kTRDHits){
156 t = (TTree*)gDirectory->Get("TreeH");
157 if(!t) return kFALSE;
158 if(!LoadHits(t)) return kFALSE;
159 } else if(fDataType&kTRDDigits){
160 t = (TTree*)gDirectory->Get("TreeD");
161 if(!t) return kFALSE;
162 if(!LoadDigits(t)) return kFALSE;
163 } else if(fDataType&kTRDClusters){
164 t = (TTree*)gDirectory->Get("TreeR");
165 if(!t) return kFALSE;
166 if(!LoadClusters(t)) return kFALSE;
167 } else if(fDataType&kTRDTracklets){
168 t = (TTree*)gDirectory->Get("TreeT");
169 if(!t) return kFALSE;
170 if(!LoadTracklets(t)) return kFALSE;
171 } else AliWarning("Please select first the type of data that you want to monitor and then hit the \"Load\" button.");
173 f->Close(); //delete f;
181 //______________________________________________________________________________
182 Bool_t AliEveTRDLoader::LoadHits(TTree *tH)
186 AliInfo("Loading ...");
187 if(!fChildren.size()) return kFALSE;
189 AliEveTRDChamber *chmb = 0x0;
190 TClonesArray *hits = new TClonesArray("AliTRDhit", 100);
191 tH->SetBranchAddress("TRD", &hits);
193 for(int iTrack=0; iTrack<tH->GetEntries(); iTrack++){
194 if(!tH->GetEvent(iTrack)) continue;
195 if(!(nhits = hits->GetEntriesFast())) continue;
199 Int_t det = ((AliTRDhit*)hits->UncheckedAt(idx))->GetDetector();
200 chmb = GetChamber(det);
201 if(chmb) chmb->LoadHits(hits, idx);
203 AliTRDhit *hit = 0x0;
205 hit = (AliTRDhit*)hits->UncheckedAt(idx);
206 if(hit->GetDetector() != det) break;
217 //______________________________________________________________________________
218 Bool_t AliEveTRDLoader::LoadClusters(TTree *tC)
222 AliInfo("Loading ...");
223 if(!fChildren.size()) return kTRUE;
225 TObjArray *clusters = new TObjArray();
226 tC->SetBranchAddress("TRDcluster", &clusters);
228 AliEveTRDChamber *chmb = 0x0;
229 AliTRDcluster *c=0x0;
230 for(int idet=0; idet<540; idet++){
232 if(!clusters->GetEntriesFast()) continue;
233 c = (AliTRDcluster*)clusters->UncheckedAt(0);
235 if((chmb = GetChamber(c->GetDetector()))) chmb->LoadClusters(clusters);
241 //______________________________________________________________________________
242 Bool_t AliEveTRDLoader::LoadDigits(TTree *tD)
246 AliInfo("Loading ...");
248 if(!fChildren.size()) return kTRUE;
250 AliEveTRDChamber *chmb;
251 AliTRDdigitsManager dm;
253 for(int idet=0; idet<540; idet++){
254 if(!(chmb=GetChamber(idet))) continue;
255 // digits = dm.GetDigits(idet);
256 // if(!digits) continue;
257 // chmb->LoadDigits(digits);
258 chmb->LoadDigits(&dm);
264 //______________________________________________________________________________
265 Bool_t AliEveTRDLoader::LoadTracklets(TTree *tT)
269 AliInfo("Loading ...");
270 if(!fChildren.size()) return kTRUE;
272 TObjArray *tracks = new TObjArray();
273 tT->SetBranchAddress("TRDmcmTracklet",&tracks);
275 AliEveTRDChamber *chmb = 0x0;
276 AliTRDmcmTracklet *trk=0x0;
277 for(int idet=0; idet<540; idet++){
278 if(!tT->GetEntry(idet)) continue;
279 if(tracks->GetEntriesFast()) trk = (AliTRDmcmTracklet*)tracks->UncheckedAt(0);
280 if((chmb = GetChamber(trk->GetDetector()))) chmb->LoadTracklets(tracks);
287 //______________________________________________________________________________
288 Bool_t AliEveTRDLoader::Open(const char *filename, const char *dir)
290 // Open given file in given directory.
292 fFilename = filename;
295 count += fDataType&kTRDHits;
296 count += fDataType&kTRDDigits;
297 count += fDataType&kTRDClusters;
298 count += fDataType&kTRDTracklets;
300 TObjArray *so = fFilename.Tokenize(".");
302 if(((TObjString*)(*so)[0])->GetString().CompareTo("TRD") != 0){
303 AliError("Filename didn't fulfill naming conventions. No TRD data will be loaded.");
307 if(((TObjString*)(*so)[1])->GetString().CompareTo("Hits") == 0){
308 if(count && !fDataType&kTRDHits){
309 AliWarning("Data type set to HITS according to file name. Previous settings will be overwritten.");
313 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Digits") == 0){
314 if(count && !fDataType&kTRDDigits){
315 AliWarning("Data type set to DIGITS according to file name. Previous settings will be overwritten.");
318 fDataType|=kTRDDigits;
319 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("RecPoints") == 0){
320 if(count && !fDataType&kTRDClusters){
321 AliWarning("Data type set to CLUSTERS according to file name. Previous settings will be overwritten.");
324 fDataType|=kTRDClusters;
325 } else if(((TObjString*)(*so)[1])->GetString().CompareTo("Tracks") == 0){
326 if(count && !fDataType&kTRDTracklets){
327 AliWarning("Data type set to TRACKLETS according to file name. Previous settings will be overwritten.");
330 fDataType|=kTRDTracklets;
332 AliError("Filename didn't fulfill naming conventions. No data will be loaded.");
340 //______________________________________________________________________________
341 void AliEveTRDLoader::Paint(Option_t *option)
345 List_i ichmb = fChildren.begin();
346 while(ichmb != fChildren.end()){
347 (dynamic_cast<AliEveTRDModule*>(*ichmb))->Paint(option);
353 //______________________________________________________________________________
354 void AliEveTRDLoader::Unload()
356 // Unload module data.
358 List_i ichmb = fChildren.begin();
359 while(ichmb != fChildren.end()){
360 (dynamic_cast<AliEveTRDModule*>(*ichmb))->Reset();
365 ///////////////////////////////////////////////////////////
366 ///////////// AliEveTRDLoaderEditor /////////////////////
367 ///////////////////////////////////////////////////////////
369 //______________________________________________________________________________
370 AliEveTRDLoaderEditor::AliEveTRDLoaderEditor(const TGWindow* p, Int_t width, Int_t height,
371 UInt_t options, Pixel_t back) :
372 TGedFrame(p, width, height, options | kVerticalFrame, back),
373 fM(0), fFile(0), fBrowse(0x0), fEvent(0),
374 fSMNumber(0), fStackNumber(0), fPlaneNumber(0)
378 MakeTitle("AliEveTRDLoader");
380 // file browser frame
382 TGHorizontalFrame* f = new TGHorizontalFrame(this);
383 TGHorizontalFrame* g = new TGHorizontalFrame(f, labelW, 0, kFixedWidth);
384 TGLabel* l = new TGLabel(g, "File: ");
385 g->AddFrame(l, new TGLayoutHints(kLHintsLeft, 0,0,4,0));
387 fFile = new TGTextEntry(f);
388 fFile->SetToolTipText("Select TRD data file or galice.root");
389 fFile->SetWidth(140);
390 fFile->Connect("DoubleClicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
393 fBrowse = new TGTextButton(f, "Browse");
394 f->AddFrame(fBrowse);
395 fBrowse->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "FileOpen()");
396 AddFrame(f, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
399 // "Chamber(s) selector" group frame
400 TGGroupFrame *fGroupFrame1974 = new TGGroupFrame(this,"Chamber(s) selector");
401 TGVerticalFrame *fVerticalFrame1974 = new TGVerticalFrame(fGroupFrame1974, 150, 50,kVerticalFrame);
403 fSMNumber = new TEveGValuator(fVerticalFrame1974, "SM:", 0, 0);
404 fSMNumber->SetShowSlider(kFALSE);
405 fSMNumber->SetLabelWidth(labelW);
406 fSMNumber->SetNELength(6);
408 fSMNumber->SetLimits(-1, 17);
409 fSMNumber->SetToolTip("Supermodule id [-1 for all]");
410 fVerticalFrame1974->AddFrame(fSMNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
412 fStackNumber = new TEveGValuator(fVerticalFrame1974, "Stack:", 0, 0);
413 fStackNumber->SetShowSlider(kFALSE);
414 fStackNumber->SetLabelWidth(labelW);
415 fStackNumber->SetNELength(6);
416 fStackNumber->Build();
417 fStackNumber->SetLimits(-1, 4);
418 fStackNumber->SetToolTip("Stack id [-1 for all in this SM]");
419 fVerticalFrame1974->AddFrame(fStackNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
421 fPlaneNumber = new TEveGValuator(fVerticalFrame1974, "Plane:", 0, 0);
422 fPlaneNumber->SetShowSlider(kFALSE);
423 fPlaneNumber->SetLabelWidth(labelW);
424 fPlaneNumber->SetNELength(6);
425 fPlaneNumber->Build();
426 fPlaneNumber->SetLimits(-1, 5);
427 fPlaneNumber->SetToolTip("Plane id [-1 for all in this stack]");
429 fVerticalFrame1974->AddFrame(fPlaneNumber, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterX | kLHintsExpandY,2,2,2,2));
431 fGroupFrame1974->AddFrame(fVerticalFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY | kLHintsCenterX,2,2,2,2));
433 TGTextButton *fTextButton2037 = new TGTextButton(fGroupFrame1974,"Select");
434 fTextButton2037->SetTextJustify(36);
435 fGroupFrame1974->AddFrame(fTextButton2037, new TGLayoutHints(kLHintsExpandY | kLHintsCenterX,2,2,2,2));
436 fTextButton2037->SetToolTipText("Apply selection", 400);
437 fTextButton2037->Connect("Clicked()",
438 "AliEveTRDLoaderEditor", this, "AddChambers()");
440 fGroupFrame1974->SetLayoutManager(new TGHorizontalLayout(fGroupFrame1974));
441 AddFrame(fGroupFrame1974, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
444 // Event steering frame
445 f = new TGHorizontalFrame(this);
446 TGTextButton *fGoTo = new TGTextButton(f, "GoTo");
447 fGoTo->SetTextJustify(36);
448 fGoTo->Resize(164,22);
449 f->AddFrame(fGoTo, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
450 fGoTo->SetToolTipText("Skip to event", 400);
451 fGoTo->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "GoTo()");
453 fEvent = new TEveGValuator(f, "Event:", 110, 0);
454 fEvent->SetShowSlider(kFALSE);
455 fEvent->SetLabelWidth(labelW);
456 fEvent->SetNELength(6);
458 fEvent->SetLimits(-1, 1000);
459 fEvent->SetToolTip("Set event number to be monitored");
460 fEvent->Connect("ValueSet(Double_t)",
461 "AliEveTRDLoaderEditor", this, "SetEvent(Double_t)");
462 f->AddFrame(fEvent, new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 2,2,2,2));
464 TGTextButton *fNext = new TGTextButton(f, "Next");
465 fNext->SetTextJustify(36);
466 fNext->Resize(164,22);
467 f->AddFrame(fNext, new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,2,2,2,2));
468 fNext->SetToolTipText("Next event", 400);
469 fNext->Connect("Clicked()", "AliEveTRDLoaderEditor", this, "Next()");
471 AddFrame(f,new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsCenterY | kLHintsExpandX,5,5,5,5));
475 //______________________________________________________________________________
476 void AliEveTRDLoaderEditor::SetModel(TObject* obj)
480 fM = dynamic_cast<AliEveTRDLoader*>(obj);
482 fFile->SetEnabled(!fM->IsDataLinked());
483 fFile->SetText(gSystem->BaseName(fM->fFilename.Data()));
484 fBrowse->SetEnabled(!fM->IsDataLinked());
486 fEvent->SetEnabled(fM->IsDataLinked());
487 fEvent->GetEntry()->SetIntNumber(fM->fEvent);
489 fSMNumber->SetEnabled(fM->IsDataLinked());
490 fSMNumber->GetEntry()->SetIntNumber(fM->fSM);
493 fStackNumber->SetEnabled(fM->IsDataLinked());
494 fStackNumber->GetEntry()->SetIntNumber(fM->fStack);
497 fPlaneNumber->SetEnabled(fM->IsDataLinked());
498 fPlaneNumber->GetEntry()->SetIntNumber(fM->fLy);
501 //______________________________________________________________________________
502 void AliEveTRDLoaderEditor::AddChambers()
504 // Slot to add chambers.
506 fM->fSM = (int)fSMNumber->GetEntry()->GetNumber();
507 fM->fStack = (int)fStackNumber->GetEntry()->GetNumber();
508 fM->fLy = (int)fPlaneNumber->GetEntry()->GetNumber();
509 fM->AddChambers(fM->fSM, fM->fStack, fM->fLy);
512 //______________________________________________________________________________
513 void AliEveTRDLoaderEditor::FileOpen()
515 // Slot for opening of file.
518 fi.fIniDir = StrDup(gSystem->DirName (fM->fFilename.Data()));
519 fi.fFilename = StrDup(gSystem->BaseName(fM->fFilename.Data()));
520 // fi.fFileTypes = tpcfiletypes;
522 new TGFileDialog(fClient->GetRoot(), gEve->GetMainWindow(), kFDOpen, &fi);
523 if (!fi.fFilename) return;
525 if(fM->Open(gSystem->BaseName(fi.fFilename), gSystem->DirName (fi.fFilename))){
526 fFile->SetToolTipText(gSystem->DirName (fi.fFilename));
527 fFile->SetText (gSystem->BaseName(fi.fFilename));
528 } else fFile->Clear();
533 void AliEveTRDLoaderEditor::GoTo()
535 // Slot for loading of event.
537 fM->GoToEvent(fM->fEvent);
540 void AliEveTRDLoaderEditor::Next()
542 // Slot for loading of event.