X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAOD%2FAliAODTrack.cxx;h=1d4985d683974d766aad01ae61037d453260c484;hb=8ef7340c9839bc186ca5879407ff8249b09b86f2;hp=269d908e6ef9d65a5521cdae13949c8590bec3c5;hpb=71cec41fd43fa2c89e033ff43f66a4ebdad13d26;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AOD/AliAODTrack.cxx b/STEER/AOD/AliAODTrack.cxx index 269d908e6ef..1d4985d6839 100644 --- a/STEER/AOD/AliAODTrack.cxx +++ b/STEER/AOD/AliAODTrack.cxx @@ -28,6 +28,7 @@ #include "AliDetectorPID.h" #include "AliAODEvent.h" #include "AliAODHMPIDrings.h" +#include "AliTOFHeader.h" #include "AliAODTrack.h" @@ -39,6 +40,7 @@ AliAODTrack::AliAODTrack() : fRAtAbsorberEnd(0.), fChi2perNDF(-999.), fChi2MatchTrigger(0.), + fPID(0), fFlags(0), fLabel(-999), fTOFLabel(), @@ -55,6 +57,7 @@ AliAODTrack::AliAODTrack() : fID(-999), fCharge(-99), fType(kUndef), + fPIDForTracking(AliPID::kPion), fCaloIndex(kEMCALNoMatch), fCovMatrix(NULL), fDetPid(NULL), @@ -63,8 +66,10 @@ AliAODTrack::AliAODTrack() : fTrackPhiOnEMCal(-999), fTrackEtaOnEMCal(-999), fTrackPtOnEMCal(-999), + fIsMuonGlobalTrack(kFALSE), // AU fTPCsignalTuned(0), fTOFsignalTuned(99999), + fMFTClusterPattern(0), // AU fAODEvent(NULL) { // default constructor @@ -73,7 +78,6 @@ AliAODTrack::AliAODTrack() : SetPosition((Float_t*)NULL); SetXYAtDCA(-999., -999.); SetPxPyPzAtDCA(-999., -999., -999.); - SetPID((Float_t*)NULL); for (Int_t i = 0; i < 3; i++) {fTOFLabel[i] = -1;} } @@ -87,7 +91,6 @@ AliAODTrack::AliAODTrack(Short_t id, Double_t covMatrix[21], Short_t charge, UChar_t itsClusMap, - Double_t pid[10], AliAODVertex *prodVertex, Bool_t usedForVtxFit, Bool_t usedForPrimVtxFit, @@ -98,6 +101,7 @@ AliAODTrack::AliAODTrack(Short_t id, fRAtAbsorberEnd(0.), fChi2perNDF(chi2perNDF), fChi2MatchTrigger(0.), + fPID(0), fFlags(0), fLabel(label), fTOFLabel(), @@ -114,6 +118,7 @@ AliAODTrack::AliAODTrack(Short_t id, fID(id), fCharge(charge), fType(ttype), + fPIDForTracking(AliPID::kPion), fCaloIndex(kEMCALNoMatch), fCovMatrix(NULL), fDetPid(NULL), @@ -122,8 +127,10 @@ AliAODTrack::AliAODTrack(Short_t id, fTrackPhiOnEMCal(-999), fTrackEtaOnEMCal(-999), fTrackPtOnEMCal(-999), + fIsMuonGlobalTrack(kFALSE), // AU fTPCsignalTuned(0), fTOFsignalTuned(99999), + fMFTClusterPattern(0), // AU fAODEvent(NULL) { // constructor @@ -135,7 +142,6 @@ AliAODTrack::AliAODTrack(Short_t id, SetUsedForVtxFit(usedForVtxFit); SetUsedForPrimVtxFit(usedForPrimVtxFit); if(covMatrix) SetCovMatrix(covMatrix); - SetPID(pid); SetITSClusterMap(itsClusMap); for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;} } @@ -150,17 +156,17 @@ AliAODTrack::AliAODTrack(Short_t id, Float_t covMatrix[21], Short_t charge, UChar_t itsClusMap, - Float_t pid[10], AliAODVertex *prodVertex, Bool_t usedForVtxFit, Bool_t usedForPrimVtxFit, AODTrk_t ttype, UInt_t selectInfo, - Float_t chi2perNDF) : + Float_t chi2perNDF ) : AliVTrack(), fRAtAbsorberEnd(0.), fChi2perNDF(chi2perNDF), fChi2MatchTrigger(0.), + fPID(0), fFlags(0), fLabel(label), fTOFLabel(), @@ -177,6 +183,7 @@ AliAODTrack::AliAODTrack(Short_t id, fID(id), fCharge(charge), fType(ttype), + fPIDForTracking(AliPID::kPion), fCaloIndex(kEMCALNoMatch), fCovMatrix(NULL), fDetPid(NULL), @@ -185,8 +192,10 @@ AliAODTrack::AliAODTrack(Short_t id, fTrackPhiOnEMCal(-999), fTrackEtaOnEMCal(-999), fTrackPtOnEMCal(-999), + fIsMuonGlobalTrack(kFALSE), // AU fTPCsignalTuned(0), fTOFsignalTuned(99999), + fMFTClusterPattern(0), // AU fAODEvent(NULL) { // constructor @@ -198,7 +207,6 @@ AliAODTrack::AliAODTrack(Short_t id, SetUsedForVtxFit(usedForVtxFit); SetUsedForPrimVtxFit(usedForPrimVtxFit); if(covMatrix) SetCovMatrix(covMatrix); - SetPID(pid); SetITSClusterMap(itsClusMap); for (Int_t i=0;i<3;i++) {fTOFLabel[i]=-1;} } @@ -210,6 +218,7 @@ AliAODTrack::~AliAODTrack() delete fCovMatrix; delete fDetPid; delete fDetectorPID; + if (fPID) {delete[] fPID; fPID = 0;} } @@ -219,6 +228,7 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) : fRAtAbsorberEnd(trk.fRAtAbsorberEnd), fChi2perNDF(trk.fChi2perNDF), fChi2MatchTrigger(trk.fChi2MatchTrigger), + fPID(0), fFlags(trk.fFlags), fLabel(trk.fLabel), fTOFLabel(), @@ -235,6 +245,7 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) : fID(trk.fID), fCharge(trk.fCharge), fType(trk.fType), + fPIDForTracking(trk.fPIDForTracking), fCaloIndex(trk.fCaloIndex), fCovMatrix(NULL), fDetPid(NULL), @@ -243,8 +254,10 @@ AliAODTrack::AliAODTrack(const AliAODTrack& trk) : fTrackPhiOnEMCal(trk.fTrackPhiOnEMCal), fTrackEtaOnEMCal(trk.fTrackEtaOnEMCal), fTrackPtOnEMCal(trk.fTrackPtOnEMCal), + fIsMuonGlobalTrack(trk.fIsMuonGlobalTrack), // AU fTPCsignalTuned(trk.fTPCsignalTuned), fTOFsignalTuned(trk.fTOFsignalTuned), + fMFTClusterPattern(trk.fMFTClusterPattern), // AU fAODEvent(trk.fAODEvent) { // Copy constructor @@ -277,7 +290,7 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk) fRAtAbsorberEnd = trk.fRAtAbsorberEnd; fChi2perNDF = trk.fChi2perNDF; fChi2MatchTrigger = trk.fChi2MatchTrigger; - trk.GetPID(fPID); + SetPID( trk.fPID ); fFlags = trk.fFlags; fLabel = trk.fLabel; fTrackLength = trk.fTrackLength; @@ -293,13 +306,16 @@ AliAODTrack& AliAODTrack::operator=(const AliAODTrack& trk) fID = trk.fID; fCharge = trk.fCharge; fType = trk.fType; + fPIDForTracking = trk.fPIDForTracking; fCaloIndex = trk.fCaloIndex; fTrackPhiOnEMCal = trk.fTrackPhiOnEMCal; fTrackEtaOnEMCal = trk.fTrackEtaOnEMCal; fTrackPtOnEMCal = trk.fTrackPtOnEMCal; + fIsMuonGlobalTrack = trk.fIsMuonGlobalTrack; // AU fTPCsignalTuned = trk.fTPCsignalTuned; fTOFsignalTuned = trk.fTOFsignalTuned; - + fMFTClusterPattern = trk.fMFTClusterPattern; // AU + delete fCovMatrix; if(trk.fCovMatrix) fCovMatrix=new AliAODRedCov<6>(*trk.fCovMatrix); else fCovMatrix=NULL; @@ -444,21 +460,22 @@ AliAODTrack::AODTrkPID_t AliAODTrack::GetMostProbablePID() const Int_t nPID = 10; AODTrkPID_t loc = kUnknown; - Double_t max = 0.; Bool_t allTheSame = kTRUE; - - for (Int_t iPID = 0; iPID < nPID; iPID++) { - if (fPID[iPID] >= max) { - if (fPID[iPID] > max) { - allTheSame = kFALSE; - max = fPID[iPID]; - loc = (AODTrkPID_t)iPID; - } else { - allTheSame = kTRUE; + if (fPID) { + Double_t max = 0.; + for (Int_t iPID = 0; iPID < nPID; iPID++) { + if (fPID[iPID] >= max) { + if (fPID[iPID] > max) { + allTheSame = kFALSE; + max = fPID[iPID]; + loc = (AODTrkPID_t)iPID; + } else { + allTheSame = kTRUE; + } } } } - return allTheSame ? kUnknown : loc; + return allTheSame ? AODTrkPID_t(GetPIDForTracking()) : loc; } //______________________________________________________________________________ @@ -467,13 +484,13 @@ void AliAODTrack::ConvertAliPIDtoAODPID() // Converts AliPID array. // The numbering scheme is the same for electrons, muons, pions, kaons, and protons. // Everything else has to be set to zero. - - fPID[kDeuteron] = 0.; - fPID[kTriton] = 0.; - fPID[kHelium3] = 0.; - fPID[kAlpha] = 0.; - fPID[kUnknown] = 0.; - + if (fPID) { + fPID[kDeuteron] = 0.; + fPID[kTriton] = 0.; + fPID[kHelium3] = 0.; + fPID[kAlpha] = 0.; + fPID[kUnknown] = 0.; + } return; } @@ -800,7 +817,7 @@ Int_t AliAODTrack::GetTOFBunchCrossing(Double_t b, Bool_t) const if (IsOn(kTIME)) { // integrated time info is there int pid = (int)GetMostProbablePID(); double ttimes[10]; - GetIntegratedTimes(ttimes); + GetIntegratedTimes(ttimes, pid>=AliPID::kSPECIES ? AliPID::kSPECIESC : AliPID::kSPECIES); tdif -= ttimes[pid]; } else { // assume integrated time info from TOF radius and momentum @@ -943,6 +960,164 @@ Bool_t AliAODTrack::GetXYZAt(Double_t x, Double_t b, Double_t *r) const return Local2GlobalPosition(r,alpha); } +//_____________________________________________________________________________ +Bool_t AliAODTrack::GetXYZatR(Double_t xr,Double_t bz, Double_t *xyz, Double_t* alpSect) const +{ + // This method has 3 modes of behaviour + // 1) xyz[3] array is provided but alpSect pointer is 0: calculate the position of track intersection + // with circle of radius xr and fill it in xyz array + // 2) alpSect pointer is provided: find alpha of the sector where the track reaches local coordinate xr + // Note that in this case xr is NOT the radius but the local coordinate. + // If the xyz array is provided, it will be filled by track lab coordinates at local X in this sector + // 3) Neither alpSect nor xyz pointers are provided: just check if the track reaches radius xr + // + // + Double_t alpha=0.0; + Double_t radPos2 = fPosition[0]*fPosition[0]+fPosition[1]*fPosition[1]; + Double_t radMax = 45.; // approximately ITS outer radius + if (radPos2 < radMax*radMax) { // inside the ITS + alpha = fMomentum[1]; //TMath::ATan2(fMomentum[1],fMomentum[0]); // fMom is pt,phi,theta! + } else { // outside the ITS + Float_t phiPos = TMath::Pi()+TMath::ATan2(-fPosition[1], -fPosition[0]); + alpha = + TMath::DegToRad()*(20*((((Int_t)(phiPos*TMath::RadToDeg()))/20))+10); + } + // + // Get the vertex of origin and the momentum + TVector3 ver(fPosition[0],fPosition[1],fPosition[2]); + TVector3 mom(Px(),Py(),Pz()); + // + // Rotate to the local coordinate system + ver.RotateZ(-alpha); + mom.RotateZ(-alpha); + // + Double_t fx = ver.X(); + Double_t fy = ver.Y(); + Double_t fz = ver.Z(); + Double_t sn = TMath::Sin(mom.Phi()); + Double_t tgl = mom.Pz()/mom.Pt(); + Double_t crv = TMath::Sign(1/mom.Pt(),(Double_t)fCharge)*bz*kB2C; + // + if ( (TMath::Abs(bz)) TMath::Pi()) phi0 -= 2.*TMath::Pi(); + else if (phi0 <-TMath::Pi()) phi0 += 2.*TMath::Pi(); + double cs0 = TMath::Cos(phi0); + double sn0 = TMath::Sin(phi0); + double r0 = x0*cs0 + y0*sn0 - tR; // DCA to origin + double r2R = 1.+r0/tR; + // + // + if (r2RkAlmost1 ) { + // printf("Does not reach : %f %f\n",r0,tR); + return kFALSE; // track does not reach the radius xr + } + // + double t = TMath::ACos(cosT); + if (tR<0) t = -t; + // intersection point + double xyzi[3]; + xyzi[0] = x0 - tR*TMath::Cos(t+phi0); + xyzi[1] = y0 - tR*TMath::Sin(t+phi0); + if (xyz) { // if postition is requested, then z is needed: + double t0 = TMath::ATan2(cs,-sn) - phi0; + double z0 = fz - t0*tR*tgl; + xyzi[2] = z0 + tR*t*tgl; + } + else xyzi[2] = 0; + // + Local2GlobalPosition(xyzi,alpha); + // + if (xyz) { + xyz[0] = xyzi[0]; + xyz[1] = xyzi[1]; + xyz[2] = xyzi[2]; + } + // + if (alpSect) { + double &alp = *alpSect; + // determine the sector of crossing + double phiPos = TMath::Pi()+TMath::ATan2(-xyzi[1],-xyzi[0]); + int sect = ((Int_t)(phiPos*TMath::RadToDeg()))/20; + alp = TMath::DegToRad()*(20*sect+10); + double x2r,f1,f2,r1,r2,dx,dy2dx,yloc=0, ylocMax = xr*TMath::Tan(TMath::Pi()/18); // min max Y within sector at given X + // + while(1) { + Double_t ca=TMath::Cos(alp-alpha), sa=TMath::Sin(alp-alpha); + if ((cs*ca+sn*sa)<0) { + AliDebug(1,Form("Rotation to target sector impossible: local cos(phi) would become %.2f",cs*ca+sn*sa)); + return kFALSE; + } + // + f1 = sn*ca - cs*sa; + if (TMath::Abs(f1) >= kAlmost1) { + AliDebug(1,Form("Rotation to target sector impossible: local sin(phi) would become %.2f",f1)); + return kFALSE; + } + // + double tmpX = fx*ca + fy*sa; + double tmpY = -fx*sa + fy*ca; + // + // estimate Y at X=xr + dx=xr-tmpX; + x2r = crv*dx; + f2=f1 + x2r; + if (TMath::Abs(f2) >= kAlmost1) { + AliDebug(1,Form("Propagation in target sector failed ! %.10e",f2)); + return kFALSE; + } + r1 = TMath::Sqrt((1.-f1)*(1.+f1)); + r2 = TMath::Sqrt((1.-f2)*(1.+f2)); + dy2dx = (f1+f2)/(r1+r2); + yloc = tmpY + dx*dy2dx; + if (yloc>ylocMax) {alp += 2*TMath::Pi()/18; sect++;} + else if (yloc<-ylocMax) {alp -= 2*TMath::Pi()/18; sect--;} + else break; + if (alp >= TMath::Pi()) alp -= 2*TMath::Pi(); + else if (alp < -TMath::Pi()) alp += 2*TMath::Pi(); + // if (sect>=18) sect = 0; + // if (sect<=0) sect = 17; + } + // + // if alpha was requested, then recalculate the position at intersection in sector + if (xyz) { + xyz[0] = xr; + xyz[1] = yloc; + if (TMath::Abs(x2r)<0.05) xyz[2] = fz + dx*(r2 + f2*dy2dx)*tgl; + else { + // for small dx/R the linear apporximation of the arc by the segment is OK, + // but at large dx/R the error is very large and leads to incorrect Z propagation + // angle traversed delta = 2*asin(dist_start_end / R / 2), hence the arc is: R*deltaPhi + // The dist_start_end is obtained from sqrt(dx^2+dy^2) = x/(r1+r2)*sqrt(2+f1*f2+r1*r2) + // Similarly, the rotation angle in linear in dx only for dx<GetITSdEdxSample(i); } + +//_____________________________________________ +Double_t AliAODTrack::GetMassForTracking() const +{ + int pid = fPIDForTracking; + if (pidGetTOFHeader(); +}