#include "AliTrackerBase.h"
#include "AliEMCALPIDUtils.h"
-
+#include "AliESDtrackCuts.h" //MARCEL
ClassImp(AliEMCALRecoUtils)
//_____________________________________
fCutR(0), fCutEta(0), fCutPhi(0),
fClusterWindow(0), fMass(0),
fStepSurface(0), fStepCluster(0),
+ fITSTrackSA(kFALSE),
fTrackCutsType(0), fCutMinTrackPt(0), fCutMinNClusterTPC(0),
fCutMinNClusterITS(0), fCutMaxChi2PerClusterTPC(0), fCutMaxChi2PerClusterITS(0),
fCutRequireTPCRefit(kFALSE), fCutRequireITSRefit(kFALSE), fCutAcceptKinkDaughters(kFALSE),
- fCutMaxDCAToVertexXY(0), fCutMaxDCAToVertexZ(0), fCutDCAToVertex2D(kFALSE)
+ fCutMaxDCAToVertexXY(0), fCutMaxDCAToVertexZ(0), fCutDCAToVertex2D(kFALSE),
+ fCutRequireITSStandAlone(kFALSE), fCutRequireITSpureSA(kFALSE)
{
//
// Constructor.
fResidualEta = new TArrayF();
fPIDUtils = new AliEMCALPIDUtils();
- InitTrackCuts();
}
//______________________________________________________________________
fCutR(reco.fCutR), fCutEta(reco.fCutEta), fCutPhi(reco.fCutPhi),
fClusterWindow(reco.fClusterWindow),
fMass(reco.fMass), fStepSurface(reco.fStepSurface), fStepCluster(reco.fStepCluster),
+ fITSTrackSA(reco.fITSTrackSA),
fTrackCutsType(reco.fTrackCutsType), fCutMinTrackPt(reco.fCutMinTrackPt),
fCutMinNClusterTPC(reco.fCutMinNClusterTPC), fCutMinNClusterITS(reco.fCutMinNClusterITS),
fCutMaxChi2PerClusterTPC(reco.fCutMaxChi2PerClusterTPC), fCutMaxChi2PerClusterITS(reco.fCutMaxChi2PerClusterITS),
fCutRequireTPCRefit(reco.fCutRequireTPCRefit), fCutRequireITSRefit(reco.fCutRequireITSRefit),
fCutAcceptKinkDaughters(reco.fCutAcceptKinkDaughters), fCutMaxDCAToVertexXY(reco.fCutMaxDCAToVertexXY),
- fCutMaxDCAToVertexZ(reco.fCutMaxDCAToVertexZ), fCutDCAToVertex2D(reco.fCutDCAToVertex2D)
+ fCutMaxDCAToVertexZ(reco.fCutMaxDCAToVertexZ), fCutDCAToVertex2D(reco.fCutDCAToVertex2D),
+ fCutRequireITSStandAlone(reco.fCutRequireITSStandAlone), fCutRequireITSpureSA(reco.fCutRequireITSpureSA)
{
//Copy ctor
fMass = reco.fMass;
fStepSurface = reco.fStepSurface;
fStepCluster = reco.fStepCluster;
-
+ fITSTrackSA = reco.fITSTrackSA;
+
fTrackCutsType = reco.fTrackCutsType;
fCutMinTrackPt = reco.fCutMinTrackPt;
fCutMinNClusterTPC = reco.fCutMinNClusterTPC;
fCutMaxDCAToVertexXY = reco.fCutMaxDCAToVertexXY;
fCutMaxDCAToVertexZ = reco.fCutMaxDCAToVertexZ;
fCutDCAToVertex2D = reco.fCutDCAToVertex2D;
-
+ fCutRequireITSStandAlone = reco.fCutRequireITSStandAlone;
+ fCutRequireITSpureSA = reco.fCutRequireITSpureSA;
if(reco.fResidualEta)
{
// assign or copy construct
fCutMaxDCAToVertexZ = 1e10;
fCutDCAToVertex2D = kFALSE;
+ fCutRequireITSStandAlone = kFALSE; //MARCEL
+ fCutRequireITSpureSA = kFALSE; //Marcel
//Misalignment matrices
for(Int_t i = 0; i < 15 ; i++)
} // Init mag field
+ if (esdevent) {
+ UInt_t mask1 = esdevent->GetESDRun()->GetDetectorsInDAQ();
+ UInt_t mask2 = esdevent->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, esdevent->GetESDRun()->GetDetectorsInReco(),
+ mask2, esdevent->GetESDRun()->GetDetectorsInDAQ()));
+ fITSTrackSA=kTRUE;
+ }
+ }
+
TObjArray *clusterArray = 0x0;
if(!clusterArr)
{
if(esdTrack->Pt()<fCutMinTrackPt) continue;
Double_t phi = esdTrack->Phi()*TMath::RadToDeg();
if(TMath::Abs(esdTrack->Eta())>0.8 || phi <= 20 || phi >= 240 ) continue;
- trackParam = const_cast<AliExternalTrackParam*>(esdTrack->GetInnerParam());
+ if(!fITSTrackSA)
+ trackParam = const_cast<AliExternalTrackParam*>(esdTrack->GetInnerParam()); // if TPC Available
+ else
+ trackParam = new AliExternalTrackParam(*esdTrack); // If ITS Track Standing alone
}
//If the input event is AOD, the starting point for extrapolation is at vertex
Int_t index = -1;
Double_t phiV = track->Phi()*TMath::RadToDeg();
if(TMath::Abs(track->Eta())>0.8 || phiV <= 20 || phiV >= 240 ) return index;
- AliExternalTrackParam *trackParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+ AliExternalTrackParam *trackParam = 0;
+ if(!fITSTrackSA)
+ trackParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam()); // If TPC
+ else
+ trackParam = new AliExternalTrackParam(*track);
+
if(!trackParam) return index;
AliExternalTrackParam emcalParam(*trackParam);
Float_t eta, phi;
cuts[10] = kTRUE;
}
+ // ITS
+ if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
+ if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
+ // TPC tracks
+ cuts[11] = kTRUE;
+ }else{
+ // ITS standalone tracks
+ if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
+ if(status & AliESDtrack::kITSpureSA) cuts[11] = kTRUE;
+ }else if(fCutRequireITSpureSA){
+ if(!(status & AliESDtrack::kITSpureSA)) cuts[11] = kTRUE;
+ }
+ }
+ }
+
Bool_t cut=kFALSE;
for (Int_t i=0; i<kNCuts; i++)
if (cuts[i]) { cut = kTRUE ; }
break;
}
+
+ case kITSStandAlone:
+ {
+ AliInfo(Form("Track cuts for matching: ITS Stand Alone tracks cut w/o DCA cut"));
+ SetRequireITSRefit(kTRUE);
+ SetRequireITSStandAlone(kTRUE);
+ SetITSTrackSA(kTRUE);
+ break;
+ }
+
}
}
class AliEMCALPIDUtils;
class AliESDtrack;
class AliExternalTrackParam;
-
+class AliESDtrackCuts;
class AliEMCALRecoUtils : public TNamed {
public:
enum NonlinearityFunctions{kPi0MC=0,kPi0GammaGamma=1,kPi0GammaConversion=2,kNoCorrection=3,kBeamTest=4,kBeamTestCorrected=5,kPi0MCv2=6,kPi0MCv3=7};
enum PositionAlgorithms{kUnchanged=-1,kPosTowerIndex=0, kPosTowerGlobal=1};
enum ParticleType{kPhoton=0, kElectron=1,kHadron =2, kUnknown=-1};
- enum { kNCuts = 11 }; //track matching
- enum TrackCutsType{kTPCOnlyCut=0, kGlobalCut=1, kLooseCut=2};
+ enum { kNCuts = 12 }; //track matching Marcel
+ enum TrackCutsType{kTPCOnlyCut=0, kGlobalCut=1, kLooseCut=2, kITSStandAlone=3}; //Marcel
//-----------------------------------------------------
//Position recalculation
void SetStep(Double_t step) { fStepSurface = step ; }
void SetStepCluster(Double_t step) { fStepCluster = step ; }
+ void SetITSTrackSA(Bool_t isITS) { fITSTrackSA = isITS ; } //Special Handle of AliExternTrackParam
+
// Exotic cells / clusters
Bool_t IsExoticCell(const Int_t absId, AliVCaloCells* cells, const Int_t bc =-1) ;
void SetMaxDCAToVertexXY(Float_t dist=1e10) { fCutMaxDCAToVertexXY = dist ; }
void SetMaxDCAToVertexZ(Float_t dist=1e10) { fCutMaxDCAToVertexZ = dist ; }
void SetDCAToVertex2D(Bool_t b=kFALSE) { fCutDCAToVertex2D = b ; }
-
+ void SetRequireITSStandAlone(Bool_t b=kFALSE) {fCutRequireITSStandAlone = b;} //Marcel
+ void SetRequireITSPureStandAlone(Bool_t b=kFALSE){fCutRequireITSpureSA = b;}
// getters
Double_t GetMinTrackPt() const { return fCutMinTrackPt ; }
Int_t GetMinNClusterTPC() const { return fCutMinNClusterTPC ; }
Float_t GetMaxDCAToVertexXY() const { return fCutMaxDCAToVertexXY ; }
Float_t GetMaxDCAToVertexZ() const { return fCutMaxDCAToVertexZ ; }
Bool_t GetDCAToVertex2D() const { return fCutDCAToVertex2D ; }
-
+ Bool_t GetRequireITSStandAlone() const { return fCutRequireITSStandAlone ; } //Marcel
private:
//Position recalculation
Double_t fMass; // Mass hypothesis of the track
Double_t fStepSurface; // Length of step to extrapolate tracks to EMCal surface
Double_t fStepCluster; // Length of step to extrapolate tracks to clusters
-
+ Bool_t fITSTrackSA; // If track matching is to be done with ITS tracks standing alone
+
// Track cuts
Int_t fTrackCutsType; // Esd track cuts type for matching
Double_t fCutMinTrackPt; // Cut on track pT
Float_t fCutMaxDCAToVertexXY; // Track-to-vertex cut in max absolute distance in xy-plane
Float_t fCutMaxDCAToVertexZ; // Track-to-vertex cut in max absolute distance in z-plane
Bool_t fCutDCAToVertex2D; // If true a 2D DCA cut is made.
+ Bool_t fCutRequireITSStandAlone; // Require ITSStandAlone
+ Bool_t fCutRequireITSpureSA; // ITS pure standalone tracks
+
ClassDef(AliEMCALRecoUtils, 18)
dEta = -999, dPhi = -999;
AliExternalTrackParam *trkParam = 0;
+
const AliESDfriendTrack* friendTrack = track->GetFriendTrack();
if(friendTrack && friendTrack->GetTPCOut())
trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
- else
+ else if(track->GetInnerParam())
trkParam = const_cast<AliExternalTrackParam*>(track->GetInnerParam());
+ else
+ trkParam = new AliExternalTrackParam(*track); //If there is ITSSa track
if(!trkParam) return kFALSE;
-
+
AliExternalTrackParam trkParamTmp (*trkParam);
if(!AliEMCALRecoUtils::ExtrapolateTrackToCluster(&trkParamTmp, cluster, track->GetMass(kTRUE), GetRecParam()->GetExtrapolateStep(), dEta, dPhi)) return kFALSE;
fClusterWindow(50),
fCutEta(0.025),
fCutPhi(0.05),
+ fITSTrackSA(kFALSE),
fTracks(0),
fClusters(0),
fGeom(0)
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)
//
// Load ESD tracks.
//
-
+
+ if (esd) {
+ 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);
//Select good quaulity tracks
if(esdTrack->Pt()<fCutPt) continue;
- if(esdTrack->GetNcls(1)<fCutNTPC)continue;
+ if(!fITSTrackSA)
+ if(esdTrack->GetNcls(1)<fCutNTPC)continue;
//Loose geometric cut
Double_t phi = esdTrack->Phi()*TMath::RadToDeg();
// If the esdFriend is available, use the TPCOuter point as the starting point of extrapolation
// Otherwise use the TPCInner point
AliExternalTrackParam *trkParam = 0;
- const AliESDfriendTrack* friendTrack = track->GetFriendTrack();
- if(friendTrack && friendTrack->GetTPCOut())
- trkParam = const_cast<AliExternalTrackParam*>(friendTrack->GetTPCOut());
+
+ 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;
if(!AliEMCALRecoUtils::ExtrapolateTrackToEMCalSurface(&trkParamTmp, 430., track->GetMass(kTRUE), fStep, eta, phi)) return index;
AliEMCALMatchCluster *cluster = (AliEMCALMatchCluster*)fClusters->At(ic);
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;
AliExternalTrackParam trkParTmp(trkParamTmp);
Double_t fClusterWindow; // Select clusters in the window to be matched to tracks
Double_t fCutEta; // cut on eta difference
Double_t fCutPhi; // cut on phi difference
-
+ Bool_t fITSTrackSA; // If ITS Tracks
+
TObjArray *fTracks; //! collection of tracks
TObjArray *fClusters; //! collection of EMCAL clusters (ESDCaloCluster or EMCALRecPoint)