]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HBTAN/AliHBTTrackPoints.cxx
Another portion of classes moved from HBTAN to ANALYSIS. HBTAN made working with...
[u/mrichter/AliRoot.git] / HBTAN / AliHBTTrackPoints.cxx
index 79e5df2cd2b69dc54b59f97abebddf56fa31474a..469db3f11d416ece56bb6868bc0f654e0b51a048 100644 (file)
 // different events (that are use to fill deniminators)   //
 //                                                        //
 ////////////////////////////////////////////////////////////
-#include "AliTPCtrack.h"
+
+#include <TClonesArray.h>
+#include <TFile.h>
 #include <TMath.h>
+
+#include "AliESDtrack.h"
+#include "AliTPCtrack.h"
 #include "AliTrackReference.h"
-#include <TClonesArray.h>
+#include "AliITStrackV2.h"
 
 ClassImp(AliHBTTrackPoints)
 
 Int_t AliHBTTrackPoints::fgDebug = 0;
+
 AliHBTTrackPoints::AliHBTTrackPoints():
  fN(0),
  fX(0x0),
@@ -30,6 +36,92 @@ AliHBTTrackPoints::AliHBTTrackPoints():
 }
 /***************************************************************/
 
+AliHBTTrackPoints::AliHBTTrackPoints(AliHBTTrackPoints::ETypes type, AliESDtrack* track):
+ fN(0),
+ fX(0x0),
+ fY(0x0),
+ fZ(0x0)
+{
+  //constructor
+  switch (type)
+   {
+     case kITS:
+       //Used only in non-id analysis
+       fN = 6;
+       fX = new Float_t[fN];
+       fY = new Float_t[fN];
+       fZ = new Float_t[fN];
+       MakeITSPoints(track);
+       break;
+
+     default:
+       Info("AliHBTTrackPoints","Not recognized type");
+   }
+   
+}
+/***************************************************************/
+
+AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliESDtrack* track, Float_t mf, Float_t dr, Float_t r0):
+ fN(n),
+ fX(new Float_t[fN]),
+ fY(new Float_t[fN]),
+ fZ(new Float_t[fN])
+{
+  //constructor
+  //mf - magnetic field in kG - needed to calculated curvature out of Pt
+  //r0 - starting radius
+  //dr - calculate points every dr cm, default every 30cm
+  if (track == 0x0)
+   {
+     Error("AliHBTTrackPoints","ESD track is null");
+     fN = 0;
+     delete [] fX;
+     delete [] fY;
+     delete [] fZ;
+     fX = fY = fZ = 0x0;
+     return;
+   }
+
+  if ( ((track->GetStatus() & AliESDtrack::kTPCrefit) == kFALSE)&& 
+       ((track->GetStatus() & AliESDtrack::kTPCin) == kFALSE)  )
+   {
+     //could happend: its stand alone tracking
+     if (GetDebug() > 3) 
+       Warning("AliHBTTrackPoints","This ESD track does not contain TPC information");
+       
+     fN = 0;
+     delete [] fX;
+     delete [] fY;
+     delete [] fZ;
+     fX = fY = fZ = 0x0;
+     
+     return;
+   }
+  
+  Double_t x;
+  Double_t par[5];
+  track->GetInnerExternalParameters(x,par);     //get properties of the track
+  if (par[4] == 0)
+   {
+     Error("AliHBTTrackPoints","This ESD track seem not to contain TPC information (curv is 0)");
+     return;
+   }
+
+  if (mf == 0.0)
+   {
+     Error("AliHBTTrackPoints","Zero Magnetic field passed as parameter.");
+     return;
+   }
+   
+  Double_t alpha = track->GetInnerAlpha();
+  Double_t cc = 1000./0.299792458/mf;//conversion constant
+  Double_t c=par[4]/cc;
+  
+  MakePoints(dr,r0,x,par,c,alpha);
+  
+}
+/***************************************************************/
+
 AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliTPCtrack* track, Float_t dr, Float_t r0):
  fN(n),
  fX(new Float_t[fN]),
@@ -58,16 +150,40 @@ AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliTPCtrack* track, Float_t dr, Fl
  //*      external param3:   tangent of the track momentum dip angle           *
  //*      external param4:   1/pt (1/(GeV/c))                                  *
     
-  Double_t xk;
+  Double_t x = 0;
   Double_t par[5];
-  track->GetExternalParameters(xk,par);     //get properties of the track
+  track->GetExternalParameters(x,par);     //get properties of the track
   
-  Double_t x = track->GetX();
-  Double_t y = track->GetY();
-  Double_t z0 = track->GetZ();
+  Double_t alpha = track->GetAlpha();
+  Double_t c=track->GetC();
+  MakePoints(dr,r0,x,par,c,alpha);
+}  
+/***************************************************************/
+
+AliHBTTrackPoints::~AliHBTTrackPoints()
+{
+  //destructor
+  delete [] fX;
+  delete [] fY;
+  delete [] fZ;
+}
+/***************************************************************/
+
+void AliHBTTrackPoints::MakePoints( Float_t dr, Float_t r0, Double_t x, Double_t* par, Double_t c, Double_t alpha)
+{
+  //Calculates points starting at radius r0
+  //spacing every dr (in radial direction)
+  // according to track parameters
+  // x - position in sector local reference frame. x i parallel to R and sector is symmetric with respect to x
+  // par - track external parameters; array with 5 elements;  look at AliTPCtrack.h or AliESDtrack.h for their meaning
+  // c - track curvature
+  // alpha - sector's rotation angle (phi) == angle needed for local to global transformation
+  
+  Double_t y = par[0];
+  Double_t z0 = par[1];
       
   Double_t phi0local = TMath::ATan2(y,x);
-  Double_t phi0global = phi0local + track->GetAlpha();
+  Double_t phi0global = phi0local + alpha;
   
   if (phi0local<0) phi0local+=2*TMath::Pi();
   if (phi0local>=2.*TMath::Pi()) phi0local-=2*TMath::Pi();
@@ -83,11 +199,11 @@ AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliTPCtrack* track, Float_t dr, Fl
   
   if (GetDebug() > 5) 
     Info("AliHBTTrackPoints","Phi Global at first padraw %f, Phi locat %f",phi0global,phi0local);
-  Double_t c=track->GetC();
-  Double_t eta = track->GetEta();
+    
+  Double_t eta = x*c - par[2] ;//par[2] = fX*C - eta; eta==fP2 ; C==fP4
   
   //this calculattions are assuming new (current) model 
-  Double_t tmp = c*x - eta;
+  Double_t tmp = par[2];
   tmp = 1. - tmp*tmp;
   tmp = c*y + TMath::Sqrt(tmp);
   Double_t dca=(TMath::Hypot(eta,tmp) - 1. )/TMath::Abs(c);
@@ -104,10 +220,45 @@ AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliTPCtrack* track, Float_t dr, Fl
   for(Int_t i = 0; i<fN; i++)
    {
      Double_t rc = r0 + i*dr;
-     Double_t factorPhi = TMath::ASin( (c2*rc + cst1/rc)/cst2 );//factor phi od rc
+     Double_t ftmp = (c2*rc + cst1/rc)/cst2;
+     if (ftmp > 1.0) 
+      {
+        if (GetDebug() > 1) 
+          Warning("AliHBTTrackPoints","ASin argument > 1 %f:",ftmp);
+        ftmp=1.0;
+      }
+     else if (ftmp < -1.0) 
+      {
+        if (GetDebug() > 1) 
+          Warning("AliHBTTrackPoints","ASin argument < -1 %f:",ftmp);
+        ftmp=-1.0;
+      }
+      
+     Double_t factorPhi = TMath::ASin( ftmp );//factor phi od rc
      Double_t phi = phi0global + factorPhi - factorPhi0;
      
-     Double_t factorZ = TMath::ASin(c2*TMath::Sqrt((rc*rc-dcasq)/cst2))*par[3]/c2;
+     ftmp = (rc*rc-dcasq)/cst2;
+     if (ftmp < 0.0) 
+      {
+        if (GetDebug() > 1) 
+          Warning("AliHBTTrackPoints","Sqrt argument < 0: %f",ftmp);
+        ftmp=0.0;
+      }
+     
+     ftmp = c2*TMath::Sqrt(ftmp);
+     if (ftmp > 1.0) 
+      {
+        if (GetDebug() > 1) 
+          Warning("AliHBTTrackPoints","ASin argument > 1: %f",ftmp);
+        ftmp=1.0;
+      }
+     else if (ftmp < -1.0) 
+      {
+        if (GetDebug() > 1) 
+          Warning("AliHBTTrackPoints","ASin argument < -1: %f",ftmp);
+        ftmp=-1.0;
+      }
+     Double_t factorZ = TMath::ASin(ftmp)*par[3]/c2;
      fZ[i] = z0 + factorZ - factorZ0;
      fX[i] = rc*TMath::Cos(phi);
      fY[i] = rc*TMath::Sin(phi);
@@ -121,15 +272,26 @@ AliHBTTrackPoints::AliHBTTrackPoints(Int_t n, AliTPCtrack* track, Float_t dr, Fl
 }
 /***************************************************************/
 
-AliHBTTrackPoints::~AliHBTTrackPoints()
+void AliHBTTrackPoints::MakeITSPoints(AliESDtrack* track)
 {
-  //destructor
-  delete [] fX;
-  delete [] fY;
-  delete [] fZ;
+//Calculates points in ITS
+// z=R*Pz/Pt
+ AliITStrackV2 itstrack(*track,kTRUE);
+ Double_t x,y,z;
+ static const Double_t r[6] = {4.0, 7.0, 14.9, 23.8, 39.1, 43.6};
+ for (Int_t i = 0; i < 6; i++)
+  {
+    itstrack.GetGlobalXYZat(r[i],x,y,z);
+    fX[i] = x;
+    fY[i] = y;
+    fZ[i] = z;
+//    Info("MakeITSPoints","X %f Y %f Z %f R asked %f R obtained %f",
+//             fX[i],fY[i],fZ[i],r[i],TMath::Hypot(fX[i],fY[i]));
+  }   
 }
-/***************************************************************/
 
+/***************************************************************/
 void AliHBTTrackPoints::PositionAt(Int_t n, Float_t &x,Float_t &y,Float_t &z)
 {
   //returns position at point n
@@ -149,21 +311,35 @@ void AliHBTTrackPoints::PositionAt(Int_t n, Float_t &x,Float_t &y,Float_t &z)
 }
 /***************************************************************/
 
+void AliHBTTrackPoints::Move(Float_t x, Float_t y, Float_t z)
+{
+//Moves all points about vector
+ for (Int_t i = 0; i<fN; i++)
+   {
+     fX[i]+=x;
+     fY[i]+=y;
+     fZ[i]+=z;
+   }   
+}
+/***************************************************************/
+
 Double_t AliHBTTrackPoints::AvarageDistance(const AliHBTTrackPoints& tr)
 {
   //returns the aritmethic avarage distance between two tracks
-  if (fN != tr.fN)
+//  Info("AvarageDistance","Entered");
+  if ( (fN <= 0) || (tr.fN <=0) )
    {
-     Error("AvarageDistance","Number of points is not equal");
+     if (GetDebug()) Warning("AvarageDistance","One of tracks is empty");
      return -1;
    }
-  if ( (fN <= 0) || (tr.fN <=0) )
+
+  if (fN != tr.fN)
    {
-     Error("AvarageDistance","One of tracks is empty");
+     Warning("AvarageDistance","Number of points is not equal");
      return -1;
    }
    
-  Double_t sum;
+  Double_t sum = 0;
   for (Int_t i = 0; i<fN; i++)
    {
      if (GetDebug()>9)
@@ -181,7 +357,7 @@ Double_t AliHBTTrackPoints::AvarageDistance(const AliHBTTrackPoints& tr)
      Double_t dz = fZ[i]-tr.fZ[i];
      sum+=TMath::Sqrt(dx*dx + dy*dy + dz*dz);
      
-     if (GetDebug()>0)
+     if (GetDebug()>1)
       {
        Info("AvarageDistance","Diff: x ,y z: %f , %f, %f",dx,dy,dz);
        Info("AvarageDistance","xxyyzz %f %f %f %f %f %f",
@@ -199,8 +375,12 @@ Double_t AliHBTTrackPoints::AvarageDistance(const AliHBTTrackPoints& tr)
 /***************************************************************/
 /***************************************************************/
 /***************************************************************/
+/***************************************************************/
+/***************************************************************/
+/***************************************************************/
 
 #include "AliRun.h"
+#include "AliESD.h"
 #include "AliRunLoader.h"
 #include "AliTPCtrack.h"
 #include "TTree.h"
@@ -211,7 +391,134 @@ Double_t AliHBTTrackPoints::AvarageDistance(const AliHBTTrackPoints& tr)
 
 
 
-void AliHBTTrackPoints::tp(Int_t entr)
+
+void AliHBTTrackPoints::testesd(Int_t entr,const char* fname )
+{
+  delete gAlice;
+  gAlice = 0x0;
+  AliRunLoader* rl = AliRunLoader::Open();
+  rl->LoadgAlice();
+  
+  Float_t mf = rl->GetAliRun()->Field()->SolenoidField();
+  
+  TFile* fFile = TFile::Open(fname);
+  
+  if (fFile == 0x0)
+   {
+     printf("testesd: There is no suche a ESD file\n");
+     return;
+   }
+  AliESD* esd = dynamic_cast<AliESD*>(fFile->Get("0"));
+  AliESDtrack *t = esd->GetTrack(entr);
+  if (t == 0x0)
+   {
+     ::Error("testesd","Can not get track %d",entr);
+     return;
+   }
+
+  
+  Int_t N = 170;
+  AliHBTTrackPoints* tp = new AliHBTTrackPoints(N,t,mf,1.);
+  
+  Float_t xmin = -250;
+  Float_t xmax =  250;
+  
+  Float_t ymin = -250;
+  Float_t ymax =  250;
+
+  Float_t zmin = -250;
+  Float_t zmax =  250;
+  
+  TH2D* hxy = new TH2D("hxy","hxy",1000,xmin,xmax,1000,ymin,ymax);
+  TH2D* hxyt = new TH2D("hxyt","hxyt",1000,xmin,xmax,1000,ymin,ymax);
+  TH2D* hxyTR = new TH2D("hxyTR","hxyTR",1000,xmin,xmax,1000,ymin,ymax);
+
+  TH2D* hxz = new TH2D("hxz","hxz",1000,xmin,xmax,1000,zmin,zmax);
+  TH2D* hxzt = new TH2D("hxzt","hxzt",1000,xmin,xmax,1000,zmin,zmax);
+  TH2D* hxzTR = new TH2D("hxzTR","hxzTR",1000,xmin,xmax,1000,zmin,zmax);
+
+  hxyt->SetDirectory(0x0);   
+  hxy->SetDirectory(0x0);   
+  hxyTR->SetDirectory(0x0);   
+  
+  hxzt->SetDirectory(0x0);   
+  hxz->SetDirectory(0x0);   
+  hxzTR->SetDirectory(0x0);   
+
+  Float_t x,y,z;
+   
+  for (Int_t i = 0;i<N;i++)
+   {  
+      Double_t r = 84.1+i;
+      tp->PositionAt(i,x,y,z);
+      hxy->Fill(x,y);
+      hxz->Fill(x,z);
+      printf("Rdemanded %f\n",r);
+      printf("tpx %f tpy %f tpz %f Rt =%f\n", x,y,z,TMath::Hypot(x,y));
+      
+   }
+
+  rl->LoadTrackRefs();
+  TTree* treeTR = rl->TreeTR();
+  TBranch* b = treeTR->GetBranch("TPC");
+  
+  TClonesArray* trackrefs = new TClonesArray("AliTrackReference", 100);
+  AliTrackReference* tref;
+  b->SetAddress(&trackrefs);
+  
+  Int_t tlab = TMath::Abs(t->GetLabel());
+
+  Int_t netr = (Int_t)treeTR->GetEntries();
+  printf("Found %d entries in TR tree\n",netr);
+  
+  for (Int_t e = 0; e < netr; e++)
+   { 
+     treeTR->GetEntry(e);
+     tref = (AliTrackReference*)trackrefs->At(0);
+     if (tref == 0x0) continue;
+     if (tref->GetTrack() != tlab) continue;
+    
+     printf("Found %d entries in TR array\n",trackrefs->GetEntries());
+     
+     for (Int_t i = 0; i < trackrefs->GetEntries(); i++)
+      {
+        tref = (AliTrackReference*)trackrefs->At(i);
+        if (tref->GetTrack() != tlab) continue;
+        x = tref->X();
+        y = tref->Y();
+        z = tref->Z();
+        printf("Track Ref: x %f y %f z %f\n",tref->X(),tref->Y(),tref->Z());
+
+        hxzTR->Fill(x,z);
+        hxyTR->Fill(x,y);
+        for (Int_t j = 1; j < 10; j++)
+         {
+            hxyTR->Fill(x, y+j*0.1);
+            hxyTR->Fill(x, y-j*0.1);
+            hxyTR->Fill(x+j*0.1,y);
+            hxyTR->Fill(x-j*0.1,y);
+
+            hxzTR->Fill(x,z-j*0.1);
+            hxzTR->Fill(x,z+j*0.1);
+            hxzTR->Fill(x-j*0.1,z);
+            hxzTR->Fill(x+j*0.1,z);
+         }
+      }
+      break; 
+    }  
+  hxy->Draw("");
+//  hxzt->Draw("same");
+  hxyTR->Draw("same");
+  
+  delete rl;
+}
+
+/***************************************************************/
+/***************************************************************/
+/***************************************************************/
+
+void AliHBTTrackPoints::testtpc(Int_t entr)
 {
   delete gAlice;
   gAlice = 0x0;
@@ -227,13 +534,22 @@ void AliHBTTrackPoints::tp(Int_t entr)
   Int_t N = 160;
   AliHBTTrackPoints* tp = new AliHBTTrackPoints(N,t,1.);
   
-  TH2D* hxy = new TH2D("hxy","hxy",1000,150,250,1000,150,250);
-  TH2D* hxyt = new TH2D("hxyt","hxyt",1000,150,250,1000,150,250);
-  TH2D* hxyTR = new TH2D("hxyTR","hxyTR",1000,150,250,1000,150,250);
+  Float_t xmin = -250;
+  Float_t xmax =  250;
+  
+  Float_t ymin = -250;
+  Float_t ymax =  250;
 
-  TH2D* hxz = new TH2D("hxz","hxz",1000,150,250,1000,151,251);
-  TH2D* hxzt = new TH2D("hxzt","hxzt",1000,150,250,1000,151,251);
-  TH2D* hxzTR = new TH2D("hxzTR","hxzTR",1000,150,250,1000,151,251);
+  Float_t zmin = -250;
+  Float_t zmax =  250;
+  
+  TH2D* hxy = new TH2D("hxy","hxy",1000,xmin,xmax,1000,ymin,ymax);
+  TH2D* hxyt = new TH2D("hxyt","hxyt",1000,xmin,xmax,1000,ymin,ymax);
+  TH2D* hxyTR = new TH2D("hxyTR","hxyTR",1000,xmin,xmax,1000,ymin,ymax);
+
+  TH2D* hxz = new TH2D("hxz","hxz",1000,xmin,xmax,1000,zmin,zmax);
+  TH2D* hxzt = new TH2D("hxzt","hxzt",1000,xmin,xmax,1000,zmin,zmax);
+  TH2D* hxzTR = new TH2D("hxzTR","hxzTR",1000,xmin,xmax,1000,zmin,zmax);
 
   hxyt->SetDirectory(0x0);   
   hxy->SetDirectory(0x0);   
@@ -329,3 +645,4 @@ void AliHBTTrackPoints::tp(Int_t entr)
   
   delete rl;
 }
+