8a3d604399df86383708fb0c945f52cec812fde3
[u/mrichter/AliRoot.git] / EVE / alice-macros / MUON_displaySimu.C
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
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
10 /// \ingroup evemacros
11 /// \file MUON_displaySimu.C
12 ///
13 /// \author B. Vulpescu, LPC
14
15 #if !defined(__CINT__) || defined(__MAKECINT__)
16 #include <Riostream.h>
17 #include <Rtypes.h>
18 #include <TTree.h>
19 #include <TStyle.h>
20 #include <TString.h>
21 #include <TSystem.h>
22 #include <TEveManager.h>
23 #include <TEveElement.h>
24 #include <TEveTrack.h>
25
26 #include <AliMpSegmentation.h>
27 #include <AliMpDDLStore.h>
28 #include <AliMpCDB.h>
29 #include <AliMUONRecoCheck.h>
30 #include <AliMUONTrack.h>
31 #include <AliMUONTrackExtrap.h>
32 #include <AliMUONVTrackStore.h>
33 #include <AliStack.h>
34 #include <AliRunLoader.h>
35 #include <AliESDEvent.h>
36 #include <AliESDMuonTrack.h>
37 #include <AliEveEventManager.h>
38 #include <AliEveMUONData.h>
39 #include <AliEveMUONChamber.h>
40 #include <AliEveMUONTrack.h>
41 #else
42 class AliEveMUONData;
43 class AliEveEventManager;
44 #endif
45
46 AliEveMUONData     *g_muon_data       = 0;
47
48 Int_t  g_currentEvent = -1;
49 Bool_t g_fromRaw      = kFALSE;
50
51 void MUON_ESD_tracks();
52 void MUON_Ref_tracks();
53 void MUON_MC_tracks();
54
55 void MUON_displaySimu(Bool_t fromRaw = kFALSE, Bool_t showTracks = kTRUE, Bool_t clustersFromESD = kTRUE)
56 {
57   //
58   // display from simulated digits (or produced raw data) 
59   // tracks: ESD, Refs, MC
60   // 
61
62   if (!AliMpSegmentation::Instance()) AliMpCDB::LoadMpSegmentation();
63   if (!AliMpDDLStore::Instance())     AliMpCDB::LoadDDLStore();
64
65   // set the magnetic field for track extrapolations
66   AliEveEventManager::AssertMagField();
67   AliMUONTrackExtrap::SetField();
68
69   TTree* dt = 0;
70   TTree* ct = 0;
71   TTree* ht = 0;
72
73   if (AliEveEventManager::GetMaster() == 0) {
74     printf("No alieve event: use alieve_init(...) \n");
75     return;
76   }
77
78   if (g_currentEvent == AliEveEventManager::GetMaster()->GetEventId()) {
79     if (g_fromRaw == fromRaw) {
80       printf("Same event... \n");
81       return;
82     } else {
83       if (g_fromRaw) {
84         printf("Same event with digits.\n");
85         AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
86       } else {
87         printf("Same event with raw.\n");
88         AliEveEventManager::GetMaster()->GotoEvent(g_currentEvent);
89       }
90     }
91   }
92
93   g_fromRaw = fromRaw;
94
95   TString dataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
96   dataPath.Append("/raw.root");
97
98   AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
99   g_muon_data = new AliEveMUONData;
100
101   if (!fromRaw) {
102     rl->LoadDigits("MUON");
103     dt = rl->GetTreeD("MUON", false);
104     if (dt == 0) {
105       cout << "No digits produced!" << endl;
106     } else {
107       cout << "With aliroot digits!" << endl;
108       g_muon_data->LoadDigits(dt);
109     }
110   } else {
111     if (gSystem->AccessPathName(dataPath.Data(),kFileExists)) {
112       cout << "No raw data produced!" << endl;
113     } else {
114       cout << "With raw digits!" << endl;
115       g_muon_data->LoadRaw(dataPath.Data());
116     }
117   }
118
119   TString esdDataPath = TString(AliEveEventManager::GetMaster()->GetTitle());
120   esdDataPath.Append("/AliESDs.root");
121   if (clustersFromESD) {
122     g_muon_data->LoadRecPointsFromESD(esdDataPath.Data());
123   } else {
124     rl->LoadRecPoints("MUON");
125     ct = rl->GetTreeR("MUON", false);
126     g_muon_data->LoadRecPoints(ct);
127   }
128   
129   rl->LoadHits("MUON");
130   ht = rl->GetTreeH("MUON", false);
131   g_muon_data->LoadHits(ht);
132   
133   g_currentEvent = AliEveEventManager::GetMaster()->GetEventId();
134
135   gStyle->SetPalette(1, 0);
136
137   gEve->DisableRedraw();
138
139   TEveElementList* l = new TEveElementList("MUONChambers");
140   l->SetTitle("MUON chambers");
141   l->SetMainColor(2);
142   gEve->AddElement(l);
143
144   for (Int_t ic = 0; ic < 14; ic++)
145   {
146     AliEveMUONChamber* mucha = new AliEveMUONChamber(ic);
147
148     mucha->SetFrameColor(2);
149     mucha->SetChamberID(ic);
150
151     mucha->SetDataSource(g_muon_data);
152
153     gEve->AddElement(mucha, l);
154   }
155
156   if (showTracks) {
157     MUON_ESD_tracks();
158     MUON_Ref_tracks();
159     MUON_MC_tracks();
160   }
161
162   gEve->Redraw3D(kTRUE);
163   gEve->EnableRedraw();
164 }
165
166 //______________________________________________________________________________
167 void MUON_ESD_tracks()
168 {
169   AliESDEvent* esd = AliEveEventManager::AssertESD();
170
171   TEveTrackList* lt = new TEveTrackList("ESD-Tracks");
172   lt->SetMainColor(6);
173   //lt->SetMUON();
174
175   gEve->AddElement(lt);
176
177   AliESDMuonTrack *mt;
178   TEveRecTrack rt;
179   Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
180   Int_t nTrack = 0;
181   for (Int_t n = 0; n < nMuonTracks; n++)
182   {
183     mt = esd->GetMuonTrack(n);
184
185     if (mt->GetNHit() == 0) continue;
186     nTrack++;
187
188     rt.fLabel = n;
189
190     AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
191
192     track->MakeESDTrack(mt);
193
194     gEve->AddElement(track, lt);
195   }
196
197 }
198
199 //______________________________________________________________________________
200 void MUON_Ref_tracks()
201 {
202   TString dataPathESD = TString(AliEveEventManager::GetMaster()->GetTitle());
203   dataPathESD.Append("/AliESDs.root");
204   TString dataPathSIM = TString(AliEveEventManager::GetMaster()->GetTitle());
205   dataPathSIM.Append("/");
206
207   AliMUONRecoCheck recoCheck(dataPathESD.Data(),dataPathSIM.Data());
208   AliMUONVTrackStore* trackRefStore = recoCheck.ReconstructibleTracks(AliEveEventManager::GetMaster()->GetEventId());
209   TIter next(trackRefStore->CreateIterator());
210   AliMUONTrack* trackRef;
211
212   TEveTrackList* lt = new TEveTrackList("Ref-Tracks");
213   lt->SetMainColor(6);
214
215   gEve->AddElement(lt);
216
217   TEveRecTrack rt;
218   Int_t i = 0;
219   while ( ( trackRef = static_cast<AliMUONTrack*>(next()) ) )
220   {
221     rt.fLabel = i++;
222
223     AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
224
225     track->MakeRefTrack(trackRef);
226
227     gEve->AddElement(track, lt);
228   }
229
230 }
231
232 //______________________________________________________________________________
233 void MUON_MC_tracks()
234 {
235   AliRunLoader* rl =  AliEveEventManager::AssertRunLoader();
236   rl->LoadKinematics();
237   AliStack* stack = rl->Stack();
238
239   Int_t nTracks  = stack->GetNtrack();
240
241   TEveTrackList* lt = new TEveTrackList("MC-Tracks");
242   lt->SetMainColor(6);
243   //lt->SetMUON();
244
245   gEve->AddElement(lt);
246
247   TParticle *part;
248   TEveRecTrack rt;
249
250   Int_t nHitTracks = g_muon_data->GetNTrackList();
251   Int_t index;
252   for (Int_t i = 0; i < nHitTracks; i++)
253   {
254     index = g_muon_data->GetTrack(i);
255     if (index >= nTracks) {
256       cout << "TEveHit track index larger than number in stack!" << endl;
257       continue;
258     }
259
260     part = stack->Particle(index);
261     if (part->P() < 0.001) continue;  // skip momenta < 1.0 MeV/c
262     rt.fLabel = i;
263
264     AliEveMUONTrack* track = new AliEveMUONTrack(&rt, lt->GetPropagator());
265
266     track->MakeMCTrack(part);
267
268     gEve->AddElement(track, lt);
269   }
270
271   rl->UnloadKinematics();
272 }
273