]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
additional functionality added
authorjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 5 May 2012 14:10:17 +0000 (14:10 +0000)
committerjotwinow <jotwinow@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sat, 5 May 2012 14:10:17 +0000 (14:10 +0000)
M    AlidNdPtTrackDumpTask.cxx
M    AlidNdPtTrackDumpTask.h
new cut scenatrio added
M    macros/CreatedNdPtTrackCuts.C

PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtTrackDumpTask.cxx
PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtTrackDumpTask.h
PWGLF/SPECTRA/ChargedHadrons/dNdPt/macros/CreatedNdPtTrackCuts.C

index 5093bfd71c8352ee2f38d3b502a338d7776e56ff..3742f4a83b1fc3d54269d424c317c85a42066ab8 100644 (file)
@@ -73,6 +73,7 @@ AlidNdPtTrackDumpTask::AlidNdPtTrackDumpTask(const char *name)
   , fOutput(0)\r
   , fPitList(0)\r
   , fUseMCInfo(kFALSE)\r
+  , fUseESDfriends(kFALSE)\r
   , fdNdPtEventCuts(0)\r
   , fdNdPtAcceptanceCuts(0)\r
   , fdNdPtRecAcceptanceCuts(0)\r
@@ -156,19 +157,29 @@ void AlidNdPtTrackDumpTask::UserExec(Option_t *)
     }\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
@@ -179,8 +190,7 @@ void AlidNdPtTrackDumpTask::UserExec(Option_t *)
 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
@@ -282,40 +292,6 @@ void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * co
 \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
@@ -339,6 +315,16 @@ void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * co
   // 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
@@ -366,6 +352,14 @@ void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * co
       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
@@ -380,54 +374,89 @@ void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * co
        "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
@@ -528,40 +557,6 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
 \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
@@ -585,6 +580,15 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
   // 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
@@ -625,55 +629,41 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
       \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
@@ -683,31 +673,37 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
       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
@@ -718,19 +714,15 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
       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
@@ -739,29 +731,22 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
 \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
@@ -804,8 +789,9 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
 \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
@@ -858,10 +844,6 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
          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
@@ -889,14 +871,8 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
           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
@@ -917,120 +893,91 @@ void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent *
       }\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
@@ -1070,7 +1017,270 @@ void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent *
 \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
@@ -1115,8 +1325,7 @@ void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent *
   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
@@ -1140,6 +1349,7 @@ void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent *
     if(!fTreeSRedirector) return;\r
     (*fTreeSRedirector)<<"V0s"<<\r
       "isDownscaled="<<isDownscaled<<\r
+      "Bz="<<bz<<\r
       "fileName.="<<&fileName<<\r
       "runNumber="<<run<<\r
       "evtTimeStamp="<<time<<\r
@@ -1157,6 +1367,122 @@ void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent *
   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
@@ -1314,12 +1640,41 @@ Bool_t AlidNdPtTrackDumpTask::IsV0Downscaled(AliESDv0 *const v0)
 }\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
@@ -1347,6 +1702,116 @@ Bool_t AlidNdPtTrackDumpTask::ConstrainTPCInner(AliExternalTrackParam *const tpc
   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
@@ -1379,6 +1844,301 @@ Bool_t AlidNdPtTrackDumpTask::ConstrainTrackInner(AliExternalTrackParam *const t
   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
@@ -1497,6 +2257,7 @@ void AlidNdPtTrackDumpTask::FinishTaskOutput()
   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
@@ -1533,6 +2294,15 @@ void AlidNdPtTrackDumpTask::FinishTaskOutput()
   }\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
@@ -1540,6 +2310,7 @@ void AlidNdPtTrackDumpTask::FinishTaskOutput()
   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
index 1873de903c636d5ccbf7ee0a1b2e014dd2d21516..7ec9a0060d20d34e29034d776b9b7a3f09699fb4 100644 (file)
@@ -45,11 +45,16 @@ class AlidNdPtTrackDumpTask : public AliAnalysisTaskSE {
   virtual void   FinishTaskOutput();
   void SetUseMCInfo(Bool_t info)           { fUseMCInfo = info; }
   Bool_t IsUseMCInfo() const               { return fUseMCInfo; }
+  void SetUseESDfriends(Bool_t friends)    { fUseESDfriends = friends; }
+  Bool_t IsUseESDfriends() const              { return fUseESDfriends; }
   
   // Process events
-  virtual void ProcessAll(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
-  virtual void Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
-  virtual void ProcessV0(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessAll(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void Process(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessV0(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessdEdx(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessLaser(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
+  void ProcessMCEff(AliESDEvent *const esdEvent=0, AliMCEvent *const mcEvent=0, AliESDfriend *const esdFriend=0);
 
   void SetEventCuts(AlidNdPtEventCuts* const cuts)              { fdNdPtEventCuts = cuts; }
   void SetAcceptanceCuts(AlidNdPtAcceptanceCuts* const cuts)    { fdNdPtAcceptanceCuts = cuts; }
@@ -73,9 +78,21 @@ class AlidNdPtTrackDumpTask : public AliAnalysisTaskSE {
   Bool_t IsFromStrangeness(const Int_t label, AliStack *const stack);
   TParticle *GetMother(TParticle *const particle, AliStack *const stack);
 
+  //AliExternalTrackParam * MakeTPCInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3]);
   Bool_t ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3]);
+
+  //Double_t CalculateChi2(AliESDtrack *const track, AliExternalTrackParam *const trackParam);
+  //Double_t CalculateChi2(AliExternalTrackParam *const trackParam1, AliExternalTrackParam *const trackParam2);
+  //AliExternalTrackParam * PropagateInnerParam(AliESDtrack *const track, Double_t radius=85, Double_t step=1);
+  //AliExternalTrackParam * PropagateITSOut(Int_t iTrack, AliExternalTrackParam * trackParam, AliESDfriend * const esdFriend, Double_t b[3], Double_t radius, Double_t step);
+  
+  //AliExternalTrackParam * MakeTrackInnerC(AliESDtrack *const track, const AliESDVertex* vtx, Double_t b[3]);
   Bool_t ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3]);
 
+  //Bool_t PropagateITSOutAndDump(Int_t iTrack, AliESDtrack *const track, AliESDfriend *const esdFriend, const AliESDVertex* vtx, Double_t b[3]);
+  //Bool_t UseMCInfoAndDump(AliMCEvent *const mcEvent, AliESDtrack *const track, AliStack *const stack);
+  //Bool_t DumpEventInfo();
+
   // v0s selection
   Int_t  GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle);
   Bool_t IsV0Downscaled(AliESDv0 *const v0);
@@ -95,6 +112,7 @@ class AlidNdPtTrackDumpTask : public AliAnalysisTaskSE {
   TIterator *fPitList;  //! iterator over the output objetcs  
 
   Bool_t fUseMCInfo;        // use MC information
+  Bool_t fUseESDfriends;        // use esd friends
 
   AlidNdPtEventCuts      *fdNdPtEventCuts;      // event cuts
   AlidNdPtAcceptanceCuts *fdNdPtAcceptanceCuts; // acceptance cuts  
index 53f5e1149a6f5070c3c18ee5c96150e5f7c1075f..0ba50dee0501a3ced82cf06fde20f073812b4c3c 100644 (file)
@@ -1737,7 +1737,7 @@ AliESDtrackCuts* CreatedNdPtTrackCuts(Int_t cutMode=1, Bool_t fieldOn = kTRUE, B
     //esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
     //
 
-    TString tag = "TPC+ITS refit required - for cut studies";
+    TString tag = "TPC+ITS refit and KinkRejection required - for cut studies";
   }
 
   // TPC+ITS refit  + TPC DCA rough cuts
@@ -1760,6 +1760,29 @@ AliESDtrackCuts* CreatedNdPtTrackCuts(Int_t cutMode=1, Bool_t fieldOn = kTRUE, B
     esdTrackCuts->SetRequireITSRefit(kTRUE);
   }
 
+  // Only TPC refit and KinksRemoval required
+  if (cutMode == 156) 
+  {
+    //
+    // TPC
+    //
+    esdTrackCuts->SetRequireTPCRefit(kTRUE);
+    esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+    //
+    // ITS
+    //
+    esdTrackCuts->SetRequireITSRefit(kFALSE);
+    //esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+    //
+
+    TString tag = "TPC refit + Kink rejection required - for cut studies";
+  }
+
+
+
+
+
+
   // cuts for data without field
   if (!fieldOn)
   {