3 /**************************************************************************
4 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
5 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
6 * full copyright notice. *
7 **************************************************************************/
9 // Macro to visualise ESD tracks from MUON spectrometer
10 // (both tracker and trigger).
12 // Use esd_muon_tracks(Bool_t showClusters, Bool_t showDigits) in order to run it
14 // Needs that alieve_init() is already called
16 #if !defined(__CINT__) || defined(__MAKECINT__)
18 #include "AliMUONESDInterface.h"
19 #include "AliMUONTrack.h"
20 #include "AliMUONTrackExtrap.h"
21 #include "AliMUONTrackParam.h"
22 #include "AliMUONConstants.h"
23 #include "AliMUONCDB.h"
24 #include "AliMUONGeometryTransformer.h"
25 #include "AliMUONTriggerCircuit.h"
29 #include "AliESDEvent.h"
30 #include "AliESDMuonTrack.h"
32 #include "EveBase/AliEveMagField.h"
33 #include "EveBase/AliEveTrack.h"
34 #include "EveBase/AliEveEventManager.h"
36 #include <TEveManager.h>
38 #include <TEveTrack.h>
39 #include <TEvePointSet.h>
40 #include <TEveQuadSet.h>
41 #include <TEveTrackPropagator.h>
42 #include <TEveVSDStructs.h>
49 AliMUONGeometryTransformer* gMUONGeometryTransformer(0x0);
50 AliMUONTriggerCircuit* gTriggerCircuit(0x0);
52 //______________________________________________________________________________
53 void esd_muon_track_propagator_setup(TEveTrackPropagator* trkProp, Bool_t tracker, Bool_t trigger)
56 if (AliMUONTrackExtrap::IsFieldON())
58 trkProp->SetMagFieldObj(new AliEveMagField);
62 trkProp->SetMagField(0.0);
64 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
66 // set propagation range
67 trkProp->SetMaxR(1000);
68 if (trigger) trkProp->SetMaxZ(-AliMUONConstants::DefaultChamberZ(13)+10.);
69 else trkProp->SetMaxZ(-AliMUONConstants::MuonFilterZBeg());
71 // go through pathmarks
72 trkProp->SetFitDaughters(kFALSE);
73 trkProp->SetFitReferences(kTRUE);
74 trkProp->SetFitDecay(kFALSE);
75 trkProp->SetFitCluster2Ds(kFALSE);
77 // Render the ref pathmarks
78 trkProp->SetRnrReferences(kTRUE);
79 trkProp->RefPMAtt().SetMarkerSize(0.5);
80 if (trigger) trkProp->RefPMAtt().SetMarkerColor(kGreen);
81 else trkProp->RefPMAtt().SetMarkerColor(kAzure);
83 // Render first vertex
86 trkProp->SetRnrFV(kTRUE);
87 if (trigger) trkProp->RefFVAtt().SetMarkerColor(kGreen);
88 else trkProp->RefFVAtt().SetMarkerColor(kAzure);
92 //______________________________________________________________________________
93 void add_esd_muon_tracks(AliESDEvent* esd, AliMUONESDInterface* data,
94 TEveTrackList* match, TEveTrackList* nomatch, TEveTrackList* ghost)
96 Int_t nTrack(esd->GetNumberOfMuonTracks());
97 TEveRecTrack recTrack;
100 // add ESD tracks to the proper list
101 for (Int_t n = 0; n < nTrack; ++n)
103 AliESDMuonTrack* emt = esd->GetMuonTrack(n);
106 UInt_t trackId = emt->GetUniqueID();
107 recTrack.fLabel = emt->GetLabel();
108 recTrack.fIndex = (Int_t)trackId;
110 // fill tracker track specific info
111 if ( emt->ContainTrackerData() )
113 recTrack.fStatus = emt->GetMatchTrigger();
114 recTrack.fSign = emt->Charge();
115 recTrack.fV.Set(emt->GetNonBendingCoorAtDCA(),emt->GetBendingCoorAtDCA(),emt->GetZ());
116 recTrack.fP.Set(emt->PxAtDCA(),emt->PyAtDCA(),emt->PzAtDCA());
117 recTrack.fBeta = ( emt->E() > 0 ) ? emt->P()/emt->E() : 0;
119 // get proper track list
120 TEveTrackList* trackList = nomatch;
121 if ( emt->GetMatchTrigger() > 0 ) trackList = match;
124 track = new AliEveTrack(&recTrack,trackList->GetPropagator());
125 track->SetName(Form("%cmu",emt->Charge()>0 ? '+':'-'));
126 track->SetStdTitle();
127 track->SetSourceObject(emt); // WARNING: Change the UniqueID of the object!!
130 TIter next(data->FindTrack(trackId)->GetTrackParamAtCluster());
131 AliMUONTrackParam* param;
132 while ( ( param = static_cast<AliMUONTrackParam*>(next()) ) )
134 TEveVector v(param->GetNonBendingCoor(),param->GetBendingCoor(),param->GetZ());
135 TEveVector p(param->Px(),param->Py(),param->Pz());
136 track->AddPathMark(TEvePathMark(TEvePathMark::kReference,v,p));
139 // add trigger track if any
140 if (emt->ContainTriggerData())
142 Double_t x11 = gTriggerCircuit->GetX11Pos(emt->LoCircuit(), emt->LoStripY());
143 Double_t y11 = gTriggerCircuit->GetY11Pos(emt->LoCircuit(), emt->LoStripX());
144 Double_t z11 = AliMUONConstants::DefaultChamberZ(10);
145 Double_t y21 = gTriggerCircuit->GetY21Pos(emt->LoCircuit(), emt->LoStripX()+emt->LoDev()+1);
146 Double_t z21 = AliMUONConstants::DefaultChamberZ(12);
147 Double_t pz = -emt->PUncorrected(); // max value
148 TEveVector v(x11, y11, z11);
149 TEveVector p(pz*x11/z11, pz*(y21-y11)/(z21-z11), pz);
150 track->AddPathMark(TEvePathMark(TEvePathMark::kReference,v,p));
153 // add the track to proper list
154 track->SetAttLineAttMarker(trackList);
155 trackList->AddElement(track);
157 else // fill ghost track specific info
159 recTrack.fStatus = 0;
160 recTrack.fSign = emt->Charge();
161 recTrack.fV.Set(emt->GetNonBendingCoorUncorrected(),emt->GetBendingCoorUncorrected(),(Double_t)AliMUONConstants::DefaultChamberZ(10));
162 recTrack.fP.Set(-TMath::Tan(emt->GetThetaXUncorrected()),-TMath::Tan(emt->GetThetaYUncorrected()),-1.);
165 track = new AliEveTrack(&recTrack,ghost->GetPropagator());
166 track->SetName("mu");
167 track->SetTitle("Trigger only");
168 track->SetSourceObject(emt);
170 // add the track to proper list
171 track->SetAttLineAttMarker(ghost);
172 ghost->AddElement(track);
179 //______________________________________________________________________________
180 void esd_muon_tracks(Bool_t showClusters, Bool_t showDigits)
183 AliESDEvent* esd = AliEveEventManager::AssertESD();
184 if (esd->GetNumberOfMuonTracks() == 0 && !gEve->GetKeepEmptyCont()) return;
187 AliEveEventManager::AssertMagField();
188 if (!AliMUONESDInterface::GetTracker()) AliMUONESDInterface::ResetTracker(AliMUONCDB::LoadRecoParam());
191 AliMpCDB::LoadAll(kFALSE);
194 if (gMUONGeometryTransformer == 0)
196 AliEveEventManager::AssertGeometry();
197 gMUONGeometryTransformer = new AliMUONGeometryTransformer();
198 gMUONGeometryTransformer->LoadGeometryData();
199 gTriggerCircuit = new AliMUONTriggerCircuit(gMUONGeometryTransformer);
202 // convert ESD objects to MUON objects
203 AliMUONESDInterface data;
204 data.LoadEvent(*esd);
207 TEveElementList* trackCont = new TEveElementList("ESD MUON Tracks");
208 trackCont->SetTitle(Form("N=%d", esd->GetNumberOfMuonTracks()));
210 TEveTrackList* match = new TEveTrackList("Matched");
211 match->SetRnrPoints(kFALSE);
212 match->SetRnrLine(kTRUE);
213 match->SetLineColor(kGreen);
214 esd_muon_track_propagator_setup(match->GetPropagator(), kTRUE, kTRUE);
215 trackCont->AddElement(match);
217 TEveTrackList* nomatch = new TEveTrackList("Not matched");
218 nomatch->SetRnrPoints(kFALSE);
219 nomatch->SetRnrLine(kTRUE);
220 nomatch->SetLineColor(kAzure);
221 esd_muon_track_propagator_setup(nomatch->GetPropagator(), kTRUE, kFALSE);
222 trackCont->AddElement(nomatch);
224 TEveTrackList* ghost = new TEveTrackList("Ghost");
225 ghost->SetRnrPoints(kFALSE);
226 ghost->SetRnrLine(kTRUE);
227 ghost->SetLineColor(kAzure);
228 esd_muon_track_propagator_setup(ghost->GetPropagator(), kFALSE, kTRUE);
229 trackCont->AddElement(ghost);
232 TEvePointSet* clusterList = 0x0;
233 if (showClusters && (data.GetNClusters() > 0 || gEve->GetKeepEmptyCont()))
235 clusterList = new TEvePointSet(10000);
236 clusterList->SetName("ESD MUON Clusters");
237 clusterList->SetTitle(Form("N=%d",data.GetNClusters()));
238 clusterList->SetPickable(kFALSE);
239 clusterList->SetMarkerStyle(5);
240 clusterList->SetMarkerColor(kYellow);
241 clusterList->SetMarkerSize(2.5);
245 TEveElementList* digitCont = 0x0;
246 TEveQuadSet* bending = 0x0;
247 TEveQuadSet* nonBending = 0x0;
248 if (showDigits && (data.GetNDigits() > 0 || gEve->GetKeepEmptyCont()))
250 digitCont = new TEveElementList("ESD MUON Digits");
251 digitCont->SetTitle(Form("N=%d",data.GetNDigits()));
253 bending = new TEveQuadSet(TEveQuadSet::kQT_RectangleXY, kFALSE, 32);
254 bending->SetName("Bending");
255 bending->SetRenderMode(TEveDigitSet::kRM_Fill);
256 bending->SetPickable(kFALSE);
257 digitCont->AddElement(bending);
259 nonBending = new TEveQuadSet(TEveQuadSet::kQT_RectangleXY, kFALSE, 32);
260 nonBending->SetName("Non bending");
261 nonBending->SetRenderMode(TEveDigitSet::kRM_Line);
262 nonBending->SetPickable(kFALSE);
263 digitCont->AddElement(nonBending);
266 // add tracks to the proper list and propagate them
267 add_esd_muon_tracks(esd, &data, match, nomatch, ghost);
268 match->SetTitle(Form("N=%d",match->NumChildren()));
269 nomatch->SetTitle(Form("N=%d",nomatch->NumChildren()));
270 ghost->SetTitle(Form("N=%d",ghost->NumChildren()));
272 nomatch->MakeTracks();
275 // add cluster to the container
278 TEveUtil::LoadMacro("muon_clusters.C+");
279 TIter next(data.CreateClusterIterator());
280 gROOT->ProcessLine(Form("add_muon_clusters((TIter*)%p, (TEvePointSet*)%p);",&next, clusterList));
283 // add digits to the containers
286 TEveUtil::LoadMacro("muon_digits.C+");
287 TIter next(data.CreateDigitIterator());
288 gROOT->ProcessLine(Form("add_muon_digits((TIter*)%p, (TEveQuadSet*)%p, (TEveQuadSet*)%p, kFALSE);",
289 &next, bending, nonBending));
291 // set containers' title
292 bending->SetTitle(Form("N=%d",bending->GetPlex()->Size()));
293 nonBending->SetTitle(Form("N=%d",nonBending->GetPlex()->Size()));
296 gStyle->SetPalette(1);
297 bending->AssertPalette();
298 nonBending->AssertPalette();
301 // add graphic containers
302 gEve->DisableRedraw();
303 gEve->AddElement(trackCont);
304 if (clusterList) gEve->AddElement(clusterList);
305 if (digitCont) gEve->AddElement(digitCont);
306 gEve->EnableRedraw();