]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackerV1.cxx
New PropagateToX method (Alex)
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackerV1.cxx
index a976537b6aedd8fc7671e29cd7d18fcd8eae6ca7..26b4f0c4267a26c368808dee30586bf008a25e75 100644 (file)
@@ -1,3 +1,4 @@
+
 /**************************************************************************
  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
  *                                                                        *
@@ -159,7 +160,7 @@ Int_t AliTRDtrackerV1::Clusters2Tracks(AliESDEvent *esd)
 
 
 //_____________________________________________________________________________
-Bool_t AliTRDtrackerV1::GetTrackPoint(Int_t /*index*/, AliTrackPoint &/*p*/) const
+Bool_t AliTRDtrackerV1::GetTrackPoint(Int_t index, AliTrackPoint &/*p*/) const
 {
        //AliInfo(Form("Asking for tracklet %d", index));
        
@@ -435,6 +436,12 @@ Int_t AliTRDtrackerV1::RefitInward(AliESDEvent *event)
 
   Int_t   nseed    = 0; // contor for loaded seeds
   Int_t   found    = 0; // contor for updated TRD tracks
+  
+  // Calibration monitor
+  AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
+  if (!calibra) AliInfo("Could not get Calibra instance\n");
+  
+  
   AliTRDtrackV1 track;
   for (Int_t itrack = 0; itrack < event->GetNumberOfTracks(); itrack++) {
     AliESDtrack *seed = event->GetTrack(itrack);
@@ -454,25 +461,31 @@ Int_t AliTRDtrackerV1::RefitInward(AliESDEvent *event)
     track.ResetCovariance(50.0);
 
                // do the propagation and processing
-    FollowProlongation(track);
-    // computes PID for track
-    track.CookPID();
-    // update calibration references using this track
-               //track.Calibrate();
-
-               // Prolongate to TPC
-    Double_t xTPC = 250.0;
-    if (PropagateToX(track, xTPC, fgkMaxStep)) { //  -with update
-      seed->UpdateTrackParams(&track, AliESDtrack::kTRDrefit);
-      track.UpdateESDtrack(seed);
-       // Add TRD track to ESDfriendTrack
-                       if (AliTRDReconstructor::StreamLevel() > 0 /*&& quality TODO*/){ 
-                               AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
-                               calibTrack->SetOwner();
-                               seed->AddCalibObject(calibTrack);
+    Bool_t kUPDATE = kFALSE;
+               Double_t xTPC = 250.0;
+    if(FollowProlongation(track)){
+                       // computes PID for track
+                       track.CookPID();
+                       // update calibration references using this track
+                       if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(&track);
+       
+                       // Prolongate to TPC
+                       if (PropagateToX(track, xTPC, fgkMaxStep)) { //  -with update
+                               seed->UpdateTrackParams(&track, AliESDtrack::kTRDrefit);
+                               track.UpdateESDtrack(seed);
+                               // Add TRD track to ESDfriendTrack
+                               if (AliTRDReconstructor::StreamLevel() > 0 /*&& quality TODO*/){ 
+                                       AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
+                                       calibTrack->SetOwner();
+                                       seed->AddCalibObject(calibTrack);
+                               }
+                               found++;
+                               kUPDATE = kTRUE;
                        }
-                       found++;
-    } else {  // - without update
+               }        
+               
+               // Prolongate to TPC without update
+               if(!kUPDATE) {
       AliTRDtrackV1 tt(*seed);
       if (PropagateToX(tt, xTPC, fgkMaxStep)) seed->UpdateTrackParams(&tt, AliESDtrack::kTRDrefit);
     }
@@ -513,6 +526,7 @@ Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t)
   
        //AliInfo("");
        Int_t    nClustersExpected = 0;
+       Float_t clength = AliTRDgeometry::AmThick() + AliTRDgeometry::DrThick();
        Int_t lastplane = 5; //GetLastPlane(&t);
        for (Int_t iplane = lastplane; iplane >= 0; iplane--) {
                //AliInfo(Form("plane %d", iplane));
@@ -553,10 +567,12 @@ Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t)
     Int_t   index   = 0;
                //AliInfo(Form("sector %d", sector));
     AliTRDseedV1 *tracklet = GetTracklet(&t, iplane, index);
-         //AliInfo(Form("tracklet 0x%x @ %d", tracklet, index));
+         //AliInfo(Form("tracklet %p @ %d", tracklet, index));
                if(!tracklet) continue;
-
-               t.PropagateTo(tracklet->GetX0(), xx0, xrho); // not correct
+               //AliInfo(Form("reco %p", tracklet->GetRecoParam()));
+               t.SetTracklet(tracklet, iplane, index);
+               
+               t.PropagateTo(tracklet->GetX0() - clength, xx0, xrho);
          if (!AdjustSector(&t)) break;
          
     Double_t maxChi2 = t.GetPredictedChi2(tracklet);
@@ -614,7 +630,6 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
 //
 
        Int_t nClustersExpected = 0;
-
   // Loop through the TRD planes
   for (Int_t iplane = 0; iplane < AliTRDgeometry::Nplan(); iplane++) {
                //AliInfo(Form("Processing plane %d ...", iplane));
@@ -697,18 +712,20 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
                                stackLayer[itb].BuildIndices();
                                nClustersChmb += stackLayer[itb].GetNClusters();
                        }
+                       if(!nClustersChmb) continue;
                        //AliInfo(Form("Detector p[%d] c[%d]. Building tracklet from %d clusters ... ", iplane, ichmb, nClustersChmb));
 
                        tracklet.SetRecoParam(fRecoParam);
                        tracklet.SetTilt(TMath::Tan(-TMath::DegToRad()*pp->GetTiltingAngle()));
                        tracklet.SetPadLength(pp->GetLengthIPad());
                        tracklet.SetPlane(iplane);
-                       Int_t tbRange   = fTimeBinsPerPlane; //Int_t(AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght() * AliTRDCommonParam::Instance()->GetSamplingFrequency()/AliTRDcalibDB::Instance()->GetVdriftDet()->GetValue(det));
+                       //Int_t tbRange   = fTimeBinsPerPlane; //Int_t(AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght() * AliTRDCommonParam::Instance()->GetSamplingFrequency()/AliTRDcalibDB::Instance()->GetVdriftDet()->GetValue(det));
                        //printf("%d hl[%f] pl[%f] tb[%d]\n", il, hL[il], padlength[il], tbRange[il]);
-                       tracklet.SetNTimeBinsRange(tbRange);
+                       //tracklet.SetNTimeBinsRange(tbRange);
                        tracklet.SetX0(x0);
                        tracklet.Init(&t);
                        if(!tracklet.AttachClustersIter(stackLayer, 1000.)) continue;
+                       tracklet.Init(&t);
 
                        //if(!tracklet.AttachClusters(stackLayer, kTRUE)) continue;
                        //if(!tracklet.Fit()) continue;
@@ -780,6 +797,72 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t)
        return nClustersExpected;
 }
 
+//_____________________________________________________________________________
+Int_t AliTRDtrackerV1::PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t maxStep)
+{
+  //
+  // Starting from current X-position of track <t> this function
+  // extrapolates the track up to radial position <xToGo>. 
+  // Returns 1 if track reaches the plane, and 0 otherwise 
+  //
+
+  const Double_t kEpsilon = 0.00001;
+
+  // Current track X-position
+  Double_t xpos = t.GetX();
+
+  // Direction: inward or outward
+  Double_t dir  = (xpos < xToGo) ? 1.0 : -1.0;
+
+  while (((xToGo - xpos) * dir) > kEpsilon) {
+
+    Double_t xyz0[3];
+    Double_t xyz1[3];
+    Double_t param[7];
+    Double_t x;
+    Double_t y;
+    Double_t z;
+
+    // The next step size
+    Double_t step = dir * TMath::Min(TMath::Abs(xToGo-xpos),maxStep);
+
+    // Get the global position of the starting point
+    t.GetXYZ(xyz0);
+
+    // X-position after next step
+    x = xpos + step;
+
+    // Get local Y and Z at the X-position of the next step
+    if (!t.GetProlongation(x,y,z)) {
+      return 0; // No prolongation possible
+    }
+
+    // The global position of the end point of this prolongation step
+    xyz1[0] =  x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha()); 
+    xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha());
+    xyz1[2] =  z;
+
+    // Calculate the mean material budget between start and
+    // end point of this prolongation step
+    AliTracker::MeanMaterialBudget(xyz0,xyz1,param);
+
+    // Propagate the track to the X-position after the next step
+    if (!t.PropagateTo(x,param[1],param[0]*param[4])) {
+      return 0;
+    }
+
+    // Rotate the track if necessary
+    AdjustSector(&t);
+
+    // New track X-position
+    xpos = t.GetX();
+
+  }
+
+  return 1;
+
+}
+
 //____________________________________________________________________
 void AliTRDtrackerV1::UnloadClusters() 
 { 
@@ -791,26 +874,21 @@ void AliTRDtrackerV1::UnloadClusters()
   Int_t nentr;
 
   nentr = fClusters->GetEntriesFast();
-       //AliInfo(Form("clearing %d clusters", nentr));
   for (i = 0; i < nentr; i++) {
     delete fClusters->RemoveAt(i);
   }
   fNclusters = 0;
-
-  nentr = fTracklets->GetEntriesFast();
-       //AliInfo(Form("clearing %d tracklets", nentr));
-  for (i = 0; i < nentr; i++) {
-    delete fTracklets->RemoveAt(i);
-  }
+  
+       if(fTracklets){
+       for (i = 0; i < fTracklets->GetEntriesFast(); i++) delete fTracklets->RemoveAt(i);
+       }
 
   nentr = fSeeds->GetEntriesFast();
-       //AliInfo(Form("clearing %d seeds", nentr));
   for (i = 0; i < nentr; i++) {
     delete fSeeds->RemoveAt(i);
   }
 
   nentr = fTracks->GetEntriesFast();
-  //AliInfo(Form("clearing %d tracks", nentr));
        for (i = 0; i < nentr; i++) {
     delete fTracks->RemoveAt(i);
   }
@@ -861,7 +939,7 @@ AliTRDseedV1* AliTRDtrackerV1::GetTracklet(AliTRDtrackV1 *track, Int_t p, Int_t
 }
 
 //____________________________________________________________________
-Int_t AliTRDtrackerV1::SetTracklet(AliTRDseedV1 */*tracklet*/)
+Int_t AliTRDtrackerV1::SetTracklet(AliTRDseedV1 *tracklet)
 {
 // Add this tracklet to the list of tracklets stored in the tracker
 //
@@ -880,8 +958,7 @@ Int_t AliTRDtrackerV1::SetTracklet(AliTRDseedV1 */*tracklet*/)
                fTracklets->SetOwner(kTRUE);
        }
        Int_t nentries = fTracklets->GetEntriesFast();
-       //AliTRDseedV1 *t = new ((*fTracklets)[nentries]) AliTRDseedV1(*tracklet);
-       //AliInfo(Form("0x%x @ %d", t, nentries));
+       new ((*fTracklets)[nentries]) AliTRDseedV1(*tracklet);
        return nentries;
 }
 
@@ -1390,7 +1467,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDstackLayer *layers
 #endif
        
        // Init chambers geometry
-       Int_t det, tbRange[6]; // time bins inside the detector geometry
+       Int_t det/*, tbRange[6]*/; // time bins inside the detector geometry
        Double_t hL[kNPlanes];       // Tilting angle
        Float_t padlength[kNPlanes]; // pad lenghts
        AliTRDpadPlane *pp;
@@ -1399,7 +1476,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDstackLayer *layers
                hL[il]        = TMath::Tan(-TMath::DegToRad()*pp->GetTiltingAngle());
                padlength[il] = pp->GetLengthIPad();
                det           = il; // to be fixed !!!!!
-               tbRange[il]   = fTimeBinsPerPlane; //Int_t(AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght() * AliTRDCommonParam::Instance()->GetSamplingFrequency()/AliTRDcalibDB::Instance()->GetVdriftDet()->GetValue(det));
+               //tbRange[il]   = fTimeBinsPerPlane; //Int_t(AliTRDgeometry::CamHght()+AliTRDgeometry::CdrHght() * AliTRDCommonParam::Instance()->GetSamplingFrequency()/AliTRDcalibDB::Instance()->GetVdriftDet()->GetValue(det));
                //printf("%d hl[%f] pl[%f] tb[%d]\n", il, hL[il], padlength[il], tbRange[il]);
        }
 
@@ -1450,7 +1527,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDstackLayer *layers
                                        tseed->SetPlane(jLayer);
                                        tseed->SetTilt(hL[jLayer]);
                                        tseed->SetPadLength(padlength[jLayer]);
-                                       tseed->SetNTimeBinsRange(tbRange[jLayer]);
+                                       //tseed->SetNTimeBinsRange(tbRange[jLayer]);
                                        tseed->SetX0(layer[iLayer]->GetX());//layers[jLayer*fTimeBinsPerPlane].GetX());
 
                                        tseed->Init(fFitter->GetRiemanFitter());
@@ -1588,7 +1665,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDstackLayer *layers
                                        cseed[jLayer].SetTilt(hL[jLayer]);
                                        cseed[jLayer].SetX0(layers[(jLayer +1) * fTimeBinsPerPlane-1].GetX());
                                        cseed[jLayer].SetPadLength(padlength[jLayer]);
-                                       cseed[jLayer].SetNTimeBinsRange(tbRange[jLayer]);
+                                       //cseed[jLayer].SetNTimeBinsRange(tbRange[jLayer]);
                                        cseed[jLayer].Init(rim);
 //                                     AliTRDcluster *cd = FindSeedingCluster(&layers[jLayer*fTimeBinsPerPlane], &cseed[jLayer]);
 //                                     if(cd == 0x0) continue;
@@ -1878,9 +1955,9 @@ Double_t  AliTRDtrackerV1::MakeSeedingPlanes(AliTRDstackLayer *layers)
        Float_t nclMed = float(ncl-nused)/nTimeBins;
        Int_t ncli = Int_t(nclMed);
        Float_t nclDev = TMath::Abs(nclMed - TMath::Max(ncli, 1));
-       nclDev -= (nclDev>.5) && ncli ? .5 : 0.; 
-       /*Double_t quality = */ return TMath::Exp(-2.*nclDev);
-       
+       nclDev -= (nclDev>.5) && ncli ? 0. : 1.; 
+       /*Double_t quality = */ return TMath::Exp(2.*nclDev);
+
 //     // get slope of the derivative
 //     if(!fitter.Eval()) return quality;
 //     fitter.PrintResults(3);