updates requested by HLT
authorabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 24 Mar 2010 12:20:31 +0000 (12:20 +0000)
committerabercuci <abercuci@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 24 Mar 2010 12:20:31 +0000 (12:20 +0000)
- cache calibration params at tracking chamber level
- recalculate cluster error parameterization for HLT during tracking
  chamber building
- do a vertex constrained fit in case of HLT before leaving MakeSeeds

TRD/AliTRDcluster.cxx
TRD/AliTRDseedV1.cxx
TRD/AliTRDtrackerV1.cxx
TRD/AliTRDtrackingChamber.cxx
TRD/AliTRDtrackingChamber.h
TRD/AliTRDtrackingSector.cxx
TRD/AliTRDtrackingSector.h

index e248340..211f154 100644 (file)
@@ -851,21 +851,29 @@ void AliTRDcluster::Print(Option_t *o) const
   // Print cluster information
   //
 
-  AliInfo(Form("Det[%3d] LTrC[%+6.2f %+6.2f %+6.2f] Q[%5.1f] FLAG[in(%c) use(%c) sh(%c)] Y[%s]", 
+  if(strcmp(o, "a")==0) {
+    AliInfo(Form(
+    "\nDet[%3d] LTrC[%+6.2f %+6.2f %+6.2f] Q[%5.1f] FLAG[in(%c) use(%c) sh(%c)] Y[%s]"
+    "\n         LChC[c(%3d) r(%2d) t(%2d)] t-t0[%2d] Npad[%d] cen[%5.3f] mask[%d]"
+    "\n         QS[%3d %3d %3d %3d %3d %3d %3d] S2[%e %e]"
+    , fDetector, GetX(), GetY(), GetZ(), fQ, 
+    IsInChamber() ? 'y' : 'n', 
+    IsUsed() ? 'y' : 'n', 
+    IsShared() ? 'y' : 'n',
+    IsRPhiMethod(kGAUS)?"GAUS":(IsRPhiMethod(kLUT)?"LUT":"COG")
+    , fPadCol, fPadRow, fPadTime, fLocalTimeBin, fNPads, fCenter, fClusterMasking
+    , fSignals[0], fSignals[1], fSignals[2], fSignals[3]
+    , fSignals[4], fSignals[5], fSignals[6]
+    , GetSigmaY2(), GetSigmaZ2()));
+  } else { 
+    AliInfo(Form("Det[%3d] LTrC[%+6.2f %+6.2f %+6.2f] Q[%5.1f] FLAG[in(%c) use(%c) sh(%c)] Y[%s]", 
     fDetector, GetX(), GetY(), GetZ(), fQ, 
     IsInChamber() ? 'y' : 'n', 
     IsUsed() ? 'y' : 'n', 
     IsShared() ? 'y' : 'n',
     IsRPhiMethod(kGAUS)?"GAUS":(IsRPhiMethod(kLUT)?"LUT":"COG")
-  ));
-
-  if(strcmp(o, "a")!=0) return;
-  AliInfo(Form("LChC[c(%3d) r(%2d) t(%2d)] t-t0[%2d] Npad[%d] cen[%5.3f] mask[%d]"
-             , fPadCol, fPadRow, fPadTime, fLocalTimeBin, fNPads, fCenter, fClusterMasking)); 
-  AliInfo(Form("Signals[%3d %3d %3d %3d %3d %3d %3d]"
-             , fSignals[0], fSignals[1], fSignals[2], fSignals[3]
-             , fSignals[4], fSignals[5], fSignals[6]));
-
+    ));
+  }
 }
 
 //_____________________________________________________________________________
index e8b94b7..c4374d7 100644 (file)
@@ -1338,6 +1338,7 @@ Bool_t AliTRDseedV1::Fit(Bool_t tilt, Bool_t zcorr)
 
     // Recalculate cluster error based on tracking information
     c->SetSigmaY2(fS2PRF, fDiffT, fExB, xc[n], zcorr?zt:-1., dydx);
+    c->SetSigmaZ2(fPad[0]*fPad[0]/12.); // for HLT
     sy[n]  = TMath::Sqrt(c->GetSigmaY2());
 
     yc[n]  = recoParam->UseGAUS() ? 
@@ -1353,7 +1354,10 @@ Bool_t AliTRDseedV1::Fit(Bool_t tilt, Bool_t zcorr)
   }
 
   // to few clusters
-  if (n < kClmin) return kFALSE; 
+  if (n < kClmin){ 
+    SetErrorMsg(kFitFailed);
+    return kFALSE; 
+  }
 
   // fit XY
   if(!fitterY.Eval()){
@@ -1405,6 +1409,9 @@ Bool_t AliTRDseedV1::Fit(Bool_t tilt, Bool_t zcorr)
       qc[n]   = TMath::Abs(c->GetQ());
       xc[n]   = fX0 - c->GetX();
       zc[n]   = c->GetZ();
+      // Recalculate cluster error based on tracking information
+      c->SetSigmaY2(fS2PRF, fDiffT, fExB, xc[n], zcorr?(z0 - xc[n]*dzdx):-1., dydx);
+      c->SetSigmaZ2(fPad[0]*fPad[0]/12.); // for HLT
       fitterZ.AddPoint(&xc[n], -qc[n], 1.);
       n--;m++;
     }
index 1820ee0..8c59d17 100644 (file)
@@ -1126,6 +1126,10 @@ Float_t AliTRDtrackerV1::FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Doub
       if(!tracklets[ilr].IsUsable(itb)) continue;
       cl = tracklets[ilr].GetClusters(itb);
       if(!cl->IsInChamber()) continue;
+      if(cl->GetSigmaY2()<1.e-6 || cl->GetSigmaZ2()<1.e-6){
+        if(AliLog::GetDebugLevel("TRD", "AliTRDtrackerV1")>1) printf("D-AliTRDtrackerV1::FitTiltedRiemanConstraint: Cluster error parameterization missing. This should appear only in HLT tests.");
+        continue;
+      }
       x = cl->GetX();
       y = cl->GetY();
       z = cl->GetZ();
@@ -1225,10 +1229,15 @@ Float_t AliTRDtrackerV1::FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigErro
     for(Int_t itb = 0; itb < AliTRDseedV1::kNclusters; itb++){
       if(!(cl = tracklets[ipl].GetClusters(itb))) continue;
       if(!cl->IsInChamber()) continue;
-      //if (!tracklets[ipl].IsUsable(itb)) continue;
+      if (!tracklets[ipl].IsUsable(itb)) continue;
       x = cl->GetX();
       y = cl->GetY();
       z = cl->GetZ();
+      if(cl->GetSigmaY2()<1.e-6 || cl->GetSigmaZ2()<1.e-6){
+        if(AliLog::GetDebugLevel("TRD", "AliTRDtrackerV1")>1) printf("D-AliTRDtrackerV1::FitTiltedRieman: Cluster error parameterization missing. This should appear only in HLT tests.");
+        tracklets[ipl].Print("a");
+        continue;
+      }
       dx = x - xref;
       // Transformation
       t = 1./(x*x + y*y);
@@ -1959,9 +1968,9 @@ Int_t AliTRDtrackerV1::BuildTrackingContainers()
 {
 // Building tracking containers for clusters
 
-  Int_t nin =0, icl = fClusters->GetEntriesFast();
-  while (icl--) {
-    AliTRDcluster *c = (AliTRDcluster *) fClusters->UncheckedAt(icl);
+  Int_t nin(0), ncl(fClusters->GetEntriesFast());
+  while (ncl--) {
+    AliTRDcluster *c = (AliTRDcluster *) fClusters->UncheckedAt(ncl);
     if(c->IsInChamber()) nin++;
     if(fkReconstructor->IsHLT()) c->SetRPhiMethod(AliTRDcluster::kCOG);
     Int_t detector       = c->GetDetector();
@@ -1969,13 +1978,12 @@ Int_t AliTRDtrackerV1::BuildTrackingContainers()
     Int_t stack          = fGeom->GetStack(detector);
     Int_t layer          = fGeom->GetLayer(detector);
     
-    fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, icl);
+    fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, ncl, fkReconstructor->IsHLT());
   }
 
-  const AliTRDCalDet *cal = AliTRDcalibDB::Instance()->GetT0Det();
   for(int isector =0; isector<AliTRDgeometry::kNsector; isector++){ 
     if(!fTrSec[isector].GetNChambers()) continue;
-    fTrSec[isector].Init(fkReconstructor, cal);
+    fTrSec[isector].Init(fkReconstructor);
   }
 
   return nin;
@@ -2223,7 +2231,6 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
   // 8. Build ESD track and register it to the output list
   //
 
-  const AliTRDCalDet *cal = AliTRDcalibDB::Instance()->GetT0Det();
   AliTRDtrackingChamber *chamber = NULL;
   AliTRDtrackingChamber **ci = NULL;
   AliTRDseedV1 sseed[kMaxTracksStack*6]; // to be initialized
@@ -2444,7 +2451,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon
     
     for(Int_t ip = 0; ip < kNPlanes; ip++){ 
       if(!(chamber = stack[ip])) continue;
-      chamber->Build(fGeom, cal);//Indices(fSieveSeeding);
+      chamber->Build(fGeom);//Indices(fSieveSeeding);
     }
 
     if(fkRecoParam->GetStreamLevel(AliTRDrecoParam::kTracker) > 10){ 
@@ -2781,6 +2788,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * c
             if(!cseed[jLayer].AttachClusters(chamber, kTRUE)) continue;
             cseed[jLayer].Fit();
           }
+          FitTiltedRiemanConstraint(&cseed[0], GetZ());
           fTrackQuality[ntracks] = 1.; // dummy value
           ntracks++;
           if(ntracks == kMaxTracksStack) return ntracks;
index 29b6037..4ce8f81 100644 (file)
@@ -37,6 +37,7 @@
 #include "AliTRDgeometry.h"
 #include "AliTRDpadPlane.h"
 #include "AliTRDcalibDB.h"
+#include "AliTRDCommonParam.h"
 #include "Cal/AliTRDCalDet.h"
 #include "Cal/AliTRDCalROC.h"
 
@@ -47,6 +48,12 @@ AliTRDtrackingChamber::AliTRDtrackingChamber()
   :TObject()
   ,fDetector(-1)
   ,fX0(0.)
+  ,fExB(0.)
+  ,fVD(0.)
+  ,fT0(0.)
+  ,fS2PRF(0.)
+  ,fDiffL(0.)
+  ,fDiffT(0.)
 {}  
 
 //_______________________________________________________
@@ -56,13 +63,23 @@ void AliTRDtrackingChamber::Clear(const Option_t *opt)
 }
 
 //_______________________________________________________
-void AliTRDtrackingChamber::InsertCluster(AliTRDcluster *c, Int_t index)
+void AliTRDtrackingChamber::InsertCluster(AliTRDcluster *c, Int_t index, Bool_t hlt)
 {
+// Add cluster to TB container and recalculate error parameterization (for HLT)
+
   fTB[c->GetPadTime()].InsertCluster(c, index);
+  if(!hlt) return;
+
+  // Define approximate error parameterization for HLT clusters
+  // if needed the fix values of 
+  //  - drift length of 1.5 can be replaced with c->GetXloc()
+  //  - pad length can be cached from geometry in Init()
+  c->SetSigmaY2(fS2PRF, fDiffT, fExB, 1.5);
+  c->SetSigmaZ2(6.75);
 }
 
 //_______________________________________________________
-Bool_t AliTRDtrackingChamber::Build(AliTRDgeometry *const geo, const AliTRDCalDet *cal, Bool_t hlt)
+Bool_t AliTRDtrackingChamber::Build(AliTRDgeometry *const geo)
 {
 // Init chamber and all time bins (AliTRDchamberTimeBin)
 // Calculates radial position of the chamber based on 
@@ -73,8 +90,8 @@ Bool_t AliTRDtrackingChamber::Build(AliTRDgeometry *const geo, const AliTRDCalDe
     return kFALSE;
   }
 
-  Int_t stack = geo->GetStack(fDetector);
-  Int_t layer = geo->GetLayer(fDetector);
+  Int_t stack = AliTRDgeometry::GetStack(fDetector);
+  Int_t layer = AliTRDgeometry::GetLayer(fDetector);
   AliTRDpadPlane *pp = geo->GetPadPlane(layer, stack);
   Double_t zl = pp->GetRow0ROC() - pp->GetRowEndROC();
   Double_t z0 = geo->GetRow0(layer, stack, 0) - zl;
@@ -90,25 +107,32 @@ Bool_t AliTRDtrackingChamber::Build(AliTRDgeometry *const geo, const AliTRDCalDe
   }    
   if(jtb<2) return kFALSE;
   
-  
   // ESTIMATE POSITION OF PAD PLANE FOR THIS CHAMBER
+  Int_t t0 = Int_t(fT0);
+  fTB[t0].SetT0();
   Double_t x0 = fTB[index[0]].GetX();
   Double_t x1 = fTB[index[1]].GetX();
   Double_t dx = (x0 - x1)/(index[1] - index[0]); 
-
-  Int_t t0 = (Int_t)cal->GetValue(fDetector);
-  if(!hlt){
-    Double_t mean = 0.0;
-    AliTRDCalROC *roc = AliTRDcalibDB::Instance()->GetT0ROC(fDetector);
-    for(Int_t k = 0; k<roc->GetNchannels(); k++) mean += roc->GetValue(k); 
-    mean /= roc->GetNchannels();
-    t0 = (Int_t)(cal->GetValue(fDetector) + mean);
-  }
-  fTB[t0].SetT0();
   fX0 = x0 + dx*(index[0] - t0);       
   return kTRUE;
 }
   
+
+//_______________________________________________________
+void AliTRDtrackingChamber::Init(Int_t det)
+{
+// Init detector number and Cache calibration parameters
+
+  fDetector = det;
+  AliTRDcalibDB *calib = AliTRDcalibDB::Instance();
+  fT0    = calib->GetT0Average(fDetector);
+  fVD    = calib->GetVdriftAverage(fDetector);
+  fS2PRF = calib->GetPRFROC(fDetector)->GetMean(); fS2PRF *= fS2PRF;
+  fExB   = AliTRDCommonParam::Instance()->GetOmegaTau(fVD);
+  AliTRDCommonParam::Instance()->GetDiffCoeff(fDiffL,
+  fDiffT, fVD);
+}
+
 //_______________________________________________________      
 Int_t AliTRDtrackingChamber::GetNClusters() const
 {
index da6adc3..bc03336 100644 (file)
@@ -25,7 +25,6 @@
 #include "AliTRDseedV1.h"
 #endif
 
-class AliTRDCalDet;
 class AliTRDgeometry;
 class AliTRDReconstructor;
 class AliTRDtrackingChamber : public TObject
@@ -36,30 +35,43 @@ public:
   virtual ~AliTRDtrackingChamber(){}
   
   void     Bootstrap(const AliTRDReconstructor *rec);
-  Bool_t   Build(AliTRDgeometry *const geo, const AliTRDCalDet *cal, Bool_t hlt = kFALSE);
+  Bool_t   Build(AliTRDgeometry *const geo);
   void     Clear(const Option_t *opt = NULL);
-  Int_t    GetDetector() const {return fDetector;}
+  Int_t    GetDetector() const { return fDetector;}
   Int_t    GetNClusters() const;
   Double_t GetQuality();
   Bool_t   GetSeedingLayer(AliTRDchamberTimeBin *&layer, AliTRDgeometry * const geo, const AliTRDReconstructor *rec);
   Float_t  GetX()        const {return fX0;}
   AliTRDchamberTimeBin* GetTB(int tb) {return tb >= 0 && tb < AliTRDseedV1::kNtb ? &fTB[tb] : NULL;}
-  void     InsertCluster(AliTRDcluster *c, Int_t index);
+  Float_t  GetExB() const      { return fExB;}
+  Float_t  GetVD() const       { return fVD;}
+  Float_t  GetT0() const       { return fT0;}
+  Float_t  GetS2PRF() const    { return  fS2PRF;}
+  Float_t  GetDiffL() const    { return  fDiffL;}
+  Float_t  GetDiffT() const    { return  fDiffT;}
+
+  void     Init(Int_t det);
+  void     InsertCluster(AliTRDcluster *c, Int_t index, Bool_t hlt=kFALSE);
   
   void     Print(Option_t *opt = NULL) const;
 
-  void     SetDetector(Int_t det) { fDetector = det;}
   void     SetOwner();
   void     Update();
 
 private:
   Int_t         fDetector;  // detector number
-  Float_t       fX0;        // approximate position of the pad plane
+  Float_t       fX0;        // radial position of the pad plane
+  Float_t       fExB;       // tg(a_L) for chamber
+  Float_t       fVD;        // drift velocity for chamber
+  Float_t       fT0;        // time 0 for chamber
+  Float_t       fS2PRF;     // sigma^2 PRF for xd->0 and phi=a_L 
+  Float_t       fDiffL;     // longitudinal diffusion coefficient
+  Float_t       fDiffT;     // transversal diffusion coefficient
   
   AliTRDchamberTimeBin fTB[AliTRDseedV1::kNtb];    // time bins 
   
   
-  ClassDef(AliTRDtrackingChamber, 1)  // TRD tracker container for one chamber
+  ClassDef(AliTRDtrackingChamber, 2)  // TRD tracker container for one chamber
 };
 
 #endif  // ALITRDTRACKINGCHAMBER_H
index 99789dc..af3f42b 100644 (file)
@@ -61,7 +61,7 @@ AliTRDtrackingSector::AliTRDtrackingSector(AliTRDgeometry *geo, Int_t gs)
 \r
     \r
 //_____________________________________________________________________________\r
-void AliTRDtrackingSector::Init(const AliTRDReconstructor *rec, const AliTRDCalDet *cal)\r
+void AliTRDtrackingSector::Init(const AliTRDReconstructor *rec)\r
 {              \r
 //     Steer building of tracking chambers and build tracking sector.\r
 //     Propagate radial position information (calibration/alignment aware) from chambers to sector level\r
@@ -74,7 +74,7 @@ void AliTRDtrackingSector::Init(const AliTRDReconstructor *rec, const AliTRDCalD
       if(!(tb = (*tc)->GetTB(itb))) continue;\r
       tb->SetReconstructor(rec);\r
     }\r
-    (*tc)->Build(fGeom, cal, rec->IsHLT());\r
+    (*tc)->Build(fGeom);\r
   }\r
     \r
   Int_t nl;\r
@@ -129,7 +129,7 @@ AliTRDtrackingChamber* AliTRDtrackingSector::GetChamber(Int_t stack, Int_t layer
   for(Int_t ic = ch+1; ic<AliTRDgeometry::kNdets; ic++) fIndex[ic] += fIndex[ic] >= 0 ? 1 : 0;\r
   \r
   AliTRDtrackingChamber *chmb = fChamber[Int_t(fIndex[ch])] = new AliTRDtrackingChamber();\r
-  chmb->SetDetector(AliTRDgeometry::GetDetector(layer, stack, fSector));\r
+  chmb->Init(AliTRDgeometry::GetDetector(layer, stack, fSector));\r
   return chmb;\r
 }\r
 \r
index 84f56c8..a9887b9 100644 (file)
@@ -21,7 +21,6 @@
 #include "AliTRDgeometry.h"
 #endif
 
-class AliTRDCalDet;
 class AliTRDReconstructor;
 class AliTRDtrackingChamber;
 class AliTRDtrackingSector 
@@ -40,7 +39,7 @@ public:
   AliTRDtrackingChamber** GetStack(Int_t stack);
   Int_t    GetSector() const {return fSector;} 
 
-  void     Init(const AliTRDReconstructor *rec, const AliTRDCalDet *cal);
+  void     Init(const AliTRDReconstructor *rec);
   void     Print(Option_t *opt = NULL) const;
   
   void     SetGeometry(AliTRDgeometry *const geo) {fGeom = geo;}