]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TOF/AliTOFtrackerMI.cxx
Track parameters update during the TOF-track matching procedure: REMOVED
[u/mrichter/AliRoot.git] / TOF / AliTOFtrackerMI.cxx
index f25c925e9d522c49be5837d7e4638f3edbb37a8c..40d0463ecef413f7c7489a831841360a1712f098 100644 (file)
@@ -162,25 +162,45 @@ Int_t AliTOFtrackerMI::PropagateBack(AliESDEvent* event) {
   for (Int_t i=0; i<ntrk; i++) {
     AliESDtrack *t=event->GetTrack(i);
     AliESDtrack *seed =(AliESDtrack*)fSeeds->UncheckedAt(i);
-    if(seed->GetTOFsignal()>0){
-      t->SetTOFsignal(seed->GetTOFsignal());
-      t->SetTOFcluster(seed->GetTOFcluster());
-      Int_t tlab[3];
-      seed->GetTOFLabel(tlab);    
-      t->SetTOFLabel(tlab);
-      AliTOFtrack *track = new AliTOFtrack(*seed);
-      Float_t info[10];
-      Double_t times[10];
-      seed->GetTOFInfo(info);
-      seed->GetIntegratedTimes(times);
-      t->UpdateTrackParams(track,AliESDtrack::kTOFout);    
-      t->SetIntegratedLength(seed->GetIntegratedLength());
-      t->SetIntegratedTimes(times);
-      t->SetTOFsignalToT(seed->GetTOFsignalToT());
-      t->SetTOFCalChannel(seed->GetTOFCalChannel());
-      //
-      t->SetTOFInfo(info);
-      delete track;
+
+    if ( (seed->GetStatus()&AliESDtrack::kTOFin)!=0 ) {
+      t->SetStatus(AliESDtrack::kTOFin);
+      //if(seed->GetTOFsignal()>0){
+      if ( (seed->GetStatus()&AliESDtrack::kTOFout)!=0 ) {
+       t->SetStatus(AliESDtrack::kTOFout);
+       t->SetTOFsignal(seed->GetTOFsignal());
+       t->SetTOFcluster(seed->GetTOFcluster());
+       Int_t tlab[3]; seed->GetTOFLabel(tlab);    
+       t->SetTOFLabel(tlab);
+
+       // Check done:
+       //       by calling the AliESDtrack::UpdateTrackParams,
+       //       the current track parameters are changed
+       //       and it could cause refit problems.
+       //       We need to update only the following track parameters:
+        //            the track length and expected times.
+       //       Removed AliESDtrack::UpdateTrackParams call
+       //       Called AliESDtrack::SetIntegratedTimes(...) and
+       //       AliESDtrack::SetIntegratedLength() routines.
+       /*
+       AliTOFtrack *track = new AliTOFtrack(*seed);
+       t->UpdateTrackParams(track,AliESDtrack::kTOFout);
+       delete track;
+       */
+
+       Double_t times[10]; seed->GetIntegratedTimes(times);
+       t->SetIntegratedTimes(times);
+       t->SetIntegratedLength(seed->GetIntegratedLength());
+       t->SetTOFsignalToT(seed->GetTOFsignalToT());
+       t->SetTOFCalChannel(seed->GetTOFCalChannel());
+       //
+       // Make attention, please:
+       //      AliESDtrack::fTOFInfo array does not be stored in the AliESDs.root file
+       //      it is there only for a check during the reconstruction step.
+       Float_t info[10];
+       seed->GetTOFInfo(info);
+       t->SetTOFInfo(info);
+      }
     }
   }
 
@@ -205,27 +225,27 @@ void AliTOFtrackerMI::CollectESD() {
     AliESDtrack *t =(AliESDtrack*)fSeeds->UncheckedAt(i);
     if ((t->GetStatus()&AliESDtrack::kTPCout)==0)continue;
 
-    // TRD good tracks, already propagated at 372 cm
-
     AliTOFtrack *track = new AliTOFtrack(*t); // New
-    Double_t x = track->GetX(); //New
-
-    if (((t->GetStatus()&AliESDtrack::kTRDout)!=0 ) && 
-        ( x >= AliTOFGeometry::RinTOF()) ){
-      track->SetSeedIndex(i);
-      t->UpdateTrackParams(track,AliESDtrack::kTOFout);    
-      new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
-      fNseedsTOF++;
-      c0++;
-      delete track;
+    Float_t x = (Float_t)track->GetX(); //New
+
+    // TRD good tracks, already propagated at 371 cm
+    if ( ( (t->GetStatus()&AliESDtrack::kTRDout)!=0 ) &&
+        ( x >= AliTOFGeometry::Rmin() ) ) {
+      if  ( track->PropagateToInnerTOF() ) {
+       track->SetSeedIndex(i);
+       t->UpdateTrackParams(track,AliESDtrack::kTOFin);
+       new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
+       fNseedsTOF++;
+       c0++;
+       delete track;
+      }
     }
 
-    // Propagate the rest of TPCbp  
-
+    // Propagate the rest of TPCbp
     else {
-      if(track->PropagateToInnerTOF()){ // temporary solution
+      if ( track->PropagateToInnerTOF() ) { // temporary solution
        track->SetSeedIndex(i);
-       t->UpdateTrackParams(track,AliESDtrack::kTOFout);    
+       t->UpdateTrackParams(track,AliESDtrack::kTOFin);
        new(aTOFTrack[fNseedsTOF]) AliTOFtrack(*track);
        fNseedsTOF++;
        c1++;
@@ -279,15 +299,15 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
   Int_t * clind = new Int_t[fN];
 
   // Some init 
-  
-  Int_t         index[1000];
-  Float_t       quality[1000];
-  Float_t       dist3D[1000][6];
-  Double_t      times[1000][6];
-  Float_t       mintimedist[1000];
-  Float_t       likelihood[1000];
-  Float_t       length[1000];
-  AliTOFcluster *clusters[1000];
+  const Int_t kNclusterMax = 1000; // related to fN value  
+  AliTOFcluster *clusters[kNclusterMax];
+  Int_t         index[kNclusterMax];
+  Float_t       quality[kNclusterMax];
+  Float_t       dist3D[kNclusterMax][6];
+  Double_t      times[kNclusterMax][6];
+  Float_t       mintimedist[kNclusterMax];
+  Float_t       likelihood[kNclusterMax];
+  Float_t       length[kNclusterMax];
   Double_t      tpcpid[5];
   dist3D[0][0]=1;
   
@@ -346,13 +366,20 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
     trackTOFin->GetExternalParameters(x,par);
     Double_t cov[15]; 
     trackTOFin->GetExternalCovariance(cov);
+
+    if (cov[0]<0. || cov[2]<0.) {
+      AliWarning(Form("Very strange track (%d)! At least one of its covariance matrix diagonal elements is negative!",i));
+      //delete trackTOFin;
+      //continue;
+    }
+
     Float_t scalefact=3.;    
     Double_t dphi=
       scalefact*
-      ((5*TMath::Sqrt(cov[0]) + 3.*fDy + 10.*TMath::Abs(par[2]))/fR); 
+      ((5*TMath::Sqrt(TMath::Abs(cov[0])) + 3.*fDy + 10.*TMath::Abs(par[2]))/fR); 
     Double_t dz=
       scalefact*
-      (5*TMath::Sqrt(cov[2]) + 3.*fDz + 10.*TMath::Abs(par[3]));
+      (5*TMath::Sqrt(TMath::Abs(cov[2])) + 3.*fDz + 10.*TMath::Abs(par[3]));
     
     Double_t phi=TMath::ATan2(par[0],x) + trackTOFin->GetAlpha();
     if (phi<-TMath::Pi())phi+=2*TMath::Pi();
@@ -364,6 +391,12 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
     // find the clusters in the window of the track
 
     for (Int_t k=FindClusterIndex(z-dz); k<fN; k++) {
+
+      if (nc>=kNclusterMax) {
+       AliWarning("No more matchable clusters can be stored! Please, increase the corresponding vectors size.");
+       break;
+      }
+
       AliTOFcluster *c=fClusters[k];
       if (c->GetZ() > z+dz) break;
       //      if (c->IsUsed()) continue;
@@ -376,6 +409,8 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
       nc++;
     }
 
+    AliDebug(1,Form(" Number of matchable TOF clusters for the track number %d: %d",i,nc));
+
     //
     // select close clusters
     //
@@ -383,7 +418,7 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
     //    Bool_t dump = kTRUE;
     for (Int_t icl=0; icl<nc; icl++){
       Float_t distances[5];
-      if (nfound>=1000) break;
+
       index[nfound]=clind[icl];
       AliTOFcluster *cluster = fClusters[clind[icl]];
       GetLinearDistances(trackTOFin, cluster, distances);
@@ -426,7 +461,10 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
       }
       //
       nfound++;
-    }   
+    }
+
+    AliDebug(1,Form(" Number of track points for the track number %d: %d",i,nfound));
+
     if (nfound == 0 ) {
       fnunmatch++;
       delete trackTOFin;
@@ -435,9 +473,9 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
     //
     //choose the best cluster
     //
-    //Float_t quality[1000];
-    //Int_t   index[1000];
-    for (Int_t kk=0; kk<1000; kk++) quality[kk]=0;
+    //Float_t quality[kNclusterMax];
+    //Int_t   index[kNclusterMax];
+    for (Int_t kk=0; kk<kNclusterMax; kk++) quality[kk]=0;
     //
     AliTOFcluster * cgold=0;
     Int_t igold =-1;
@@ -494,8 +532,16 @@ void AliTOFtrackerMI::MatchTracksMI(Bool_t mLastStep){
     //    Double_t tof2=25.*cgold->GetTDC()-350; // in ps
     Double_t tof2=AliTOFGeometry::TdcBinWidth()*cgold->GetTDC()+kTofOffset; // in ps
     Float_t tgamma = TMath::Sqrt(cgold->GetR()*cgold->GetR()+cgold->GetZ()*cgold->GetZ())/0.03;
-    Float_t info[11]={dist3D[igold][0],dist3D[igold][1],dist3D[igold][2],dist3D[igold][3],dist3D[igold][4],mintimedist[igold],
-                     -1,tgamma, qualityGold,cgold->GetQuality(),0};
+    Float_t info[10]={dist3D[igold][0],
+                     dist3D[igold][1],
+                     dist3D[igold][2],
+                     dist3D[igold][3],
+                     dist3D[igold][4],
+                     mintimedist[igold],
+                     -1,
+                     tgamma,
+                     qualityGold,
+                     cgold->GetQuality()};
     //    GetLinearDistances(trackTOFin,cgold,&info[6]);
     if (inonfake>=0){
       info[6] = inonfake;
@@ -572,7 +618,8 @@ Int_t AliTOFtrackerMI::LoadClusters(TTree *cTree) {
   for (Int_t i=0; i<nc; i++) {
     AliTOFcluster *c=(AliTOFcluster*)clusters->UncheckedAt(i);
 
-    fClusters[i]=new AliTOFcluster(*c); fN++;
+//PH    fClusters[i]=new AliTOFcluster(*c); fN++;
+    fClusters[i]=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)));
     //AliInfo(Form("%i %f",i, fClusters[i]->GetZ()));
@@ -588,7 +635,7 @@ void AliTOFtrackerMI::UnloadClusters() {
   //This function unloads TOF clusters
   //--------------------------------------------------------------------
   for (Int_t i=0; i<fN; i++) {
-    delete fClusters[i];
+//PH    delete fClusters[i];
     fClusters[i] = 0x0;
   }
   fN=0;
@@ -631,15 +678,15 @@ Int_t AliTOFtrackerMI::FindClusterIndex(Double_t z) const {
   return m;
 }
 
-
-
+//_________________________________________________________________________
 Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster *cluster, Float_t distances[5])
 {
   //
   // calclates distance between cluster and track
   // use linear aproximation
   //
-  const Float_t kRaddeg = 180/3.14159265358979312;
+  //const Float_t kRaddeg = 180/3.14159265358979312;
+  const Float_t kRaddeg = TMath::RadToDeg();
   //
   //  Float_t tiltangle  = fGeom->GetAngles(cluster->fdetIndex[1],cluster->fdetIndex[2])/kRaddeg;  //tiltangle  
   Int_t cind[5];
@@ -661,7 +708,7 @@ Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster *
   Float_t phi = TMath::ATan2(cpos[1],cpos[0]); 
   if(phi<0) phi=2.*TMath::Pi()+phi;
   //  Get the local angle in the sector philoc
-  Float_t phiangle   = (Int_t (phi*kRaddeg/20.) + 0.5)*20./kRaddeg;
+  Float_t phiangle = (Int_t (phi*kRaddeg/20.) + 0.5)*20./kRaddeg;
   //
   Double_t v0[3];
   Double_t dir[3];
@@ -682,27 +729,27 @@ Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster *
   temp    =  cpos[0]*cosphi+cpos[1]*sinphi;
   cpos[1] = -cpos[0]*sinphi+cpos[1]*cosphi;
   cpos[0] = temp;
-  temp    =  v0[0]*cosphi+v0[1]*sinphi;
+  temp  =  v0[0]*cosphi+v0[1]*sinphi;
   v0[1] = -v0[0]*sinphi+v0[1]*cosphi;
   v0[0] = temp;
   //  
   temp    =  cpos[0]*costh+cpos[2]*sinth;
   cpos[2] = -cpos[0]*sinth+cpos[2]*costh;
   cpos[0] = temp;
-  temp    =  v0[0]*costh+v0[2]*sinth;
-  v0[2]   = -v0[0]*sinth+v0[2]*costh;
-  v0[0]   = temp;
+  temp   =  v0[0]*costh+v0[2]*sinth;
+  v0[2]  = -v0[0]*sinth+v0[2]*costh;
+  v0[0]  = temp;
   //
   //
   //rotate direction vector
   //
-  temp    =  dir[0]*cosphi+dir[1]*sinphi;
+  temp   =  dir[0]*cosphi+dir[1]*sinphi;
   dir[1] = -dir[0]*sinphi+dir[1]*cosphi;
   dir[0] = temp;
   //
-  temp    =  dir[0]*costh+dir[2]*sinth;
-  dir[2]  = -dir[0]*sinth+dir[2]*costh;
-  dir[0]  = temp;
+  temp   =  dir[0]*costh+dir[2]*sinth;
+  dir[2] = -dir[0]*sinth+dir[2]*costh;
+  dir[0] = temp;
   //
   Float_t v3[3];
   Float_t k = (cpos[0]-v0[0])/dir[0];
@@ -719,7 +766,9 @@ Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster *
   //
   // Debuging part of the matching
   //
-  if (track->GetLabel()==cluster->GetLabel(0) ||track->GetLabel()==cluster->GetLabel(1) ){
+  if (track->GetLabel()==cluster->GetLabel(0) ||
+      track->GetLabel()==cluster->GetLabel(1) ||
+      track->GetLabel()==cluster->GetLabel(2) ){
     TTreeSRedirector& cstream = *fDebugStreamer;
     Float_t tdc = cluster->GetTDC();
     cstream<<"Tracks"<<
@@ -737,8 +786,7 @@ Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster *
   return distances[3];
 }
 
-
-
+//_________________________________________________________________________
 void    AliTOFtrackerMI::GetLikelihood(Float_t dy, Float_t dz, const Double_t *cov, AliTOFtrack * /*track*/, Float_t & py, Float_t &pz)
 {
   //