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