there have been some changes in the on-line tracklet and GTU track
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDData.cxx
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 #include "TROOT.h"
11 #include "TVector.h"
12 #include "TLinearFitter.h"
13 #include "TCanvas.h"
14 #include "TGeoMatrix.h"
15
16 #include "TEveTrans.h"
17 #include "TEveManager.h"
18
19 #include "EveBase/AliEveEventManager.h"
20
21 #include "AliEveTRDData.h"
22 #include "AliEveTRDModuleImp.h"
23 #include "AliEveTRDLoader.h"
24 #include "AliEveTRDLoaderImp.h"
25
26 #include "AliGeomManager.h"
27 #include "AliESDtrack.h"
28 #include "AliLog.h"
29 #include "AliPID.h"
30 #include "AliTrackPointArray.h"
31 #include "AliRieman.h"
32
33 #include "AliTRDhit.h"
34 #include "AliTRDcluster.h"
35 #include "AliTRDseedV1.h"
36 #include "AliTRDtrackletMCM.h"
37 #include "AliTRDtrackletWord.h"
38 #include "AliTRDmcmSim.h"
39 #include "AliTRDtrackV1.h"
40 #include "AliTRDtrackerV1.h"
41 #include "AliTRDpadPlane.h"
42 #include "AliTRDdigitsManager.h"
43 #include "AliTRDmcmSim.h"
44 #include "AliTRDarrayADC.h"
45 #include "AliTRDSignalIndex.h"
46 #include "AliTRDgeometry.h"
47 #include "AliTRDtransform.h"
48 #include "AliTRDReconstructor.h"
49 #include "AliTRDrecoParam.h"
50
51 ClassImp(AliEveTRDHits)
52 ClassImp(AliEveTRDDigits)
53 ClassImp(AliEveTRDClusters)
54 ClassImp(AliEveTRDTracklet)
55 ClassImp(AliEveTRDTrack)
56 ClassImp(AliEveTRDTrackletOnline)
57 ClassImp(AliEveTRDmcm)
58
59 ///////////////////////////////////////////////////////////
60 /////////////   AliEveTRDDigits       /////////////////////
61 ///////////////////////////////////////////////////////////
62
63 //______________________________________________________________________________
64 AliEveTRDDigits::AliEveTRDDigits(AliEveTRDChamber *p) :
65   TEveQuadSet("digits", ""), fParent(p), fBoxes(), fData()
66 {
67   // Constructor.
68 }
69
70 //______________________________________________________________________________
71 AliEveTRDDigits::~AliEveTRDDigits()
72 {
73 //  AliInfo(GetTitle());
74 }
75
76 //______________________________________________________________________________
77 void AliEveTRDDigits::ComputeRepresentation()
78 {
79   // Calculate digits representation according to user settings. The
80   // user can set the following parameters:
81   // - digits scale (log/lin)
82   // - digits threshold
83   // - digits apparence (quads/boxes)
84
85   if(!fData.HasData()){
86     return;
87   }
88
89   TEveQuadSet::Reset(TEveQuadSet::kQT_RectangleYZ, kTRUE, 64);
90
91   Double_t scale, dy, dz;
92   Int_t q, color;
93   Int_t nrows = fData.GetNrow(),
94         ncols = fData.GetNcol(),
95         ntbs  = fData.GetNtime(),
96         det   = fParent->GetID(),
97         ly    = AliTRDgeometry::GetLayer(det),
98         stk   = AliTRDgeometry::GetStack(det),
99         sec   = AliTRDgeometry::GetSector(det),
100         vid   = AliGeomManager::LayerToVolUID(AliGeomManager::kTRD1 + ly, stk + AliTRDgeometry::Nstack() * sec);
101   Float_t threshold = fParent->GetDigitsThreshold();
102   Short_t sig[7]={0,0,0,10,0,0,0};
103
104   AliTRDtransform transform(det);
105   AliTRDgeometry *geo = fParent->fGeo;
106   AliTRDpadPlane *pp = geo->GetPadPlane(geo->GetLayer(det), geo->GetStack(det));
107
108   // express position in tracking coordinates
109   AliTRDcluster c;
110   fData.Expand();
111   for (Int_t ir = 0; ir < nrows; ir++) {
112     dz = pp->GetRowSize(ir);
113     for (Int_t ic = 0; ic < ncols; ic++) {
114       dy = pp->GetColSize(ic);
115       for (Int_t it = 0; it < ntbs; it++) {
116         q = fData.GetData(ir, ic, it);
117         if (q < threshold) continue;
118         
119 /*        Double_t x[6] = {0., 0., Double_t(q), 0., 0., 0.}; 
120         Int_t  roc[3] = {ir, ic, 0}; 
121         Bool_t    out = kTRUE;*/
122         
123         new (&c) AliTRDcluster(det, ic, ir, it, sig, vid);
124         transform.Transform(&c);
125
126         scale = q < 512 ? q/512. : 1.;
127         color  = 50+int(scale*50.);
128         
129         AliDebug(4, Form("y[%f] z[%f] x[%f] w[%f] h[%f]\n", c.GetY(), c.GetZ(), c.GetX(), .9*dy, dz*scale));
130         AddQuad(c.GetY(), c.GetZ(), c.GetX(), .9*dy, dz*scale);
131         QuadValue(q);
132         QuadColor(color);
133         QuadId(new TNamed(Form("Charge%d", q), "dummy title"));
134       }  // end time loop
135     }  // end col loop
136   }  // end row loop
137   fData.Compress();
138   
139   // rotate to global coordinates
140   //RefitPlex();
141   TEveTrans& t = RefMainTrans();
142   t.SetRotByAngles((sec+.5)*AliTRDgeometry::GetAlpha(), 0.,0.);
143 }
144
145 //______________________________________________________________________________
146 void AliEveTRDDigits::SetData(AliTRDdigitsManager *digits)
147 {
148   // Set data source.
149
150   Int_t det(fParent->GetID());
151   AliTRDarrayADC *data = digits->GetDigits(det);
152   if(!data->GetDim()) return;
153   data->Expand();
154
155   AliTRDSignalIndex *indexes = digits->GetIndexes(det);
156   if(!indexes->IsAllocated()) digits->BuildIndexes(det);
157
158   if(!fData.HasData()) fData.Allocate(data->GetNrow(), data->GetNcol(), data->GetNtime());
159   fData.Expand();
160
161   Int_t row, col, time, adc;
162   indexes->ResetCounters();
163   while (indexes->NextRCIndex(row, col)){
164     indexes->ResetTbinCounter();
165     while (indexes->NextTbinIndex(time)){
166       if(data->IsPadCorrupted(row, col, time)){
167         // we should mark this position
168         break;
169       }
170       adc = data->GetData(row, col, time);
171       if(adc <= 1) continue;
172       fData.SetData(row, col, time, adc);
173       //fIndex->AddIndexTBin(row,col,time);
174       //printf("\tr[%d] c[%d] t[%d] ADC[%d]\n", row, col, time, adc);
175     } 
176   }
177   fData.Compress();
178 }
179
180
181 // //______________________________________________________________________________
182 // void AliEveTRDDigits::Paint(Option_t *option)
183 // {
184 //   // Paint the object.
185 // 
186 //   if(fParent->GetDigitsBox()) fBoxes.Paint(option);
187 //   else TEveQuadSet::Paint(option);
188 // }
189
190 //______________________________________________________________________________
191 void AliEveTRDDigits::Reset()
192 {
193   // Reset raw and visual data.
194
195   TEveQuadSet::Reset(TEveQuadSet::kQT_RectangleYZ, kTRUE, 64);
196   // MT fBoxes.fBoxes.clear();
197   fData.Reset();
198 }
199
200 ///////////////////////////////////////////////////////////
201 /////////////   AliEveTRDHits         /////////////////////
202 ///////////////////////////////////////////////////////////
203
204 //______________________________________________________________________________
205 AliEveTRDHits::AliEveTRDHits() : TEvePointSet("hits", 20)
206 {
207   // Constructor.
208   SetMarkerSize(.1);
209   SetMarkerColor(kGreen);
210   SetOwnIds(kTRUE);
211 }
212
213 //______________________________________________________________________________
214 AliEveTRDHits::~AliEveTRDHits()
215 {
216   //AliInfo(GetTitle());
217 }
218
219 //______________________________________________________________________________
220 void AliEveTRDHits::PointSelected(Int_t n)
221 {
222   // Handle an individual point selection from GL.
223
224   AliTRDhit *h = NULL;
225   if(!(h = dynamic_cast<AliTRDhit*>(GetPointId(n)))) return;
226   printf("Id[%3d] Det[%3d] Reg[%c] TR[%c] Q[%3d] MC[%d] t[%f]\n", 
227     n, h->GetDetector(), 
228     h->FromAmplification() ? 'A' : 'D', 
229     h->FromTRphoton() ? 'y' : 'n', 
230     h->GetCharge(), h->GetTrack(), h->GetTime());
231 }
232
233
234 ///////////////////////////////////////////////////////////
235 /////////////   AliEveTRDClusters         /////////////////////
236 ///////////////////////////////////////////////////////////
237
238 //______________________________________________________________________________
239 AliEveTRDClusters::AliEveTRDClusters():AliEveTRDHits()
240 {
241   // Constructor.
242   SetName("clusters");
243
244   SetMarkerSize(.4);
245   SetMarkerStyle(24);
246   SetMarkerColor(kGray);
247   SetOwnIds(kTRUE);
248 }
249
250 //______________________________________________________________________________
251 void AliEveTRDClusters::PointSelected(Int_t n)
252 {
253   // Handle an individual point selection from GL.
254
255   AliTRDcluster *c = dynamic_cast<AliTRDcluster*>(GetPointId(n));
256   if(!c) return;
257   c->Print();
258   Emit("PointSelected(Int_t)", n);
259   // Bool_t     AliCluster::GetGlobalCov(Float_t* cov) const
260   // Bool_t     AliCluster::GetGlobalXYZ(Float_t* xyz) const
261   // Float_t    AliCluster::GetSigmaY2() const
262   // Float_t    AliCluster::GetSigmaYZ() const
263   // Float_t    AliCluster::GetSigmaZ2() const
264 }
265
266 //______________________________________________________________________________
267 void AliEveTRDClusters::Print(Option_t *o) const
268 {
269   AliTRDcluster *c = NULL;
270
271   for(Int_t n = GetN(); n--;){
272     if(!(c = dynamic_cast<AliTRDcluster*>(GetPointId(n)))) continue;
273     c->Print(o);
274   }
275 }
276
277 //______________________________________________________________________________
278 void AliEveTRDClusters::Load(Char_t *w, Bool_t stk) const
279 {
280   Int_t typ = -1;
281   if(strcmp(w, "hit")==0) typ = 0;
282   else if(strcmp(w, "dig")==0) typ = 1;
283   else if(strcmp(w, "cls")==0) typ = 2;
284   else if(strcmp(w, "all")==0) typ = 3;
285   else{
286     AliInfo("The following arguments are accepted:");
287     AliInfo("   \"hit\" : loading of MC hits");
288     AliInfo("   \"dig\" : loading of digits");
289     AliInfo("   \"cls\" : loading of reconstructed clusters");
290     AliInfo("   \"all\" : loading of MC hits+digits+clusters");
291     return;
292   }
293
294   AliTRDcluster *c = NULL;
295   Int_t n = 0;
296   while((n = GetN() && !(c = dynamic_cast<AliTRDcluster*>(GetPointId(n))))) n++;
297   if(!c) return;
298
299   Int_t det = c->GetDetector();
300   AliEveTRDLoader *loader = NULL;
301   switch(typ){
302   case 0:  
303     loader = new AliEveTRDLoader("Hits");
304     if(!loader->Open("TRD.Hits.root")){ 
305       delete loader;
306       return;
307     }
308     loader->SetDataType(AliEveTRDLoader::kTRDHits);
309     break;
310   case 1:
311     loader = new AliEveTRDLoader("Digits");
312     if(!loader->Open("TRD.Digits.root")){ 
313       delete loader;
314       return;
315     }
316     loader->SetDataType(AliEveTRDLoader::kTRDDigits);
317     break;
318   case 2:
319     loader = new AliEveTRDLoader("Clusters");
320     if(!loader->Open("TRD.RecPoints.root")){ 
321       delete loader;
322       return;
323     }
324     loader->SetDataType(AliEveTRDLoader::kTRDClusters);
325     break;
326   case 3:
327     loader = new AliEveTRDLoaderSim("MC");
328     if(!loader->Open("galice.root")){ 
329       delete loader;
330       return;
331     }
332     loader->SetDataType(AliEveTRDLoader::kTRDHits | AliEveTRDLoader::kTRDDigits | AliEveTRDLoader::kTRDClusters);
333     break;
334   default: return;
335   }
336
337   loader->AddChambers(AliTRDgeometry::GetSector(det),AliTRDgeometry::GetStack(det), stk ? -1 : AliTRDgeometry::GetLayer(det));
338   // load first event
339   loader->GoToEvent(AliEveEventManager::GetCurrent()->GetEventId());
340   
341   // register loader with alieve
342   gEve->AddElement(loader);
343   //loader->SpawnEditor();
344   gEve->Redraw3D();
345 }
346
347 ///////////////////////////////////////////////////////////
348 /////////////   AliEveTRDTracklet         /////////////////////
349 ///////////////////////////////////////////////////////////
350
351 //______________________________________________________________________________
352 AliEveTRDTracklet::AliEveTRDTracklet(AliTRDseedV1 *trklt):TEveLine()
353   ,fClusters(NULL)
354 {
355   // Constructor.
356   SetName("tracklet");
357   
358   SetUserData(trklt);
359   Float_t dx;
360   Float_t x0   = trklt->GetX0();
361   Float_t y0   = trklt->GetYref(0);
362   Float_t z0   = trklt->GetZref(0);
363   Float_t dydx = trklt->GetYref(1);
364   Float_t dzdx = trklt->GetZref(1);
365   Float_t tilt = trklt->GetTilt();
366   Float_t g[3];
367   AliTRDcluster *c = NULL;
368   for(Int_t ic=0; ic<AliTRDseedV1::kNclusters; ic++){
369     if(!(c = trklt->GetClusters(ic))) continue;
370     if(!fClusters) AddElement(fClusters = new AliEveTRDClusters());
371     dx = x0 - c->GetX();
372     //Float_t yt = y0 - dx*dydx;
373     Float_t zt = z0 - dx*dzdx;
374     // backup yc - for testing purposes
375     Float_t yc = c->GetY(); 
376     c->SetY(yc-tilt*(c->GetZ()-zt));
377     c->GetGlobalXYZ(g); 
378     Int_t id = fClusters->SetNextPoint(g[0], g[1], g[2]);    
379     //Int_t id = fClusters->SetNextPoint(c->GetX(), c->GetY(), c->GetZ());    
380     c->SetY(yc);
381     fClusters->SetPointId(id, new AliTRDcluster(*c));
382   } 
383   if(fClusters){
384     fClusters->SetTitle(Form("N[%d]", trklt->GetN2()));
385     fClusters->SetMarkerColor(kMagenta);
386   }
387
388   SetTitle(Form("Det[%d] Plane[%d] P[%7.3f]", trklt->GetDetector(), trklt->GetPlane(), trklt->GetMomentum()));
389   SetLineColor(kRed);
390   //SetOwnIds(kTRUE);
391   
392   // init tracklet line
393   Int_t sec = AliTRDgeometry::GetSector(trklt->GetDetector());
394   Double_t alpha = AliTRDgeometry::GetAlpha() * (sec<9 ? sec + .5 : sec - 17.5); 
395
396   //trklt->Fit(kTRUE);
397   y0   = trklt->GetYfit(0);
398   dydx = trklt->GetYfit(1);
399   Double_t xg =  x0 * TMath::Cos(alpha) - y0 * TMath::Sin(alpha); 
400   Double_t yg = x0 * TMath::Sin(alpha) + y0 * TMath::Cos(alpha);
401   SetPoint(0, xg, yg, z0); 
402   //SetPoint(0, x0, y0, z0);
403
404
405   dx = .5*AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght();
406   x0 -= dx; 
407   y0 -= dydx*dx,
408   z0 -= dzdx*dx; 
409   xg = x0 * TMath::Cos(alpha) - y0 * TMath::Sin(alpha); 
410   yg = x0 * TMath::Sin(alpha) + y0 * TMath::Cos(alpha);
411   SetPoint(1, xg, yg, z0);
412   //SetPoint(1, x0, y0, z0);
413 }
414
415
416 AliEveTRDTracklet::~AliEveTRDTracklet() 
417 {
418
419 }
420
421 //______________________________________________________________________________
422 void AliEveTRDTracklet::Print(Option_t *o) const
423 {
424   AliTRDseedV1 *tracklet = (AliTRDseedV1*)GetUserData();
425   if(!tracklet) return;
426   tracklet->Print(o);
427 }
428
429 ///////////////////////////////////////////////////////////
430 /////////////   AliEveTRDTrack         /////////////////////
431 ///////////////////////////////////////////////////////////
432
433 //______________________________________________________________________________
434 AliEveTRDTrack::AliEveTRDTrack(AliTRDtrackV1 *trk) 
435   :TEveLine()
436   ,fTrackState(0)
437   ,fESDStatus(0)
438   ,fAlpha(0.)
439   ,fPoints(NULL)
440   ,fRim(NULL)
441 {
442   // Constructor.
443   SetUserData(trk);
444   SetName("");
445
446   AliTRDtrackerV1::SetNTimeBins(24);
447
448   fRim = new AliRieman(trk->GetNumberOfClusters());
449   AliTRDseedV1 *tracklet = NULL;
450   for(Int_t il=0; il<AliTRDgeometry::kNlayer; il++){
451     if(!(tracklet = trk->GetTracklet(il))) continue;
452     if(!tracklet->IsOK()) continue;
453     AddElement(new AliEveTRDTracklet(tracklet));
454
455     AliTRDcluster *c = NULL;
456 //     tracklet->ResetClusterIter(kFALSE);
457 //     while((c = tracklet->PrevCluster())){
458     for(Int_t ic=AliTRDseedV1::kNtb; ic--;){
459       if(!(c=tracklet->GetClusters(ic))) continue;
460       Float_t xc = c->GetX();
461       Float_t yc = c->GetY();
462       Float_t zc = c->GetZ();
463       Float_t zt = tracklet->GetZref(0) - (tracklet->GetX0()-xc)*tracklet->GetZref(1); 
464       yc -= tracklet->GetTilt()*(zc-zt);
465       fRim->AddPoint(xc, yc, zc, .05, 2.3);
466     }
467   }
468   if(trk->GetNumberOfTracklets()>1) fRim->Update();
469   SetStatus(fTrackState);
470 }
471
472 //______________________________________________________________________________
473 AliEveTRDTrack::~AliEveTRDTrack()
474 {
475   if(fPoints) delete [] fPoints; fPoints = NULL;
476   //delete dynamic_cast<AliTRDtrackV1*>(GetUserData());
477 }
478
479 //______________________________________________________________________________
480 void AliEveTRDTrack::Print(Option_t *o) const
481 {
482   AliTRDtrackV1 *track = (AliTRDtrackV1*)GetUserData();
483   if(!track) return;
484   track->Print(o);
485 }
486
487 //______________________________________________________________________________
488 void AliEveTRDTrack::SetStatus(UChar_t s)
489 {
490   // nothing to be done
491   if(fPoints && fTrackState == s) return;
492
493   const Int_t nc = AliTRDtrackV1::kMAXCLUSTERSPERTRACK;
494   AliTRDtrackV1 *trk(NULL);
495   if(!(trk=static_cast<AliTRDtrackV1*>(GetUserData()))) {
496     AliError("Failed casting data to TRD track.");
497     return;
498   }
499
500   Bool_t BUILD = kFALSE;
501   if(!fPoints){ 
502     fPoints = new AliTrackPoint[nc];
503
504     // define the radial span of the track in the TRD
505     Double_t xmin = -1., xmax = -1.;
506     Int_t det = 0;
507     AliTRDseedV1 *trklt = NULL;
508     for(Int_t ily=0; ily<AliTRDgeometry::kNlayer; ily++){
509       if(!(trklt = trk->GetTracklet(ily))) continue;
510       if(xmin<0.) xmin = trklt->GetX0() - AliTRDgeometry::CamHght() - AliTRDgeometry::CdrHght();
511       if(trklt->GetX0()>xmax) xmax = trklt->GetX0();
512       det = trklt->GetDetector();
513     }
514     Int_t sec = det/AliTRDgeometry::kNdets;
515     fAlpha = AliTRDgeometry::GetAlpha() * (sec<9 ? sec + .5 : sec - 17.5); //trk->GetAlpha()
516
517     Double_t dx =(xmax - xmin)/nc;
518     for(Int_t ip=0; ip<nc; ip++){
519       fPoints[ip].SetXYZ(xmin, 0., 0.);
520       xmin+=dx;
521     }
522     BUILD = kTRUE;
523   }
524
525   // select track model
526   if(BUILD || ((s&12) != (fTrackState&12))){
527     if(TESTBIT(s, kTrackCosmics)){
528       //printf("Straight track\n");
529       AliTRDtrackerV1::FitLine(trk, NULL, kFALSE, nc, fPoints);
530     } else {
531       if(TESTBIT(s, kTrackModel)){
532         //printf("Kalman track\n");
533         if(trk->GetNumberOfTracklets() >=4) AliTRDtrackerV1::FitKalman(trk, NULL, kFALSE, nc, fPoints);
534       } else { 
535         //printf("Rieman track\n");
536         if(trk->GetNumberOfTracklets() >=4) AliTRDtrackerV1::FitRiemanTilt(trk, NULL, kTRUE, nc, fPoints);
537         Float_t x = 0.;
538         for(Int_t ip = nc; ip--;){
539           x = fPoints[ip].GetX();
540           fPoints[ip].SetXYZ(x, fRim->GetYat(x), fRim->GetZat(x));
541         }
542       }
543     }
544   
545     Float_t global[3];
546     for(Int_t ip=0; ip<nc; ip++){
547       fPoints[ip].Rotate(-fAlpha).GetXYZ(global);
548       SetPoint(ip, global[0], global[1], global[2]);
549     }
550     SetSmooth(kTRUE);
551   }
552
553   // set color
554   if(BUILD || ((s&3) != (fTrackState&3))){
555     if(TESTBIT(s, kSource)){
556       //printf("Source color\n");
557       if(fESDStatus&AliESDtrack::kTRDin){
558         SetMarkerColor(kGreen);
559         SetLineColor(kGreen);
560       } else {
561         SetMarkerColor(kMagenta);
562         SetLineColor(kMagenta);
563       }
564     } else {
565       if(TESTBIT(s, kPID) == AliTRDpidUtil::kLQ){
566         //printf("PID color kLQPID\n");
567         //trk->GetReconstructor()->SetOption("!nn");
568       } else {
569         //printf("PID color kNNPID\n");
570         //trk->GetReconstructor()->SetOption("nn");
571       }
572       //trk->CookPID();
573   
574       Int_t species = 0; Float_t pid = 0.;
575       for(Int_t is=0; is<AliPID::kSPECIES; is++) 
576         if(trk->GetPID(is) > pid){
577           pid = trk->GetPID(is);
578           species = is;
579         }
580       switch(species){
581       case AliPID::kElectron:
582         SetMarkerColor(kRed);
583         SetLineColor(kRed);
584         break;
585       default:
586         SetMarkerColor(kBlue);
587         SetLineColor(kBlue);
588         break;
589       }
590     }
591     SetLineWidth(2);
592   }
593   
594   const Char_t *model = "line";
595   if(!TESTBIT(s, kTrackCosmics)){
596     if(TESTBIT(s, kTrackModel)) model = "kalman";
597     else model = "rieman";
598   }
599   Int_t species = 0; Float_t pid = 0.;
600   for(Int_t is=0; is<AliPID::kSPECIES; is++) 
601     if(trk->GetPID(is) > pid){
602       pid = trk->GetPID(is);
603       species = is;
604     }
605
606   SetTitle(Form(
607     "Tracklets[%d] Clusters[%d]\n"
608     "Reconstruction Source[%s]\n"
609     "PID[%4.1f %4.1f %4.1f %4.1f %4.1f]\n"
610     "MC[%d]", trk->GetNumberOfTracklets(), trk->GetNumberOfClusters(), fESDStatus&AliESDtrack::kTRDin ? "barrel" : "sa",
611     1.E2*trk->GetPID(0), 1.E2*trk->GetPID(1),
612     1.E2*trk->GetPID(2), 1.E2*trk->GetPID(3), 1.E2*trk->GetPID(4), trk->GetLabel()));
613
614   if(GetName()){
615     char id[6]; strncpy(id, GetName(), 6); 
616     SetName(Form("%s %s", id, AliPID::ParticleName(species)));
617   }
618
619   // save track status
620   fTrackState = s;
621 }
622
623
624 AliEveTRDTrackletOnline::AliEveTRDTrackletOnline(AliTRDtrackletMCM *tracklet) :
625   TEveLine(),
626   fDetector(-1),
627   fROB(-1),
628   fMCM(-1)
629 {
630   AliTRDtrackletMCM *trkl = new AliTRDtrackletMCM(*tracklet);
631   SetUserData(trkl);
632
633   fDetector = trkl->GetDetector();
634   fROB = trkl->GetROB();
635   fMCM = trkl->GetMCM();
636
637   SetName("sim. tracklet");
638   SetTitle(Form("Det: %i, ROB: %i, MCM: %i, Label: %i\n0x%08x", 
639                 trkl->GetDetector(), trkl->GetROB(), trkl->GetMCM(), trkl->GetLabel(),
640                 trkl->GetTrackletWord()));
641   SetLineColor(kGreen);
642   SetLineWidth(3);
643
644   AliTRDgeometry geo;
645   TGeoHMatrix *matrix = geo.GetClusterMatrix(trkl->GetDetector());
646
647   fDetector = trkl->GetDetector();
648   fROB = trkl->GetROB();
649   fMCM = trkl->GetMCM();
650   
651   Float_t length = 3.;
652   Double_t x[3];
653   Double_t p[3];
654   Double_t p2[3];
655   x[0] = AliTRDgeometry::AnodePos(); 
656   x[1] = trkl->GetY();
657   x[2] = trkl->GetLocalZ();
658
659   matrix->LocalToMaster(x, p);
660   geo.RotateBack(trkl->GetDetector(), p, p2);
661   SetPoint(0, p2[0], p2[1], p2[2]);
662
663   x[0] -= length;
664   x[1] -= length * trkl->GetdYdX();
665   matrix->LocalToMaster(x, p);
666   p[2] *= p[0] / (p[0] + length);
667   geo.RotateBack(trkl->GetDetector(), p, p2);
668   SetPoint(1, p2[0], p2[1], p2[2]);
669 }
670
671 AliEveTRDTrackletOnline::AliEveTRDTrackletOnline(AliTRDtrackletWord *tracklet) :
672   TEveLine(),
673   fDetector(-1),
674   fROB(-1),
675   fMCM(-1)
676 {
677   AliTRDtrackletWord *trkl = new AliTRDtrackletWord(*tracklet);
678   SetUserData(trkl);
679
680   fDetector = trkl->GetDetector();
681   fROB = trkl->GetROB(); 
682   fMCM = trkl->GetMCM(); 
683
684   SetName("raw tracklet");
685   SetTitle(Form("Det: %i, ROB: %i, MCM: %i, Label: %i\n0x%08x", 
686                 trkl->GetDetector(), fROB, fMCM, -1,
687                 trkl->GetTrackletWord()));
688   SetLineColor(kRed);
689   SetLineWidth(3);
690
691   AliTRDgeometry geo;
692   TGeoHMatrix *matrix = geo.GetClusterMatrix(trkl->GetDetector());
693
694   Float_t length = 3.;
695   Double_t x[3];
696   Double_t p[3];
697   Double_t p2[3];
698   x[0] = AliTRDgeometry::AnodePos();
699   x[1] = trkl->GetY();
700   x[2] = trkl->GetLocalZ();
701   
702   matrix->LocalToMaster(x, p);
703   geo.RotateBack(trkl->GetDetector(), p, p2);
704   SetPoint(0, p2[0], p2[1], p2[2]);
705
706   x[0] -= length;
707   x[1] -= length * trkl->GetdYdX();
708   matrix->LocalToMaster(x, p);
709   p[2] *= p[0] / (p[0] + length);
710   geo.RotateBack(trkl->GetDetector(), p, p2);
711   SetPoint(1, p2[0], p2[1], p2[2]);
712 }
713
714 AliEveTRDTrackletOnline::~AliEveTRDTrackletOnline() 
715 {
716   delete ((AliTRDtrackletBase*) GetUserData());
717   SetUserData(0x0);
718 }
719
720 void AliEveTRDTrackletOnline::ShowMCM(Option_t *opt) const
721 {
722   if (fDetector < 0 || fROB < 0 || fMCM < 0)
723     return;
724
725   AliEveTRDmcm *evemcm = new AliEveTRDmcm();
726   evemcm->Init(fDetector, fROB, fMCM);
727   evemcm->LoadDigits();
728   evemcm->Draw(opt);
729
730   TEveElementList *mcmlist = NULL;
731   if (gEve->GetCurrentEvent()) 
732     mcmlist = (TEveElementList*) gEve->GetCurrentEvent()->FindChild("TRD MCMs");
733   if (!mcmlist) {
734     mcmlist = new TEveElementList("TRD MCMs");
735     gEve->AddElement(mcmlist);
736   }
737   gEve->AddElement(evemcm, mcmlist);
738 }
739
740
741 AliEveTRDmcm::AliEveTRDmcm() :
742   TEveElement(),
743   TNamed(),
744   fMCM(new AliTRDmcmSim())
745 {
746   SetName("MCM");
747   SetTitle("Unknown MCM");
748 }
749
750 AliEveTRDmcm::~AliEveTRDmcm()
751 {
752   delete fMCM;
753 }
754
755 Bool_t AliEveTRDmcm::Init(Int_t det, Int_t rob, Int_t mcm)
756 {
757   SetName(Form("MCM: Det. %i, ROB %i, MCM %i", det, rob, mcm));
758   SetTitle(Form("MCM: Det. %i, ROB %i, MCM %i", det, rob, mcm));
759   fMCM->Init(det, rob, mcm);
760   fMCM->Reset();
761   return kTRUE;
762 }
763
764 Bool_t AliEveTRDmcm::LoadDigits()
765 {
766   AliRunLoader *rl = AliEveEventManager::AssertRunLoader();
767   return fMCM->LoadMCM(rl, fMCM->GetDetector(), 
768                        fMCM->GetRobPos(), fMCM->GetMcmPos());
769 }
770
771 Bool_t AliEveTRDmcm::Filter()
772 {
773   fMCM->Filter();
774   return kTRUE;
775 }
776
777 Bool_t AliEveTRDmcm::Tracklet()
778 {
779   fMCM->Tracklet();
780   return kTRUE;
781 }
782
783 void AliEveTRDmcm::Draw(Option_t* option)
784 {
785   const char *mcmname = Form("mcm_%i_%i_%i", fMCM->GetDetector(),
786                              fMCM->GetRobPos(), fMCM->GetMcmPos());
787
788   TCanvas *c = dynamic_cast<TCanvas*> (gROOT->FindObject(mcmname));
789   if (!c)
790     c = gEve->AddCanvasTab("TRD MCM");
791   c->SetTitle(Form("MCM %i on ROB %i of det. %i", 
792                    fMCM->GetMcmPos(), fMCM->GetRobPos(), fMCM->GetDetector()));
793   c->SetName(mcmname);
794   c->cd();
795   fMCM->Draw(option);
796 }
797
798 Bool_t AliEveTRDmcm::AssignPointer(const char* ptrname)
799 {
800   gROOT->ProcessLine(Form("AliTRDmcmSim* %s = (AliTRDmcmSim *) 0x%x", ptrname, fMCM));
801   return kTRUE;
802 }