]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EMCAL/AliEMCALTracker.cxx
From Andrea Dainese: protection in AliAODTrack::PropagateToDCA for usage in case...
[u/mrichter/AliRoot.git] / EMCAL / AliEMCALTracker.cxx
index 7a02eb112a0429889ae112917c00f939ae944319..167cd9fa2aaa28215e205bc85066f55f11bb2165 100644 (file)
 #include "AliCDBEntry.h"
 #include "AliCDBManager.h"
 #include "AliEMCALReconstructor.h"
+#include "AliEMCALRecoUtils.h"
 
 #include "AliEMCALTracker.h"
 
+using std::cerr;
+using std::endl;
 ClassImp(AliEMCALTracker)
 
 //
 //------------------------------------------------------------------------------
 //
 AliEMCALTracker::AliEMCALTracker() 
-  : AliTracker(),
-    fCutPt(0),
-    fCutNITS(0),
-    fCutNTPC(50),
-    fStep(50),
-    fTrackCorrMode(kTrackCorrMMB),     
-    fCutEta(0.025),
-    fCutPhi(0.05),
-    fTracks(0),
-    fClusters(0),
-    fGeom(0)
+: AliTracker(),
+  fCutPt(0),
+  fCutNITS(0),
+  fCutNTPC(50),
+  fStep(20),
+  fTrackCorrMode(kTrackCorrMMB),
+  fEMCalSurfaceDistance(440),
+  fClusterWindow(50),
+  fCutEta(0.025),
+  fCutPhi(0.05),
+  fITSTrackSA(kFALSE),
+  fTracks(0),
+  fClusters(0),
+  fGeom(0)
 {
   //
   // Default constructor.
@@ -94,8 +100,11 @@ AliEMCALTracker::AliEMCALTracker(const AliEMCALTracker& copy)
     fCutNTPC(copy.fCutNTPC),
     fStep(copy.fStep),
     fTrackCorrMode(copy.fTrackCorrMode),
+    fEMCalSurfaceDistance(copy.fEMCalSurfaceDistance),
+    fClusterWindow(copy.fClusterWindow),
     fCutEta(copy.fCutEta),
     fCutPhi(copy.fCutPhi),
+    fITSTrackSA(copy.fITSTrackSA), 
     fTracks((TObjArray*)copy.fTracks->Clone()),
     fClusters((TObjArray*)copy.fClusters->Clone()),
     fGeom(copy.fGeom)
@@ -108,27 +117,12 @@ AliEMCALTracker::AliEMCALTracker(const AliEMCALTracker& copy)
 //
 //------------------------------------------------------------------------------
 //
-AliEMCALTracker& AliEMCALTracker::operator=(const AliEMCALTracker& copy)
-{
-  //
-  // Assignment operator.
-  // Besides copying all parameters, duplicates all collections.       
-  //
-
-  fCutPt  = copy.fCutPt;
-  fCutEta = copy.fCutEta;
-  fCutPhi = copy.fCutPhi;      
-  fStep = copy.fStep;
-  fTrackCorrMode = copy.fTrackCorrMode;
+AliEMCALTracker& AliEMCALTracker::operator=(const AliEMCALTracker& source)
+{ // assignment operator; use copy ctor
+  if (&source == this) return *this;
 
-  fCutNITS = copy.fCutNITS;
-  fCutNTPC = copy.fCutNTPC;
-  
-  fTracks = (TObjArray*)copy.fTracks->Clone();
-  fClusters = (TObjArray*)copy.fClusters->Clone();
-  fGeom = copy.fGeom;
-  
-  return (*this);
+  new (this) AliEMCALTracker(source);
+  return *this;
 }
 //
 //------------------------------------------------------------------------------
@@ -149,10 +143,10 @@ void AliEMCALTracker::InitParameters()
  
     fCutEta  =  recParam->GetMthCutEta();
     fCutPhi  =  recParam->GetMthCutPhi();
-    fStep    =   recParam->GetExtrapolateStep();
+    fStep    =  recParam->GetExtrapolateStep();
     fCutPt   =  recParam->GetTrkCutPt();
-    fCutNITS = recParam->GetTrkCutNITS();
-    fCutNTPC = recParam->GetTrkCutNTPC();
+    fCutNITS =  recParam->GetTrkCutNITS();
+    fCutNTPC =  recParam->GetTrkCutNTPC();
   }
        
 }
@@ -267,33 +261,38 @@ Int_t AliEMCALTracker::LoadTracks(AliESDEvent *esd)
   //
   // Load ESD tracks.
   //
-       
+
+  UInt_t mask1 = esd->GetESDRun()->GetDetectorsInDAQ();
+  UInt_t mask2 = esd->GetESDRun()->GetDetectorsInReco();
+  Bool_t desc1 = (mask1 >> 3) & 0x1;
+  Bool_t desc2 = (mask2 >> 3) & 0x1;
+  if (desc1==0 || desc2==0) {
+//     AliError(Form("TPC not in DAQ/RECO: %u (%u)/%u (%u)",
+//                   mask1, esd->GetESDRun()->GetDetectorsInReco(),
+//                   mask2, esd->GetESDRun()->GetDetectorsInDAQ()));
+    fITSTrackSA = kTRUE;
+  }
+  
   Clear("TRACKS");
   fTracks = new TObjArray(0);
        
   Int_t nTracks = esd->GetNumberOfTracks();
-  Bool_t isKink=kFALSE;
+  //Bool_t isKink=kFALSE;
   for (Int_t i = 0; i < nTracks; i++) 
     {
       AliESDtrack *esdTrack = esd->GetTrack(i);
       // set by default the value corresponding to "no match"
       esdTrack->SetEMCALcluster(kUnmatched);
+      esdTrack->ResetStatus(AliESDtrack::kEMCALmatch);
 
       //Select good quaulity tracks
       if(esdTrack->Pt()<fCutPt) continue;
-      if(esdTrack->GetNcls(1)<fCutNTPC)continue;
-
-      //Reject kink daughters
-      isKink = kFALSE;
-      for (Int_t j = 0; j < 3; j++)
-       {
-         if (esdTrack->GetKinkIndex(j) != 0) isKink = kTRUE;
-       }
-      if (isKink) continue;
+      if(!fITSTrackSA)
+       if(esdTrack->GetNcls(1)<fCutNTPC)continue;
 
       //Loose geometric cut
       Double_t phi = esdTrack->Phi()*TMath::RadToDeg();
-      if(TMath::Abs(esdTrack->Eta())>1 || phi <= 60 || phi >= 200 ) continue;
+      if(TMath::Abs(esdTrack->Eta())>0.8 || phi <= 20 || phi >= 240 ) continue;
 
       fTracks->AddLast(esdTrack);
     }
@@ -370,6 +369,7 @@ Int_t AliEMCALTracker::PropagateBack(AliESDEvent* esd)
              {
                AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(index);
                track->SetEMCALcluster(cluster->Index());
+               track->SetStatus(AliESDtrack::kEMCALmatch);
              }
          }
 
@@ -386,56 +386,63 @@ Int_t AliEMCALTracker::FindMatchedCluster(AliESDtrack *track)
   // Find the closest one as matched if the residuals (dEta, dPhi) satisfy the cuts
   //
 
-  Double_t maxEta=fCutEta;
-  Double_t maxPhi=fCutPhi;
+  Float_t maxEta=fCutEta;
+  Float_t maxPhi=fCutPhi;
   Int_t index = -1;
   
   // If the esdFriend is available, use the TPCOuter point as the starting point of extrapolation
   // Otherwise use the TPCInner point
-  AliExternalTrackParam *trkParam;
-  const AliESDfriendTrack*  friendTrack = track->GetFriendTrack();
-  if(friendTrack && friendTrack->GetTPCOut())
-    trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
+  AliExternalTrackParam *trkParam = 0;
+  
+  if(!fITSTrackSA){ 
+    const AliESDfriendTrack*  friendTrack = track->GetFriendTrack();
+    if(friendTrack && friendTrack->GetTPCOut())
+      trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
+    else if(track->GetInnerParam())
+      trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+  }
   else
-    trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+    trkParam = new AliExternalTrackParam(*track);
+  
   if(!trkParam) return index;
+  
+  AliExternalTrackParam trkParamTmp(*trkParam);
+  Float_t eta, phi, pt;
+  if(!AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&trkParamTmp, fEMCalSurfaceDistance, track->GetMass(kTRUE), fStep, eta, phi, pt))  {
+       if(fITSTrackSA) delete trkParam;
+       return index;
+  }
+  track->SetTrackPhiEtaPtOnEMCal(phi,eta,pt);
+  if(TMath::Abs(eta)>0.75 || (phi) < 70*TMath::DegToRad() || (phi) > 190*TMath::DegToRad()){
+        if(fITSTrackSA) delete trkParam;
+       return index;
+  }
 
   //Perform extrapolation
   Double_t trkPos[3];
+  trkParamTmp.GetXYZ(trkPos);
   Int_t nclusters = fClusters->GetEntries();
   for(Int_t ic=0; ic<nclusters; ic++)
     {
-      AliExternalTrackParam *trkParamTmp = new AliExternalTrackParam(*trkParam);
       AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(ic);
-      TVector3 vec(cluster->X(),cluster->Y(),cluster->Z());
-      Double_t alpha =  ((int)(vec.Phi()*TMath::RadToDeg()/20)+0.5)*20*TMath::DegToRad();
-      //Rotate to proper local coordinate
-      vec.RotateZ(-alpha); 
-      trkParamTmp->Rotate(alpha); 
-      //extrapolation is done here
-      if(!AliTrackerBase::PropagateTrackToBxByBz(trkParamTmp, vec.X(), track->GetMass(), fStep, kFALSE, 0.8, -1)) continue; 
-
-      //Calculate the residuals
-      trkParamTmp->GetXYZ(trkPos);        
-      TVector3 clsPosVec(cluster->X(),cluster->Y(),cluster->Z());
-      TVector3 trkPosVec(trkPos[0],trkPos[1],trkPos[2]);
+      Float_t clsPos[3] = {cluster->X(),cluster->Y(),cluster->Z()};
+      Double_t dR = TMath::Sqrt(TMath::Power(trkPos[0]-clsPos[0],2)+TMath::Power(trkPos[1]-clsPos[1],2)+TMath::Power(trkPos[2]-clsPos[2],2));
+//       printf("\n dR=%f,wind=%f\n",dR,fClusterWindow); //MARCEL
+      if(dR > fClusterWindow) continue;
       
-      Double_t clsPhi = clsPosVec.Phi();
-      if(clsPhi<0) clsPhi+=2*TMath::Pi();
-      Double_t trkPhi = trkPosVec.Phi();
-      if(trkPhi<0) trkPhi+=2*TMath::Pi();
+      AliExternalTrackParam trkParTmp(trkParamTmp);
 
-      Double_t tmpPhi = clsPhi-trkPhi;
-      Double_t tmpEta = clsPosVec.Eta()-trkPosVec.Eta();
-  
+      Float_t tmpEta, tmpPhi;
+      if(!AliEMCALRecoUtils::ExtrapolateTrackToPosition(&trkParTmp, clsPos,track->GetMass(kTRUE), 5, tmpEta, tmpPhi)) continue;
       if(TMath::Abs(tmpPhi)<TMath::Abs(maxPhi) && TMath::Abs(tmpEta)<TMath::Abs(maxEta))
         {
           maxPhi=tmpPhi;
           maxEta=tmpEta;
           index=ic;
         }
-        delete trkParamTmp;
       }
+
+  if(fITSTrackSA) delete trkParam;
   return index;
 }