]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVE/EveDet/AliEveTRDModuleImp.cxx
From Alexandru:
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTRDModuleImp.cxx
index df97c5bfd308adf93d3012450174137ae7732a19..a5c2c3989d3ffe35db39acf100bd5af48ead76e9 100644 (file)
  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
  * full copyright notice.                                                 *
  **************************************************************************/
+
 #include "AliEveTRDModuleImp.h"
 #include "AliEveTRDData.h"
 
-#include "TMath.h"
-#include <TGListTree.h>
+#include "TGListTree.h"
+#include "TClonesArray.h"
+#include "TGeoManager.h"
+#include "TGeoMatrix.h"
 
 #include "TEveManager.h"
 #include "TEveTrack.h"
+#include "TEveGeoNode.h"
+#include "TEveTrans.h"
+
 
 #include "AliLog.h"
-#include "AliRun.h"
-#include "AliTRDv1.h"
 #include "AliTRDgeometry.h"
 #include "AliTRDCommonParam.h"
 #include "AliTRDpadPlane.h"
-#include "AliTRDdigit.h"
 #include "AliTRDhit.h"
 #include "AliTRDcluster.h"
-#include "AliTRDcalibDB.h"
-#include "AliTRDdataArrayI.h"
 #include "AliTRDmcmTracklet.h"
 
-using namespace std;
-
 ClassImp(AliEveTRDChamber)
 ClassImp(AliEveTRDNode)
 
-//________________________________________________________
+//______________________________________________________________________________
 AliEveTRDNode::AliEveTRDNode(const char *typ, Int_t det) :
   TEveElement(), AliEveTRDModule(typ, det)
 {
+  // Xonstructor.
 }
 
-//________________________________________________________
-void   AliEveTRDNode::Paint(Option_t* option)
+//______________________________________________________________________________
+void AliEveTRDNode::Paint(Option_t* option)
 {
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
-               iter++;
-       }
+  // Paint object.
+
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    (dynamic_cast<AliEveTRDModule*>(*iter))->Paint(option);
+    iter++;
+  }
 }
 
-//________________________________________________________
-void   AliEveTRDNode::Reset()
+//______________________________________________________________________________
+void AliEveTRDNode::Reset()
 {
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
-               iter++;
-       }
+  // Reset.
+
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    (dynamic_cast<AliEveTRDModule*>(*iter))->Reset();
+    iter++;
+  }
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::Collapse()
 {
-       TGListTree *list = gEve->GetListTree();
-       AliEveTRDNode *node = 0x0;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
-               list->CloseItem(FindListTreeItem(list));
-               iter++;
-       }
+  // Collapse.
+
+  TGListTree *list = gEve->GetListTree();
+  AliEveTRDNode *node = 0x0;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Collapse();
+    list->CloseItem(FindListTreeItem(list));
+    iter++;
+  }
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::Expand()
 {
-       TGListTree *list = gEve->GetListTree();
-       AliEveTRDNode *node = 0x0;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
-               list->OpenItem(FindListTreeItem(list));
-               iter++;
-       }
+  // Expand.
+
+  TGListTree *list = gEve->GetListTree();
+  AliEveTRDNode *node = 0x0;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->Expand();
+    list->OpenItem(FindListTreeItem(list));
+    iter++;
+  }
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::EnableListElements()
 {
-       SetRnrSelf(kTRUE);
-       AliEveTRDNode *node = 0x0;
-       AliEveTRDChamber *chmb = 0x0;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
-                       node->SetRnrSelf(kTRUE);
-                       node->EnableListElements();
-               }
-               if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
-               iter++;
-       }
-       gEve->Redraw3D();
+  // Enable list elements.
+
+  SetRnrSelf(kTRUE);
+  AliEveTRDNode *node = 0x0;
+  AliEveTRDChamber *chmb = 0x0;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
+      node->SetRnrSelf(kTRUE);
+      node->EnableListElements();
+    }
+    if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kTRUE);
+    iter++;
+  }
+  gEve->Redraw3D();
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::DisableListElements()
 {
-       SetRnrSelf(kFALSE);
-       AliEveTRDNode *node = 0x0;
-       AliEveTRDChamber *chmb = 0x0;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
-                       node->SetRnrSelf(kFALSE);
-                       node->DisableListElements();
-               }
-               if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
-               iter++;
-       }
-       gEve->Redraw3D();
+  // Disable list elements.
+
+  SetRnrSelf(kFALSE);
+  AliEveTRDNode *node = 0x0;
+  AliEveTRDChamber *chmb = 0x0;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))){
+      node->SetRnrSelf(kFALSE);
+      node->DisableListElements();
+    }
+    if((chmb = dynamic_cast<AliEveTRDChamber*>(*iter))) chmb->SetRnrSelf(kFALSE);
+    iter++;
+  }
+  gEve->Redraw3D();
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::UpdateLeaves()
 {
-       AliEveTRDModule *module;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               module = dynamic_cast<AliEveTRDModule*>(*iter);
-               if(!module) continue;
-
-               module->fRnrHits = fRnrHits;
-               module->fRnrDigits = fRnrDigits;
-               module->fDigitsLog = fDigitsLog;
-               module->fDigitsBox = fDigitsBox;
-               module->fDigitsThreshold = fDigitsThreshold;
-               module->kDigitsNeedRecompute = kDigitsNeedRecompute;
-               module->fRnrRecPoints = fRnrRecPoints;
-               module->fRnrTracklets = fRnrTracklets;
-               iter++;
-       }
-
-       AliEveTRDNode *node = 0x0;
-       iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
-               iter++;
-       }
+  // Update leaves.
+
+  AliEveTRDModule *module;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    module = dynamic_cast<AliEveTRDModule*>(*iter);
+    if(!module) continue;
+
+    module->fRnrHits = fRnrHits;
+    module->fRnrDigits = fRnrDigits;
+    module->fDigitsLog = fDigitsLog;
+    module->fDigitsBox = fDigitsBox;
+    module->fDigitsThreshold = fDigitsThreshold;
+    module->fDigitsNeedRecompute = fDigitsNeedRecompute;
+    module->fRnrRecPoints = fRnrRecPoints;
+    module->fRnrTracklets = fRnrTracklets;
+    iter++;
+  }
+
+  AliEveTRDNode *node = 0x0;
+  iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateLeaves();
+    iter++;
+  }
 }
 
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDNode::UpdateNode()
 {
-//     Info("UpdateNode()", Form("%s", GetName()));
-       AliEveTRDNode *node = 0x0;
-       List_i iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
-               iter++;
-       }
-
-       Int_t score[11];
-       for(int i=0; i<11; i++) score[i] = 0;
-       AliEveTRDModule *module;
-       iter = fChildren.begin();
-       while(iter != fChildren.end()){
-               module = dynamic_cast<AliEveTRDModule*>(*iter);
-               if(!module) continue;
-               score[0] += (module->fLoadHits) ? 1 : 0;
-               score[1] += (module->fRnrHits) ? 1 : 0;
-
-               score[2] += (module->fLoadDigits) ? 1 : 0;
-               score[3] += (module->fRnrDigits) ? 1 : 0;
-               score[4] += (module->fDigitsLog) ? 1 : 0;
-               score[5] += (module->fDigitsBox) ? 1 : 0;
-               score[6] += (module->kDigitsNeedRecompute) ? 1 : 0;
-
-               score[7] += (module->fLoadRecPoints) ? 1 : 0;
-               score[8] += (module->fRnrRecPoints) ? 1 : 0;
-
-               score[9] += (module->fLoadTracklets) ? 1 : 0;
-               score[10] += (module->fRnrTracklets) ? 1 : 0;
-               iter++;
-       }
-
-       Int_t size = fChildren.size();
-       fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
-       fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
-
-       fLoadDigits    = (score[2] > 0) ? kTRUE : kFALSE;
-       fRnrDigits     = (score[3] == size) ? kTRUE : kFALSE;
-       fDigitsLog     = (score[4] == size) ? kTRUE : kFALSE;
-       fDigitsBox     = (score[5] == size) ? kTRUE : kFALSE;
-       kDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
-
-       fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
-       fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
-
-       fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
-       fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
-}
-
+  // Update node.
+
+  // Info("UpdateNode()", Form("%s", GetName()));
+  AliEveTRDNode *node = 0x0;
+  List_i iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    if((node = dynamic_cast<AliEveTRDNode*>(*iter))) node->UpdateNode();
+    iter++;
+  }
 
-///////////////////////////////////////////////////////////
-/////////////        AliEveTRDChamber       /////////////////////
-///////////////////////////////////////////////////////////
+  Int_t score[11];
+  for(int i=0; i<11; i++) score[i] = 0;
+  AliEveTRDModule *module;
+  iter = fChildren.begin();
+  while(iter != fChildren.end()){
+    module = dynamic_cast<AliEveTRDModule*>(*iter);
+    if(!module) continue;
+    score[0] += (module->fLoadHits) ? 1 : 0;
+    score[1] += (module->fRnrHits) ? 1 : 0;
+
+    score[2] += (module->fLoadDigits) ? 1 : 0;
+    score[3] += (module->fRnrDigits) ? 1 : 0;
+    score[4] += (module->fDigitsLog) ? 1 : 0;
+    score[5] += (module->fDigitsBox) ? 1 : 0;
+    score[6] += (module->fDigitsNeedRecompute) ? 1 : 0;
+
+    score[7] += (module->fLoadRecPoints) ? 1 : 0;
+    score[8] += (module->fRnrRecPoints) ? 1 : 0;
+
+    score[9] += (module->fLoadTracklets) ? 1 : 0;
+    score[10] += (module->fRnrTracklets) ? 1 : 0;
+    iter++;
+  }
 
-//________________________________________________________
-AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
-  TEveElement(), AliEveTRDModule("Chmb", det), rowMax(-1), colMax(-1), timeMax(22), fX0(0.), fPla(-1)
-{
-  //
-  // Constructor
-  //
+  Int_t size = fChildren.size();
+  fLoadHits      = (score[0] > 0) ? kTRUE : kFALSE;
+  fRnrHits       = (score[1] == size) ? kTRUE : kFALSE;
 
-       fDigits    = 0x0;
-       fHits      = 0x0;
-       fRecPoints = 0x0;
-       fTracklets = 0x0;
+  fLoadDigits    = (score[2] > 0) ? kTRUE : kFALSE;
+  fRnrDigits     = (score[3] == size) ? kTRUE : kFALSE;
+  fDigitsLog     = (score[4] == size) ? kTRUE : kFALSE;
+  fDigitsBox     = (score[5] == size) ? kTRUE : kFALSE;
+  fDigitsNeedRecompute = (score[6] == size) ? kTRUE : kFALSE;
 
-       AliTRDCommonParam* parCom = AliTRDCommonParam::Instance();
-       samplingFrequency = parCom->GetSamplingFrequency();
+  fLoadRecPoints = (score[7] > 0) ? kTRUE : kFALSE;
+  fRnrRecPoints  = (score[8] == size) ? kTRUE : kFALSE;
 
-       fGeo      = 0x0;
-       fPadPlane = 0x0;
+  fLoadTracklets = (score[9] > 0) ? kTRUE : kFALSE;
+  fRnrTracklets  = (score[10] == size) ? kTRUE : kFALSE;
 }
 
-//________________________________________________________
-AliEveTRDChamber::AliEveTRDChamber(const AliEveTRDChamber &mod):
-  TEveElement(), AliEveTRDModule("Chmb", mod.fDet)
-{
-  //
-  // Copy constructor
-  //
-       SetMainColor(mod.GetMainColor());
 
-       if(mod.fDigits) {}
-       if(mod.fHits) {}
-       if(mod.fRecPoints){}
-}
+///////////////////////////////////////////////////////////
+////////////      AliEveTRDChamber     ////////////////////
+///////////////////////////////////////////////////////////
 
-//________________________________________________________
-AliEveTRDChamber& AliEveTRDChamber::operator=(const AliEveTRDChamber &mod)
+//______________________________________________________________________________
+AliEveTRDChamber::AliEveTRDChamber(Int_t det) :
+  TEveElement()
+  ,AliEveTRDModule("Chmb", det)
+  ,fDigits(0x0)
+  ,fHits(0x0)
+  ,fRecPoints(0x0)
+  ,fTracklets(0x0)
+  ,fGeo(0x0)
+  ,fShape(0x0)
+  ,fNrows(-1)
+  ,fNcols(-1)
+  ,fNtime(22)
 {
   //
-  // Assignment operator
+  // Constructor
   //
-
-  if (this != &mod) {
-    fDet    = mod.fDet;
-               if(mod.fDigits) {}
-               if(mod.fHits) {}
-               if(mod.fRecPoints){}
-  }
-  return *this;
-}
-
-//________________________________________________________
-Int_t  AliEveTRDChamber::GetSM() const
-{
-       if(!fGeo){
-               AliWarning("Fail. No TRD geometry defined.");
-               return -1;
-       }
-       return fGeo->GetSector(fDet);
 }
 
-//________________________________________________________
-Int_t  AliEveTRDChamber::GetSTK() const
-{
-       if(!fGeo){
-               AliWarning("Fail. No TRD geometry defined.");
-               return -1;
-       }
-       return fGeo->GetChamber(fDet);
-}
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDChamber::LoadClusters(TObjArray *clusters)
 {
   //
   // Draw clusters
   //
 
-       if(!fGeo){
-               AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
-               return;
-       }
-
-       if(!fRecPoints){
-               fRecPoints = new AliEveTRDClusters(this);
-               fRecPoints->SetMarkerSize(1.);
-               fRecPoints->SetMarkerStyle(24);
-               fRecPoints->SetMarkerColor(6);
-               fRecPoints->SetOwnIds(kTRUE);
-       } else fRecPoints->Reset();
-
-       Float_t q;
-        Double_t cloc[3], cglo[3];
-
-       AliTRDcluster *c=0x0;
-       for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){
-               c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
-               cloc[0] = c->GetX();
-               cloc[1] = c->GetY();
-               cloc[2] = c->GetZ();
-               q = c->GetQ();
-               fGeo->RotateBack(fDet,cloc,cglo);
-               fRecPoints->SetNextPoint(cglo[0], cglo[1], cglo[2]);
-               fRecPoints->SetPointId(c);
-       }
-       fLoadRecPoints = kTRUE;
+  if(!fGeo){
+    AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
+    return;
+  }
+
+  if(!fRecPoints){
+    AddElement(fRecPoints = new AliEveTRDClusters(this));
+    fRecPoints->SetMarkerSize(.2);
+    fRecPoints->SetMarkerStyle(24);
+    fRecPoints->SetMarkerColor(kGreen);
+    fRecPoints->SetOwnIds(kTRUE);
+  }
+  fRecPoints->Reset();
+
+  Float_t q;
+  Float_t g[3]; //global coordinates
+  AliTRDcluster *c=0x0;
+  for(int iclus=0; iclus<clusters->GetEntriesFast(); iclus++){
+    c = (AliTRDcluster*)clusters->UncheckedAt(iclus);
+    c->GetGlobalXYZ(g); 
+    q = c->GetQ();
+    Int_t id = fRecPoints->SetNextPoint(g[0], g[1], g[2]);    
+    fRecPoints->SetPointId(id, new AliTRDcluster(*c));
+  }
+  fLoadRecPoints = kTRUE;
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDChamber::LoadDigits(AliTRDdigitsManager *digits)
 {
   //
   // Draw digits
   //
-       if(!fGeo){
-               AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
-               return;
-       }
-//     Info("LoadDigits()", Form("digits =0x%x", digits));
+  if(!fGeo){
+    AliError(Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
+    return;
+  }
+  // Info("LoadDigits()", Form("digits =0x%x", digits));
 
-       if(!fDigits) fDigits = new AliEveTRDDigits(this);
-       else fDigits->Reset();
+  if(!fDigits) AddElement(fDigits = new AliEveTRDDigits(this));
 
-       fDigits->SetData(digits);
-       fLoadDigits = kTRUE;
+  fDigits->Reset();
+  fDigits->SetData(digits);
+  fLoadDigits = kTRUE;
 }
 
-//________________________________________________________
-void AliEveTRDChamber::AddHit(AliTRDhit *hit)
+//______________________________________________________________________________
+void AliEveTRDChamber::LoadHits(TClonesArray *hits, Int_t &idx)
 {
   //
   // Draw hits
   //
-//     Info("AddHit()", Form("%s", GetName()));
-
-       if(!fHits){
-               fHits = new AliEveTRDHits(this);
-               fHits->SetMarkerSize(.1);
-               fHits->SetMarkerColor(2);
-               fHits->SetOwnIds(kTRUE);
-       }
-
-       fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
-       fHits->SetPointId(hit);
-       fLoadHits = kTRUE;
+  //Info("AddHit()", Form("%s", GetName()));
+
+  if(!fHits){
+    AddElement(fHits = new AliEveTRDHits(this));
+    fHits->SetMarkerSize(.1);
+    fHits->SetMarkerColor(2);
+    fHits->SetOwnIds(kTRUE);
+  }
+  fLoadHits = kTRUE;
+  Int_t nhits = hits->GetEntriesFast();
+
+  AliTRDhit *hit = 0x0;
+  while(idx<nhits){
+    hit = (AliTRDhit*)hits->UncheckedAt(idx);
+    if(hit->GetDetector() != fDet) return;
+
+    Int_t id = fHits->SetNextPoint(hit->X(), hit->Y(), hit->Z());
+    fHits->SetPointId(id, new AliTRDhit(*hit));
+    idx++;
+  }
+  return;
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDChamber::LoadTracklets(TObjArray *tracks)
 {
   //
   // Draw tracks
   //
-       if(!fGeo){
-               Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
-               return;
-       }
-//     Info("LoadTracklets()", Form("tracks = 0x%x", tracks));
-
-       if(!fTracklets){
-               fTracklets = new std::vector<TEveTrack*>;
-       } else fTracklets->clear();
-
-
-       AliTRDmcmTracklet *trk = 0x0;
-       Double_t cloc[3], cglo[3];
-       for(int itrk=0; itrk<tracks->GetEntries();itrk++){
-               trk = (AliTRDmcmTracklet*)tracks->At(itrk);
-               trk->MakeTrackletGraph(fGeo,.5);
-               fTracklets->push_back(new TEveTrack());
-               fTracklets->back()->SetLineColor(4);
-
-               cloc[0] = trk->GetTime0(); // x0
-               cloc[1] = trk->GetOffset(); // y0
-               cloc[2] = trk->GetRowz(); // z
-         fGeo->RotateBack(fDet,cloc,cglo);
-               fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
-
-               cloc[0] += 3.7; // x1
-               cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
-         fGeo->RotateBack(fDet,cloc,cglo);
-               fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
-       }
-       fLoadTracklets = kTRUE;
+  if(!fGeo){
+    Error("LoadTracklets()", Form("Geometry not set for chamber %d. Please call first AliEveTRDChamber::SetGeometry().", fDet));
+    return;
+  }
+  // Info("LoadTracklets()", Form("tracks = 0x%x", tracks));
+
+  if(!fTracklets){
+    fTracklets = new std::vector<TEveTrack*>;
+  } else fTracklets->clear();
+
+
+  AliTRDmcmTracklet *trk = 0x0;
+  Double_t cloc[3], cglo[3];
+  for(int itrk=0; itrk<tracks->GetEntries();itrk++){
+    trk = (AliTRDmcmTracklet*)tracks->At(itrk);
+    trk->MakeTrackletGraph(fGeo,.5);
+    fTracklets->push_back(new TEveTrack());
+    fTracklets->back()->SetLineColor(4);
+
+    cloc[0] = trk->GetTime0(); // x0
+    cloc[1] = trk->GetOffset(); // y0
+    cloc[2] = trk->GetRowz(); // z
+    fGeo->RotateBack(fDet,cloc,cglo);
+    fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
+
+    cloc[0] += 3.7; // x1
+    cloc[1] += TMath::Tan(trk->GetSlope()*TMath::Pi()/180.) * 3.7; // y1
+    fGeo->RotateBack(fDet,cloc,cglo);
+    fTracklets->back()->SetNextPoint(cglo[0], cglo[1], cglo[2]);
+  }
+  fLoadTracklets = kTRUE;
 }
 
 //____________________________________________________
-void   AliEveTRDChamber::Paint(Option_t* option)
+void AliEveTRDChamber::Paint(Option_t* option)
 {
-/*     Info("Paint()", Form("%s", GetName()));*/
-       if(!fRnrSelf) return;
-       if(fDigits && fRnrDigits){
-               if(kDigitsNeedRecompute){
-                       fDigits->ComputeRepresentation();
-                       kDigitsNeedRecompute = kFALSE;
-               }
-               fDigits->Paint(option);
-       }
-       if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
-       if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
-       if(fTracklets && fRnrTracklets){
-               for(vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
-       }
+  // Paint object.
+
+  //AliInfo(GetName());
+  if(!fRnrSelf) return;
+  if(fDigits && fRnrDigits){
+    if(fDigitsNeedRecompute){
+      fDigits->ComputeRepresentation();
+      fDigitsNeedRecompute = kFALSE;
+    }
+    fDigits->Paint(option);
+  }
+
+  if(fRecPoints && fRnrRecPoints) fRecPoints->GetObject()->Paint(option);
+
+  if(fHits && fRnrHits) fHits->GetObject()->Paint(option);
+
+  if(fTracklets && fRnrTracklets){
+    for(std::vector<TEveTrack*>::iterator i=fTracklets->begin(); i != fTracklets->end(); ++i) (*i)->Paint(option);
+  }
 }
 
-//________________________________________________________
-void   AliEveTRDChamber::Reset()
+//______________________________________________________________________________
+void AliEveTRDChamber::Reset()
 {
-       if(fHits){
-               fHits->Reset();
-               fLoadHits = kFALSE;
-       }
-       if(fDigits){
-               fDigits->Reset();
-               fLoadDigits = kFALSE;
-       }
-       if(fRecPoints){
-               fRecPoints->Reset();
-               fLoadRecPoints = kFALSE;
-       }
-       if(fTracklets){
-               fTracklets->clear();
-               fLoadTracklets = kFALSE;
-       }
+  // Reset.
+
+  if(fHits){
+    fHits->Reset();
+    fLoadHits = kFALSE;
+  }
+  if(fDigits){
+    fDigits->Reset();
+    fLoadDigits = kFALSE;
+    fDigitsNeedRecompute = kTRUE;
+  }
+  if(fRecPoints){
+    fRecPoints->Reset();
+    fLoadRecPoints = kFALSE;
+  }
+  if(fTracklets){
+    fTracklets->clear();
+    fLoadTracklets = kFALSE;
+  }
 }
 
-//________________________________________________________
+//______________________________________________________________________________
 void AliEveTRDChamber::SetGeometry(AliTRDgeometry *geo)
 {
-       fGeo = geo;
-
-       fPla = fGeo->GetPlane(fDet);
-       fX0 = fGeo->GetTime0(fPla);
-
-       fPadPlane = fGeo->GetPadPlane(fPla,fGeo->GetChamber(fDet));
-       rowMax = fPadPlane->GetNrows();
-       colMax = fPadPlane->GetNcols();
+  // Set geometry.
+
+  fGeo = geo;
+
+  Int_t  ism  = geo->GetSector(fDet);
+  Int_t  istk = geo->GetChamber(fDet);
+  Int_t  ipla = geo->GetPlane(fDet);
+  Int_t icha  = istk*6+ipla;
+
+  // define pad plane size in pads
+  AliTRDpadPlane *pp = fGeo->GetPadPlane(ipla, istk);
+  fNrows   = pp->GetNrows();
+  fNcols   = pp->GetNcols();
+
+// this version for setting the rendarable object is not working very nice
+// Int_t shape_offset = TEveGeoShape::Class()->GetDataMemberOffset("fShape");
+// TEveGeoShape* eg_shape = new TEveGeoShape("geometry");
+// eg_shape->RefMainTrans().SetFrom(* gGeoManager->GetCurrentMatrix());
+// * (TGeoShape**) (((char*)eg_shape) + shape_offset) = gGeoManager->GetCurrentVolume()->GetShape();
+// 
+// eg_shape->StampColorSelection();
+
+  // define rendarable volumes
+  gGeoManager->cd(Form("/B077_1/BSEGMO%d_1/BTRD%d_1/UTR1_1/UTS1_1/UTI1_1/UT%02d_1", ism, ism, icha));
+  fShape = new TEveGeoTopNode(gGeoManager, gGeoManager->GetCurrentNode());
+  fShape->RefMainTrans().SetFrom(*gGeoManager->GetCurrentMatrix());
+  fShape->DisableListElements();
+  fShape->SetRnrSelf(kFALSE);
+// try to set the properties but it is crashing !!
+//   TEveGeoNode *node = 0x0; 
+//   if((node = (TEveGeoNode*)fShape->FindChild(Form("UA%02d_1", icha)))) node->SetRnrState(kTRUE);
+//   else AliWarning(Form("Can not retrieve geo node UA%02d_1", icha));
+
+  AddElement(fShape);
 }