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 /// \ingroup evemacros
11 /// \file MUON_displaySimu.C
13 /// \author B. Vulpescu, LPC
15 #if !defined(__CINT__) || defined(__MAKECINT__)
16 #include <Riostream.h>
22 #include <TEveManager.h>
23 #include <TEveElement.h>
24 #include <TEveTrack.h>
26 #include <MUON/mapping/AliMpSegmentation.h>
27 #include <MUON/mapping/AliMpDDLStore.h>
28 #include <MUON/mapping/AliMpCDB.h>
29 #include <MUON/AliMUONRecoCheck.h>
30 #include <MUON/AliMUONTrack.h>
31 #include <MUON/AliMUONTrackExtrap.h>
32 #include <MUON/AliMUONVTrackStore.h>
33 #include <STEER/STEERBase/AliStack.h>
34 #include <STEER/STEER/AliRunLoader.h>
35 #include <STEER/ESD/AliESDEvent.h>
36 #include <STEER/ESD/AliESDMuonTrack.h>
37 #include <EVE/EveBase/AliEveEventManager.h>
38 #include <EVE/EveDet/AliEveMUONData.h>
39 #include <EVE/EveDet/AliEveMUONChamber.h>
40 #include <EVE/EveDet/AliEveMUONTrack.h>
43 class AliEveEventManager;
46 AliEveMUONData *g_muon_data = 0;
48 Int_t g_currentEvent = -1;
49 Bool_t g_fromRaw = kFALSE;
51 void MUON_ESD_tracks();
52 void MUON_Ref_tracks();
53 void MUON_MC_tracks();
55 void MUON_displaySimu(Bool_t fromRaw = kFALSE, Bool_t showTracks = kTRUE, Bool_t clustersFromESD = kTRUE)
58 // display from simulated digits (or produced raw data)
59 // tracks: ESD, Refs, MC
62 if (!AliMpSegmentation::Instance()) AliMpCDB::LoadMpSegmentation();
63 if (!AliMpDDLStore::Instance()) AliMpCDB::LoadDDLStore();
65 // set the magnetic field for track extrapolations
66 AliEveEventManager::AssertMagField();
67 AliMUONTrackExtrap::SetField();
73 if (AliEveEventManager::GetMaster() == 0) {
74 printf("No alieve event: use alieve_init(...) \n");
78 if (g_currentEvent == AliEveEventManager::GetMaster()->GetEventId()) {
79 if (g_fromRaw == fromRaw) {
80 printf("Same event... \n");
84 printf("Same event with digits.\n");
85 AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
87 printf("Same event with raw.\n");
88 AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
95 TString dataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
96 dataPath.Append("/raw.root");
98 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
99 g_muon_data = new AliEveMUONData;
102 rl->LoadDigits("MUON");
103 dt = rl->GetTreeD("MUON", false);
105 cout << "No digits produced!" << endl;
107 cout << "With aliroot digits!" << endl;
108 g_muon_data->LoadDigits(dt);
111 if (gSystem->AccessPathName(dataPath.Data(),kFileExists)) {
112 cout << "No raw data produced!" << endl;
114 cout << "With raw digits!" << endl;
115 g_muon_data->LoadRaw(dataPath.Data());
119 TString esdDataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
120 esdDataPath.Append("/AliESDs.root");
121 if (clustersFromESD) {
122 g_muon_data->LoadRecPointsFromESD(esdDataPath.Data());
124 rl->LoadRecPoints("MUON");
125 ct = rl->GetTreeR("MUON", false);
126 g_muon_data->LoadRecPoints(ct);
129 rl->LoadHits("MUON");
130 ht = rl->GetTreeH("MUON", false);
131 g_muon_data->LoadHits(ht);
133 g_currentEvent = AliEveEventManager::GetMaster()->GetEventId();
135 gStyle->SetPalette(1, 0);
137 gEve->DisableRedraw();
139 TEveElementList* l = new TEveElementList("MUONChambers");
140 l->SetTitle("MUON chambers");
144 for (Int_t ic = 0; ic < 14; ic++)
146 AliEveMUONChamber* mucha = new AliEveMUONChamber(ic);
148 mucha->SetFrameColor(2);
149 mucha->SetChamberID(ic);
151 mucha->SetDataSource(g_muon_data);
153 gEve->AddElement(mucha, l);
162 gEve->Redraw3D(kTRUE);
163 gEve->EnableRedraw();
166 //______________________________________________________________________________
167 void MUON_ESD_tracks()
169 AliESDEvent* esd = AliEveEventManager::AssertESD();
171 TEveTrackList* lt = new TEveTrackList("ESD-Tracks");
175 gEve->AddElement(lt);
179 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
181 for (Int_t n = 0; n < nMuonTracks; n++)
183 mt = esd->GetMuonTrack(n);
185 if (mt->GetNHit() == 0) continue;
190 AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
192 track->MakeESDTrack(mt);
194 gEve->AddElement(track, lt);
199 //______________________________________________________________________________
200 void MUON_Ref_tracks()
202 TString dataPathESD = TString(AliEveEventManager::GetMaster()->GetTitle());
203 dataPathESD.Append("/AliESDs.root");
204 TString dataPathSIM = TString(AliEveEventManager::GetMaster()->GetTitle());
205 dataPathSIM.Append("/");
207 AliMUONRecoCheck recoCheck(dataPathESD.Data(),dataPathSIM.Data());
208 AliMUONVTrackStore* trackRefStore = recoCheck.ReconstructibleTracks(AliEveEventManager::GetMaster()->GetEventId());
209 TIter next(trackRefStore->CreateIterator());
210 AliMUONTrack* trackRef;
212 TEveTrackList* lt = new TEveTrackList("Ref-Tracks");
215 gEve->AddElement(lt);
219 while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) )
223 AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
225 track->MakeRefTrack(trackRef);
227 gEve->AddElement(track, lt);
232 //______________________________________________________________________________
233 void MUON_MC_tracks()
235 AliRunLoader* rl = AliEveEventManager::AssertRunLoader();
236 rl->LoadKinematics();
237 AliStack* stack = rl->Stack();
239 Int_t nTracks = stack->GetNtrack();
241 TEveTrackList* lt = new TEveTrackList("MC-Tracks");
245 gEve->AddElement(lt);
250 Int_t nHitTracks = g_muon_data->GetNTrackList();
252 for (Int_t i = 0; i < nHitTracks; i++)
254 index = g_muon_data->GetTrack(i);
255 if (index >= nTracks) {
256 cout << "TEveHit track index larger than number in stack!" << endl;
260 part = stack->Particle(index);
261 if (part->P() < 0.001) continue; // skip momenta < 1.0 MeV/c
264 AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
266 track->MakeMCTrack(part);
268 gEve->AddElement(track, lt);
271 rl->UnloadKinematics();