, fOutput(0)\r
, fPitList(0)\r
, fUseMCInfo(kFALSE)\r
+ , fUseESDfriends(kFALSE)\r
, fdNdPtEventCuts(0)\r
, fdNdPtAcceptanceCuts(0)\r
, fdNdPtRecAcceptanceCuts(0)\r
}\r
}\r
\r
- fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
- if(!fESDfriend) {\r
- Printf("ERROR: ESD friends not available");\r
+ if(fUseESDfriends) {\r
+ fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));\r
+ if(!fESDfriend) {\r
+ Printf("ERROR: ESD friends not available");\r
+ }\r
}\r
\r
//\r
if(fProcessAll) { \r
- ProcessAll(fESD,fMC,fESDfriend);\r
+ ProcessAll(fESD,fMC,fESDfriend); // all track stages and MC\r
ProcessV0(fESD,fMC,fESDfriend);\r
+ ProcessLaser(fESD,fMC,fESDfriend);\r
+ ProcessdEdx(fESD,fMC,fESDfriend);\r
+ if(IsUseMCInfo())\r
+ ProcessMCEff(fESD,fMC,fESDfriend);\r
}\r
else {\r
Process(fESD,fMC,fESDfriend);\r
ProcessV0(fESD,fMC,fESDfriend);\r
+ ProcessLaser(fESD,fMC,fESDfriend);\r
+ ProcessdEdx(fESD,fMC,fESDfriend);\r
+ if(IsUseMCInfo())\r
+ ProcessMCEff(fESD,fMC,fESDfriend);\r
}\r
\r
// Post output data.\r
void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
{\r
//\r
- // Process real and/or simulated events\r
- // Only filtering\r
+ // Select real events with high-pT tracks \r
//\r
if(!esdEvent) {\r
AliDebug(AliLog::kError, "esdEvent not available");\r
\r
} // end bUseMC\r
\r
- // laser events \r
- if(esdEvent)\r
- {\r
- const AliESDHeader* esdHeader = esdEvent->GetHeader();\r
- if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib) \r
- {\r
- Int_t countLaserTracks = 0;\r
- for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
- {\r
- AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
- if(!track) continue;\r
-\r
- if(track->GetTPCInnerParam()) countLaserTracks++;\r
- }\r
- \r
- if(countLaserTracks > 100) { \r
-\r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
- Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
-\r
- if(!fTreeSRedirector) return;\r
- (*fTreeSRedirector)<<"Laser"<<\r
- "fileName.="<<&fileName<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "multTPCtracks="<<countLaserTracks<<\r
- "\n";\r
- }\r
- }\r
- }\r
-\r
-\r
// get reconstructed vertex \r
//const AliESDVertex* vtxESD = 0; \r
const AliESDVertex* vtxESD = 0; \r
// check event cuts\r
if(isEventOK && isEventTriggered)\r
{\r
+\r
+ //\r
+ // get IR information\r
+ //\r
+ AliESDHeader *esdHeader = 0;\r
+ esdHeader = esdEvent->GetHeader();\r
+ if(!esdHeader) return;\r
+ Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s\r
+ Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval\r
+\r
//\r
Double_t vert[3] = {0}; \r
vert[0] = vtxESD->GetXv();\r
if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
//printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
\r
+ AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());\r
+ if (!tpcInner) continue;\r
+ // transform to the track reference frame \r
+ Bool_t isOK = kFALSE;\r
+ isOK = tpcInner->Rotate(track->GetAlpha());\r
+ isOK = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+ if(!isOK) continue;\r
+\r
// Dump to the tree \r
// vertex\r
// TPC-ITS tracks\r
"vertX="<<vert[0]<<\r
"vertY="<<vert[1]<<\r
"vertZ="<<vert[2]<<\r
+ "IRtot="<<ir1<<\r
+ "IRint2="<<ir2<<\r
"mult="<<mult<<\r
"esdTrack.="<<track<<\r
"centralityF="<<centralityF<<\r
"\n";\r
}\r
+ }\r
+ \r
+ PostData(1, fOutput);\r
+}\r
+\r
+\r
+//_____________________________________________________________________________\r
+void AlidNdPtTrackDumpTask::ProcessLaser(AliESDEvent *const esdEvent, AliMCEvent * const /*mcEvent*/, AliESDfriend *const /*esdFriend*/)\r
+{\r
+ //\r
+ // Process laser events\r
+ //\r
+ if(!esdEvent) {\r
+ AliDebug(AliLog::kError, "esdEvent not available");\r
+ return;\r
+ }\r
+\r
+ // get file name\r
+ TTree *chain = (TChain*)GetInputData(0);\r
+ if(!chain) { \r
+ Printf("ERROR: Could not receive input chain");\r
+ return;\r
+ }\r
+ TObjString fileName(chain->GetCurrentFile()->GetName());\r
\r
- // high dEdx\r
+ // laser events \r
+ const AliESDHeader* esdHeader = esdEvent->GetHeader();\r
+ if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib) \r
+ {\r
+ Int_t countLaserTracks = 0;\r
for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
{\r
AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
if(!track) continue;\r
- if(track->Charge()==0) continue;\r
- if(!esdTrackCuts->AcceptTrack(track)) continue;\r
- if(!accCuts->AcceptTrack(track)) continue;\r
\r
- if(!IsHighDeDxParticle(track)) continue;\r
- \r
+ if(track->GetTPCInnerParam()) countLaserTracks++;\r
+ }\r
+ \r
+ if(countLaserTracks > 100) \r
+ { \r
+ Double_t runNumber = esdEvent->GetRunNumber();\r
+ Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+ Double_t bz = esdEvent->GetMagneticField();\r
+\r
if(!fTreeSRedirector) return;\r
- (*fTreeSRedirector)<<"dEdx"<<\r
+ (*fTreeSRedirector)<<"Laser"<<\r
"fileName.="<<&fileName<<\r
"runNumber="<<runNumber<<\r
"evtTimeStamp="<<evtTimeStamp<<\r
"evtNumberInFile="<<evtNumberInFile<<\r
"Bz="<<bz<<\r
- "vertX="<<vert[0]<<\r
- "vertY="<<vert[1]<<\r
- "vertZ="<<vert[2]<<\r
- "mult="<<mult<<\r
- "esdTrack.="<<track<<\r
+ "multTPCtracks="<<countLaserTracks<<\r
"\n";\r
- }\r
+ }\r
}\r
- \r
- PostData(1, fOutput);\r
}\r
\r
-\r
-\r
-\r
-\r
-\r
-\r
//_____________________________________________________________________________\r
void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const esdFriend)\r
{\r
//\r
- // Process real and/or simulated events\r
- //\r
+ // Select real events with high-pT tracks\r
+ // Calculate and stor in the output tree:\r
+ // TPC constrained tracks\r
+ // InnerParams constrained tracks\r
+ // TPC-ITS tracks\r
+ // ITSout-InnerParams tracks\r
+ // chi2 distance between TPC constrained and TPC-ITS tracks\r
+ // chi2 distance between TPC refitted constrained and TPC-ITS tracks\r
+ // chi2 distance between ITSout and InnerParams tracks\r
+ // MC information: \r
+ // track references at ITSin, TPCin; InnerParam at first TPC track reference, \r
+ // particle ID, mother ID, production mechanism ...\r
+ // \r
+\r
if(!esdEvent) {\r
AliDebug(AliLog::kError, "esdEvent not available");\r
return;\r
\r
} // end bUseMC\r
\r
- // laser events \r
- if(esdEvent)\r
- {\r
- const AliESDHeader* esdHeader = esdEvent->GetHeader();\r
- if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib) \r
- {\r
- Int_t countLaserTracks = 0;\r
- for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
- {\r
- AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
- if(!track) continue;\r
-\r
- if(track->GetTPCInnerParam()) countLaserTracks++;\r
- }\r
- \r
- if(countLaserTracks > 100) { \r
-\r
- Double_t runNumber = esdEvent->GetRunNumber();\r
- Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
- Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
-\r
- if(!fTreeSRedirector) return;\r
- (*fTreeSRedirector)<<"Laser"<<\r
- "fileName.="<<&fileName<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "multTPCtracks="<<countLaserTracks<<\r
- "\n";\r
- }\r
- }\r
- }\r
-\r
-\r
// get reconstructed vertex \r
//const AliESDVertex* vtxESD = 0; \r
const AliESDVertex* vtxESD = 0; \r
// check event cuts\r
if(isEventOK && isEventTriggered)\r
{\r
+ //\r
+ // get IR information\r
+ //\r
+ AliESDHeader *esdHeader = 0;\r
+ esdHeader = esdEvent->GetHeader();\r
+ if(!esdHeader) return;\r
+ Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s\r
+ Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval\r
+\r
//\r
Double_t vert[3] = {0}; \r
vert[0] = vtxESD->GetXv();\r
\r
Double_t x[3]; track->GetXYZ(x);\r
Double_t b[3]; AliTracker::GetBxByBz(x,b);\r
- Bool_t isOK = kFALSE;\r
\r
//\r
- // Constrain TPC-only tracks (TPCinner) to vertex\r
+ // Transform TPC inner params to track reference frame\r
//\r
+ Bool_t isOKtpcInner = kFALSE;\r
AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());\r
- if (!tpcInner) continue;\r
- // transform to the track reference frame \r
- isOK = tpcInner->Rotate(track->GetAlpha());\r
- isOK = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
- if(!isOK) continue;\r
+ if (tpcInner) {\r
+ // transform to the track reference frame \r
+ isOKtpcInner = tpcInner->Rotate(track->GetAlpha());\r
+ isOKtpcInner = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+ }\r
\r
+ //\r
+ // Constrain TPC inner to vertex\r
// clone TPCinner has to be deleted\r
+ //\r
+ Bool_t isOKtpcInnerC = kFALSE;\r
AliExternalTrackParam * tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));\r
- if (!tpcInnerC) continue;\r
- \r
- // constrain TPCinner \r
- //isOK = ConstrainTPCInner(tpcInnerC,vtxESD,esdEvent->GetMagneticField());\r
- isOK = ConstrainTPCInner(tpcInnerC,vtxESD,b);\r
-\r
- // transform to the track reference frame \r
- isOK = tpcInnerC->Rotate(track->GetAlpha());\r
- isOK = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
-\r
- if(!isOK) {\r
- if(tpcInnerC) delete tpcInnerC;\r
- continue;\r
+ if (tpcInnerC) {\r
+ isOKtpcInnerC = ConstrainTPCInner(tpcInnerC,vtxESD,b);\r
+ isOKtpcInnerC = tpcInnerC->Rotate(track->GetAlpha());\r
+ isOKtpcInnerC = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
}\r
\r
-\r
//\r
- // Constrain TPC refitted tracks at inner TPC wall (InnerParams) \r
- // to vertex\r
+ // Constrain TPC refitted tracks at inner TPC wall (InnerParams) to vertex \r
+ // Clone track InnerParams has to be deleted\r
//\r
- // clone track InnerParams has to be deleted\r
+ Bool_t isOKtrackInnerC = kFALSE;\r
AliExternalTrackParam * trackInnerC = new AliExternalTrackParam(*(track->GetInnerParam()));\r
- if (!trackInnerC) continue;\r
- \r
- // constrain track InnerParams \r
- isOK = ConstrainTrackInner(trackInnerC,vtxESD,track->GetMass(),b);\r
-\r
- // transform to the track reference frame \r
- isOK = trackInnerC->Rotate(track->GetAlpha());\r
- isOK = trackInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
-\r
- if(!isOK) {\r
- if(trackInnerC) delete trackInnerC;\r
- continue;\r
- }\r
+ if (trackInnerC) {\r
+ isOKtrackInnerC = ConstrainTrackInner(trackInnerC,vtxESD,track->GetMass(),b);\r
+ isOKtrackInnerC = trackInnerC->Rotate(track->GetAlpha());\r
+ isOKtrackInnerC = trackInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
+ } \r
\r
//\r
// calculate chi2 between vi and vj vectors\r
TMatrixD deltaT(5,1), deltaTtrackC(5,1);\r
TMatrixD delta(1,5), deltatrackC(1,5);\r
TMatrixD covarM(5,5), covarMtrackC(5,5);\r
+ TMatrixD chi2(1,1);\r
+ TMatrixD chi2trackC(1,1);\r
\r
- for (Int_t ipar=0; ipar<5; ipar++) {\r
- deltaT(ipar,0)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
- delta(0,ipar)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ if(isOKtpcInnerC && isOKtrackInnerC) \r
+ {\r
+ for (Int_t ipar=0; ipar<5; ipar++) {\r
+ deltaT(ipar,0)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ delta(0,ipar)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
\r
- deltaTtrackC(ipar,0)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
- deltatrackC(0,ipar)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ deltaTtrackC(ipar,0)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ deltatrackC(0,ipar)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];\r
\r
- for (Int_t jpar=0; jpar<5; jpar++) {\r
- Int_t index=track->GetIndex(ipar,jpar);\r
- covarM(ipar,jpar)=track->GetCovariance()[index]+tpcInnerC->GetCovariance()[index];\r
- covarMtrackC(ipar,jpar)=track->GetCovariance()[index]+trackInnerC->GetCovariance()[index];\r
+ for (Int_t jpar=0; jpar<5; jpar++) {\r
+ Int_t index=track->GetIndex(ipar,jpar);\r
+ covarM(ipar,jpar)=track->GetCovariance()[index]+tpcInnerC->GetCovariance()[index];\r
+ covarMtrackC(ipar,jpar)=track->GetCovariance()[index]+trackInnerC->GetCovariance()[index];\r
+ }\r
}\r
- }\r
- // chi2 distance TPC constrained and TPC+ITS\r
- TMatrixD covarMInv = covarM.Invert();\r
- TMatrixD mat2 = covarMInv*deltaT;\r
- TMatrixD chi2 = delta*mat2; \r
- //chi2.Print();\r
\r
- // chi2 distance TPC refitted constrained and TPC+ITS\r
- TMatrixD covarMInvtrackC = covarMtrackC.Invert();\r
- TMatrixD mat2trackC = covarMInvtrackC*deltaTtrackC;\r
- TMatrixD chi2trackC = deltatrackC*mat2trackC; \r
- //chi2trackC.Print();\r
+ // chi2 distance TPC constrained and TPC+ITS\r
+ TMatrixD covarMInv = covarM.Invert();\r
+ TMatrixD mat2 = covarMInv*deltaT;\r
+ chi2 = delta*mat2; \r
+ //chi2.Print();\r
+\r
+ // chi2 distance TPC refitted constrained and TPC+ITS\r
+ TMatrixD covarMInvtrackC = covarMtrackC.Invert();\r
+ TMatrixD mat2trackC = covarMInvtrackC*deltaTtrackC;\r
+ chi2trackC = deltatrackC*mat2trackC; \r
+ //chi2trackC.Print();\r
+ }\r
\r
\r
//\r
const Double_t kStep=3; \r
\r
// clone track InnerParams has to be deleted\r
+ Bool_t isOKtrackInnerC2 = kFALSE;\r
AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
- if (!trackInnerC2) continue;\r
- if(!AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE))\r
- {\r
- if(trackInnerC2) delete trackInnerC2;\r
- continue;\r
+ if (trackInnerC2) {\r
+ isOKtrackInnerC2 = AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE);\r
}\r
\r
- AliExternalTrackParam *outerITSc = new AliExternalTrackParam();\r
- if(!outerITSc) continue;\r
-\r
+ Bool_t isOKouterITSc = kFALSE;\r
+ AliExternalTrackParam *outerITSc = NULL;\r
TMatrixD chi2OuterITS(1,1);\r
- chi2OuterITS(0,0) = 0;\r
\r
if(esdFriend && esdFriend->TestSkipBit()==kFALSE) \r
{\r
\r
if(friendTrack) \r
{\r
- if( (outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut())) ) \r
+ outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut());\r
+ if(outerITSc) \r
{\r
- if(AliTracker::PropagateTrackToBxByBz(outerITSc,kTPCRadius,track->GetMass(),kStep,kFALSE))\r
- {\r
- // transform ITSout to the track InnerParams reference frame \r
- isOK = kFALSE;\r
- isOK = outerITSc->Rotate(trackInnerC2->GetAlpha());\r
- isOK = outerITSc->PropagateTo(trackInnerC2->GetX(),esdEvent->GetMagneticField());\r
-\r
- if(!isOK) {\r
- if(outerITSc) delete outerITSc;\r
- if(trackInnerC2) delete trackInnerC2;\r
- continue;\r
- }\r
- \r
- //\r
- // calculate chi2 between outerITS and innerParams\r
- // cov without z-coordinate at the moment\r
- //\r
- TMatrixD deltaTouterITS(4,1);\r
- TMatrixD deltaouterITS(1,4);\r
- TMatrixD covarMouterITS(4,4);\r
-\r
+ isOKouterITSc = AliTracker::PropagateTrackToBxByBz(outerITSc,kTPCRadius,track->GetMass(),kStep,kFALSE);\r
+ isOKouterITSc = outerITSc->Rotate(trackInnerC2->GetAlpha());\r
+ isOKouterITSc = outerITSc->PropagateTo(trackInnerC2->GetX(),esdEvent->GetMagneticField());\r
+\r
+ //\r
+ // calculate chi2 between outerITS and innerParams\r
+ // cov without z-coordinate at the moment\r
+ //\r
+ TMatrixD deltaTouterITS(4,1);\r
+ TMatrixD deltaouterITS(1,4);\r
+ TMatrixD covarMouterITS(4,4);\r
+\r
+ if(isOKtrackInnerC2 && isOKouterITSc) {\r
Int_t kipar = 0;\r
Int_t kjpar = 0;\r
for (Int_t ipar=0; ipar<5; ipar++) {\r
\r
AliTrackReference *refTPCIn = NULL;\r
AliTrackReference *refITS = NULL;\r
+\r
+ Bool_t isOKtrackInnerC3 = kFALSE;\r
AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
- if(!trackInnerC3) continue;\r
\r
if(IsUseMCInfo()) \r
{\r
for (Int_t iref = 0; iref < nTrackRef; iref++) \r
{\r
AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);\r
- //printf("ref %p \n",ref);\r
- //if(ref) printf("ref->DetectorId() %d \n",ref->DetectorId());\r
- //printf("AliTrackReference::kTPC %d \n",AliTrackReference::kTPC);\r
-\r
\r
// Ref. in the middle ITS \r
if(ref && ref->DetectorId()==AliTrackReference::kITS)\r
if(refTPCIn && trackInnerC3) \r
{\r
Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());\r
- isOK = kFALSE;\r
- isOK = trackInnerC3->Rotate(kRefPhi);\r
- isOK = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);\r
-\r
- if(!isOK){\r
- if(trackInnerC3) delete trackInnerC3;\r
- if(refTPCIn) delete refTPCIn;\r
- }\r
+ isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);\r
+ isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);\r
}\r
}\r
\r
}\r
\r
//\r
- if(!fTreeSRedirector) return;\r
- (*fTreeSRedirector)<<"dNdPtTree"<<\r
- "fileName.="<<&fileName<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "Bz="<<bz<<\r
- "vertX="<<vert[0]<<\r
- "vertY="<<vert[1]<<\r
- "vertZ="<<vert[2]<<\r
- "mult="<<mult<<\r
- "esdTrack.="<<track<<\r
- "extTPCInnerC.="<<tpcInnerC<<\r
- "extInnerParamC.="<<trackInnerC<<\r
- "extInnerParam.="<<trackInnerC2<<\r
- "extOuterITS.="<<outerITSc<<\r
- "extInnerParamRef.="<<trackInnerC3<<\r
- "refTPCIn.="<<refTPCIn<<\r
- "refITS.="<<refITS<<\r
- "chi2TPCInnerC="<<chi2(0,0)<<\r
- "chi2InnerC="<<chi2trackC(0,0)<<\r
- "chi2OuterITS="<<chi2OuterITS(0,0)<<\r
- "centralityF="<<centralityF<<\r
- "particle.="<<particle<<\r
- "particleMother.="<<particleMother<<\r
- "mech="<<mech<<\r
- "isPrim="<<isPrim<<\r
- "isFromStrangess="<<isFromStrangess<<\r
- "isFromConversion="<<isFromConversion<<\r
- "isFromMaterial="<<isFromMaterial<<\r
- "particleTPC.="<<particleTPC<<\r
- "particleMotherTPC.="<<particleMotherTPC<<\r
- "mechTPC="<<mechTPC<<\r
- "isPrimTPC="<<isPrimTPC<<\r
- "isFromStrangessTPC="<<isFromStrangessTPC<<\r
- "isFromConversionTPC="<<isFromConversionTPC<<\r
- "isFromMaterialTPC="<<isFromMaterialTPC<<\r
- "particleITS.="<<particleITS<<\r
- "particleMotherITS.="<<particleMotherITS<<\r
- "mechITS="<<mechITS<<\r
- "isPrimITS="<<isPrimITS<<\r
- "isFromStrangessITS="<<isFromStrangessITS<<\r
- "isFromConversionITS="<<isFromConversionITS<<\r
- "isFromMaterialITS="<<isFromMaterialITS<<\r
- "\n";\r
+ Bool_t dumpToTree=kFALSE;\r
+ \r
+ if(isOKtpcInnerC && isOKtrackInnerC) dumpToTree = kTRUE;\r
+ if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;\r
+ if(fUseMCInfo && isOKtrackInnerC3) dumpToTree = kTRUE;\r
\r
+ //\r
+ if(fTreeSRedirector && dumpToTree) \r
+ {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "fileName.="<<&fileName<<\r
+ "runNumber="<<runNumber<<\r
+ "evtTimeStamp="<<evtTimeStamp<<\r
+ "evtNumberInFile="<<evtNumberInFile<<\r
+ "Bz="<<bz<<\r
+ "vertX="<<vert[0]<<\r
+ "vertY="<<vert[1]<<\r
+ "vertZ="<<vert[2]<<\r
+ "IRtot="<<ir1<<\r
+ "IRint2="<<ir2<<\r
+ "mult="<<mult<<\r
+ "esdTrack.="<<track<<\r
+ "extTPCInnerC.="<<tpcInnerC<<\r
+ "extInnerParamC.="<<trackInnerC<<\r
+ "extInnerParam.="<<trackInnerC2<<\r
+ "extOuterITS.="<<outerITSc<<\r
+ "extInnerParamRef.="<<trackInnerC3<<\r
+ "refTPCIn.="<<refTPCIn<<\r
+ "refITS.="<<refITS<<\r
+ "chi2TPCInnerC="<<chi2(0,0)<<\r
+ "chi2InnerC="<<chi2trackC(0,0)<<\r
+ "chi2OuterITS="<<chi2OuterITS(0,0)<<\r
+ "centralityF="<<centralityF<<\r
+ "particle.="<<particle<<\r
+ "particleMother.="<<particleMother<<\r
+ "mech="<<mech<<\r
+ "isPrim="<<isPrim<<\r
+ "isFromStrangess="<<isFromStrangess<<\r
+ "isFromConversion="<<isFromConversion<<\r
+ "isFromMaterial="<<isFromMaterial<<\r
+ "particleTPC.="<<particleTPC<<\r
+ "particleMotherTPC.="<<particleMotherTPC<<\r
+ "mechTPC="<<mechTPC<<\r
+ "isPrimTPC="<<isPrimTPC<<\r
+ "isFromStrangessTPC="<<isFromStrangessTPC<<\r
+ "isFromConversionTPC="<<isFromConversionTPC<<\r
+ "isFromMaterialTPC="<<isFromMaterialTPC<<\r
+ "particleITS.="<<particleITS<<\r
+ "particleMotherITS.="<<particleMotherITS<<\r
+ "mechITS="<<mechITS<<\r
+ "isPrimITS="<<isPrimITS<<\r
+ "isFromStrangessITS="<<isFromStrangessITS<<\r
+ "isFromConversionITS="<<isFromConversionITS<<\r
+ "isFromMaterialITS="<<isFromMaterialITS<<\r
+ "\n";\r
+ }\r
+ \r
if(tpcInnerC) delete tpcInnerC;\r
if(trackInnerC) delete trackInnerC;\r
if(trackInnerC2) delete trackInnerC2;\r
if(outerITSc) delete outerITSc;\r
-\r
if(trackInnerC3) delete trackInnerC3;\r
}\r
-\r
- // high dEdx\r
- for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
- {\r
- AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
- if(!track) continue;\r
- if(track->Charge()==0) continue;\r
- if(!esdTrackCuts->AcceptTrack(track)) continue;\r
- if(!accCuts->AcceptTrack(track)) continue;\r
-\r
- if(!IsHighDeDxParticle(track)) continue;\r
- \r
- if(!fTreeSRedirector) return;\r
- (*fTreeSRedirector)<<"dEdx"<<\r
- "fileName.="<<&fileName<<\r
- "runNumber="<<runNumber<<\r
- "evtTimeStamp="<<evtTimeStamp<<\r
- "evtNumberInFile="<<evtNumberInFile<<\r
- "Bz="<<bz<<\r
- "vertX="<<vert[0]<<\r
- "vertY="<<vert[1]<<\r
- "vertZ="<<vert[2]<<\r
- "mult="<<mult<<\r
- "esdTrack.="<<track<<\r
- "\n";\r
- }\r
}\r
\r
PostData(1, fOutput);\r
}\r
\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::IsHighDeDxParticle(AliESDtrack * track) {\r
- //\r
- // check if particle is Z > 1 \r
- //\r
- if (track->GetTPCNcls() < 60) return kFALSE;\r
- Double_t mom = track->GetInnerParam()->GetP();\r
- if (mom < 0.2) return kFALSE; // protection against unexpected behavior of Aleph parameterization\r
- Float_t dca[2], bCov[3];\r
- track->GetImpactParameters(dca,bCov);\r
- //\r
-\r
- Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541);\r
-\r
- if (track->GetTPCsignal() > triggerDeDx && track->GetTPCsignal()<1000 && TMath::Abs(dca[0])<3.) return kTRUE;\r
-\r
- return kFALSE;\r
-}\r
\r
//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+void AlidNdPtTrackDumpTask::ProcessMCEff(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
{\r
//\r
- // Process real and/or simulated events\r
- //\r
+ // Fill tree for efficiency studies MC only\r
+\r
if(!esdEvent) {\r
AliDebug(AliLog::kError, "esdEvent not available");\r
return;\r
}\r
\r
+ if(!mcEvent) {\r
+ AliDebug(AliLog::kError, "mcEvent not available");\r
+ return;\r
+ }\r
+\r
// get selection cuts\r
AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
\r
physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
if(!physicsSelection) return;\r
- //SetPhysicsTriggerSelection(physicsSelection);\r
+\r
+ if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+ // set trigger (V0AND)\r
+ triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+ if(!triggerAnalysis) return;\r
+ isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+ }\r
+ }\r
+\r
+ // centrality determination\r
+ Float_t centralityF = -1;\r
+ AliCentrality *esdCentrality = esdEvent->GetCentrality();\r
+ centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());\r
+\r
+ // use MC information\r
+ AliHeader* header = 0;\r
+ AliGenEventHeader* genHeader = 0;\r
+ AliStack* stack = 0;\r
+ TArrayF vtxMC(3);\r
+\r
+ Int_t multMCTrueTracks = 0;\r
+ if(IsUseMCInfo())\r
+ {\r
+ //\r
+ if(!mcEvent) {\r
+ AliDebug(AliLog::kError, "mcEvent not available");\r
+ return;\r
+ }\r
+ // get MC event header\r
+ header = mcEvent->Header();\r
+ if (!header) {\r
+ AliDebug(AliLog::kError, "Header not available");\r
+ return;\r
+ }\r
+ // MC particle stack\r
+ stack = mcEvent->Stack();\r
+ if (!stack) {\r
+ AliDebug(AliLog::kError, "Stack not available");\r
+ return;\r
+ }\r
+\r
+ // get MC vertex\r
+ genHeader = header->GenEventHeader();\r
+ if (!genHeader) {\r
+ AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");\r
+ return;\r
+ }\r
+ genHeader->PrimaryVertex(vtxMC);\r
+\r
+ // multipliticy of all MC primary tracks\r
+ // in Zv, pt and eta ranges)\r
+ multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
+\r
+ } // end bUseMC\r
+\r
+ // get reconstructed vertex \r
+ //const AliESDVertex* vtxESD = 0; \r
+ const AliESDVertex* vtxESD = 0; \r
+ if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {\r
+ vtxESD = esdEvent->GetPrimaryVertexTPC();\r
+ }\r
+ else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {\r
+ vtxESD = esdEvent->GetPrimaryVertexTracks();\r
+ }\r
+ else {\r
+ return;\r
+ }\r
+\r
+ if(!vtxESD) return;\r
+\r
+ Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+ //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+ //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+ // check event cuts\r
+ if(isEventOK && isEventTriggered)\r
+ {\r
+ if(IsUseMCInfo()) \r
+ {\r
+ if(!stack) return;\r
+\r
+ //\r
+ // MC info\r
+ //\r
+ TParticle *particle=NULL;\r
+ TParticle *particleMother=NULL;\r
+ Int_t mech=-1;\r
+\r
+ // reco event info\r
+ Double_t vert[3] = {0}; \r
+ vert[0] = vtxESD->GetXv();\r
+ vert[1] = vtxESD->GetYv();\r
+ vert[2] = vtxESD->GetZv();\r
+ Int_t mult = vtxESD->GetNContributors();\r
+ Double_t bz = esdEvent->GetMagneticField();\r
+ Double_t runNumber = esdEvent->GetRunNumber();\r
+ Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+\r
+ // loop over MC stack\r
+ for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) \r
+ {\r
+ particle = stack->Particle(iMc);\r
+ if (!particle)\r
+ continue;\r
+\r
+ // only charged particles\r
+ if(!particle->GetPDG()) continue;\r
+ Double_t charge = particle->GetPDG()->Charge()/3.;\r
+ if (TMath::Abs(charge) < 0.001)\r
+ continue;\r
+\r
+ // only primary particles\r
+ Bool_t prim = stack->IsPhysicalPrimary(iMc);\r
+ if(!prim) continue;\r
+\r
+ // downscale low-pT particles\r
+ Double_t scalempt= TMath::Min(particle->Pt(),10.);\r
+ Double_t downscaleF = gRandom->Rndm();\r
+ downscaleF *= fLowPtTrackDownscaligF;\r
+ if(TMath::Exp(2*scalempt)<downscaleF) continue;\r
+\r
+ // is particle in acceptance\r
+ if(!accCuts->AcceptTrack(particle)) continue;\r
+ \r
+ // check if particle reconstructed\r
+ Bool_t isRec = kFALSE;\r
+ Int_t trackIndex = -1;\r
+ for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+ {\r
+ \r
+ AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+ if(!track) continue;\r
+ if(track->Charge()==0) continue;\r
+ if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
+ {\r
+ Int_t label = TMath::Abs(track->GetLabel());\r
+ if(label == iMc) {\r
+ isRec = kTRUE;\r
+ trackIndex = iTrack;\r
+ break;\r
+ }\r
+ } \r
+ }\r
+\r
+ // Store information in the output tree\r
+ AliESDtrack *recTrack = NULL; \r
+ if(trackIndex>-1) { \r
+ recTrack = esdEvent->GetTrack(trackIndex); \r
+ } else {\r
+ recTrack = new AliESDtrack(); \r
+ } \r
+\r
+ particleMother = GetMother(particle,stack);\r
+ mech = particle->GetUniqueID();\r
+\r
+ //MC particle track length\r
+ Double_t tpcTrackLength = 0.;\r
+ AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);\r
+ if(mcParticle) {\r
+ Int_t counter;\r
+ tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);\r
+ } \r
+\r
+\r
+ //\r
+ if(fTreeSRedirector) {\r
+ (*fTreeSRedirector)<<"MCEffTree"<<\r
+ "fileName.="<<&fileName<<\r
+ "runNumber="<<runNumber<<\r
+ "evtTimeStamp="<<evtTimeStamp<<\r
+ "evtNumberInFile="<<evtNumberInFile<<\r
+ "Bz="<<bz<<\r
+ "vertX="<<vert[0]<<\r
+ "vertY="<<vert[1]<<\r
+ "vertZ="<<vert[2]<<\r
+ "mult="<<mult<<\r
+ "esdTrack.="<<recTrack<<\r
+ "isRec="<<isRec<<\r
+ "tpcTrackLength="<<tpcTrackLength<<\r
+ "particle.="<<particle<<\r
+ "particleMother.="<<particleMother<<\r
+ "mech="<<mech<<\r
+ "\n";\r
+ }\r
+\r
+ if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;\r
+ }\r
+ }\r
+ }\r
+ \r
+ PostData(1, fOutput);\r
+}\r
+\r
+//_____________________________________________________________________________\r
+Bool_t AlidNdPtTrackDumpTask::IsHighDeDxParticle(AliESDtrack * track) {\r
+ //\r
+ // check if particle is Z > 1 \r
+ //\r
+ if (track->GetTPCNcls() < 60) return kFALSE;\r
+ Double_t mom = track->GetInnerParam()->GetP();\r
+ if (mom < 0.2) return kFALSE; // protection against unexpected behavior of Aleph parameterization\r
+ Float_t dca[2], bCov[3];\r
+ track->GetImpactParameters(dca,bCov);\r
+ //\r
+\r
+ Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541);\r
+\r
+ if (track->GetTPCsignal() > triggerDeDx && track->GetTPCsignal()<1000 && TMath::Abs(dca[0])<3.) return kTRUE;\r
+\r
+ return kFALSE;\r
+}\r
+\r
+//_____________________________________________________________________________\r
+void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+{\r
+ //\r
+ // Select real events with V0 (K0s and Lambda) high-pT candidates\r
+ //\r
+ if(!esdEvent) {\r
+ AliDebug(AliLog::kError, "esdEvent not available");\r
+ return;\r
+ }\r
+\r
+ // get selection cuts\r
+ AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
+ AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+ AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+ if(!evtCuts || !accCuts || !esdTrackCuts) {\r
+ AliDebug(AliLog::kError, "cuts not available");\r
+ return;\r
+ }\r
+\r
+ // trigger selection\r
+ Bool_t isEventTriggered = kTRUE;\r
+ AliPhysicsSelection *physicsSelection = NULL;\r
+ AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+ // \r
+ AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+ if (!inputHandler)\r
+ {\r
+ Printf("ERROR: Could not receive input handler");\r
+ return;\r
+ }\r
+ \r
+ // get file name\r
+ TTree *chain = (TChain*)GetInputData(0);\r
+ if(!chain) { \r
+ Printf("ERROR: Could not receive input chain");\r
+ return;\r
+ }\r
+ TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+ // trigger\r
+ if(evtCuts->IsTriggerRequired()) \r
+ {\r
+ // always MB\r
+ isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+ physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+ if(!physicsSelection) return;\r
+ //SetPhysicsTriggerSelection(physicsSelection);\r
\r
if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
// set trigger (V0AND)\r
Int_t run = esdEvent->GetRunNumber();\r
Int_t time= esdEvent->GetTimeStamp();\r
Int_t evNr=esdEvent->GetEventNumberInFile();\r
- \r
-\r
+ Double_t bz = esdEvent->GetMagneticField();\r
\r
\r
for (Int_t iv0=0; iv0<nV0s; iv0++){\r
if(!fTreeSRedirector) return;\r
(*fTreeSRedirector)<<"V0s"<<\r
"isDownscaled="<<isDownscaled<<\r
+ "Bz="<<bz<<\r
"fileName.="<<&fileName<<\r
"runNumber="<<run<<\r
"evtTimeStamp="<<time<<\r
PostData(1, fOutput);\r
}\r
\r
+//_____________________________________________________________________________\r
+void AlidNdPtTrackDumpTask::ProcessdEdx(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
+{\r
+ //\r
+ // Select real events with large TPC dEdx signal\r
+ //\r
+ if(!esdEvent) {\r
+ AliDebug(AliLog::kError, "esdEvent not available");\r
+ return;\r
+ }\r
+\r
+ // get selection cuts\r
+ AlidNdPtEventCuts *evtCuts = GetEventCuts(); \r
+ AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); \r
+ AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); \r
+\r
+ if(!evtCuts || !accCuts || !esdTrackCuts) {\r
+ AliDebug(AliLog::kError, "cuts not available");\r
+ return;\r
+ }\r
+\r
+ // get file name\r
+ TTree *chain = (TChain*)GetInputData(0);\r
+ if(!chain) { \r
+ Printf("ERROR: Could not receive input chain");\r
+ return;\r
+ }\r
+ TObjString fileName(chain->GetCurrentFile()->GetName());\r
+\r
+ // trigger\r
+ Bool_t isEventTriggered = kTRUE;\r
+ AliPhysicsSelection *physicsSelection = NULL;\r
+ AliTriggerAnalysis* triggerAnalysis = NULL;\r
+\r
+ // \r
+ AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();\r
+ if (!inputHandler)\r
+ {\r
+ Printf("ERROR: Could not receive input handler");\r
+ return;\r
+ }\r
+\r
+ if(evtCuts->IsTriggerRequired()) \r
+ {\r
+ // always MB\r
+ isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;\r
+\r
+ physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());\r
+ if(!physicsSelection) return;\r
+\r
+ if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {\r
+ // set trigger (V0AND)\r
+ triggerAnalysis = physicsSelection->GetTriggerAnalysis();\r
+ if(!triggerAnalysis) return;\r
+ isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+ }\r
+ }\r
+\r
+ // get reconstructed vertex \r
+ const AliESDVertex* vtxESD = 0; \r
+ if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {\r
+ vtxESD = esdEvent->GetPrimaryVertexTPC();\r
+ }\r
+ else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {\r
+ vtxESD = esdEvent->GetPrimaryVertexTracks();\r
+ }\r
+ else {\r
+ return;\r
+ }\r
+ if(!vtxESD) return;\r
+\r
+ Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); \r
+ //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+ //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
+\r
+\r
+ // check event cuts\r
+ if(isEventOK && isEventTriggered)\r
+ {\r
+ Double_t vert[3] = {0}; \r
+ vert[0] = vtxESD->GetXv();\r
+ vert[1] = vtxESD->GetYv();\r
+ vert[2] = vtxESD->GetZv();\r
+ Int_t mult = vtxESD->GetNContributors();\r
+ Double_t bz = esdEvent->GetMagneticField();\r
+ Double_t runNumber = esdEvent->GetRunNumber();\r
+ Double_t evtTimeStamp = esdEvent->GetTimeStamp();\r
+ Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();\r
+\r
+ // large dEdx\r
+ for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)\r
+ {\r
+ AliESDtrack *track = esdEvent->GetTrack(iTrack);\r
+ if(!track) continue;\r
+ if(track->Charge()==0) continue;\r
+ if(!esdTrackCuts->AcceptTrack(track)) continue;\r
+ if(!accCuts->AcceptTrack(track)) continue;\r
+\r
+ if(!IsHighDeDxParticle(track)) continue;\r
+ \r
+ if(!fTreeSRedirector) return;\r
+ (*fTreeSRedirector)<<"dEdx"<<\r
+ "fileName.="<<&fileName<<\r
+ "runNumber="<<runNumber<<\r
+ "evtTimeStamp="<<evtTimeStamp<<\r
+ "evtNumberInFile="<<evtNumberInFile<<\r
+ "Bz="<<bz<<\r
+ "vertX="<<vert[0]<<\r
+ "vertY="<<vert[1]<<\r
+ "vertZ="<<vert[2]<<\r
+ "mult="<<mult<<\r
+ "esdTrack.="<<track<<\r
+ "\n";\r
+ }\r
+ }\r
+}\r
\r
//_____________________________________________________________________________\r
Int_t AlidNdPtTrackDumpTask::GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle)\r
}\r
\r
\r
+//_____________________________________________________________________________\r
+/*\r
+Bool_t AlidNdPtTrackDumpTask::MakeTPCInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3])\r
+{\r
+//\r
+// return TPC inner constrain object (must be deleted)\r
+//\r
\r
+if(!track) return NULL;\r
+if(!vtx) return NULL;\r
+ \r
+ AliExternalTrackParam * tpcInnerC = NULL;\r
+ Bool_t isOK = kFALSE;\r
+\r
+ tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));\r
+ if (!tpcInnerC) return NULL;\r
+ isOK = ConstrainTPCInner(tpcInnerC,vtx,b);\r
+ isOK = tpcInnerC->Rotate(track->GetAlpha());\r
+ isOK = tpcInnerC->PropagateTo(track->GetX(),b[2]);\r
+ if(!isOK) {\r
+ delete tpcInnerC;\r
+ return NULL;\r
+ }\r
\r
+ if(fTreeSRedirector) {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "esdTrack.="<<track<<\r
+ "extTPCInnerC.="<<tpcInnerC<<\r
+ "chi2TPCInnerC="<<chi2TPCInnerC;\r
+ }\r
\r
-\r
-\r
-\r
+return tpcInnerC;\r
+}\r
+*/\r
\r
//_____________________________________________________________________________\r
Bool_t AlidNdPtTrackDumpTask::ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3])\r
return kTRUE;\r
}\r
\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+AliExternalTrackParam * AlidNdPtTrackDumpTask::CalculateChi2(AliESDtrack *const track, AliExternalTrackParam *const trackParam)\r
+{\r
+//\r
+// calculate chi2 between vi and vj vectors\r
+// with covi and covj covariance matrices\r
+// chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)\r
+//\r
+\r
+if(!track) return 0;\r
+if(!trackParam) return 0;\r
+\r
+ TMatrixD deltaT(5,1);\r
+ TMatrixD delta(1,5);\r
+ TMatrixD covarM(5,5);\r
+\r
+ for (Int_t ipar=0; ipar<5; ipar++) {\r
+ deltaT(ipar,0)=trackParam->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ delta(0,ipar)=trackParam->GetParameter()[ipar]-track->GetParameter()[ipar];\r
+ for (Int_t jpar=0; jpar<5; jpar++) {\r
+ Int_t index=track->GetIndex(ipar,jpar);\r
+ covarM(ipar,jpar)=track->GetCovariance()[index]+trackParam->GetCovariance()[index];\r
+ }\r
+ }\r
+\r
+ // chi2 distance \r
+ TMatrixD covarMInv = covarM.Invert();\r
+ TMatrixD mat2 = covarMInv*deltaT;\r
+ TMatrixD chi2 = delta*mat2; \r
+ //chi2.Print();\r
+\r
+return ((Double_t)chi(0,0));\r
+}\r
+*/\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+AliExternalTrackParam * AlidNdPtTrackDumpTask::CalculateChi2(AliExternalTrackParam *const trackParam1, AliExternalTrackParam *const trackParam2)\r
+{\r
+//\r
+// calculate chi2 between vi and vj vectors\r
+// with covi and covj covariance matrices\r
+// chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)\r
+//\r
+\r
+if(!track) return 0;\r
+if(!trackParam) return 0;\r
+\r
+TMatrixD deltaT(5,1);\r
+TMatrixD delta(1,5);\r
+TMatrixD covarM(5,5);\r
+\r
+ for (Int_t ipar=0; ipar<5; ipar++) {\r
+ deltaT(ipar,0)=trackParam1->GetParameter()[ipar]-trackParam2->GetParameter()[ipar];\r
+ delta(0,ipar)=trackParam1->GetParameter()[ipar]-trackParam2->GetParameter()[ipar];\r
+ for (Int_t jpar=0; jpar<5; jpar++) {\r
+ Int_t index=track->GetIndex(ipar,jpar);\r
+ covarM(ipar,jpar)=trackParam1->GetCovariance()[index]+trackParam2->GetCovariance()[index];\r
+ }\r
+ }\r
+\r
+ // chi2 distance \r
+ TMatrixD covarMInv = covarM.Invert();\r
+ TMatrixD mat2 = covarMInv*deltaT;\r
+ TMatrixD chi2 = delta*mat2; \r
+ //chi2.Print();\r
+\r
+return ((Double_t)chi(0,0));\r
+}\r
+*/\r
+\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+AliExternalTrackParam * AlidNdPtTrackDumpTask::MakeTrackInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3])\r
+{\r
+//\r
+// Constrain TPC refitted tracks at inner TPC wall (InnerParams) \r
+// to vertex\r
+//\r
+if(!track) return NULL;\r
+if(!vtx) return NULL;\r
+\r
+ // clone track InnerParams has to be deleted\r
+ AliExternalTrackParam * trackInnerC = new AliExternalTrackParam(*(track->GetInnerParam()));\r
+ if (!trackInnerC) return NULL;\r
+ Bool_t isOK = ConstrainTrackInner(trackInnerC,vtx,track->GetMass(),b);\r
+ isOK = trackInnerC->Rotate(track->GetAlpha());\r
+ isOK = trackInnerC->PropagateTo(track->GetX(),b[2]);\r
+ if(!isOK) {\r
+ if(trackInnerC) delete trackInnerC;\r
+ return NULL;\r
+ }\r
+ \r
+ \r
+ // Dump to tree\r
+ if(fTreeSRedirector) \r
+ {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "extInnerParamC.="<<trackInnerC<<\r
+ "chi2InnerC="<<chi2InnerC<<\r
+ "\n";\r
+ }\r
+\r
+return trackInnerC;\r
+}\r
+*/\r
+\r
//_____________________________________________________________________________\r
Bool_t AlidNdPtTrackDumpTask::ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3])\r
{\r
return kTRUE;\r
}\r
\r
+//_____________________________________________________________________________\r
+/*\r
+AliExternalTrackParam * AlidNdPtTrackDumpTask::PropagateInnerParam(AliESDtrack *const track, Double_t radius, Double_t step)\r
+{\r
+//\r
+// Propagate InnerParams to inner wall \r
+//\r
+if(!track) return NULL;\r
+\r
+ Bool_t isOK = kFALSE;\r
+\r
+ // clone track InnerParams has to be deleted\r
+ AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
+ if (!trackInnerC2) return NULL; \r
+ isOK = AliTracker::PropagateTrackToBxByBz(trackInnerC2,radius,track->GetMass(),step,kFALSE);\r
+ if(!isOK) {\r
+ delete trackInnerC2;\r
+ return NULL;\r
+ }\r
+\r
+return trackInnerC2;\r
+}\r
+*/\r
+\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+AliExternalTrackParam * AlidNdPtTrackDumpTask::PropagateITSOut(Int_t iTrack, AliExternalTrackParam * trackParam, AliESDfriend *const esdFriend, Double_t b[3], Double_t radius, Double_t step)\r
+{\r
+//\r
+// Propagate ITSout to TPC inner wall \r
+//\r
+\r
+if(!track) return NULL;\r
+if(!esdFriend) return NULL;\r
+\r
+ Bool_t isOK = kFALSE;\r
+ AliExternalTrackParam *outerITSc = 0;\r
+\r
+ if(esdFriend && esdFriend->TestSkipBit()==kFALSE) \r
+ {\r
+ // propagate ITSout to TPC inner wall\r
+ AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);\r
+ if(friendTrack) \r
+ {\r
+ if( (outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut())) ) \r
+ {\r
+ if(AliTracker::PropagateTrackToBxByBz(outerITSc,radius,track->GetMass(),step,kFALSE))\r
+ {\r
+ // transform ITSout to the track InnerParams reference frame \r
+ isOK = outerITSc->Rotate(trackInnerC2->GetAlpha());\r
+ isOK = outerITSc->PropagateTo(trackInnerC2->GetX(),b[2]);\r
+ if(!isOK) {\r
+ if(trackInnerC2) delete trackInnerC2;\r
+ if(outerITSc) delete outerITSc;\r
+ return kFALSE;\r
+ }\r
+ \r
+ //\r
+ // calculate chi2 between outerITS and innerParams\r
+ // cov without z-coordinate at the moment\r
+ // \r
+ TMatrixD deltaTouterITS(4,1);\r
+ TMatrixD deltaouterITS(1,4);\r
+ TMatrixD covarMouterITS(4,4);\r
+\r
+ Int_t kipar = 0;\r
+ Int_t kjpar = 0;\r
+ for (Int_t ipar=0; ipar<5; ipar++) {\r
+ if(ipar!=1) {\r
+ deltaTouterITS(kipar,0)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];\r
+ deltaouterITS(0,kipar)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];\r
+ }\r
+\r
+ kjpar=0;\r
+ for (Int_t jpar=0; jpar<5; jpar++) {\r
+ Int_t index=outerITSc->GetIndex(ipar,jpar);\r
+ if(ipar !=1 || jpar!=1) {\r
+ covarMouterITS(kipar,kjpar)=outerITSc->GetCovariance()[index]+trackInnerC2->GetCovariance()[index];\r
+ }\r
+ if(jpar!=1) kjpar++;\r
+ }\r
+ if(ipar!=1) kipar++;\r
+ }\r
+\r
+ // chi2 distance ITSout and InnerParams\r
+ TMatrixD covarMInvouterITS = covarMouterITS.Invert();\r
+ TMatrixD mat2outerITS = covarMInvouterITS*deltaTouterITS;\r
+ TMatrixD chi2OuterITS = deltaouterITS*mat2outerITS; \r
+ //chi2OuterITS.Print();\r
+ chi2ITSout = chi2OuterITS(0,0);\r
+\r
+ // dump to the tree\r
+ if(fTreeSRedirector) \r
+ {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "extInnerParam.="<<trackInnerC2<<\r
+ "extOuterITS.="<<outerITSc<<\r
+ "chi2OuterITS="<<chi2ITSout;\r
+ }\r
+ } \r
+ }\r
+ }\r
+ }\r
+\r
+ if(trackInnerC2) delete trackInnerC2;\r
+ if(outerITSc) delete outerITSc;\r
+\r
+return kTRUE;\r
+}\r
+*/\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+Bool_t AlidNdPtTrackDumpTask::UseMCInfoAndDump(AliMCEvent *const mcEvent, AliESDtrack *const track, AliStack *const stack)\r
+{\r
+//\r
+// MC info\r
+//\r
+if(!mcEvent) return kFALSE;\r
+if(!track) return kFALSE;\r
+if(!stack) return kFALSE;\r
+\r
+\r
+ const Double_t kStep=3; \r
+\r
+\r
+ TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;\r
+ TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;\r
+ static Int_t mech=-1, mechTPC=-1, mechITS=-1;\r
+ static Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;\r
+ static Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;\r
+ static Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;\r
+ static Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;\r
+\r
+ AliTrackReference *refTPCIn = NULL;\r
+ AliTrackReference *refITS = NULL;\r
+\r
+ AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
+ if (!trackInnerC3) return kFALSE; \r
+\r
+ //\r
+ // global track\r
+ //\r
+ Int_t label = TMath::Abs(track->GetLabel()); \r
+ particle = stack->Particle(label);\r
+ if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.) \r
+ {\r
+ particleMother = GetMother(particle,stack);\r
+ mech = particle->GetUniqueID();\r
+ isPrim = stack->IsPhysicalPrimary(label);\r
+ isFromStrangess = IsFromStrangeness(label,stack);\r
+ isFromConversion = IsFromConversion(label,stack);\r
+ isFromMaterial = IsFromMaterial(label,stack);\r
+ }\r
+\r
+ //\r
+ // TPC track\r
+ //\r
+ Int_t labelTPC = TMath::Abs(track->GetTPCLabel()); \r
+ particleTPC = stack->Particle(labelTPC);\r
+ if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)\r
+ {\r
+ particleMotherTPC = GetMother(particleTPC,stack);\r
+ mechTPC = particleTPC->GetUniqueID();\r
+ isPrimTPC = stack->IsPhysicalPrimary(labelTPC);\r
+ isFromStrangessTPC = IsFromStrangeness(labelTPC,stack);\r
+ isFromConversionTPC = IsFromConversion(labelTPC,stack);\r
+ isFromMaterialTPC = IsFromMaterial(labelTPC,stack);\r
+ }\r
+\r
+ //\r
+ // store first track reference\r
+ // for TPC track\r
+ //\r
+ TParticle *part=0;\r
+ TClonesArray *trefs=0;\r
+ Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);\r
+\r
+ if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.) \r
+ {\r
+ Int_t nTrackRef = trefs->GetEntries();\r
+ //printf("nTrackRef %d \n",nTrackRef);\r
+\r
+ Int_t countITS = 0;\r
+ for (Int_t iref = 0; iref < nTrackRef; iref++) \r
+ {\r
+ AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);\r
+ //printf("ref %p \n",ref);\r
+ //if(ref) printf("ref->DetectorId() %d \n",ref->DetectorId());\r
+ //printf("AliTrackReference::kTPC %d \n",AliTrackReference::kTPC);\r
+\r
+ // Ref. in the middle ITS \r
+ if(ref && ref->DetectorId()==AliTrackReference::kITS)\r
+ {\r
+ if(!refITS && countITS==2) {\r
+ refITS = ref;\r
+ //printf("refITS %p \n",refITS);\r
+ }\r
+ countITS++;\r
+ }\r
+\r
+ // TPC\r
+ if(ref && ref->DetectorId()==AliTrackReference::kTPC)\r
+ {\r
+ if(!refTPCIn) {\r
+ refTPCIn = ref;\r
+ //printf("refTPCIn %p \n",refTPCIn);\r
+ //break;\r
+ }\r
+ }\r
+ }\r
+\r
+ // transform inner params to TrackRef\r
+ // reference frame\r
+ if(refTPCIn && trackInnerC3) {\r
+ Double_t fRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());\r
+ Bool_t isOK = kFALSE;\r
+ isOK = trackInnerC3->Rotate(fRefPhi);\r
+ isOK = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);\r
+ if(!isOK){\r
+ delete trackInnerC3;\r
+ return kFALSE;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // ITS track\r
+ //\r
+ Int_t labelITS = TMath::Abs(track->GetITSLabel()); \r
+ particleITS = stack->Particle(labelITS);\r
+ if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)\r
+ {\r
+ particleMotherITS = GetMother(particleITS,stack);\r
+ mechITS = particleITS->GetUniqueID();\r
+ isPrimITS = stack->IsPhysicalPrimary(labelITS);\r
+ isFromStrangessITS = IsFromStrangeness(labelITS,stack);\r
+ isFromConversionITS = IsFromConversion(labelITS,stack);\r
+ isFromMaterialITS = IsFromMaterial(labelITS,stack);\r
+ }\r
+\r
+ // dump to tree\r
+ if(fTreeSRedirector) \r
+ {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "extInnerParamRef.="<<trackInnerC3<<\r
+ "refTPCIn.="<<refTPCIn<<\r
+ "refITS.="<<refITS<<\r
+ "particle.="<<particle<<\r
+ "particleMother.="<<particleMother<<\r
+ "mech="<<mech<<\r
+ "isPrim="<<isPrim<<\r
+ "isFromStrangess="<<isFromStrangess<<\r
+ "isFromConversion="<<isFromConversion<<\r
+ "isFromMaterial="<<isFromMaterial<<\r
+ "particleTPC.="<<particleTPC<<\r
+ "particleMotherTPC.="<<particleMotherTPC<<\r
+ "mechTPC="<<mechTPC<<\r
+ "isPrimTPC="<<isPrimTPC<<\r
+ "isFromStrangessTPC="<<isFromStrangessTPC<<\r
+ "isFromConversionTPC="<<isFromConversionTPC<<\r
+ "isFromMaterialTPC="<<isFromMaterialTPC<<\r
+ "particleITS.="<<particleITS<<\r
+ "particleMotherITS.="<<particleMotherITS<<\r
+ "mechITS="<<mechITS<<\r
+ "isPrimITS="<<isPrimITS<<\r
+ "isFromStrangessITS="<<isFromStrangessITS<<\r
+ "isFromConversionITS="<<isFromConversionITS<<\r
+ "isFromMaterialITS="<<isFromMaterialITS<<\r
+ "\n";\r
+ }\r
+\r
+ if(trackInnerC3) delete trackInnerC3;\r
+\r
+return kTRUE;\r
+}\r
+*/\r
+\r
+//_____________________________________________________________________________\r
+/*\r
+Bool_t AlidNdPtTrackDumpTask::DumpEventInfo() \r
+{\r
+//\r
+// Dump run and event information to tree\r
+// \r
+ if(fTreeSRedirector) \r
+ {\r
+ (*fTreeSRedirector)<<"dNdPtTree"<<\r
+ "\n";\r
+ }\r
+\r
+return kTRUE;\r
+}\r
+*/\r
\r
//_____________________________________________________________________________\r
TParticle *AlidNdPtTrackDumpTask::GetMother(TParticle *const particle, AliStack *const stack) \r
TTree* tree2 = 0;\r
TTree* tree3 = 0;\r
TTree* tree4 = 0;\r
+ TTree* tree5 = 0;\r
//\r
chain = new TChain("dNdPtTree");\r
if(chain) { \r
}\r
if(tree4) tree4->Print();\r
\r
+ //\r
+ chain = new TChain("MCEffTree");\r
+ if(chain) { \r
+ chain->Add("jotwinow_Temp_Trees.root");\r
+ tree5 = chain->CopyTree("1");\r
+ delete chain; chain=0; \r
+ }\r
+ if(tree5) tree5->Print();\r
+\r
\r
OpenFile(1);\r
\r
if(tree2) fOutput->Add(tree2);\r
if(tree3) fOutput->Add(tree3);\r
if(tree4) fOutput->Add(tree4);\r
+ if(tree5) fOutput->Add(tree5);\r
\r
// Post output data.\r
PostData(1, fOutput);\r