]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFtracker.cxx
add decalibration of TOF times using sim pars on CDB, updates to handle new V5 geometry
[u/mrichter/AliRoot.git] / TOF / AliTOFtracker.cxx
index 98cf5b61fad3d4ef9586b94514e6aba7e8d64491..28c9833ba562f6755e13c182e7bcf312b07027dd 100644 (file)
 #include "AliRun.h"
 #include "AliModule.h"
 
-//#include "AliTOFdigit.h"
 #include "AliTOFcluster.h"
 #include "AliTOFtrack.h"
 #include "AliTOFGeometry.h"
 #include "AliTOFtracker.h"
 
+
+#include "AliTrackPointArray.h"
+#include "AliAlignObj.h"
+
 ClassImp(AliTOFtracker)
 
 //_____________________________________________________________________________
 AliTOFtracker::AliTOFtracker(AliTOFGeometry * geom, Double_t parPID[2]) { 
   //AliTOFtracker main Ctor
 
-  fHoles=true;
+  //fHoles=true;
   fNseeds=0;
   fNseedsTOF=0;
   fngoodmatch=0;
@@ -57,10 +60,12 @@ AliTOFtracker::AliTOFtracker(AliTOFGeometry * geom, Double_t parPID[2]) {
   fDy=AliTOFGeometry::XPad(); 
   fDz=AliTOFGeometry::ZPad(); 
   fDx=1.5; 
+  fDzMax=35.; 
+  fDyMax=50.; 
   fSeeds=0x0;
   fTracks=0x0;
   fN=0;
-  Init(); // temporary solution to know about Holes/no Holes
+  fHoles = fGeom->GetHoles();
 }
 //_____________________________________________________________________________
 AliTOFtracker::AliTOFtracker(const AliTOFtracker &t):AliTracker() { 
@@ -80,28 +85,14 @@ AliTOFtracker::AliTOFtracker(const AliTOFtracker &t):AliTracker() {
   fdCut=t.fdCut; 
   fDy=t.fDy; 
   fDz=t.fDz; 
-  fDx=1.5; 
+  fDx=t.fDx; 
+  fDzMax=t.fDzMax; 
+  fDyMax=t.fDyMax; 
   fSeeds=t.fSeeds;
   fTracks=t.fTracks;
   fN=t.fN;
 }
 //_____________________________________________________________________________
-void AliTOFtracker::Init() { 
-
-// temporary solution to know about Holes/no Holes, will be implemented as 
-// an AliTOFGeometry getter
-
-  AliModule* frame=gAlice->GetModule("FRAME"); 
-
-  if(!frame) {
-    AliError("Could Not load FRAME! Assume Frame with Holes");
-    fHoles=true;
-  } else{
-    if(frame->IsVersion()==1) {fHoles=false;}    
-    else {fHoles=true;}      
-  }
-}
-//_____________________________________________________________________________
 Int_t AliTOFtracker::PropagateBack(AliESD* event) {
   //
   // Gets seeds from ESD event and Match with TOF Clusters
@@ -196,7 +187,7 @@ void AliTOFtracker::CollectESD() {
     Double_t x = track->GetX(); //New
 
     if (((t->GetStatus()&AliESDtrack::kTRDout)!=0 ) && 
-        ( x >= AliTOFGeometry::RinTOF()) ){
+        ( x >= fGeom->RinTOF()) ){
       track->SetSeedIndex(i);
       t->UpdateTrackParams(track,AliESDtrack::kTOFout);    
       new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
@@ -237,19 +228,20 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
   Int_t * clind[6];
   for (Int_t ii=0;ii<6;ii++) clind[ii] = new Int_t[fN];
   
-  for (Int_t i=0; i<fNseedsTOF; i++) {
+  for (Int_t iseed=0; iseed<fNseedsTOF; iseed++) {
 
-    AliTOFtrack *track =(AliTOFtrack*)fTracks->UncheckedAt(i);
+    AliTOFtrack *track =(AliTOFtrack*)fTracks->UncheckedAt(iseed);
     AliESDtrack *t =(AliESDtrack*)fSeeds->UncheckedAt(track->GetSeedIndex());
     if(t->GetTOFsignal()>0. ) continue;
     AliTOFtrack *trackTOFin =new AliTOFtrack(*track);
 
-    // Some init 
+    // Some init
 
     Int_t         index[10000];
     Float_t        dist[10000];
     Float_t       cxpos[10000];
     Float_t       crecL[10000];
+    TGeoHMatrix   global[1000];
      
     // Determine a window around the track
 
@@ -270,6 +262,12 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
     if (phi>=TMath::Pi())phi-=2*TMath::Pi();
     Double_t z=par[1];   
 
+    //upper limit on window's size.
+
+    if(dz> fDzMax) dz=fDzMax;
+    if(dphi*fR>fDyMax) dphi=fDyMax/fR;
+
+
     Int_t nc=0;
 
     // find the clusters in the window of the track
@@ -292,6 +290,16 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
       clind[3][nc] = c->GetDetInd(3);
       clind[4][nc] = c->GetDetInd(4);
       clind[5][nc] = k;      
+      Char_t path[100];
+      Int_t ind[5];
+      ind[0]=clind[0][nc];
+      ind[1]=clind[1][nc];
+      ind[2]=clind[2][nc];
+      ind[3]=clind[3][nc];
+      ind[4]=clind[4][nc];
+      fGeom->GetVolumePath(ind,path);
+      gGeoManager->cd(path);
+      global[nc] = *gGeoManager->GetCurrentMatrix();
       nc++;
     }
 
@@ -302,7 +310,7 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
     Int_t nStepsDone = 0;
     for( Int_t istep=0; istep<nSteps; istep++){ 
 
-      Float_t xs=AliTOFGeometry::RinTOF()+istep*0.1;
+      Float_t xs=fGeom->RinTOF()+istep*0.1;
       Double_t ymax=xs*TMath::Tan(0.5*AliTOFGeometry::GetAlpha());
 
       Bool_t skip=kFALSE;
@@ -355,14 +363,14 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
        cind[3]= clind[3][i];
        cind[4]= clind[4][i];
         Bool_t accept = kFALSE;
-        if( mLastStep)accept = (fGeom->DistanceToPad(cind,ctrackPos)<fdCut);
-        if(!mLastStep)accept = (fGeom->IsInsideThePad(cind,ctrackPos));
+       if( mLastStep)accept = (fGeom->DistanceToPad(cind,global[i],ctrackPos)<fdCut);
+       if(!mLastStep)accept = (fGeom->IsInsideThePad(cind,global[i],ctrackPos));
        if(accept){
          if(!mLastStep)isInside=kTRUE;
-         dist[nfound]=fGeom->DistanceToPad(cind,ctrackPos);
+         dist[nfound]=fGeom->DistanceToPad(cind,global[i],ctrackPos);
          crecL[nfound]=trackPos[3][istep];
          index[nfound]=clind[5][i]; // store cluster id            
-         cxpos[nfound]=AliTOFGeometry::RinTOF()+istep*0.1; //store prop.radius
+         cxpos[nfound]=fGeom->RinTOF()+istep*0.1; //store prop.radius
          nfound++;
          if(isInside)break;
        }//end if accept
@@ -398,7 +406,7 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
     }
 
     AliTOFcluster *c=fClusters[idclus];
-    c->Use(); //AliInfo(Form("I am usig the cluster"));
+    c->Use(); //AliInfo(Form("I am using the cluster"));
 
     // Track length correction for matching Step 2 
 
@@ -419,17 +427,23 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){
        (c->GetLabel(2)==TMath::Abs(trackTOFin->GetLabel()))
        ) {
       fngoodmatch++;
+
+      //AliInfo(Form(" track label good %5i",trackTOFin->GetLabel()));
+
     }
     else{
       fnbadmatch++;
+
+      //AliInfo(Form(" track label  bad %5i",trackTOFin->GetLabel()));
+
     }
 
     delete trackTOFin;
 
-    //Double_t tof=50*c->GetTDC()+32; // in ps
     Double_t tof=AliTOFGeometry::TdcBinWidth()*c->GetTDC()+32; // in ps
     t->SetTOFsignal(tof);
-    t->SetTOFcluster(c->GetIndex());
+    //t->SetTOFcluster(c->GetIndex()); // pointing to the digits tree
+    t->SetTOFcluster(idclus); // pointing to the recPoints tree
     Double_t time[10]; t->GetIntegratedTimes(time);
     Double_t mom=t->GetP();
     for(Int_t j=0;j<=AliPID::kSPECIES;j++){
@@ -469,23 +483,6 @@ Int_t AliTOFtracker::LoadClusters(TTree *cTree) {
 
   for (Int_t i=0; i<nc; i++) {
     AliTOFcluster *c=(AliTOFcluster*)clusters->UncheckedAt(i);
-    /*
-    for (Int_t jj=0; jj<5; jj++) dig[jj]=c->GetDetInd(jj);
-
-    Double_t h[5];
-    h[0]=c->GetR();
-    h[1]=c->GetPhi();
-    h[2]=c->GetZ();
-    h[3]=c->GetTDC();
-    h[4]=c->GetADC();
-
-    Int_t indexDig[3];
-    for (Int_t jj=0; jj<3; jj++) indexDig[jj] = c->GetLabel(jj);
-
-    AliTOFcluster *cl=new AliTOFcluster(h,c->GetTracks(),dig,i);
-    */
-
-    //    fClusters[i]=c; fN++;
     fClusters[i]=new AliTOFcluster(*c); fN++;
 
     //AliInfo(Form("%4i %4i  %f %f %f  %f %f   %2i %1i %2i %1i %2i",i, fClusters[i]->GetIndex(),fClusters[i]->GetZ(),fClusters[i]->GetR(),fClusters[i]->GetPhi(), fClusters[i]->GetTDC(),fClusters[i]->GetADC(),fClusters[i]->GetDetInd(0),fClusters[i]->GetDetInd(1),fClusters[i]->GetDetInd(2),fClusters[i]->GetDetInd(3),fClusters[i]->GetDetInd(4)));
@@ -524,3 +521,59 @@ Int_t AliTOFtracker::FindClusterIndex(Double_t z) const {
   return m;
 }
 
+//_________________________________________________________________________
+Bool_t AliTOFtracker::GetTrackPoint(Int_t index, AliTrackPoint& p) const
+{
+  // Get track space point with index i
+  // Coordinates are in the global system
+  AliTOFcluster *cl = fClusters[index];
+  Float_t xyz[3];
+  xyz[0] = cl->GetR()*TMath::Cos(cl->GetPhi());
+  xyz[1] = cl->GetR()*TMath::Sin(cl->GetPhi());
+  xyz[2] = cl->GetZ();
+  p.SetXYZ(xyz[0],xyz[1],xyz[2]);
+
+  // Detector numbering scheme
+  Int_t nSector = fGeom->NSectors();
+  Int_t nPlate  = fGeom->NPlates();
+  Int_t nStripA = fGeom->NStripA();
+  Int_t nStripB = fGeom->NStripB();
+  Int_t nStripC = fGeom->NStripC();
+
+  Int_t isector = cl->GetDetInd(0);
+  if (isector >= nSector)
+    AliError(Form("Wrong sector number in TOF (%d) !",isector));
+  Int_t iplate = cl->GetDetInd(1);
+  if (iplate >= nPlate)
+    AliError(Form("Wrong plate number in TOF (%d) !",iplate));
+  Int_t istrip = cl->GetDetInd(2);
+
+  Int_t stripOffset = 0;
+  switch (iplate) {
+  case 0:
+    stripOffset = 0;
+    break;
+  case 1:
+    stripOffset = nStripC;
+    break;
+  case 2:
+    stripOffset = nStripC+nStripB;
+    break;
+  case 3:
+    stripOffset = nStripC+nStripB+nStripA;
+    break;
+  case 4:
+    stripOffset = nStripC+nStripB+nStripA+nStripB;
+    break;
+  default:
+    AliError(Form("Wrong plate number in TOF (%d) !",iplate));
+    break;
+  };
+
+  Int_t idet = (2*(nStripC+nStripB)+nStripA)*isector +
+               stripOffset +
+               istrip;
+  UShort_t volid = AliAlignObj::LayerToVolUID(AliAlignObj::kTOF,idet);
+  p.SetVolumeID((UShort_t)volid);
+  return kTRUE;
+}