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