]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/EVE/AliHLTEveHLT.cxx
Correct use of ROOT_INCLUDE_DIR
[u/mrichter/AliRoot.git] / HLT / EVE / AliHLTEveHLT.cxx
index d4d99d22ea8b9c702a10dc0a58e29df642ddfd7d..73f4aa6df549f5491efee95e99ecece9ad84aae9 100644 (file)
@@ -1,3 +1,4 @@
+// $Id$
 /**************************************************************************
  * This file is property of and copyright by the ALICE HLT Project        *
  * ALICE Experiment at CERN, All rights reserved.                         *
 #include "TEveManager.h"
 #include "TEvePointSet.h"
 #include "TEveTrack.h"
+#include "TEveElement.h"
 #include "TCanvas.h"
 #include "AliESDEvent.h"
+#include "AliESDtrack.h"
 #include "TEveTrackPropagator.h"
 #include "AliEveTrack.h"
 #include "TEveVSDStructs.h"
 #include "TString.h"
-#include "TPCLib/tracking-ca/AliHLTTPCCATrackParam.h"
-#include "TPCLib/tracking-ca/AliHLTTPCCATrackConvertor.h"
+#include "tracking-ca/AliHLTTPCCATrackParam.h"
+#include "tracking-ca/AliHLTTPCCATrackConvertor.h"
 #include "AliEveMagField.h"
 #include "TH1.h"
 #include "TH1F.h"
@@ -48,22 +51,23 @@ AliHLTEveHLT::AliHLTEveHLT() :
   fUseIpOnFailedITS(kFALSE),
   fUseRkStepper(kFALSE),
   fTrackList(NULL),
+  fTrackLists(NULL),
   fOldTrackList(NULL),
   fPointSetVertex(NULL),
   fTrCanvas(NULL),
   fVertexCanvas(NULL),
-  fHistPt(NULL), 
-  fHistP(NULL), 
   fHistEta(NULL),
-  fHistTheta(NULL),
   fHistPhi(NULL),
   fHistnClusters(NULL),
   fHistMult(NULL),
+  fHistDCAr(NULL),
   fTrCount(0), 
-  fVCount(0)
+  fVCount(0),
+  fNTrackBins(10)
 {
   // Constructor.
-  //CreateHistograms();
+  CreateHistograms();
+
 }
 ///___________________________________________________________________
 AliHLTEveHLT::~AliHLTEveHLT()
@@ -72,22 +76,48 @@ AliHLTEveHLT::~AliHLTEveHLT()
   if(fTrackList)
     delete fTrackList;
   fTrackList = NULL;
+
+  if(fTrackLists)
+    delete fTrackLists;
+  fTrackLists = NULL;
+
+
 }
-///____________________________________________________________________
-void AliHLTEveHLT::ProcessEsdEvent( AliESDEvent * esd ) {
+
+
+///________________________________________________________________________
+void AliHLTEveHLT::CreateHistograms(){
   //See header file for documentation
-  if(!fTrackList) CreateTrackList();
-  if(!fPointSetVertex) CreateVertexPointSet();
-  ProcessEsdEvent(esd, fTrackList);
-    
+
+  //fHistPt        = new TH1F("fHistPt",       "transverse momentum",    100, 0, 10); // KK   
+  //fHistP         = new TH1F("fHistP",        "signed momentum",        100,-7,  7);     
+
+  //fHistPt   ->SetXTitle("p_{t} (GeV/c)");   // KK
+  //fHistP    ->SetXTitle("P*charge (GeV/c)");
+
+  // fHistTheta     = new TH1F("fHistTheta",    "polar angle",            180, 0,180);   
+  // fHistTheta->SetXTitle("#theta (degrees)");
+  
+  fHistEta       = new TH1F("fHistEta",      "pseudorapidity",         100,-2,  2);       
+  fHistEta  ->SetXTitle("#eta");
+
+  fHistPhi      = new TH1F("fHistPhi",      "azimuthal angle",        180, 0,360);   
+  fHistPhi  ->SetXTitle("#phi (degrees)");
+
+  fHistnClusters = new TH1F("fHistnClusters","TPC clusters per track", 160, 0,160);
+
+  fHistMult      = new TH1F("fHistMult",     "event track multiplicity",150, 0, 15000);    
+  
+  fHistDCAr = new TH1F("fHistDCAr", "DCA r", 200, -100, 100);
+
 }
+
+
 ///_____________________________________________________________________
 void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
   //See header file for documentation
   if ( ! block->GetDataType().CompareTo("ALIESDV0") ) {
-    if(!fTrackList) CreateTrackList();
-    if(!fPointSetVertex) CreateVertexPointSet();
-    ProcessEsdBlock(block, fTrackList);
+    ProcessEsdBlock(block);
   } 
   
   else if ( ! block->GetDataType().CompareTo("ROOTTOBJ") ) {
@@ -105,8 +135,8 @@ void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
 
   else if ( !block->GetDataType().CompareTo("ROOTHIST") ) {      
     if( !fCanvas ) { 
-      fCanvas = CreateCanvas("Primary Vertex", "Primary Vertex");
-      fCanvas->Divide(3, 2);
+      fCanvas = CreateCanvas("PVtx/Tr QA", "PrimV");
+      fCanvas->Divide(3, 3);
     }
     ProcessHistograms( block , fCanvas);
   }  
@@ -115,29 +145,40 @@ void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
 ///____________________________________________________________________________
 void AliHLTEveHLT::UpdateElements() {
   //See header file for documentation
-  //
-  //DrawHistograms();
-  if(fTrackList) fTrackList->ElementChanged();
+
+  DrawHistograms();
+
+  if(fTrackLists) {
+    for(Int_t il = 0; il < fNTrackBins; il++) {
+      TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
+      if(trackList) trackList->ElementChanged();
+    } 
+  }
+
   if(fPointSetVertex) fPointSetVertex->ResetBBox();
   if(fTrCanvas) fTrCanvas->Update();
   if(fVertexCanvas) fVertexCanvas->Update();
   if(fCanvas) fCanvas->Update();
   
 }
+
 ///_________________________________________________________________________________
 void AliHLTEveHLT::ResetElements(){
   //See header file for documentation
   
   cout << "destroy"<<endl;
-  if(fTrackList) {
-    fTrackList->Destroy();
-    fTrackList = NULL;
-    // RemoveElement(fTrackList);
-    // TThread * destructor = new TThread(DestroyGarbage, (void*) this);
-    // destructor->Run();
-    // fTrackList = NULL;
+
+  if(fTrackLists) {
+    for(Int_t il = 0; il < fNTrackBins; il++) {
+      TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
+      if(trackList) trackList->DestroyElements();
+    } 
   }
+
   
+  fTrCount = 0;
+  fVCount = 0;
+
   if(fPointSetVertex) fPointSetVertex->Reset();
   cout<< "reset done"<<endl;
   fHistoCount = 0;
@@ -162,11 +203,12 @@ void AliHLTEveHLT::DestroyOldTrackList() {
 void AliHLTEveHLT::ProcessHistograms(AliHLTHOMERBlockDesc * block, TCanvas * canvas) {
   //See header file for documentation
   if (!fTrCanvas) {
-    fTrCanvas = CreateCanvas("TPC ESD QA", "TPC ESD QA");
+    fTrCanvas = CreateCanvas("ESD", "ESD");
     fTrCanvas->Divide(4, 2);
   }
+
   if(!fVertexCanvas) {
-    fVertexCanvas = CreateCanvas("Vertex QA", "Vertex");
+    fVertexCanvas = CreateCanvas("Vtx", "Vtx");
     fVertexCanvas->Divide(4, 2);
   }
 
@@ -221,21 +263,22 @@ void AliHLTEveHLT::AddHistogramToCanvas(TH1* histogram, TCanvas * canvas, Int_t
 void AliHLTEveHLT::CreateTrackList() {
   //See header file for documentation
   fTrackList = new TEveTrackList("ESD Tracks");
-  fTrackList->SetMainColor(6);
+  fTrackList->SetMainColor(kOrange);
   AddElement(fTrackList);
 }
-// ///________________________________________________________________________________________
-// void AliHLTEveHLT::CreateTrackList() {
-//   //See header file for documentation
-//   fTrackList = new TEveElementList("ESD tracks");
-//   for (Int_t i = 0; i < 10; i++ ) {
-//     TEveTrackList * trackList = new TEveTrackList(Form("Tracklist_%d", i));
-//     trackList->SetMainColor(i);
-//     fTrackList->AddElement(trackList);
-//   }
-  
-//   AddElement(fTrackList);
-// }
+
+///________________________________________________________________________________________
+void AliHLTEveHLT::CreateTrackLists() {
+  //See header file for documentation
+  fTrackLists = new TEveElementList("ESD Track lists");
+  AddElement(fTrackLists);
+  for(Int_t i = 0; i < 10; i++) {
+    TEveTrackList * trackList = new TEveTrackList(Form("Tracks_%d", i));
+    trackList->SetMainColor(kOrange-i);
+    fTrackLists->AddElement(trackList);
+  }
+}
+
 
 ///_________________________________________________________________________________________
 void AliHLTEveHLT::CreateVertexPointSet() {
@@ -251,24 +294,63 @@ void AliHLTEveHLT::CreateVertexPointSet() {
 void AliHLTEveHLT::ProcessGlobalTrigger( AliHLTHOMERBlockDesc * block ) {
   //See header file for documentation
   AliHLTGlobalTriggerDecision * decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(block->GetTObject());
-  decision->Print();
+  if(decision) decision->Print();
 
 }
 
 
 ///______________________________________________________________________
-void AliHLTEveHLT::ProcessEsdBlock( AliHLTHOMERBlockDesc * block, TEveTrackList * cont ) {
+void AliHLTEveHLT::ProcessEsdBlock( AliHLTHOMERBlockDesc * block) {
   //See header file for documentation
 
   AliESDEvent* esd = (AliESDEvent *) (block->GetTObject());
   if (!esd) return;
   
-  ProcessEsdEvent(esd, cont);
+  ProcessEsdEvent(esd);
 }
-///___________________________________________________________________________________
-void AliHLTEveHLT::ProcessEsdEvent(AliESDEvent * esd, TEveTrackList * cont) {
 
-  esd->GetStdContent();
+
+
+///_________________________________________________________________________________
+Color_t AliHLTEveHLT::GetColor(Float_t pt) {
+  //See header file
+  Color_t baseColor = kOrange;
+  
+  Float_t binlimit = 0.1;
+  for(Int_t i = 0; i< 10; i++) {
+   
+    if (pt < binlimit)
+      return baseColor - i;
+    
+    binlimit +=0.1;
+  }
+  
+  return baseColor - 9;
+
+}
+
+///_________________________________________________________________________________
+Int_t AliHLTEveHLT::GetColorBin(Float_t pt) {
+  //See header file
+  
+  Float_t binlimit = 0.1;
+  for(Int_t i = 0; i< 10; i++) {
+   
+    if (pt < binlimit)
+      return i;
+    
+    binlimit +=0.1;
+  }
+  
+  return 9;
+  
+}
+
+///____________________________________________________________________
+void AliHLTEveHLT::ProcessEsdEvent( AliESDEvent * esd ) {
+  //See header file for documentation
+  if(!fPointSetVertex) CreateVertexPointSet();
+  if(!fTrackLists) CreateTrackLists();
 
   cout << "ProcessESDEvent() :"<< esd->GetEventNumberInFile()<< "  " << esd->GetNumberOfCaloClusters() << " tracks : " << esd->GetNumberOfTracks() << endl;
 
@@ -282,41 +364,92 @@ void AliHLTEveHLT::ProcessEsdEvent(AliESDEvent * esd, TEveTrackList * cont) {
     fPointSetVertex->SetNextPoint(vertex[0], vertex[1], vertex[2]);
   }
   
-  SetUpTrackPropagator(cont->GetPropagator(),-0.1*esd->GetMagneticField(), 520);
-
+  TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild());
+  if(trackList) SetUpTrackPropagator(trackList->GetPropagator(),-0.1*esd->GetMagneticField(), 520);
   for (Int_t iter = 0; iter < esd->GetNumberOfTracks(); ++iter) {
-    AliEveTrack* track = dynamic_cast<AliEveTrack*>(MakeEsdTrack(esd->GetTrack(iter), cont));
-    cont->AddElement(track);
+
+   AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(esd->GetTrack(iter));
+   FillTrackList(esdTrack);
+   FillHistograms(esdTrack);
    
-    // fHistPt->Fill(esd->GetTrack(iter)->Pt());   // KK
-    // fHistP->Fill(esd->GetTrack(iter)->P()*esd->GetTrack(iter)->Charge());
-    // fHistEta->Fill(esd->GetTrack(iter)->Eta());
-    // fHistTheta->Fill(esd->GetTrack(iter)->Theta()*TMath::RadToDeg());
-    // fHistPhi->Fill(esd->GetTrack(iter)->Phi()*TMath::RadToDeg());
-    // if(esd->GetTrack(iter)->GetStatus()&AliESDtrack::kTPCin || (esd->GetTrack(iter)->GetStatus()&AliESDtrack::kTPCin && esd->GetTrack(iter)->GetStatus()&AliESDtrack::kITSin)){
-    //    fHistnClusters->Fill(esd->GetTrack(iter)->GetTPCNcls());  
-    //}
   }
+  fHistMult->Fill(esd->GetNumberOfTracks()); // KK
   
-//fHistMult->Fill(esd->GetNumberOfTracks()); // KK
-  
-  
-  cont->SetTitle(Form("N=%d", esd->GetNumberOfTracks()) );
-  cont->MakeTracks();
+  //BALLE hardcoded size
+  for(Int_t il = 0; il < fNTrackBins; il++) {
+    trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
+    trackList->MakeTracks();
+  } 
+}
+///__________________________________________________________________________
+void AliHLTEveHLT::FillTrackList(AliESDtrack * esdTrack) {
+  //See header file for documentation
+  TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild());
+  if (!trackList) return;
   
+  AliEveTrack* track = dynamic_cast<AliEveTrack*>(MakeEsdTrack(esdTrack, trackList));        
+  Int_t bin = GetColorBin(esdTrack->Pt());
+  trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", bin)));
+  if(trackList) {
+    track->SetAttLineAttMarker(trackList);
+    trackList->AddElement(track);
+  } else cout << "BALLE"<<endl;
+
+
 }
 
 
+///____________________________________________________________________________________
+void AliHLTEveHLT::FillHistograms(AliESDtrack * esdTrack) {
+
+  if(esdTrack->GetTPCNcls() == 0) return;
+  
+  fHistEta->Fill(esdTrack->Eta());
+  // fHistTheta->Fill(esdTrack->Theta()*TMath::RadToDeg());
+  fHistPhi->Fill(esdTrack->Phi()*TMath::RadToDeg());
+  
+  
+  Float_t DCAr, DCAz = -99;
+  esdTrack->GetImpactParametersTPC(DCAr, DCAz);
+  fHistDCAr->Fill(DCAr);
+  
+  
+  if(esdTrack->GetStatus()&AliESDtrack::kTPCin || (esdTrack->GetStatus()&AliESDtrack::kTPCin && esdTrack->GetStatus()&AliESDtrack::kITSin)){
+    fHistnClusters->Fill(esdTrack->GetTPCNcls());  
+  }
+}
 
 void AliHLTEveHLT::DrawHistograms(){
   //See header file for documentation
+  if(!fCanvas) {
+    fCanvas = CreateCanvas("PVtx/Tr QA", "Primary vertex, Track QA");
+    fCanvas->Divide(3, 3);
+  }
+
+  fCanvas->cd(5);
+  fHistEta->Draw();
+
+  fCanvas->cd(6);
+  fHistPhi->Draw();
 
+  fCanvas->cd(7);
+  fHistnClusters->Draw();
 
+  fCanvas->cd(8);
+  fHistMult->Draw();
+
+  fCanvas->cd(9);
+  fHistDCAr->Draw();
+
+  fCanvas->cd();
 
 }
 
 AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
   //See header file for documentation
+  
+    
+
 
 
   const double kCLight = 0.000299792458;
@@ -341,7 +474,9 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
     trackParam = *at->GetConstrainedParam();
   }
   else if( at->GetInnerParam() ){
-    trackParam = *(at->GetInnerParam());
+    float x = at->GetX();
+    float y = at->GetY();
+    if(sqrt(x*x+y*y)>.5 ) trackParam = *(at->GetInnerParam());
   }
   if( at->GetStatus()&AliESDtrack::kTRDin ){
     // transport to TRD in
@@ -364,7 +499,6 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
   }
 
   AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
-  track->SetAttLineAttMarker(cont);
   track->SetName(Form("AliEveTrack %d", at->GetID()));
   track->SetElementTitle(CreateTrackTitle(at));
   track->SetSourceObject(at);
@@ -387,9 +521,9 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
     track->AddPathMark( startPoint );    
   }
 
-
+  bool ok = 1;
   if( at->GetOuterParam() && at->GetTPCPoints(2)>80 ){
-  
+
     //
     // use AliHLTTPCCATrackParam propagator 
     // since AliExternalTrackParam:PropagateTo()
@@ -397,7 +531,7 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
     //
     double rot = at->GetOuterParam()->GetAlpha() - trackParam.GetAlpha();
     double crot = cos(rot), srot = sin(rot);
-    double xEnd = at->GetTPCPoints(2)*crot +  at->GetTPCPoints(3)*srot;
+    double xEnd = at->GetTPCPoints(2)*crot -  at->GetTPCPoints(3)*srot;
   // take parameters constrained to vertex (if they are)
  
 
@@ -407,35 +541,49 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
     Double_t x0 = trackParam.GetX();
     Double_t dx = xEnd - x0;
     
+    if( dx<0 ) ok = 0;
     //
     // set a reference at the half of trajectory for better drawing
     //
     
-    for( double dxx=dx/2; TMath::Abs(dxx)>=1.; dxx*=.9 ){
-      if( !t.TransportToX(x0+dxx, bz, .999 ) ) continue;
-      AliExternalTrackParam tt;
-      AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() ); 
-      tt.GetXYZ(vbuf);
-      tt.GetPxPyPz(pbuf);
-      TEvePathMark midPoint(TEvePathMark::kReference);
-      midPoint.fV.Set(vbuf);
-      midPoint.fP.Set(pbuf);    
-      track->AddPathMark( midPoint );
-      break;
+    if( ok ){ 
+      double dxx=dx/2; 
+      if( TMath::Abs(dxx)>=1. ){
+
+       if( !t.TransportToX(x0+dxx, bz, .999 ) ){
+         ok = 0;
+       } else {
+         AliExternalTrackParam tt;
+         AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() ); 
+         tt.GetXYZ(vbuf);
+         tt.GetPxPyPz(pbuf);
+         TEvePathMark midPoint(TEvePathMark::kReference);
+         midPoint.fV.Set(vbuf);
+         midPoint.fP.Set(pbuf);    
+         track->AddPathMark( midPoint );     
+       }
+      }
     }
    
     //
     // Set a reference at the end of the trajectory
     // and a "decay point", to let the event display know where the track ends
     //
     
-    for( ; 1; dx*=.9 ){
-      if( !t.TransportToX(x0+dx, bz, .999 ) ){
-       if( TMath::Abs(dx)<1. ) break;
-       continue;
+
+    ///Removing meaningless loop, please have a look Sergey!!
+
+    // FIXME this loop does not make sense anymore
+    // Matthias 2010-05-02
+    if( !t.TransportToX(x0+dx, bz, .999 ) ){
+      ok = 0; 
+    }
+    
+    {
+      if( !ok ){ 
+       AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
       }
-       AliExternalTrackParam tt;
+      AliExternalTrackParam tt;
       AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() ); 
       tt.GetXYZ(vbuf);
       tt.GetPxPyPz(pbuf);
@@ -446,12 +594,11 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
       decPoint.fV.Set(vbuf);
       decPoint.fP.Set(pbuf);
       track->AddPathMark( endPoint );
-      track->AddPathMark( decPoint );      
-      break;
+      track->AddPathMark( decPoint );
     }  
   }
 
-  if (at->IsOn(AliESDtrack::kTPCrefit))
+  if ( ok &&  at->IsOn(AliESDtrack::kTPCrefit))
   {
     if ( ! innerTaken)
     {
@@ -459,6 +606,7 @@ AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
     }
     AddTrackParamToTrack(track, at->GetOuterParam());
   }
+  
   return track;
 }