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