Cosmic tracker as an intergral part of the central ALICE reconstruction.
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 24 Jan 2012 13:25:39 +0000 (13:25 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 24 Jan 2012 13:25:39 +0000 (13:25 +0000)
Cosmic tracker called during the AliTPCtrackerMI::RefitInward.

Changes for the cosmic tracking codes necessary to be used in the compiled code

M      CMakelibTPCrec.pkg             - Adding cosmic tracking classes
M      TPCrecLinkDef.h                - Adding cosmic tracking classes
M      AliTPCtrackerMI.cxx            - Invoke cosmic tracker ::FindCosmics during refit inward

M      AliCosmicTracker.h             -
M      AliCosmicTracker.cxx           -
M      AliTPCCosmicTrackfit.cxx       - Using function instaead of static data members for constants
M      AliTPCCosmicTrackfit.h         -
M      AliTPCCosmicUtils.h            - Coding Convention
M      AliTPCCosmicUtils.cxx          -

(Xianguo)

TPC/AliCosmicTracker.cxx
TPC/AliCosmicTracker.h
TPC/AliTPCCosmicTrackfit.cxx
TPC/AliTPCCosmicTrackfit.h
TPC/AliTPCCosmicUtils.cxx
TPC/AliTPCCosmicUtils.h
TPC/AliTPCtrackerMI.cxx
TPC/CMakelibTPCrec.pkg
TPC/TPCrecLinkDef.h

index d31beb0..81678e4 100644 (file)
@@ -117,16 +117,19 @@ AliCosmicTracker::AliCosmicTracker(const Int_t dlev, const TString tag):
   fUserCut(0x0)
   , fStreamer(0x0), fDebugLevel(dlev)
   , fESDEvent(0x0)
-  , fCombinedTrackfit(0x0)
+  , fCosmicTrackfit(0x0)
   , fTrackStack(0x0)
-  , fCombRefPt(-999)
-  , fChi2PerCluster(-999)
-  , fImpactD(-999)
-  , fImpactZ(-999)
-  , fIsReuse(kFALSE)
-  , fFindableRatio(-999)
+  , fTrack0()
+  , fTrack1()
+  , fRawVtx(-999,-999,-999)
+  , fRawDCA(-999)
   , fdPhi(-999)
+  , fCutdPhi(-999)
   , fdTheta(-999)
+  , fCutdTheta(-999)
+  , fErrFlagESDtrackCut(-999)
+  , fErrFlagIsPair(-999)
+  , fErrFlagCosmicTrackfit(-999)
 {
   //
   //constructor
@@ -135,7 +138,7 @@ AliCosmicTracker::AliCosmicTracker(const Int_t dlev, const TString tag):
   if(fDebugLevel & 1)
     fStreamer = new TTreeSRedirector(Form("CosmicTracker_%s.root", tag.Data()));
 
-  fCombinedTrackfit = new AliTPCCosmicTrackfit(0, "AliCosmicTracker");
+  fCosmicTrackfit = new AliTPCCosmicTrackfit(0, "AliCosmicTracker");
   fTrackStack = new TClonesArray("AliESDCosmicTrack",100);
  
   for(Int_t ii=0; ii<5; ii++){
@@ -165,7 +168,7 @@ AliCosmicTracker::~AliCosmicTracker()
   //destructor
   //
   delete fStreamer;
-  delete fCombinedTrackfit;
+  delete fCosmicTrackfit;
   delete fTrackStack;
 }
 
@@ -174,7 +177,6 @@ void AliCosmicTracker::SetESDEvent(AliESDEvent *esd)
   //
   //set esd event
   //
-
   fESDEvent = esd;
   fTrackStack->Clear();
 }
@@ -195,9 +197,14 @@ Int_t AliCosmicTracker::Process(const TString tag, const Bool_t kprint)
   Double_t findabler0 = -999;
   Double_t findabler1 = -999;
 
+  fErrFlagESDtrackCut = 0;
+  fErrFlagIsPair = 0;
+  fErrFlagCosmicTrackfit = 0;
+
   for(Int_t itrk=0; itrk<ntrk; itrk++){
-    if(!ESDtrackCut(fESDEvent->GetTrack(itrk), findabler0))
+    if(!ESDtrackCut(fESDEvent->GetTrack(itrk), findabler0)){
       continue;
+    }
 
     for(Int_t jtrk=itrk+1; jtrk<ntrk; jtrk++){
       if(!ESDtrackCut(fESDEvent->GetTrack(jtrk), findabler1))
@@ -206,28 +213,31 @@ Int_t AliCosmicTracker::Process(const TString tag, const Bool_t kprint)
       AliESDtrack * trk0 = fESDEvent->GetTrack(itrk);
       AliESDtrack * trk1 = fESDEvent->GetTrack(jtrk);
       if( IsPair(trk0, trk1) ){
-        if( fCombinedTrackfit->CombineESDtracks(trk0, trk1)  ){
-          fCombTrackUp = *(fCombinedTrackfit->GetTrackParamUp());
-          fCombTrackLow = *(fCombinedTrackfit->GetTrackParamLow());
+        const Bool_t kfit = fCosmicTrackfit->CombineESDtracks(trk0, trk1);
+        fErrFlagCosmicTrackfit = fCosmicTrackfit->GetStatus();
 
-          fCombRefPt = fCombinedTrackfit->GetTrackParamLow()->Pt();
-          fChi2PerCluster = fCombinedTrackfit->GetChi2PerCluster();
+        if(kfit){
+          fRawVtx = fCosmicTrackfit->ImpactParameter3D();
+          fRawDCA = fCosmicTrackfit->ImpactParameter2D().Mag();
 
-          fImpactD = fCombinedTrackfit->GetImpactD();
-          fImpactZ = fCombinedTrackfit->GetImpactZ();
+          const Int_t ncls              = fCosmicTrackfit->GetFitNcls();
+          const Double_t leverarm       = fCosmicTrackfit->GetFitLeverArm();
+          const Double_t chi2percluster = fCosmicTrackfit->GetChi2PerCluster();
+          const Double_t impactD        = fCosmicTrackfit->GetImpactD();
+          const Double_t impactZ        = fCosmicTrackfit->GetImpactZ();
 
-          fFindableRatio = TMath::Min(findabler0, findabler1);
+          const Double_t findableratio  = TMath::Min(findabler0, findabler1);
 
           trkcounter[itrk]++;
           trkcounter[jtrk]++;
+          const Bool_t isreuse          = (trkcounter[itrk]>1 || trkcounter[jtrk]>1);
 
-          fIsReuse = (trkcounter[itrk]>1 || trkcounter[jtrk]>1);
-          if(fDebugLevel & 1)
-            WriteStreamer(ntrk);
+          const TVector3 icU = fCosmicTrackfit->GetInnerClusterUp();
+          const TVector3 icD = fCosmicTrackfit->GetInnerClusterLow();
 
           Int_t idup = itrk;
           Int_t idlow = jtrk;
-          if(fCombinedTrackfit->IsSwap()){
+          if(fCosmicTrackfit->IsSwap()){
             const Int_t idtmp = idup;
             idup = idlow;
             idlow = idtmp;
@@ -239,28 +249,32 @@ Int_t AliCosmicTracker::Process(const TString tag, const Bool_t kprint)
 
           if(
              (fDebugLevel & 4) && 
-             ( (fIsReuse && ntrk<=4) || kprint )
+             ( (isreuse && ntrk<=4) || kprint )
              ){
             AliESDtrack * trks[]={fESDEvent->GetTrack(idup), fESDEvent->GetTrack(idlow)};
             AliTPCCosmicUtils::DrawTracks(trks, Form("reuse_%03d_%03d_%03d_%s", ntrk, itrk, jtrk, tag.Data()));
           }
           if(
              (fDebugLevel & 8) &&
-             fImpactD > 200
+             impactD > 160 && findableratio < 0.56
              ){
             AliESDtrack * trks[]={fESDEvent->GetTrack(idup), fESDEvent->GetTrack(idlow)};
-            AliTPCCosmicUtils::DrawTracks(trks, Form("largevtd_%.f_%03d_%03d_%03d_%s", fImpactD, ntrk, itrk, jtrk, tag.Data()));
+            AliTPCCosmicUtils::DrawTracks(trks, Form("largevtd_%.f_%.f_%03d_%03d_%03d_%s", impactD, findableratio, ntrk, itrk, jtrk, tag.Data()));
           }
 
-          AliESDCosmicTrack costrk(idup, idlow, fCombinedTrackfit->GetTrackParamUp(), fCombinedTrackfit->GetTrackParamLow(), &fTrack0, &fTrack1, fCombinedTrackfit->GetFitNcls(), fCombinedTrackfit->GetFitLeverArm(), fCombinedTrackfit->GetChi2PerCluster(), fCombinedTrackfit->GetImpactD(), fCombinedTrackfit->GetImpactZ(), fIsReuse, fFindableRatio);
+          AliESDCosmicTrack costrk(idup, idlow, fCosmicTrackfit->GetTrackParamUp(), fCosmicTrackfit->GetTrackParamLow(), &fTrack0, &fTrack1, ncls, leverarm, chi2percluster, impactD, impactZ, isreuse, findableratio, icU, icD);
           new((*fTrackStack)[npair]) AliESDCosmicTrack(costrk);
           npair++;
+
+          if(fDebugLevel & 1)
+            WriteStreamer(ntrk, &costrk);
+
         }
         else{
           if(fDebugLevel & 16){
             if(ntrk==2){
               AliESDtrack * trks[]={trk0, trk1};
-              AliTPCCosmicUtils::DrawTracks(trks, Form("failCombinedFit_%02d_%03d_%03d_%03d_%s", fCombinedTrackfit->GetStatus(), ntrk, itrk, jtrk, tag.Data()));
+              AliTPCCosmicUtils::DrawTracks(trks, Form("failCosmicFit_%02d_%03d_%03d_%03d_%s", fCosmicTrackfit->GetStatus(), ntrk, itrk, jtrk, tag.Data()));
             }
           }
         }
@@ -285,8 +299,6 @@ Bool_t AliCosmicTracker::IsPair(AliESDtrack * trk0, AliESDtrack * trk1)
   //check whether the two tracks come from one cosmic ray
   //
 
-  fErrFlagIsPair = 0;
-
   //dphi + pi should = 0
   fdPhi   = AliTPCCosmicUtils::AngleInRange(trk0->Phi()   - trk1->Phi()   + TMath::Pi());
   if( TMath::Abs(fdPhi) > fCutdPhi ){
@@ -368,7 +380,7 @@ Bool_t AliCosmicTracker::IsPair(AliESDtrack * trk0, AliESDtrack * trk1)
   }
 
   for(Int_t ii=0; ii<2; ii++){
-    if(!AliTrackerBase::PropagateTrackToBxByBz(&(tmptrk[ii]), xTogo, AliTPCCosmicUtils::fgkMass, maxStep, rotateTo, maxSnp, eloss[ii])){
+    if(!AliTrackerBase::PropagateTrackToBxByBz(&(tmptrk[ii]), xTogo, AliTPCCosmicUtils::Mass(), maxStep, rotateTo, maxSnp, (Int_t)(eloss[ii]))){
       fErrFlagIsPair = 7;
       return kFALSE;
     }
@@ -435,38 +447,63 @@ Bool_t AliCosmicTracker::ESDtrackCut(AliESDtrack * trk, Double_t &findabler)
   //
 
   if(fUserCut){
-    if(!fUserCut(trk))
+    if(!fUserCut(trk)){
+      fErrFlagESDtrackCut = 1;
       return kFALSE;
+    }
   }
 
   //reject kink
-  if(trk->GetKinkIndex(0)>0)
+  if(trk->GetKinkIndex(0)>0){
+    fErrFlagESDtrackCut = 2;
     return kFALSE;
+  }
 
   //require refit
-  if(!trk->IsOn(AliESDtrack::kTPCrefit))
+  if(!trk->IsOn(AliESDtrack::kTPCrefit)){
+    fErrFlagESDtrackCut = 3;
     return kFALSE;
+  }
 
   // due to drift velocity calibration, a track crossing Z=0 may be reconstructed as 2 ESD tracks, so two pairs are formed, each with one part of this track. Solution: cut on findable ratio (require > 0.5) to remove split tracks due to drift velocity calibration systematics on different sides
   //there is some remaining with isreuse = true, user should cut on findable ratio according to the fraction of isreuse
   findabler = -999;
-  if(!trk->GetTPCNclsF())
+  if(!trk->GetTPCNclsF()){
+    fErrFlagESDtrackCut = 4;
     return kFALSE;
+  }
 
   findabler = (Double_t)trk->GetTPCNcls()/(Double_t) trk->GetTPCNclsF();
 
-  if(findabler < fgkCutFindable ){
+  if(findabler < CutFindable() ){
+    fErrFlagESDtrackCut = 5;
+    return kFALSE;
+  }
+
+  //cut on # TPC ncls on each ESDtrack
+  if(trk->GetTPCncls()<AliTPCCosmicUtils::NclsMin()){
+    fErrFlagESDtrackCut = 6;
     return kFALSE;
   }
 
   //require ESDfriends
-  if(!AliTPCCosmicUtils::GetTPCseed(trk))
+  if(!AliTPCCosmicUtils::GetTPCseed(trk)){
+    fErrFlagESDtrackCut = 7;
     return kFALSE;
+  }
 
   return kTRUE;
 }
 
-void AliCosmicTracker::WriteStreamer(Int_t ntrk)
+Int_t AliCosmicTracker::GetErrFlag() const
+{
+  //
+  //return the error status in process
+  //
+  return fErrFlagESDtrackCut + fErrFlagIsPair*100 + fErrFlagCosmicTrackfit*10000;
+}
+
+void AliCosmicTracker::WriteStreamer(Int_t ntrk, AliESDCosmicTrack *costrk)
 {
   //
   //output to streamer
@@ -474,16 +511,12 @@ void AliCosmicTracker::WriteStreamer(Int_t ntrk)
 
   (*fStreamer)<<"CosmicTracker_Streamer"<<
     "ntrk="<<ntrk<<
-    "combup="<<&fCombTrackUp<<
-    "comblow="<<&fCombTrackLow<<
-    "track0="<<&fTrack0<<
-    "track1="<<&fTrack1<<
-    "vtxd="<<fImpactD<<
-    "vtxz="<<fImpactZ<<
-    "isreuse="<<fIsReuse<<
-    "findabler="<<fFindableRatio<<
-    "pt="<<fCombRefPt<<
-    "chi2="<<fChi2PerCluster<<
+
+    "costrk="<<costrk<<
+
+    "rawvtx="<<&fRawVtx<<
+    "rawdca="<<fRawDCA<<
+
     "dphi="<<fdPhi<<
     "dtheta="<<fdTheta<<
     "pull0="<<fPull[0]<<
@@ -498,3 +531,30 @@ void AliCosmicTracker::WriteStreamer(Int_t ntrk)
     "delta4="<<fDelta[4]<<
     "\n";
 }
+
+TClonesArray *AliCosmicTracker::FindCosmic(AliESDEvent *event, const Bool_t kadd)
+{
+  //
+  //do cosmic combined trackfit
+  //
+
+  AliCosmicTracker cosmicTracker;
+  cosmicTracker.SetESDEvent(event);
+  const Int_t npair = cosmicTracker.Process();
+  const TClonesArray *arr = cosmicTracker.GetTrackStack();
+
+  TClonesArray *stackCosmic = 0x0;
+  if(kadd){
+    for(Int_t ip=0; ip<npair; ip++){
+      const AliESDCosmicTrack * esdcos = (AliESDCosmicTrack*) arr->At(ip);
+      event->AddCosmicTrack(esdcos);
+    }
+    printf("AliCosmicTracker::FindCosmic: event %d: Number of cosmic pairs by AliCosmicTracker %d out of %d tracks, err %d\n", event->GetEventNumberInFile(), npair, event->GetNumberOfTracks(), cosmicTracker.GetErrFlag());
+  }
+  else{
+    stackCosmic = new TClonesArray(*arr);
+  }
+
+  return stackCosmic;
+}
+
index 1057098..6ad5da0 100644 (file)
 #ifndef ALICOSMICTRACKER_H
 #define ALICOSMICTRACKER_H
 
-class TTreeSRedirector;
+class AliESDCosmicTrack;
 class AliTPCCosmicTrackfit;
 
+class AliESDEvent;
+
 class AliCosmicTracker
 {
  public:
 
-  typedef Bool_t (*CutFunc)(AliESDtrack *trk);
+  typedef Bool_t (*CutFunc)(const AliESDtrack *trk);
 
   AliCosmicTracker(const Int_t dlev=0, const TString tag="test"); 
   ~AliCosmicTracker();
@@ -41,6 +43,8 @@ class AliCosmicTracker
   TClonesArray * GetTrackStack() const {return fTrackStack;}
 
   TTreeSRedirector * GetStreamer() const {return fStreamer;}
+  Int_t GetDebugLevel() const {return fDebugLevel;}
+  Int_t GetErrFlag() const;
 
   void SetCutPull(     const Int_t ii, const Double_t cut){ fCutPull[ii] = cut;}
   void SetCutDelta(    const Int_t ii, const Double_t cut){ fCutDelta[ii] = cut;}
@@ -50,35 +54,32 @@ class AliCosmicTracker
 
   void SetUserESDtrackCut(CutFunc func){fUserCut = func;}
 
+  static TClonesArray *FindCosmic(AliESDEvent *event, const Bool_t kadd);
+
  private:
   AliCosmicTracker(const AliCosmicTracker &p);
   AliCosmicTracker & operator=(const AliCosmicTracker &p);
 
+  static Double_t CutFindable(){return 0.5;}          //cut on findable ratio of TPC cluster; DCA-anormlay is caused by laser!! should check trigger!!
+
   Bool_t ESDtrackCut(AliESDtrack * trk, Double_t &findabler);
 
   Bool_t IsPair(AliESDtrack* trk0, AliESDtrack*trk1);
-  void WriteStreamer(Int_t ntrk);
+  void WriteStreamer(Int_t ntrk, AliESDCosmicTrack *costrk);
 
   CutFunc fUserCut;                               //user ESDtrack function
   TTreeSRedirector *fStreamer;                   //debug streamer
   Int_t fDebugLevel;                             //debug level
 
   AliESDEvent *fESDEvent;                        //esd
-  AliTPCCosmicTrackfit *fCombinedTrackfit;     //combinedtrackfit
+  AliTPCCosmicTrackfit *fCosmicTrackfit;          //cosmictrackfit
   TClonesArray *fTrackStack;                     //storing cosmic ray
 
-  AliExternalTrackParam fCombTrackUp;            //upper track param from combined track fit
-  AliExternalTrackParam fCombTrackLow;          //lower track param from combined track fit
   AliExternalTrackParam fTrack0;                //upper track param estimated at x=0 from IsPair
   AliExternalTrackParam fTrack1;                //lower track param estimated at x=0 from IsPair
 
-  Double_t fCombRefPt;                           //pt of the ray at lower-outer TPC by combined fit
-  Double_t fChi2PerCluster;                      //chi2/ncls of the fit
-  Double_t fImpactD;                                  //2d impact parameter
-  Double_t fImpactZ;                                   //z of impact parameter
-  Bool_t fIsReuse;                                     //if one the the tracks in the pair is already used in previous pair
-  Double_t fFindableRatio;                      //min of TPC ncls/nfindablecls of the two tracks
-
+  TVector3 fRawVtx;                             //raw vertex position calculated only from upper and lower inner most TPC cluster
+  Double_t fRawDCA;                              //raw DCA (2d) calculated only from upper and lower inner most TPC cluster 
   Double_t fdPhi;                                //phi0-phi1-pi of the EDS tracks
   Double_t fCutdPhi;                           //cut
 
@@ -91,9 +92,9 @@ class AliCosmicTracker
   Double_t fDelta[5];                             //delta of the two ESD tracks at x=0
   Double_t fCutDelta[5];                          //delta cut
 
-  Int_t fErrFlagIsPair;                            //error status in IsPair
-
-  static const Double_t fgkCutFindable = 0.5;            //cut on findable ratio of TPC cluster
+  Int_t fErrFlagESDtrackCut;                       //error status in ESDtrackCut()
+  Int_t fErrFlagIsPair;                            //error status in IsPair()
+  Int_t fErrFlagCosmicTrackfit;                    //error status in fCosmicTrackfit
 };
 
 #endif
index 2412195..ca23856 100644 (file)
@@ -14,7 +14,7 @@
  **************************************************************************/
 //
 //-------------------------------------------------------
-//          Implementation of the TPC combined trackfit
+//          Implementation of the TPC cosmic trackfit
 //
 //   Origin:  Xianguo Lu lu@physi.uni-heidelberg.de  Xianguo.Lu@cern.ch
 //
@@ -34,7 +34,7 @@
 //===========================================================================================
 // 
 // Interface/Implementation:
-// This class provide the functionality to combined two ESD tracks and perform the trackfit using all related track points.
+// This class provide the functionality to combine two ESD tracks and perform the trackfit using all related track points.
 // Input: AliESDtrack's (or AliTPCseed's, expert use)
 // Output: the trackparams from the combined fit are stored as data member of this class, and they can be accessed via getter or copy.
 //
 //===========================================================================================
 // Usage
 /*
-  fCombinedTrackfit = new AliTPCCosmicTrackfit(debuglevel, "anystring");
+  fCosmicTrackfit = new AliTPCCosmicTrackfit(debuglevel, "anystring");
 
   //order not important; will be internally ordered (potinters modified due to &) such that track0 is the upper one
   //kfit = kTRUE: good fit, kFALSE: bad fit
-  const Bool_t kfit = fCombinedTrackfit->CombineESDtracks(esdtrack0, esdtrack1);
+  const Bool_t kfit = fCosmicTrackfit->CombineESDtracks(esdtrack0, esdtrack1);
 
   //status = 0 for good fit (i.e. kfit=kTRUE), non-0 for bad fit (i.e. kfit=kFALSE), see "enum CombineStatus" definition in header file
-  const Int_t status = fCombinedTrackfit->GetStatus(); 
+  const Int_t status = fCosmicTrackfit->GetStatus(); 
 */
 //===========================================================================================
 // Efficiency
 // for 2011 Feb. cosmic data nch=2 events, the kfit and status look like:
 /*
 kfit,status (  0,   1):   16337 /  443901 =   3.680%          //kFailGetTPCseeds
-kfit,status (  0,   2):    3692 /  443901 =   0.832%          //not both tracks have ncl > AliTPCCosmicUtils::fgkNclsMin
+kfit,status (  0,   2):    3692 /  443901 =   0.832%          //not both tracks have ncl > AliTPCCosmicUtils::NclsMin()
 kfit,status (  0,   3):    6527 /  443901 =   1.470%          //clusters in two tracks should be clearly separated in y, i.e. lowest cluster of upper track higher than highest cluster of lower track; otherwise fail 
-kfit,status (  0,   4):    7033 /  443901 =   1.584%          //fLeverArm<fgkCutLeverArm
+kfit,status (  0,   4):    7033 /  443901 =   1.584%          //fLeverArm<CutLeverArm()
 kfit,status (  0,   6):    4398 /  443901 =   0.991%          //fail in propagation of at least one cluster
-kfit,status (  0,   7):     508 /  443901 =   0.114%          //chi2/nfit > fgkMaxChi2
+kfit,status (  0,   7):     508 /  443901 =   0.114%          //chi2/nfit > MaxChi2()
 kfit,status (  0,   8):      52 /  443901 =   0.012%          //fail in geting impact parameters
 kfit,status (  1,   0):  405354 /  443901 =  91.316%          //i.e. 91% of nch=2 events are successfully fitted.
 */
@@ -132,17 +132,22 @@ AliTPCCosmicTrackfit::AliTPCCosmicTrackfit(const Int_t dlev, const TString tag):
   fStreamer(0x0), fDebugLevel(dlev)
   , fSeedUp(0x0), fSeedLow(0x0), fTrackparUp(0x0), fTrackparLow(0x0), fIniTrackparUp(0x0), fIniTrackparLow(0x0)
   , fStatus(-999)
+  , fKswap(0)
+  , fInnerClusterUp(-999,-999,-999)
+  , fInnerClusterLow(-999,-999,-999)
   , fLeverArm(-999)
   , fFitNcls(-999), fMissNcls(-999), fPreChi2(-999), fFitLeverArm(-999), fImpactD(-999), fImpactZ(-999)
+  , fRowStartShift(-999)
+  , fRowStep(-999)
+  , fXMin(-999)
+  , fXMax(-999)
 {
   //
   //Constructor
   //
-  fInnerClusterUp.SetXYZ(-999,-999,-999);
-  fInnerClusterLow.SetXYZ(-999,-999,-999);
 
   if(fDebugLevel>0)
-    fStreamer = new TTreeSRedirector(Form("CombinedTrackfit_%s.root", tag.Data()));
+    fStreamer = new TTreeSRedirector(Form("CosmicTrackfit_%s.root", tag.Data()));
 
   SetRow(0,1);
   SetX(-1e10, 1e10);
@@ -254,8 +259,7 @@ void AliTPCCosmicTrackfit::Print() const
   printf("Status %2d NclsU %3d NclsD %3d ZinnerU %7.2f ZinnerD %7.2f LeverArm %7.2f\n", fStatus, fSeedUp->GetNumberOfClusters(), fSeedLow->GetNumberOfClusters(), fInnerClusterUp.Z(), fInnerClusterLow.Z(), fLeverArm);
 }
 
-/*
-Double_t AliTPCCosmicTrackfit::ImpactParameter2D() const
+TVector3 AliTPCCosmicTrackfit::ImpactParameter2D() const
 {
   //
   //calculate the 2D-impactparameter from (0,0)
@@ -265,10 +269,12 @@ Double_t AliTPCCosmicTrackfit::ImpactParameter2D() const
   const TVector3 l1(fInnerClusterUp.X(),  fInnerClusterUp.Y(),  0);
   const TVector3 l2(fInnerClusterLow.X(), fInnerClusterLow.Y(), 0);
 
-  return AliTPCCosmicUtils::Point2LineDist(p0, l1, l2);
+  TVector3 vtx;
+  AliTPCCosmicUtils::Point2LineDist(p0, l1, l2, &vtx);
+  return vtx;
 }
 
-Double_t AliTPCCosmicTrackfit::ImpactParameter3D() const
+TVector3 AliTPCCosmicTrackfit::ImpactParameter3D() const
 {
   //
   //calculate the 3D-impactparameter from (0,0,0)
@@ -278,9 +284,24 @@ Double_t AliTPCCosmicTrackfit::ImpactParameter3D() const
   const TVector3 l1(fInnerClusterUp);
   const TVector3 l2(fInnerClusterLow);
 
-  return AliTPCCosmicUtils::Point2LineDist(p0, l1, l2);
+  TVector3 vtx;
+  AliTPCCosmicUtils::Point2LineDist(p0, l1, l2, &vtx);
+
+  //==========================
+  /*
+  printf("testing... \n");
+  TVector3 tmpv = ImpactParameter2D();
+  if(fabs(tmpv.Mag()-vtx.Pt())>1e-6){
+    printf("strange!!! %e %e %e\n", tmpv.Mag(), vtx.Pt(), fabs(tmpv.Mag()-vtx.Pt()));
+    vtx.Print();
+    tmpv.Print();
+    fInnerClusterUp.Print();
+    fInnerClusterLow.Print();
+  }
+  */
+  //==========================
+  return vtx;
 }
-*/
 
 Double_t AliTPCCosmicTrackfit::MinPhi() const
 {
@@ -365,7 +386,7 @@ void AliTPCCosmicTrackfit::Update()
   }
 
   fPreChi2 /= fFitNcls;
-  if(fPreChi2>fgkMaxChi2){
+  if(fPreChi2>MaxChi2()){
     fStatus = kFailChi2;
     return;
   }
@@ -405,7 +426,7 @@ Bool_t AliTPCCosmicTrackfit::CheckLeverArm()
   //On the other hand, short lever arm from two tracks mostly means they are fake pairs.
   //lever arm extents over one quadrant, e.g. (0,250)-(250,0): 250*sqrt(2)~350
   //
-  if(fLeverArm<fgkCutLeverArm){
+  if(fLeverArm<CutLeverArm()){
     fStatus = kFailLeverArm;
     return kFALSE;
   }
@@ -430,7 +451,7 @@ Bool_t AliTPCCosmicTrackfit::AnaSeeds()
   }
   
   for(Int_t itrk=0; itrk<2; itrk++){
-    for(Int_t irow=0; irow<AliTPCCosmicUtils::fgkNRow; irow++){
+    for(Int_t irow=0; irow<AliTPCCosmicUtils::NRow(); irow++){
       const AliTPCclusterMI * cls = (*seeds[itrk])->GetClusterPointer(irow);
       if(!cls)
         continue;
@@ -500,7 +521,7 @@ Bool_t AliTPCCosmicTrackfit::CheckNcls()
   //
   //check number of clusters in TPCseed, for too small number MakeSeed will fail
   //
-  if( fSeedUp->GetNumberOfClusters()<AliTPCCosmicUtils::fgkNclsMin || fSeedLow->GetNumberOfClusters()<AliTPCCosmicUtils::fgkNclsMin ){
+  if( fSeedUp->GetNumberOfClusters()<AliTPCCosmicUtils::NclsMin() || fSeedLow->GetNumberOfClusters()<AliTPCCosmicUtils::NclsMin() ){
     fStatus = kFailNclsMin;
     return kFALSE;
   }
index af154c0..241b6f6 100644 (file)
@@ -28,10 +28,12 @@ const Double_t _TPCINR  =  84.8;
 const Double_t _TPCOUR  =  246.6;
 */
 
-#ifndef ALITPCCOMBINEDTRACKFIT_H
-#define ALITPCCOMBINEDTRACKFIT_H
+#ifndef ALITPCCOSMICTRACKFIT_H
+#define ALITPCCOSMICTRACKFIT_H
 
-class TTreeSRedirector;
+#ifndef TVECTOR3_H
+#include "TVector3.h"
+#endif
 
 class AliTPCCosmicTrackfit
 {
@@ -60,10 +62,10 @@ class AliTPCCosmicTrackfit
   Double_t GetLeverArm()const {return fLeverArm;}
   TVector3 GetInnerClusterUp()const {return fInnerClusterUp;}
   TVector3 GetInnerClusterLow()const {return fInnerClusterLow;}
-  /*
-  Double_t ImpactParameter2D() const;
-  Double_t ImpactParameter3D() const;
-  */
+
+  TVector3 ImpactParameter2D() const;
+  TVector3 ImpactParameter3D() const;
+
   Double_t MinPhi()const;
 
   const AliExternalTrackParam * GetTrackParamUp() const {return fTrackparUp;}
@@ -96,6 +98,9 @@ class AliTPCCosmicTrackfit
   AliTPCCosmicTrackfit(const AliTPCCosmicTrackfit & p);
   AliTPCCosmicTrackfit & operator=(const AliTPCCosmicTrackfit & p);
 
+  static Double_t CutLeverArm(){ return 350;}  //minimum lever arm 350 ~ 250 * sqrt(2)
+  static Double_t MaxChi2(){ return 10;}       //max. chi2/ncls
+
   void IniCombineESDtracks();
   Bool_t GetTPCseeds(const AliESDtrack *trk0,  const AliESDtrack *trk1);
   Bool_t CheckNcls();
@@ -133,8 +138,6 @@ class AliTPCCosmicTrackfit
   Int_t fRowStep;                              //row step
   Double_t fXMin;                              //cluster X min
   Double_t fXMax;                              //cluster X max
-  static const Double_t fgkCutLeverArm = 350;  //minimum lever arm 350 ~ 250 * sqrt(2)
-  static const Double_t fgkMaxChi2 = 10;       //max. chi2/ncls
 };
 
 #endif
index 7b33df9..25b40f9 100644 (file)
@@ -18,7 +18,7 @@
 //
 // detailed description can be found inside individual function
 //
-// grep "exitreport" in output log to check abnormal termination
+// grep "error" in output log to check abnormal termination
 //
 //
 //  Xianguo Lu 
 #include <TTreeStream.h>
 #include <TVector3.h>
 
+#include "AliAnalysisManager.h"
+#include "AliESDEvent.h"
+#include "AliESDfriend.h"
 #include "AliESDtrack.h"
 #include "AliESDfriendTrack.h"
+#include "AliESDInputHandler.h"
 #include "AliTPCseed.h"
 #include "AliTrackerBase.h"
 #include "AliTrackPointArray.h"
 
 #include "AliTPCCosmicUtils.h"
 
-Double_t AliTPCCosmicUtils::Point2LineDist(const TVector3 p0, const TVector3 l1, const TVector3 l2)
+Int_t AliTPCCosmicUtils::GetBField(const AliESDEvent *esd)
+{
+  //
+  //get b-field in unit of kg, expect 1, 2, 5kg only
+  //
+  const Double_t dm = esd->GetMagneticField();
+  
+  Int_t mag = -999;
+  if(dm>0)
+    mag = (Int_t) (dm+0.5);
+  else
+    mag = (Int_t) (dm-0.5);
+
+  if(TMath::Abs(mag)!=1 && TMath::Abs(mag)!=2 && TMath::Abs(mag)!=5){
+    printf("error AliTPCCosmicUtils::GetB strange Bfield! %f %d\n", dm, mag); exit(1);
+  }
+
+  return mag;
+}
+
+Int_t AliTPCCosmicUtils::GetTrigger(const AliESDEvent *esd)
+{
+  //
+  //get cosmic trigger
+  //
+  const TString strig = esd->GetFiredTriggerClasses();
+  Int_t btrig = 0;
+
+  if( strig.Contains("C0OB0"))
+    btrig += k0OB0;
+  if( strig.Contains("C0OB1"))
+    btrig += k0OB1;
+  if( strig.Contains("C0HWU"))
+    btrig += k0HWU;
+  if( strig.Contains("CTRDCO2"))
+    btrig += kTRDCO2;
+  if( strig.Contains("AMU"))
+    btrig += kAMU;
+  if( strig.Contains("SCO"))
+    btrig += kSCO;
+
+  return btrig;
+}
+
+Bool_t AliTPCCosmicUtils::GetESD(AliESDEvent *& esdevent, AliESDfriend *& esdfriend)
+{
+  //
+  //get esdevent and esdfriend
+  //
+
+  esdevent = 0x0;
+  esdfriend = 0x0;
+
+  AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler *>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
+  if(esdH){  
+    esdevent = esdH->GetEvent();
+  }
+
+  if(!esdevent){
+    printf("AliAnalysisTaskdEdxCosmic::GetESD error No ESD Event\n");
+    return kFALSE;
+  }
+  
+  esdH->SetActiveBranches("ESDfriend*");
+  esdfriend = (AliESDfriend *)esdevent->FindListObject("AliESDfriend");
+
+  if(!esdfriend){
+    printf("AliAnalysisTaskdEdxCosmic::GetESD error No ESD friend\n");
+    return kFALSE;
+  }
+
+  esdevent->SetESDfriend(esdfriend);
+
+  return kTRUE;
+}
+
+
+Double_t AliTPCCosmicUtils::GetMinPhi(const AliExternalTrackParam *params[])
+{
+  //
+  //minimum phi angle of the two tracks, 0: horizontal
+  //
+  const Double_t fsp[] = {TMath::Abs(TMath::Sin(params[0]->Phi())), 
+                          TMath::Abs(TMath::Sin(params[1]->Phi()))};
+  const Double_t minphi = TMath::ASin(TMath::Min(fsp[0], fsp[1])) * TMath::RadToDeg();
+
+  return minphi;
+}
+
+Double_t AliTPCCosmicUtils::Point2LineDist(const TVector3 p0, const TVector3 l1, const TVector3 l2, TVector3 *vtx)
 {
   //
   //return distance of p0 to line (l2-l1)
@@ -50,9 +143,21 @@ Double_t AliTPCCosmicUtils::Point2LineDist(const TVector3 p0, const TVector3 l1,
   const TVector3 va = p0 - l1;
   const TVector3 vb = l2 - l1;
 
-  const TVector3 dd = va.Cross(vb);
+  //calculate vtx position
+  const Double_t ca = va.Dot(vb)/vb.Mag();
+  const TVector3 imp = l1 + vb.Unit()*ca;
 
+  if(vtx){
+    (*vtx) = imp;
+  }
+
+  /* equivalent to imp.Mag()
+  //calculate distance
+  const TVector3 dd = va.Cross(vb);
   return dd.Mag()/vb.Mag();
+  */
+
+  return imp.Mag();
 }
 
 Double_t AliTPCCosmicUtils::AngleInRange(Double_t phi)
@@ -195,7 +300,7 @@ void AliTPCCosmicUtils::DrawSeeds(const AliTPCseed * seeds[], const TString tag,
       continue;
 
     Int_t ncl = 0;
-    for(Int_t irow=0; irow<fgkNRow; irow++){
+    for(Int_t irow=0; irow<NRow(); irow++){
       const AliTPCclusterMI * cls = seeds[itrk]->GetClusterPointer(irow);
       if(!cls)
         continue;
@@ -265,10 +370,10 @@ AliTPCseed * AliTPCCosmicUtils::GetTPCseed(const AliESDtrack *esdtrack)
 
   AliESDfriendTrack * friendtrk = (AliESDfriendTrack *) esdtrack->GetFriendTrack();
   if(!friendtrk){
-    printf("exitreport AliTPCCosmicUtils::GetTPCseed no friend track!\n");
-    exit(1);
+    //printf("AliTPCCosmicUtils::GetTPCseed no friend track!\n"); exit(1);
+    return 0x0;
   }
-    
+
   TObject *calibObject=0x0;
   AliTPCseed *tseed = 0x0;
   for(Int_t l=0; (calibObject=friendtrk->GetCalibObject(l)); l++) {
@@ -285,7 +390,7 @@ AliExternalTrackParam *AliTPCCosmicUtils::MakeSeed(const AliTPCseed *tseed)
   //make seed for propagation of TrackParam, using np = 3 outer clusters (separated by deltancls clusters) in TPCseed
   //
 
-  const Int_t rowstart = fgkNRow-1;
+  const Int_t rowstart = NRow()-1;
   const Int_t rowstop = 0;  
   const Int_t drow = -1;
 
@@ -300,7 +405,7 @@ AliExternalTrackParam *AliTPCCosmicUtils::MakeSeed(const AliTPCseed *tseed)
   //---
   Int_t npos = 0;
   Int_t icl = 0;
-  const Int_t deltancls = fgkNclsMin/2-1;
+  const Int_t deltancls = NclsMin()/2-1;
   Int_t oldcl = -deltancls;
 
   for(Int_t irow=rowstart; drow*irow<=drow*rowstop; irow+=drow){
@@ -402,7 +507,7 @@ void AliTPCCosmicUtils::SingleFit(AliExternalTrackParam * trackInOld, AliExterna
   //nmiss is from the 2 FitKernel of the last iteration
   //nfit, pchi2 is from the last FitKernel of the last iteration
 
-  Int_t rowouter = fgkNRow-1-rowstartshift;
+  Int_t rowouter = NRow()-1-rowstartshift;
 
   //so that when reversed, the same rows are read! important!!!
   Int_t rowinner = rowouter - rowouter/rowstep * rowstep;
@@ -412,7 +517,7 @@ void AliTPCCosmicUtils::SingleFit(AliExternalTrackParam * trackInOld, AliExterna
   TVector3 dpos;
   lfit = 0;
 
-  for(Int_t ii=0; ii<fgkNiter; ii++){
+  for(Int_t ii=0; ii<Niter(); ii++){
     nmiss = 0;
 
     gposStart.SetXYZ(-999,-999,-999);
@@ -432,14 +537,14 @@ void AliTPCCosmicUtils::SingleFit(AliExternalTrackParam * trackInOld, AliExterna
     gposStart.SetXYZ(-999,-999,-999);
     ksite = -999;
     trackOut = trackIn;
-    FitKernel(&trackOut, tseed, rowinner, rowouter,  rowstep, xmin, xmax, outde, ksite, nfit, nmiss, pchi2, gposStart, gposStop, (ii==fgkNiter-1 ? debugstreamer : 0x0), kTRUE);
+    FitKernel(&trackOut, tseed, rowinner, rowouter,  rowstep, xmin, xmax, outde, ksite, nfit, nmiss, pchi2, gposStart, gposStop, (ii==Niter()-1 ? debugstreamer : 0x0), kTRUE);
     //PrintTrackParam(90020+ii, &trackOut);
 
     dpos = gposStart-gposStop;
     lfit += dpos.Pt();
   }
 
-  lfit /= 2.*fgkNiter;
+  lfit /= 2.*Niter();
 
   if(trackInOld)
     (*trackInOld)  = trackIn;
@@ -464,7 +569,7 @@ void AliTPCCosmicUtils::CombinedFit(AliExternalTrackParam *trackPars[],  const A
   AliExternalTrackParam trackLow = *(trackPars[1]);
   AliExternalTrackParam trackUp;
 
-  for(Int_t ii=0; ii<fgkNiter; ii++){
+  for(Int_t ii=0; ii<Niter(); ii++){
     lfit = 0;
     vtxD = 0;
     vtxZ = 0;
@@ -479,7 +584,7 @@ void AliTPCCosmicUtils::CombinedFit(AliExternalTrackParam *trackPars[],  const A
     
     //upper->lower
     trackLow = trackUp;    
-    SubCombined(&trackLow, seeds, 0, 1, rowstartshift, rowstep, xmin, xmax, lowde, nfit, nmiss, pchi2, tmpl, tmpd, tmpz, (ii==fgkNiter-1? debugstreamer : 0x0));
+    SubCombined(&trackLow, seeds, 0, 1, rowstartshift, rowstep, xmin, xmax, lowde, nfit, nmiss, pchi2, tmpl, tmpd, tmpz, (ii==Niter()-1? debugstreamer : 0x0));
     lfit += tmpl;
     vtxD += tmpd;
     vtxZ += tmpz;
@@ -515,7 +620,7 @@ void AliTPCCosmicUtils::SubCombined(AliExternalTrackParam *trackPar, const AliTP
   vtxZ = -1e10;
 
   //always nrow -> 1 -> nrow
-  Int_t rowstart= fgkNRow-1-rowstartshift;
+  Int_t rowstart= NRow()-1-rowstartshift;
 
   //so that when reversed, the same rows are read! important!!!
   Int_t rowstop = rowstart - rowstart/rowstep * rowstep;
@@ -540,7 +645,7 @@ void AliTPCCosmicUtils::SubCombined(AliExternalTrackParam *trackPar, const AliTP
       const Double_t maxStep = 1;
       const Bool_t rotateTo = kFALSE;
       const Double_t maxSnp = 0.8;
-      if(AliTrackerBase::PropagateTrackToBxByBz(&vertex, 0, fgkMass, maxStep, rotateTo, maxSnp, eloss)){
+      if(AliTrackerBase::PropagateTrackToBxByBz(&vertex, 0, Mass(), maxStep, rotateTo, maxSnp, (Int_t)eloss)){
         vtxD = TMath::Abs(vertex.GetParameter()[0]);
         vtxZ = vertex.GetParameter()[1];
       }
@@ -570,7 +675,7 @@ void AliTPCCosmicUtils::FitKernel(AliExternalTrackParam *trackPar, const AliTPCs
 
     AliTPCclusterMI *cl=tseed->GetClusterPointer(irow);
     if (!cl) continue;
-    if (cl->GetX()< fgkXMin) continue;
+    if (cl->GetX()< XMin()) continue;
 
     //cut on cluster X (i.e. r) to specify leverarm
     if(cl->GetX()< xmin){
@@ -614,7 +719,7 @@ void AliTPCCosmicUtils::FitKernel(AliExternalTrackParam *trackPar, const AliTPCs
     const Double_t maxSnp = 0.8;
 
     //eloss critical only for combine fit!!!
-    const Bool_t kpro = AliTrackerBase::PropagateTrackToBxByBz(&tmppar, xTogo, fgkMass, maxStep, rotateTo, maxSnp, eloss);
+    const Bool_t kpro = AliTrackerBase::PropagateTrackToBxByBz(&tmppar, xTogo, Mass(), maxStep, rotateTo, maxSnp, (Int_t)eloss);
     if(!kpro){
       nmiss++;
       continue;
@@ -658,7 +763,6 @@ void AliTPCCosmicUtils::FitKernel(AliExternalTrackParam *trackPar, const AliTPCs
 
   //to make sure rowstart and rowstop are the actual ending
   if(checkstop != rowstop){
-    printf("exitreport AliTPCCosmicUtils::FitKernel wrong rowstart, stop, drow!! %d %d %d\n", rowstart, rowstop, drow);
-    exit(1);
+    printf("AliTPCCosmicUtils::FitKernel error wrong rowstart, stop, drow!! %d %d %d\n", rowstart, rowstop, drow); exit(1);
   }
 }
index b73a048..9fe82b7 100644 (file)
 #ifndef ALITPCCOSMICUTILS_H
 #define ALITPCCOSMICUTILS_H
 
+class TVector3;
+
+class AliESDfriend;
+
 class AliTPCCosmicUtils
 {
  public:
+  enum{
+    k0OB0=1,
+    k0OB1=2,
+    k0HWU=4,
+    kTRDCO2=8,
+    kAMU=16,
+    kSCO=32
+  };
+  
+  static Double_t GetMinPhi(const AliExternalTrackParam *params[]);
+  static Int_t GetBField(const AliESDEvent *esd);
+  static Int_t GetTrigger(const AliESDEvent *esd);
   static AliTPCseed * GetTPCseed(const AliESDtrack *esdtrack);
-    
+  static Bool_t GetESD(AliESDEvent *& esdevent, AliESDfriend *& esdfriend);
+  //===========================
+
   static AliExternalTrackParam *MakeSeed(const AliTPCseed *tseed);
 
   static void SingleFit(AliExternalTrackParam * trackInOld, AliExternalTrackParam * trackOutOld, const AliTPCseed *tseed, const Bool_t kinward, const Int_t rowstartshift, const Int_t rowstep, const Double_t xmin, const Double_t xmax, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, Double_t &lfit, TTreeSRedirector *debugstreamer=0x0);
 
-  static void CombinedFit(AliExternalTrackParam *trackPars[],  const AliTPCseed *seeds[],  const Int_t rowstartshift, const Int_t rowstep, const Double_t xmin, const Double_t xmax, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, Double_t &lfit, Double_t &lfit, Double_t &vtxD, TTreeSRedirector *debugstreamer=0x0);
+  static void CombinedFit(AliExternalTrackParam *trackPars[],  const AliTPCseed *seeds[],  const Int_t rowstartshift, const Int_t rowstep, const Double_t xmin, const Double_t xmax, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, Double_t &lfit, Double_t &vtxD, Double_t &vtxZ, TTreeSRedirector *debugstreamer=0x0);
 
   static void DrawTracks(AliESDtrack *esdtrks[], const TString tag, const TString outputformat="png");
   static void DrawSeeds(const AliTPCseed * seeds[], const TString tag, const TString outputformat="png");
   static void PrintTrackParam(const Int_t id, const AliExternalTrackParam * trackpar, const char *tag="");
   static Bool_t RotateSafe(AliExternalTrackParam *trackPar, const Double_t aa);
   static Double_t AngleInRange(Double_t phi);
-  static Double_t Point2LineDist(const TVector3 p0, const TVector3 l1, const TVector3 l2);
+  static Double_t Point2LineDist(const TVector3 p0, const TVector3 l1, const TVector3 l2, TVector3 *vtx = 0x0);
+
+  static Int_t NRow(){ return 159;}           //number of pad rows
+  static Int_t NclsMin(){ return 40;}         //minimum requirement of number of TPC cluster
+  static Double_t Mass(){ return 0.105658;}   //muon mass
+
+  //---------------------------
 
  private:
+
+  static Int_t XMin(){ return 80;}            //minimum x (tracking system) to use in propagation
+  static Int_t Niter(){ return 2;}            //number of iteration in SingleFit and CombinedFit, 1 is not enough, 3 is the same as 2
+
   static void IniCov(AliExternalTrackParam *trackPar, const Double_t ncl);
-  static void SubCombined(AliExternalTrackParam *trackPar, const AliTPCseed *seeds[], const Int_t tk0, const Int_t tk1, const Int_t rowstartshift, const Int_t rowstep, const Double_t xmin, const Double_t xmax, const Double_t eloss, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, Double_t &lfit, Double_t &lfit, Double_t &vtxD, TTreeSRedirector *debugstreamer=0x0);
-  static void FitKernel(AliExternalTrackParam *trackPar, const AliTPCseed *tseed, const Int_t rowstart, const Int_t rowstop, const Int_t drow, const Double_t xmin, const Double_t xmax, const Double_t eloss, Int_t &ksite, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, TVector3 &gposStart, TVector3 &gposStop, TTreeSRedirector *debugstreamer, const Bool_t kinicov);
+  static void SubCombined(AliExternalTrackParam *trackPar, const AliTPCseed *seeds[], const Int_t tk0, const Int_t tk1, const Int_t rowstartshift, const Int_t rowstep, const Double_t xmin, const Double_t xmax, const Double_t eloss, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, Double_t &lfit, Double_t &vtxD, Double_t &vtxZ, TTreeSRedirector *debugstreamer=0x0);
 
-  static const Int_t fgkNRow = 159;           //number of pad rows
-  static const Int_t fgkNclsMin = 40;         //minimum requirement of number of TPC cluster
-  static const Int_t fgkXMin = 80;            //minimum x (tracking system) to use in propagation
-  static const Double_t fgkMass = 0.105658;   //muon mass
-  static const Int_t fgkNiter = 2;            //number of iteration in SingleFit and CombinedFit, 1 is not enough, 3 is the same as 2
+  static void FitKernel(AliExternalTrackParam *trackPar, const AliTPCseed *tseed, const Int_t rowstart, const Int_t rowstop, const Int_t drow, const Double_t xmin, const Double_t xmax, const Double_t eloss, Int_t &ksite, Int_t &nfit, Int_t &nmiss, Double_t &pchi2, TVector3 &gposStart, TVector3 &gposStop, TTreeSRedirector *debugstreamer, const Bool_t kinicov);
 };
 
 #endif
index 91ecd23..168581a 100644 (file)
 #include "AliDCSSensorArray.h"
 #include "AliDCSSensor.h"
 #include "AliDAQ.h"
+#include "AliCosmicTracker.h"
 
 //
 
@@ -2796,6 +2797,9 @@ Int_t AliTPCtrackerMI::RefitInward(AliESDEvent *event)
   //FindKinks(fSeeds,event);
   if (AliTPCReconstructor::StreamLevel()>3)  DumpClusters(2,fSeeds);
   Info("RefitInward","Number of refitted tracks %d",ntracks);
+
+  AliCosmicTracker::FindCosmic(event, kTRUE);
+
   return 0;
 }
 
index 9ef4c91..a640499 100644 (file)
@@ -55,6 +55,9 @@ set ( SRCS
     AliTPCclustererKr.cxx 
     AliTPCclusterKr.cxx 
     AliTPCvtpr.cxx
+    AliTPCCosmicUtils.cxx   
+    AliTPCCosmicTrackfit.cxx
+    AliCosmicTracker.cxx
     )
 
 string ( REPLACE ".cxx" ".h" HDRS "${SRCS}" )
index e070bdc..972e603 100644 (file)
@@ -51,5 +51,9 @@
 #pragma link C++ class AliTPCclusterKr+;
 #pragma link C++ class AliTPCclustererKr+;
 
+#pragma link C++ class AliTPCCosmicUtils+;
+#pragma link C++ class AliTPCCosmicTrackfit+;
+#pragma link C++ class AliCosmicTracker+;
+
 #endif