]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGLF/SPECTRA/ChargedHadrons/dNdPt/AlidNdPtTrackDumpTask.cxx
end-of-line normalization
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / ChargedHadrons / dNdPt / AlidNdPtTrackDumpTask.cxx
index 6156c9c95a1f029cf2bf06cc8e8c37eb6e774f00..ebdb83f1e09950f9a40e371e7d1580c7c65dbf29 100644 (file)
-/**************************************************************************\r
-* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
-*                                                                        *\r
-* Author: The ALICE Off-line Project.                                    *\r
-* Contributors are mentioned in the code where appropriate.              *\r
-*                                                                        *\r
-* Permission to use, copy, modify and distribute this software and its   *\r
-* documentation strictly for non-commercial purposes is hereby granted   *\r
-* without fee, provided that the above copyright notice appears in all   *\r
-* copies and that both the copyright notice and this permission notice   *\r
-* appear in the supporting documentation. The authors make no claims     *\r
-* about the suitability of this software for any purpose. It is          *\r
-* provided "as is" without express or implied warranty.                  *\r
-**************************************************************************/\r
-\r
-#include "iostream"\r
-\r
-#include <TPDGCode.h>\r
-#include <TDatabasePDG.h>\r
-\r
-#include "TChain.h"\r
-#include "TTreeStream.h"\r
-#include "TTree.h"\r
-#include "TH1F.h"\r
-#include "TCanvas.h"\r
-#include "TList.h"\r
-#include "TObjArray.h"\r
-#include "TFile.h"\r
-#include "TMatrixD.h"\r
-#include "TRandom3.h"\r
-\r
-#include "AliHeader.h"  \r
-#include "AliGenEventHeader.h"  \r
-#include "AliInputEventHandler.h"  \r
-#include "AliStack.h"  \r
-#include "AliTrackReference.h"  \r
-\r
-#include "AliPhysicsSelection.h"\r
-#include "AliAnalysisTask.h"\r
-#include "AliAnalysisManager.h"\r
-#include "AliESDEvent.h"\r
-#include "AliESDfriend.h"\r
-#include "AliMCEvent.h"\r
-#include "AliESDInputHandler.h"\r
-#include "AliESDVertex.h"\r
-#include "AliTracker.h"\r
-#include "AliGeomManager.h"\r
-\r
-#include "AliCentrality.h"\r
-#include "AliESDVZERO.h"\r
-#include "AliMultiplicity.h"\r
-\r
-#include "AliESDtrackCuts.h"\r
-#include "AliMCEventHandler.h"\r
-#include "AlidNdPt.h"\r
-#include "AlidNdPtEventCuts.h"\r
-#include "AlidNdPtAcceptanceCuts.h"\r
-\r
-#include "AlidNdPtTrackDumpTask.h"\r
-#include "AliKFParticle.h"\r
-#include "AliESDv0.h"\r
-\r
-using namespace std;\r
-\r
-ClassImp(AlidNdPtTrackDumpTask)\r
-\r
-//_____________________________________________________________________________\r
-AlidNdPtTrackDumpTask::AlidNdPtTrackDumpTask(const char *name) \r
-  : AliAnalysisTaskSE(name)\r
-  , fESD(0)\r
-  , fMC(0)\r
-  , fESDfriend(0)\r
-  , fOutput(0)\r
-  , fPitList(0)\r
-  , fUseMCInfo(kFALSE)\r
-  , fUseESDfriends(kFALSE)\r
-  , fdNdPtEventCuts(0)\r
-  , fdNdPtAcceptanceCuts(0)\r
-  , fdNdPtRecAcceptanceCuts(0)\r
-  , fEsdTrackCuts(0)\r
-  , fTrigger(AliTriggerAnalysis::kMB1) \r
-  , fAnalysisMode(AlidNdPtHelper::kTPC) \r
-  , fTreeSRedirector(0)\r
-  , fCentralityEstimator(0)\r
-  , fLowPtTrackDownscaligF(0)\r
-  , fLowPtV0DownscaligF(0)\r
-  , fProcessAll(kFALSE)\r
-{\r
-  // Constructor\r
-\r
-  // Define input and output slots here\r
-  DefineOutput(1, TList::Class());\r
-\r
-}\r
-\r
-//_____________________________________________________________________________\r
-AlidNdPtTrackDumpTask::~AlidNdPtTrackDumpTask()\r
-{\r
-  if(fOutput) delete fOutput;  fOutput =0; \r
-  if(fTreeSRedirector) delete fTreeSRedirector;  fTreeSRedirector =0; \r
-\r
-  if(fdNdPtEventCuts) delete fdNdPtEventCuts; fdNdPtEventCuts=NULL; \r
-  if(fdNdPtAcceptanceCuts) delete fdNdPtAcceptanceCuts; fdNdPtAcceptanceCuts=NULL;\r
-  if(fdNdPtRecAcceptanceCuts) delete fdNdPtRecAcceptanceCuts; fdNdPtRecAcceptanceCuts=NULL;  \r
-  if(fEsdTrackCuts) delete fEsdTrackCuts; fEsdTrackCuts=NULL;\r
-}\r
-\r
-//____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::Notify()\r
-{\r
-  static Int_t count = 0;\r
-  count++;\r
-  TTree *chain = (TChain*)GetInputData(0);\r
-  if(chain)\r
-  {\r
-    Printf("Processing %d. file: %s", count, chain->GetCurrentFile()->GetName());\r
-  }\r
-\r
-return kTRUE;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::UserCreateOutputObjects()\r
-{\r
-  // Create histograms\r
-  // Called once\r
-  fOutput = new TList;\r
-  fOutput->SetOwner();\r
-\r
-  //\r
-  // create temporary file for output tree\r
-  fTreeSRedirector = new TTreeSRedirector("jotwinow_Temp_Trees.root");\r
-\r
-  PostData(1, fOutput);\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::UserExec(Option_t *) \r
-{\r
-  //\r
-  // Called for each event\r
-  //\r
-\r
-  // ESD event\r
-  fESD = (AliESDEvent*) (InputEvent());\r
-  if (!fESD) {\r
-    Printf("ERROR: ESD event not available");\r
-    return;\r
-  }\r
-\r
-  // MC event\r
-  if(fUseMCInfo) {\r
-    fMC = MCEvent();\r
-    if (!fMC) {\r
-      Printf("ERROR: MC event not available");\r
-      return;\r
-    }\r
-  }\r
-\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); // 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
-  PostData(1, fOutput);\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
-{\r
-  //\r
-  // Select real events with high-pT tracks \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
-    Printf("ERROR 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
-      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
-\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
-    // Use when Peter commit the changes in the header\r
-    Int_t ir1 = 0;\r
-    Int_t ir2 = 0;\r
-\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
-    // high pT tracks\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
-      // downscale low-pT tracks\r
-      Double_t scalempt= TMath::Min(track->Pt(),10.);\r
-      Double_t downscaleF = gRandom->Rndm();\r
-      downscaleF *= fLowPtTrackDownscaligF;\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
-      //\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
-       "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
-  // 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
-\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)<<"Laser"<<\r
-        "fileName.="<<&fileName<<\r
-        "runNumber="<<runNumber<<\r
-        "evtTimeStamp="<<evtTimeStamp<<\r
-        "evtNumberInFile="<<evtNumberInFile<<\r
-        "Bz="<<bz<<\r
-        "multTPCtracks="<<countLaserTracks<<\r
-        "\n";\r
-    }\r
-  }\r
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const esdFriend)\r
-{\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
-\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
-      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
-\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
-    Int_t ir1 = 0;\r
-    Int_t ir2 = 0;\r
-\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
-    // high pT tracks\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
-      // downscale low-pT tracks\r
-      Double_t scalempt= TMath::Min(track->Pt(),10.);\r
-      Double_t downscaleF = gRandom->Rndm();\r
-      downscaleF *= fLowPtTrackDownscaligF;\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
-      // Dump to the tree \r
-      // vertex\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
-      \r
-      Double_t x[3]; track->GetXYZ(x);\r
-      Double_t b[3]; AliTracker::GetBxByBz(x,b);\r
-\r
-      //\r
-      // Transform TPC inner params to track reference frame\r
-      //\r
-      Bool_t isOKtpcInner = kFALSE;\r
-      AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());\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) {\r
-        isOKtpcInnerC = ConstrainTPCInner(tpcInnerC,vtxESD,b);\r
-        isOKtpcInnerC = tpcInnerC->Rotate(track->GetAlpha());\r
-        isOKtpcInnerC = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());\r
-      }\r
-\r
-      //\r
-      // Constrain TPC refitted tracks at inner TPC wall (InnerParams) to vertex  \r
-      // Clone track InnerParams has to be deleted\r
-      //\r
-      Bool_t isOKtrackInnerC = kFALSE;\r
-      AliExternalTrackParam * trackInnerC =  new AliExternalTrackParam(*(track->GetInnerParam()));\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
-      // with covi and covj covariance matrices\r
-      // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)\r
-      //\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
-      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
-\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
-        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
-      // Propagate ITSout to TPC inner wall \r
-      // and calculate chi2 distance to track (InnerParams)\r
-      //\r
-      const Double_t kTPCRadius=85; \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) {\r
-        isOKtrackInnerC2 = AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE);\r
-      }\r
-\r
-      Bool_t isOKouterITSc = kFALSE;\r
-      AliExternalTrackParam *outerITSc = NULL;\r
-      TMatrixD chi2OuterITS(1,1);\r
-\r
-      if(esdFriend && esdFriend->TestSkipBit()==kFALSE) \r
-      {\r
-        // propagate ITSout to TPC inner wall\r
-        AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);\r
-\r
-        if(friendTrack) \r
-       {\r
-          outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut());\r
-          if(outerITSc) \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
-               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
-              chi2OuterITS = deltaouterITS*mat2outerITS; \r
-              //chi2OuterITS.Print();\r
-           } \r
-          }\r
-        }\r
-      }\r
-\r
-      //\r
-      // MC info\r
-      //\r
-      TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;\r
-      TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;\r
-      Int_t mech=-1, mechTPC=-1, mechITS=-1;\r
-      Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;\r
-      Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;\r
-      Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;\r
-      Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;\r
-\r
-      AliTrackReference *refTPCIn = NULL;\r
-      AliTrackReference *refITS = NULL;\r
-\r
-      Bool_t isOKtrackInnerC3 = kFALSE;\r
-      AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));\r
-\r
-      if(IsUseMCInfo()) \r
-      {\r
-        if(!stack) return;\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
-\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
-         {\r
-           Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());\r
-            isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);\r
-            isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);\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
-\r
-      //\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
-       if(trackInnerC3) delete trackInnerC3;\r
-    }\r
-  }\r
-  \r
-  PostData(1, fOutput);\r
-}\r
-\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::ProcessMCEff(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)\r
-{\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
-  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
-\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
-      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
-\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
-  // Dump the pt downscaled V0 into the tree\r
-  // \r
-  Int_t ntracks = esdEvent->GetNumberOfTracks();\r
-  Int_t nV0s = esdEvent->GetNumberOfV0s();\r
-  Int_t run = esdEvent->GetRunNumber();\r
-  Int_t time= esdEvent->GetTimeStamp();\r
-  Int_t evNr=esdEvent->GetEventNumberInFile();\r
-  Double_t bz = esdEvent->GetMagneticField();\r
-\r
-\r
-  for (Int_t iv0=0; iv0<nV0s; iv0++){\r
-    AliESDv0 * v0 = esdEvent->GetV0(iv0);\r
-    if (!v0) continue;\r
-    AliESDtrack * track0 = esdEvent->GetTrack(v0->GetIndex(0));\r
-    AliESDtrack * track1 = esdEvent->GetTrack(v0->GetIndex(1));\r
-    if (!track0) continue;\r
-    if (!track1) continue;\r
-    if (track0->GetSign()<0) {\r
-      track1 = esdEvent->GetTrack(v0->GetIndex(0));\r
-      track0 = esdEvent->GetTrack(v0->GetIndex(1));\r
-    }\r
-    //\r
-    Bool_t isDownscaled = IsV0Downscaled(v0);\r
-    if (isDownscaled) continue;\r
-    AliKFParticle kfparticle; //\r
-    Int_t type=GetKFParticle(v0,esdEvent,kfparticle);\r
-    if (type==0) continue;   \r
-\r
-    if(!fTreeSRedirector) return;\r
-    (*fTreeSRedirector)<<"V0s"<<\r
-      "isDownscaled="<<isDownscaled<<\r
-      "Bz="<<bz<<\r
-      "fileName.="<<&fileName<<\r
-      "runNumber="<<run<<\r
-      "evtTimeStamp="<<time<<\r
-      "evtNumberInFile="<<evNr<<\r
-      "type="<<type<<\r
-      "ntracks="<<ntracks<<\r
-      "v0.="<<v0<<\r
-      "kf.="<<&kfparticle<<\r
-      "track0.="<<track0<<\r
-      "track1.="<<track1<<\r
-      "centralityF="<<centralityF<<\r
-      "\n";\r
-  }\r
-  }\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
-  // Create KF particle in case the V0 fullfill selection criteria\r
-  //\r
-  // Selection criteria\r
-  //  0. algorithm cut\r
-  //  1. track cut\r
-  //  3. chi2 cut\r
-  //  4. rough mass cut\r
-  //  5. Normalized pointing angle cut\r
-  //\r
-  const Double_t cutMass=0.2;\r
-  const Double_t kSigmaDCACut=3;\r
-  //\r
-  // 0.) algo cut - accept only on the fly\r
-  //\r
-  if (v0->GetOnFlyStatus() ==kFALSE) return 0;     \r
-  //\r
-  // 1.) track cut\r
-  // \r
-  AliESDtrack * track0 = event->GetTrack(v0->GetIndex(0));\r
-  AliESDtrack * track1 = event->GetTrack(v0->GetIndex(1));\r
-  /*\r
-    TCut cutD="abs(track0.fD/sqrt(track0.fCdd))>2&&abs(track1.fD/sqrt(track1.fCdd))>2";\r
-    TCut cutTheta="abs(track0.fP[3])<1&&abs(track1.fP[3])<1";\r
-    TCut cutNcl="track0.GetTPCClusterInfo(2,1)>100&&track1.GetTPCClusterInfo(2,1)>100";\r
-  */  \r
-  if (TMath::Abs(track0->GetTgl())>1) return 0;\r
-  if (TMath::Abs(track1->GetTgl())>1) return 0;\r
-  if ((track0->GetTPCClusterInfo(2,1))<100) return 0;\r
-  if ((track1->GetTPCClusterInfo(2,1))<100) return 0;\r
-  //if ((track0->GetITSclusters(0))<2) return 0;\r
-  //if ((track1->GetITSclusters(0))<2) return 0; \r
-  Float_t pos0[2]={0}, cov0[3]={0};\r
-  Float_t pos1[2]={0}, cov1[3]={0};\r
-  track0->GetImpactParameters(pos0,cov0);\r
-  track0->GetImpactParameters(pos1,cov1);\r
-  //\r
-  if (TMath::Abs(pos0[0])<kSigmaDCACut*TMath::Sqrt(cov0[0])) return 0;\r
-  if (TMath::Abs(pos1[0])<kSigmaDCACut*TMath::Sqrt(cov1[0])) return 0;\r
-  // \r
-  //\r
-  // 3.) Chi2 cut\r
-  //\r
-  Double_t chi2KF = v0->GetKFInfo(2,2,2);\r
-  if (chi2KF>25) return 0;\r
-  //\r
-  // 4.) Rough mass cut - 0.200 GeV\r
-  //\r
-  static Double_t masses[2]={-1};\r
-  if (masses[0]<0){\r
-    masses[0] = TDatabasePDG::Instance()->GetParticle("K_S0")->Mass();\r
-    masses[1] = TDatabasePDG::Instance()->GetParticle("Lambda0")->Mass();\r
-  }\r
-  Double_t mass00=  v0->GetEffMass(0,0);\r
-  Double_t mass22=  v0->GetEffMass(2,2);\r
-  Double_t mass42=  v0->GetEffMass(4,2);\r
-  Double_t mass24=  v0->GetEffMass(2,4);\r
-  Bool_t massOK=kFALSE;\r
-  Int_t type=0;\r
-  Int_t ptype=0;\r
-  Double_t dmass=1;\r
-  Int_t p1=0, p2=0;\r
-  if (TMath::Abs(mass00-0)<cutMass) {\r
-    massOK=kTRUE; type+=1; \r
-    if (TMath::Abs(mass00-0)<dmass) {\r
-      ptype=1;\r
-      dmass=TMath::Abs(mass00-0);      \r
-      p1=0; p2=0;\r
-    } \r
-  }\r
-  if (TMath::Abs(mass24-masses[1])<cutMass) {\r
-    massOK=kTRUE; type+=2; \r
-    if (TMath::Abs(mass24-masses[1])<dmass){\r
-      dmass = TMath::Abs(mass24-masses[1]);\r
-      ptype=2;\r
-      p1=2; p2=4;\r
-    }\r
-  }\r
-  if (TMath::Abs(mass42-masses[1])<cutMass) {\r
-    massOK=kTRUE; type+=4;\r
-    if (TMath::Abs(mass42-masses[1])<dmass){\r
-      dmass = TMath::Abs(mass42-masses[1]);\r
-      ptype=4;\r
-      p1=4; p2=2;\r
-    }\r
-  }\r
-  if (TMath::Abs(mass22-masses[0])<cutMass) {\r
-    massOK=kTRUE; type+=8;\r
-    if (TMath::Abs(mass22-masses[0])<dmass){\r
-      dmass = TMath::Abs(mass22-masses[0]);\r
-      ptype=8;\r
-      p1=2; p2=2;\r
-    }\r
-  }\r
-  if (type==0) return 0;\r
-  //\r
-  const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};\r
-  const AliExternalTrackParam *paramP = v0->GetParamP();\r
-  const AliExternalTrackParam *paramN = v0->GetParamN();\r
-  if (paramP->GetSign()<0){\r
-    paramP=v0->GetParamP();\r
-    paramN=v0->GetParamN();\r
-  }\r
-  //Double_t *pparam1 = (Double_t*)paramP->GetParameter();\r
-  //Double_t *pparam2 = (Double_t*)paramN->GetParameter();\r
-  //\r
-  AliKFParticle kfp1( *paramP, spdg[p1]  );\r
-  AliKFParticle kfp2( *paramN, -1 *spdg[p2]  );\r
-  AliKFParticle V0KF;\r
-  (V0KF)+=kfp1;\r
-  (V0KF)+=kfp2;\r
-  kfparticle=V0KF;\r
-  //\r
-  // Pointing angle\r
-  //\r
-  Double_t  errPhi    = V0KF.GetErrPhi();\r
-  Double_t  pointAngle= TMath::ACos(v0->GetV0CosineOfPointingAngle());\r
-  if (pointAngle/errPhi>10) return 0;  \r
-  //\r
-  return ptype;  \r
-}\r
-\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::IsV0Downscaled(AliESDv0 *const v0)\r
-{\r
-  //\r
-  // Downscale randomly low pt V0\r
-  //\r
-  //return kFALSE;\r
-  Double_t maxPt= TMath::Max(v0->GetParamP()->Pt(), v0->GetParamN()->Pt());\r
-  Double_t scalempt= TMath::Min(maxPt,10.);\r
-  Double_t downscaleF = gRandom->Rndm();\r
-  downscaleF *= fLowPtV0DownscaligF;\r
-  \r
-  //printf("V0 TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);\r
-  if (TMath::Exp(2*scalempt)<downscaleF) return kTRUE;\r
-  return kFALSE;\r
-\r
-  /*\r
-    TH1F his1("his1","his1",100,0,10);\r
-    TH1F his2("his2","his2",100,0,10);\r
-    {for (Int_t i=0; i<10000; i++){\r
-       Double_t rnd=gRandom->Exp(1);\r
-       Bool_t isDownscaled =TMath::Exp(rnd)<100*gRandom->Rndm();\r
-       his1->Fill(rnd); \r
-       if (!isDownscaled) his2->Fill(rnd); \r
-    }}\r
-\r
-   */\r
-\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
-return tpcInnerC;\r
-}\r
-*/\r
-\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3])\r
-{\r
- // Constrain TPC inner params constrained\r
- //\r
-      if(!tpcInnerC) return kFALSE; \r
-      if(!vtx) return kFALSE;\r
-\r
-      Double_t dz[2],cov[3];\r
-      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();\r
-      //if(!tpcInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; \r
-      //if(!tpcInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; \r
-      if(!tpcInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; \r
-\r
-\r
-      Double_t covar[6]; vtx->GetCovMatrix(covar);\r
-      Double_t p[2]={tpcInnerC->GetParameter()[0]-dz[0],tpcInnerC->GetParameter()[1]-dz[1]};\r
-      Double_t c[3]={covar[2],0.,covar[5]};\r
-      Double_t chi2C=tpcInnerC->GetPredictedChi2(p,c);\r
-      if (chi2C>kVeryBig) return kFALSE; \r
-\r
-      if(!tpcInnerC->Update(p,c)) return kFALSE;\r
-\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
- // Constrain TPC inner params constrained\r
- //\r
-      if(!trackInnerC) return kFALSE; \r
-      if(!vtx) return kFALSE;\r
-\r
-      const Double_t kRadius  = 2.8; \r
-      const Double_t kMaxStep = 1.0; \r
-\r
-      Double_t dz[2],cov[3];\r
-\r
-      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();\r
-      //if(!trackInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; \r
-      //if(!trackInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; \r
-\r
-      if(!AliTracker::PropagateTrackToBxByBz(trackInnerC,kRadius,mass,kMaxStep,kFALSE)) return kFALSE;\r
-      if(!trackInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; \r
-\r
-      //\r
-      Double_t covar[6]; vtx->GetCovMatrix(covar);\r
-      Double_t p[2]={trackInnerC->GetParameter()[0]-dz[0],trackInnerC->GetParameter()[1]-dz[1]};\r
-      Double_t c[3]={covar[2],0.,covar[5]};\r
-      Double_t chi2C=trackInnerC->GetPredictedChi2(p,c);\r
-      if (chi2C>kVeryBig) return kFALSE; \r
-\r
-      if(!trackInnerC->Update(p,c)) return kFALSE;\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
-{\r
-  if(!particle) return NULL;\r
-  if(!stack) return NULL;\r
-\r
-  Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
-  TParticle* mother = NULL; \r
-  mother = stack->Particle(motherLabel); \r
-\r
-return mother;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::IsFromConversion(const Int_t label, AliStack *const stack) \r
-{\r
-  Bool_t isFromConversion = kFALSE;\r
-\r
-  if(stack) {\r
-    TParticle* particle = stack->Particle(label);\r
-\r
-    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
-    {\r
-       Int_t mech = particle->GetUniqueID(); // production mechanism \r
-       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
-\r
-       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
-       TParticle* mother = stack->Particle(motherLabel); \r
-       if(mother) {\r
-          Int_t motherPdg = mother->GetPdgCode();\r
-\r
-          if(!isPrim && mech==5 && motherPdg==kGamma) { \r
-            isFromConversion=kTRUE; \r
-          }\r
-       }\r
-    } \r
-  } \r
-\r
-  return isFromConversion;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::IsFromMaterial(const Int_t label, AliStack *const stack) \r
-{\r
-  Bool_t isFromMaterial = kFALSE;\r
-\r
-  if(stack) {\r
-    TParticle* particle = stack->Particle(label);\r
-\r
-    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
-    {\r
-       Int_t mech = particle->GetUniqueID(); // production mechanism \r
-       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
-\r
-       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
-       TParticle* mother = stack->Particle(motherLabel); \r
-       if(mother) {\r
-          if(!isPrim && mech==13) { \r
-            isFromMaterial=kTRUE; \r
-          }\r
-       }\r
-     } \r
-  } \r
-\r
-  return isFromMaterial;\r
-}\r
-\r
-//_____________________________________________________________________________\r
-Bool_t AlidNdPtTrackDumpTask::IsFromStrangeness(const Int_t label, AliStack *const stack) \r
-{\r
-  Bool_t isFromStrangeness = kFALSE;\r
-\r
-  if(stack) {\r
-    TParticle* particle = stack->Particle(label);\r
-\r
-    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) \r
-    {\r
-       Int_t mech = particle->GetUniqueID(); // production mechanism \r
-       Bool_t isPrim = stack->IsPhysicalPrimary(label);\r
-\r
-       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  \r
-       TParticle* mother = stack->Particle(motherLabel); \r
-       if(mother) {\r
-          Int_t motherPdg = mother->GetPdgCode();\r
-\r
-          // K+-, lambda, antilambda, K0s decays\r
-          if(!isPrim && mech==4 && \r
-             (TMath::Abs(motherPdg)==kKPlus || TMath::Abs(motherPdg)==kLambda0 || motherPdg==kK0Short))\r
-          {\r
-            isFromStrangeness = kTRUE;\r
-          } \r
-       }\r
-    } \r
-  } \r
-\r
-  return isFromStrangeness;\r
-}\r
-\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::FinishTaskOutput() \r
-{\r
-  //\r
-  // Called one at the end \r
-  // locally on working node\r
-  //\r
-\r
-  // must be deleted to store trees\r
-  if(fTreeSRedirector)  delete fTreeSRedirector; fTreeSRedirector=0;\r
-\r
-  // open temporary file and copy trees to the ouptut container\r
-\r
-  TChain* chain = 0;\r
-  TTree* tree1 = 0;\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
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    tree1 = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(tree1) tree1->Print();\r
-\r
-  //\r
-  chain = new TChain("V0s");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    tree2 = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(tree2) tree2->Print();\r
-\r
-  //\r
-  chain = new TChain("dEdx");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    tree3 = chain->CopyTree("1");\r
-    delete chain; chain=0; \r
-  }\r
-  if(tree3) tree3->Print();\r
-\r
-  //\r
-  chain = new TChain("Laser");\r
-  if(chain) { \r
-    chain->Add("jotwinow_Temp_Trees.root");\r
-    tree4 = chain->CopyTree("1");\r
-    delete chain; chain=0; \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(tree1) fOutput->Add(tree1);\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
-}\r
-\r
-//_____________________________________________________________________________\r
-void AlidNdPtTrackDumpTask::Terminate(Option_t *) \r
-{\r
-  // Called one at the end \r
-  /*\r
-  fOutputSummary = dynamic_cast<TTree*> (GetOutputData(1));\r
-  if(fOutputSummary) delete fOutputSummary; fOutputSummary=0;\r
-  TChain* chain = new TChain("dNdPtTree");\r
-  if(!chain) return;\r
-  chain->Add("jotwinow_HighPt_TrackAndV0_Trees.root");\r
-  TTree *tree = chain->CopyTree("1");\r
-  if (chain) { delete chain; chain=0; }\r
-  if(!tree) return;\r
-  tree->Print();\r
-  fOutputSummary = tree;\r
-\r
-  if (!fOutputSummary) {\r
-    Printf("ERROR: AlidNdPtTrackDumpTask::Terminate(): Output data not avaiable %p \n", GetOutputData(1));\r
-    return;\r
-  }\r
-  */\r
-\r
-  PostData(1, fOutput);\r
-\r
-}\r
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+
+#include "iostream"
+
+#include <TPDGCode.h>
+#include <TDatabasePDG.h>
+
+#include "TChain.h"
+#include "TTreeStream.h"
+#include "TTree.h"
+#include "TH1F.h"
+#include "TCanvas.h"
+#include "TList.h"
+#include "TObjArray.h"
+#include "TFile.h"
+#include "TMatrixD.h"
+#include "TRandom3.h"
+
+#include "AliHeader.h"  
+#include "AliGenEventHeader.h"  
+#include "AliInputEventHandler.h"  
+#include "AliStack.h"  
+#include "AliTrackReference.h"  
+
+#include "AliPhysicsSelection.h"
+#include "AliAnalysisTask.h"
+#include "AliAnalysisManager.h"
+#include "AliESDEvent.h"
+#include "AliESDfriend.h"
+#include "AliMCEvent.h"
+#include "AliESDInputHandler.h"
+#include "AliESDVertex.h"
+#include "AliTracker.h"
+#include "AliGeomManager.h"
+
+#include "AliCentrality.h"
+#include "AliESDVZERO.h"
+#include "AliMultiplicity.h"
+
+#include "AliESDtrackCuts.h"
+#include "AliMCEventHandler.h"
+#include "AlidNdPt.h"
+#include "AlidNdPtEventCuts.h"
+#include "AlidNdPtAcceptanceCuts.h"
+
+#include "AlidNdPtTrackDumpTask.h"
+#include "AliKFParticle.h"
+#include "AliESDv0.h"
+
+using namespace std;
+
+ClassImp(AlidNdPtTrackDumpTask)
+
+//_____________________________________________________________________________
+AlidNdPtTrackDumpTask::AlidNdPtTrackDumpTask(const char *name) 
+  : AliAnalysisTaskSE(name)
+  , fESD(0)
+  , fMC(0)
+  , fESDfriend(0)
+  , fOutput(0)
+  , fPitList(0)
+  , fUseMCInfo(kFALSE)
+  , fUseESDfriends(kFALSE)
+  , fdNdPtEventCuts(0)
+  , fdNdPtAcceptanceCuts(0)
+  , fdNdPtRecAcceptanceCuts(0)
+  , fEsdTrackCuts(0)
+  , fTrigger(AliTriggerAnalysis::kMB1) 
+  , fAnalysisMode(AlidNdPtHelper::kTPC) 
+  , fTreeSRedirector(0)
+  , fCentralityEstimator(0)
+  , fLowPtTrackDownscaligF(0)
+  , fLowPtV0DownscaligF(0)
+  , fProcessAll(kFALSE)
+  , fProcessCosmics(kFALSE)
+  , fTree1(0)
+  , fTree2(0)
+  , fTree3(0)
+  , fTree4(0)
+  , fTree5(0)
+  , fTree6(0)
+{
+  // Constructor
+
+  // Define input and output slots here
+  DefineOutput(1, TTree::Class());
+  DefineOutput(2, TTree::Class());
+  DefineOutput(3, TTree::Class());
+  DefineOutput(4, TTree::Class());
+  DefineOutput(5, TTree::Class());
+  DefineOutput(6, TTree::Class());
+}
+
+//_____________________________________________________________________________
+AlidNdPtTrackDumpTask::~AlidNdPtTrackDumpTask()
+{
+  if(fOutput) delete fOutput;  fOutput =0; 
+  if(fTreeSRedirector) delete fTreeSRedirector;  fTreeSRedirector =0; 
+
+  if(fdNdPtEventCuts) delete fdNdPtEventCuts; fdNdPtEventCuts=NULL; 
+  if(fdNdPtAcceptanceCuts) delete fdNdPtAcceptanceCuts; fdNdPtAcceptanceCuts=NULL;
+  if(fdNdPtRecAcceptanceCuts) delete fdNdPtRecAcceptanceCuts; fdNdPtRecAcceptanceCuts=NULL;  
+  if(fEsdTrackCuts) delete fEsdTrackCuts; fEsdTrackCuts=NULL;
+
+
+}
+
+//____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::Notify()
+{
+  static Int_t count = 0;
+  count++;
+  TTree *chain = (TChain*)GetInputData(0);
+  if(chain)
+  {
+    Printf("Processing %d. file: %s", count, chain->GetCurrentFile()->GetName());
+  }
+
+return kTRUE;
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::UserCreateOutputObjects()
+{
+  // Create histograms
+  // Called once
+  fOutput = new TList;
+  fOutput->SetOwner();
+
+  //
+  // create temporary file for output tree
+  fTreeSRedirector = new TTreeSRedirector("jotwinow_Temp_Trees.root");
+
+  fTree1 = new TTree;
+  fTree2 = new TTree;
+  fTree3 = new TTree;
+  fTree4 = new TTree;
+  fTree5 = new TTree;
+  fTree6 = new TTree;
+
+  fOutput->Add(fTree1);
+  fOutput->Add(fTree2);
+  fOutput->Add(fTree3);
+  fOutput->Add(fTree4);
+  fOutput->Add(fTree5);
+  fOutput->Add(fTree6);
+
+  PostData(1, fTree1);
+  PostData(2, fTree2);
+  PostData(3, fTree3);
+  PostData(4, fTree4);
+  PostData(5, fTree5);
+  PostData(6, fTree6);
+
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::UserExec(Option_t *) 
+{
+  //
+  // Called for each event
+  //
+
+  // ESD event
+  fESD = (AliESDEvent*) (InputEvent());
+  if (!fESD) {
+    Printf("ERROR: ESD event not available");
+    return;
+  }
+
+  // MC event
+  if(fUseMCInfo) {
+    fMC = MCEvent();
+    if (!fMC) {
+      Printf("ERROR: MC event not available");
+      return;
+    }
+  }
+
+  if(fUseESDfriends) {
+    fESDfriend = static_cast<AliESDfriend*>(fESD->FindListObject("AliESDfriend"));
+      if(!fESDfriend) {
+        Printf("ERROR: ESD friends not available");
+    }
+  }
+
+  //
+  if(fProcessAll) { 
+    ProcessAll(fESD,fMC,fESDfriend); // all track stages and MC
+  }
+  else {
+    Process(fESD,fMC,fESDfriend);    // only global and TPC tracks
+  }
+
+  //
+  ProcessV0(fESD,fMC,fESDfriend);
+  ProcessLaser(fESD,fMC,fESDfriend);
+  ProcessdEdx(fESD,fMC,fESDfriend);
+
+  if (fProcessCosmics) { ProcessCosmics(fESD); }
+  if(IsUseMCInfo()) { ProcessMCEff(fESD,fMC,fESDfriend); }
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessCosmics(AliESDEvent *const event)
+{
+  //
+  // Select real events with high-pT tracks 
+  //
+  if(!event) {
+    AliDebug(AliLog::kError, "event not available");
+    return;
+  }
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+   
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+
+    // check for cosmic pairs
+    //
+    // find cosmic pairs trigger by random trigger
+    //
+    //
+    AliESDVertex *vertexSPD =  (AliESDVertex *)event->GetPrimaryVertexSPD();
+    AliESDVertex *vertexTPC =  (AliESDVertex *)event->GetPrimaryVertexTPC(); 
+    const Double_t kMinPt=0.8;
+    const Double_t kMinPtMax=0.8;
+    const Double_t kMinNcl=50;
+    const Double_t kMaxDelta[5]={2,600,0.02,0.02,0.1};
+    Int_t ntracks=event->GetNumberOfTracks(); 
+    //  Float_t dcaTPC[2]={0,0};
+    // Float_t covTPC[3]={0,0,0};
+
+    UInt_t specie = event->GetEventSpecie();  // skip laser events
+    if (specie==AliRecoParam::kCalib) return;
+  
+
+
+    for (Int_t itrack0=0;itrack0<ntracks;itrack0++) {
+      AliESDtrack *track0 = event->GetTrack(itrack0);
+      if (!track0) continue;
+      if (!track0->IsOn(AliESDtrack::kTPCrefit)) continue;
+
+      if (TMath::Abs(AliTracker::GetBz())>1 && track0->Pt() < kMinPt) continue;
+      if (track0->Pt() < kMinPt) continue;
+      if (track0->GetTPCncls() < kMinNcl) continue;
+      if (TMath::Abs(track0->GetY())<kMaxDelta[0]) continue; 
+      if (track0->GetKinkIndex(0)>0) continue;
+      const Double_t * par0=track0->GetParameter(); //track param at rhe DCA
+      //rm primaries
+      //
+      //track0->GetImpactParametersTPC(dcaTPC,covTPC);
+      //if (TMath::Abs(dcaTPC[0])<kMaxDelta[0]) continue;
+      //if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;
+      //    const AliExternalTrackParam * trackIn0 = track0->GetInnerParam();
+      for (Int_t itrack1=itrack0+1;itrack1<ntracks;itrack1++) {
+        AliESDtrack *track1 = event->GetTrack(itrack1);
+        if (!track1) continue;  
+        if (!track1->IsOn(AliESDtrack::kTPCrefit)) continue;
+        if (track1->GetKinkIndex(0)>0) continue;
+        if ((TMath::Abs(AliTracker::GetBz())>1) && (track1->Pt() < kMinPt)) continue;
+        if (track1->Pt() < kMinPt) continue;
+        if (track1->GetTPCncls()<kMinNcl) continue;
+        if (TMath::Abs(AliTracker::GetBz())>1 && TMath::Max(track1->Pt(), track0->Pt())<kMinPtMax) continue;
+        if (TMath::Abs(track1->GetY())<kMaxDelta[0]) continue;
+        //track1->GetImpactParametersTPC(dcaTPC,covTPC);
+        //      if (TMath::Abs(dcaTPC[0])<kMaxDelta[0]) continue;
+        //if (TMath::Abs(dcaTPC[1])<kMaxDelta[0]*2) continue;
+        //
+        const Double_t* par1=track1->GetParameter(); //track param at rhe DCA
+        //
+        Bool_t isPair=kTRUE;
+        for (Int_t ipar=0; ipar<5; ipar++){
+          if (ipar==4&&TMath::Abs(AliTracker::GetBz())<1) continue; // 1/pt not defined for B field off
+          if (TMath::Abs(TMath::Abs(par0[ipar])-TMath::Abs(par1[ipar]))>kMaxDelta[ipar]) isPair=kFALSE;
+        }
+        if (!isPair) continue;
+        if (TMath::Abs(TMath::Abs(track0->GetAlpha()-track1->GetAlpha())-TMath::Pi())>kMaxDelta[2]) isPair=kFALSE;
+        //delta with correct sign
+        /*
+        TCut cut0="abs(t1.fP[0]+t0.fP[0])<2"
+        TCut cut3="abs(t1.fP[3]+t0.fP[3])<0.02"
+        TCut cut4="abs(t1.fP[4]+t0.fP[4])<0.2"
+        */
+        if  (TMath::Abs(par0[0]+par1[0])>kMaxDelta[0]) isPair=kFALSE; //delta y   opposite sign
+        if  (TMath::Abs(par0[3]+par1[3])>kMaxDelta[3]) isPair=kFALSE; //delta tgl opposite sign
+        if  (TMath::Abs(AliTracker::GetBz())>1 && TMath::Abs(par0[4]+par1[4])>kMaxDelta[4]) isPair=kFALSE; //delta 1/pt opposite sign
+        if (!isPair) continue;
+        TString filename(AliAnalysisManager::GetAnalysisManager()->GetTree()->GetCurrentFile()->GetName());
+        Int_t eventNumber = event->GetEventNumberInFile(); 
+        //Bool_t hasFriend = kFALSE;
+        //Bool_t hasITS=(track0->GetNcls(0)+track1->GetNcls(0)>4);
+        //printf("DUMPHPTCosmic:%s|%f|%d|%d|%d\n",filename.Data(),(TMath::Min(track0->Pt(),track1->Pt())), eventNumber,hasFriend,hasITS);
+        //      const AliExternalTrackParam * trackIn1 = track1->GetInnerParam();      
+        //
+        //               
+        Int_t ntracksSPD = vertexSPD->GetNContributors();
+        Int_t ntracksTPC = vertexTPC->GetNContributors();        
+        Int_t runNumber     = event->GetRunNumber();        
+        Int_t timeStamp    = event->GetTimeStamp();
+        ULong64_t triggerMask = event->GetTriggerMask();
+        Float_t magField    = event->GetMagneticField();
+        TObjString triggerClass = event->GetFiredTriggerClasses().Data();
+        
+       //
+      // Dump to the tree 
+      // vertex
+      // TPC-ITS tracks
+      //
+      if(!fTreeSRedirector) return;
+         (*fTreeSRedirector)<<"CosmicPairs"<<
+           "fileName.="<<&fileName<<         // file name
+           "runNumber="<<runNumber<<              //  run number           
+           "evtTimeStamp="<<timeStamp<<            //  time stamp of event
+            "evtNumberInFile="<<eventNumber<<          //  event number            
+           "trigger="<<triggerMask<<      //  trigger
+           "triggerClass="<<&triggerClass<<      //  trigger
+           "Bz="<<magField<<             //  magnetic field
+           //
+           "multSPD="<<ntracksSPD<<
+           "multTPC="<<ntracksTPC<<
+           "vertSPD.="<<vertexSPD<<         //primary vertex -SPD
+           "vertTPC.="<<vertexTPC<<         //primary vertex -TPC
+           "t0.="<<track0<<              //track0
+           "t1.="<<track1<<              //track1
+           "\n";      
+        }
+      }
+}
+
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::Process(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
+{
+  //
+  // Select real events with high-pT tracks 
+  //
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    Printf("ERROR cuts not available");
+    return;
+  }
+
+  // trigger selection
+  Bool_t isEventTriggered = kTRUE;
+  AliPhysicsSelection *physicsSelection = NULL;
+  AliTriggerAnalysis* triggerAnalysis = NULL;
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+   
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // trigger
+  if(evtCuts->IsTriggerRequired())  
+  {
+    // always MB
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
+
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
+    if(!physicsSelection) return;
+    //SetPhysicsTriggerSelection(physicsSelection);
+
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
+      // set trigger (V0AND)
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();
+      if(!triggerAnalysis) return;
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
+    }
+  }
+
+  // centrality determination
+  Float_t centralityF = -1;
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
+
+  // use MC information
+  AliHeader* header = 0;
+  AliGenEventHeader* genHeader = 0;
+  AliStack* stack = 0;
+  TArrayF vtxMC(3);
+
+  Int_t multMCTrueTracks = 0;
+  if(IsUseMCInfo())
+  {
+    //
+    if(!mcEvent) {
+      AliDebug(AliLog::kError, "mcEvent not available");
+      return;
+    }
+    // get MC event header
+    header = mcEvent->Header();
+    if (!header) {
+      AliDebug(AliLog::kError, "Header not available");
+      return;
+    }
+    // MC particle stack
+    stack = mcEvent->Stack();
+    if (!stack) {
+      AliDebug(AliLog::kError, "Stack not available");
+      return;
+    }
+
+    // get MC vertex
+    genHeader = header->GenEventHeader();
+    if (!genHeader) {
+      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
+      return;
+    }
+    genHeader->PrimaryVertex(vtxMC);
+
+    // multipliticy of all MC primary tracks
+    // in Zv, pt and eta ranges)
+    multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
+
+  } // end bUseMC
+
+  // get reconstructed vertex  
+  //const AliESDVertex* vtxESD = 0; 
+  AliESDVertex* vtxESD = 0; 
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();
+  }
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();
+  }
+  else {
+       return;
+  }
+
+  if(!vtxESD) return;
+
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d, status %d, vz %f \n",isEventOK, isEventTriggered, vtxESD->GetStatus(), vtxESD->GetZv());
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+
+  // check event cuts
+  if(isEventOK && isEventTriggered)
+  {
+
+    //
+    // get IR information
+    //
+    AliESDHeader *esdHeader = 0;
+    esdHeader = esdEvent->GetHeader();
+    if(!esdHeader) return;
+    //Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s
+    //Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval
+
+    // Use when Peter commit the changes in the header
+    Int_t ir1 = 0;
+    Int_t ir2 = 0;
+
+    //
+    Double_t vert[3] = {0}; 
+    vert[0] = vtxESD->GetXv();
+    vert[1] = vtxESD->GetYv();
+    vert[2] = vtxESD->GetZv();
+    Int_t mult = vtxESD->GetNContributors();
+    Double_t bz = esdEvent->GetMagneticField();
+    Double_t runNumber = esdEvent->GetRunNumber();
+    Double_t evtTimeStamp = esdEvent->GetTimeStamp();
+    Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+
+    // high pT tracks
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+    {
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);
+      if(!track) continue;
+      if(track->Charge()==0) continue;
+      if(!esdTrackCuts->AcceptTrack(track)) continue;
+      if(!accCuts->AcceptTrack(track)) continue;
+      
+      // downscale low-pT tracks
+      Double_t scalempt= TMath::Min(track->Pt(),10.);
+      Double_t downscaleF = gRandom->Rndm();
+      downscaleF *= fLowPtTrackDownscaligF;
+      if(TMath::Exp(2*scalempt)<downscaleF) continue;
+      //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
+
+      AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());
+      if (!tpcInner) continue;
+      // transform to the track reference frame 
+      Bool_t isOK = kFALSE;
+      isOK = tpcInner->Rotate(track->GetAlpha());
+      isOK = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
+      if(!isOK) continue;
+
+      // Dump to the tree 
+      // vertex
+      // TPC-ITS tracks
+      //
+      if(!fTreeSRedirector) return;
+      (*fTreeSRedirector)<<"highPt"<<
+        "fileName.="<<&fileName<<
+        "runNumber="<<runNumber<<
+        "evtTimeStamp="<<evtTimeStamp<<
+        "evtNumberInFile="<<evtNumberInFile<<
+        "Bz="<<bz<<
+        "vtxESD.="<<vtxESD<<
+       "IRtot="<<ir1<<
+       "IRint2="<<ir2<<
+        "mult="<<mult<<
+        "esdTrack.="<<track<<
+        "centralityF="<<centralityF<<
+        "\n";
+    }
+  }
+  
+}
+
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessLaser(AliESDEvent *const esdEvent, AliMCEvent * const /*mcEvent*/, AliESDfriend *const /*esdFriend*/)
+{
+  //
+  // Process laser events
+  //
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // laser events 
+  const AliESDHeader* esdHeader = esdEvent->GetHeader();
+  if(esdHeader && esdHeader->GetEventSpecie()==AliRecoParam::kCalib) 
+  {
+    Int_t countLaserTracks = 0;
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+    {
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);
+      if(!track) continue;
+
+      if(track->GetTPCInnerParam()) countLaserTracks++;
+    }
+       
+    if(countLaserTracks > 100) 
+    {      
+      Double_t runNumber = esdEvent->GetRunNumber();
+      Double_t evtTimeStamp = esdEvent->GetTimeStamp();
+      Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+      Double_t bz = esdEvent->GetMagneticField();
+
+      if(!fTreeSRedirector) return;
+      (*fTreeSRedirector)<<"Laser"<<
+        "fileName.="<<&fileName<<
+        "runNumber="<<runNumber<<
+        "evtTimeStamp="<<evtTimeStamp<<
+        "evtNumberInFile="<<evtNumberInFile<<
+        "Bz="<<bz<<
+        "multTPCtracks="<<countLaserTracks<<
+        "\n";
+    }
+  }
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessAll(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const esdFriend)
+{
+  //
+  // Select real events with high-pT tracks
+  // Calculate and stor in the output tree:
+  //  TPC constrained tracks
+  //  InnerParams constrained tracks
+  //  TPC-ITS tracks
+  //  ITSout-InnerParams tracks
+  //  chi2 distance between TPC constrained and TPC-ITS tracks
+  //  chi2 distance between TPC refitted constrained and TPC-ITS tracks
+  //  chi2 distance between ITSout and InnerParams tracks
+  //  MC information: 
+  //   track references at ITSin, TPCin; InnerParam at first TPC track reference, 
+  //   particle ID, mother ID, production mechanism ...
+  // 
+
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    AliDebug(AliLog::kError, "cuts not available");
+    return;
+  }
+
+  // trigger selection
+  Bool_t isEventTriggered = kTRUE;
+  AliPhysicsSelection *physicsSelection = NULL;
+  AliTriggerAnalysis* triggerAnalysis = NULL;
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+   
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // trigger
+  if(evtCuts->IsTriggerRequired())  
+  {
+    // always MB
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
+
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
+    if(!physicsSelection) return;
+    //SetPhysicsTriggerSelection(physicsSelection);
+
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
+      // set trigger (V0AND)
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();
+      if(!triggerAnalysis) return;
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
+    }
+  }
+
+  // centrality determination
+  Float_t centralityF = -1;
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
+
+  // use MC information
+  AliHeader* header = 0;
+  AliGenEventHeader* genHeader = 0;
+  AliStack* stack = 0;
+  TArrayF vtxMC(3);
+
+  Int_t multMCTrueTracks = 0;
+  if(IsUseMCInfo())
+  {
+    //
+    if(!mcEvent) {
+      AliDebug(AliLog::kError, "mcEvent not available");
+      return;
+    }
+    // get MC event header
+    header = mcEvent->Header();
+    if (!header) {
+      AliDebug(AliLog::kError, "Header not available");
+      return;
+    }
+    // MC particle stack
+    stack = mcEvent->Stack();
+    if (!stack) {
+      AliDebug(AliLog::kError, "Stack not available");
+      return;
+    }
+
+    // get MC vertex
+    genHeader = header->GenEventHeader();
+    if (!genHeader) {
+      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
+      return;
+    }
+    genHeader->PrimaryVertex(vtxMC);
+
+    // multipliticy of all MC primary tracks
+    // in Zv, pt and eta ranges)
+    multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
+
+  } // end bUseMC
+
+  // get reconstructed vertex  
+  //const AliESDVertex* vtxESD = 0; 
+  AliESDVertex* vtxESD = 0; 
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();
+  }
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();
+  }
+  else {
+       return;
+  }
+
+  if(!vtxESD) return;
+
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+
+  // check event cuts
+  if(isEventOK && isEventTriggered)
+  {
+    //
+    // get IR information
+    //
+    AliESDHeader *esdHeader = 0;
+    esdHeader = esdEvent->GetHeader();
+    if(!esdHeader) return;
+    //Int_t ir1 = esdHeader->GetTriggerIREntries(); //all ir-s
+    //Int_t ir2 = esdHeader->GetTriggerIREntries(-1,1); // int2 set, 180 ms time interval
+    //
+    Int_t ir1 = 0;
+    Int_t ir2 = 0;
+
+    //
+    Double_t vert[3] = {0}; 
+    vert[0] = vtxESD->GetXv();
+    vert[1] = vtxESD->GetYv();
+    vert[2] = vtxESD->GetZv();
+    Int_t mult = vtxESD->GetNContributors();
+    Double_t bz = esdEvent->GetMagneticField();
+    Double_t runNumber = esdEvent->GetRunNumber();
+    Double_t evtTimeStamp = esdEvent->GetTimeStamp();
+    Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+
+    // high pT tracks
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+    {
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);
+      if(!track) continue;
+      if(track->Charge()==0) continue;
+      if(!esdTrackCuts->AcceptTrack(track)) continue;
+      if(!accCuts->AcceptTrack(track)) continue;
+      
+      // downscale low-pT tracks
+      Double_t scalempt= TMath::Min(track->Pt(),10.);
+      Double_t downscaleF = gRandom->Rndm();
+      downscaleF *= fLowPtTrackDownscaligF;
+      if(TMath::Exp(2*scalempt)<downscaleF) continue;
+      //printf("TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
+
+      // Dump to the tree 
+      // vertex
+      // TPC constrained tracks
+      // InnerParams constrained tracks
+      // TPC-ITS tracks
+      // ITSout-InnerParams tracks
+      // chi2 distance between TPC constrained and TPC-ITS tracks
+      // chi2 distance between TPC refitted constrained and TPC-ITS tracks
+      // chi2 distance between ITSout and InnerParams tracks
+      // MC information
+      
+      Double_t x[3]; track->GetXYZ(x);
+      Double_t b[3]; AliTracker::GetBxByBz(x,b);
+
+      //
+      // Transform TPC inner params to track reference frame
+      //
+      Bool_t isOKtpcInner = kFALSE;
+      AliExternalTrackParam * tpcInner = (AliExternalTrackParam *)(track->GetTPCInnerParam());
+      if (tpcInner) {
+        // transform to the track reference frame 
+        isOKtpcInner = tpcInner->Rotate(track->GetAlpha());
+        isOKtpcInner = tpcInner->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
+      }
+
+      //
+      // Constrain TPC inner to vertex
+      // clone TPCinner has to be deleted
+      //
+      Bool_t isOKtpcInnerC = kFALSE;
+      AliExternalTrackParam * tpcInnerC = new AliExternalTrackParam(*(track->GetTPCInnerParam()));
+      if (tpcInnerC) {
+        isOKtpcInnerC = ConstrainTPCInner(tpcInnerC,vtxESD,b);
+        isOKtpcInnerC = tpcInnerC->Rotate(track->GetAlpha());
+        isOKtpcInnerC = tpcInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
+      }
+
+      //
+      // Constrain TPC refitted tracks at inner TPC wall (InnerParams) to vertex  
+      // Clone track InnerParams has to be deleted
+      //
+      Bool_t isOKtrackInnerC = kFALSE;
+      AliExternalTrackParam * trackInnerC =  new AliExternalTrackParam(*(track->GetInnerParam()));
+      if (trackInnerC) {
+        isOKtrackInnerC = ConstrainTrackInner(trackInnerC,vtxESD,track->GetMass(),b);
+        isOKtrackInnerC = trackInnerC->Rotate(track->GetAlpha());
+        isOKtrackInnerC = trackInnerC->PropagateTo(track->GetX(),esdEvent->GetMagneticField());
+      } 
+      
+      //
+      // calculate chi2 between vi and vj vectors
+      // with covi and covj covariance matrices
+      // chi2ij = (vi-vj)^(T)*(covi+covj)^(-1)*(vi-vj)
+      //
+      TMatrixD deltaT(5,1), deltaTtrackC(5,1);
+      TMatrixD delta(1,5),  deltatrackC(1,5);
+      TMatrixD covarM(5,5), covarMtrackC(5,5);
+      TMatrixD chi2(1,1);
+      TMatrixD chi2trackC(1,1);
+
+      if(isOKtpcInnerC && isOKtrackInnerC) 
+      {
+        for (Int_t ipar=0; ipar<5; ipar++) {
+          deltaT(ipar,0)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
+         delta(0,ipar)=tpcInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
+
+          deltaTtrackC(ipar,0)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
+         deltatrackC(0,ipar)=trackInnerC->GetParameter()[ipar]-track->GetParameter()[ipar];
+
+          for (Int_t jpar=0; jpar<5; jpar++) {
+           Int_t index=track->GetIndex(ipar,jpar);
+           covarM(ipar,jpar)=track->GetCovariance()[index]+tpcInnerC->GetCovariance()[index];
+           covarMtrackC(ipar,jpar)=track->GetCovariance()[index]+trackInnerC->GetCovariance()[index];
+          }
+        }
+
+        // chi2 distance TPC constrained and TPC+ITS
+        TMatrixD covarMInv = covarM.Invert();
+        TMatrixD mat2 = covarMInv*deltaT;
+        chi2 = delta*mat2; 
+        //chi2.Print();
+
+        // chi2 distance TPC refitted constrained and TPC+ITS
+        TMatrixD covarMInvtrackC = covarMtrackC.Invert();
+        TMatrixD mat2trackC = covarMInvtrackC*deltaTtrackC;
+        chi2trackC = deltatrackC*mat2trackC; 
+        //chi2trackC.Print();
+      }
+
+
+      //
+      // Propagate ITSout to TPC inner wall 
+      // and calculate chi2 distance to track (InnerParams)
+      //
+      const Double_t kTPCRadius=85; 
+      const Double_t kStep=3; 
+
+      // clone track InnerParams has to be deleted
+      Bool_t isOKtrackInnerC2 = kFALSE;
+      AliExternalTrackParam *trackInnerC2 = new AliExternalTrackParam(*(track->GetInnerParam()));
+      if (trackInnerC2) {
+        isOKtrackInnerC2 = AliTracker::PropagateTrackToBxByBz(trackInnerC2,kTPCRadius,track->GetMass(),kStep,kFALSE);
+      }
+
+      Bool_t isOKouterITSc = kFALSE;
+      AliExternalTrackParam *outerITSc = NULL;
+      TMatrixD chi2OuterITS(1,1);
+
+      if(esdFriend && esdFriend->TestSkipBit()==kFALSE) 
+      {
+        // propagate ITSout to TPC inner wall
+        AliESDfriendTrack *friendTrack = esdFriend->GetTrack(iTrack);
+
+        if(friendTrack) 
+       {
+          outerITSc = new AliExternalTrackParam(*friendTrack->GetITSOut());
+          if(outerITSc) 
+         {
+            isOKouterITSc = AliTracker::PropagateTrackToBxByBz(outerITSc,kTPCRadius,track->GetMass(),kStep,kFALSE);
+            isOKouterITSc = outerITSc->Rotate(trackInnerC2->GetAlpha());
+            isOKouterITSc = outerITSc->PropagateTo(trackInnerC2->GetX(),esdEvent->GetMagneticField());
+
+           //
+            // calculate chi2 between outerITS and innerParams
+           // cov without z-coordinate at the moment
+           //
+            TMatrixD deltaTouterITS(4,1);
+            TMatrixD deltaouterITS(1,4);
+            TMatrixD covarMouterITS(4,4);
+
+            if(isOKtrackInnerC2 && isOKouterITSc) {
+             Int_t kipar = 0;
+             Int_t kjpar = 0;
+              for (Int_t ipar=0; ipar<5; ipar++) {
+               if(ipar!=1) {
+                  deltaTouterITS(kipar,0)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
+                 deltaouterITS(0,kipar)=outerITSc->GetParameter()[ipar]-trackInnerC2->GetParameter()[ipar];
+               }
+
+                kjpar=0;
+                for (Int_t jpar=0; jpar<5; jpar++) {
+                 Int_t index=outerITSc->GetIndex(ipar,jpar);
+                 if(ipar !=1 || jpar!=1) {
+                   covarMouterITS(kipar,kjpar)=outerITSc->GetCovariance()[index]+trackInnerC2->GetCovariance()[index];
+                 }
+                  if(jpar!=1)  kjpar++;
+               }
+               if(ipar!=1) kipar++;
+             }
+
+              // chi2 distance ITSout and InnerParams
+              TMatrixD covarMInvouterITS = covarMouterITS.Invert();
+              TMatrixD mat2outerITS = covarMInvouterITS*deltaTouterITS;
+              chi2OuterITS = deltaouterITS*mat2outerITS; 
+              //chi2OuterITS.Print();
+           } 
+          }
+        }
+      }
+
+      //
+      // MC info
+      //
+      TParticle *particle=NULL, *particleTPC=NULL, *particleITS=NULL;
+      TParticle *particleMother=NULL, *particleMotherTPC=NULL, *particleMotherITS=NULL;
+      Int_t mech=-1, mechTPC=-1, mechITS=-1;
+      Bool_t isPrim=kFALSE, isPrimTPC=kFALSE, isPrimITS=kFALSE;
+      Bool_t isFromStrangess=kFALSE, isFromStrangessTPC=kFALSE, isFromStrangessITS=kFALSE;
+      Bool_t isFromConversion=kFALSE, isFromConversionTPC=kFALSE, isFromConversionITS=kFALSE;
+      Bool_t isFromMaterial=kFALSE, isFromMaterialTPC=kFALSE, isFromMaterialITS=kFALSE;
+
+      AliTrackReference *refTPCIn = NULL;
+      AliTrackReference *refITS = NULL;
+
+      Bool_t isOKtrackInnerC3 = kFALSE;
+      AliExternalTrackParam *trackInnerC3 = new AliExternalTrackParam(*(track->GetInnerParam()));
+
+      if(IsUseMCInfo()) 
+      {
+        if(!stack) return;
+
+        //
+        // global track
+       //
+        Int_t label = TMath::Abs(track->GetLabel()); 
+        particle = stack->Particle(label);
+        if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0.)
+       {
+         particleMother = GetMother(particle,stack);
+          mech = particle->GetUniqueID();
+          isPrim = stack->IsPhysicalPrimary(label);
+         isFromStrangess  = IsFromStrangeness(label,stack);
+         isFromConversion = IsFromConversion(label,stack);
+          isFromMaterial   = IsFromMaterial(label,stack);
+       }
+
+        //
+       // TPC track
+       //
+       Int_t labelTPC = TMath::Abs(track->GetTPCLabel()); 
+        particleTPC = stack->Particle(labelTPC);
+        if(particleTPC && particleTPC->GetPDG() && particleTPC->GetPDG()->Charge()!=0.)
+       {
+         particleMotherTPC = GetMother(particleTPC,stack);
+          mechTPC = particleTPC->GetUniqueID();
+          isPrimTPC = stack->IsPhysicalPrimary(labelTPC);
+         isFromStrangessTPC  = IsFromStrangeness(labelTPC,stack);
+         isFromConversionTPC = IsFromConversion(labelTPC,stack);
+          isFromMaterialTPC   = IsFromMaterial(labelTPC,stack);
+       }
+
+        //
+        // store first track reference
+       // for TPC track
+       //
+        TParticle *part=0;
+        TClonesArray *trefs=0;
+        Int_t status = mcEvent->GetParticleAndTR(track->GetTPCLabel(), part, trefs);
+
+       if(status>0 && part && trefs && part->GetPDG() && part->GetPDG()->Charge()!=0.) 
+       {
+         Int_t nTrackRef = trefs->GetEntries();
+         //printf("nTrackRef %d \n",nTrackRef);
+
+          Int_t countITS = 0;
+         for (Int_t iref = 0; iref < nTrackRef; iref++) 
+          {
+            AliTrackReference *ref = (AliTrackReference *)trefs->At(iref);
+
+             // Ref. in the middle ITS 
+            if(ref && ref->DetectorId()==AliTrackReference::kITS)
+            {
+             if(!refITS && countITS==2) {
+               refITS = ref;
+               //printf("refITS %p \n",refITS);
+             }
+             countITS++;
+            }
+
+            // TPC
+            if(ref && ref->DetectorId()==AliTrackReference::kTPC)
+            {
+             if(!refTPCIn) {
+               refTPCIn = ref;
+               //printf("refTPCIn %p \n",refTPCIn);
+               //break;
+             }
+            }
+         }
+
+          // transform inner params to TrackRef
+         // reference frame
+          if(refTPCIn && trackInnerC3) 
+         {
+           Double_t kRefPhi = TMath::ATan2(refTPCIn->Y(),refTPCIn->X());
+            isOKtrackInnerC3 = trackInnerC3->Rotate(kRefPhi);
+            isOKtrackInnerC3 = AliTracker::PropagateTrackToBxByBz(trackInnerC3,refTPCIn->R(),track->GetMass(),kStep,kFALSE);
+         }
+        }
+
+        //
+       // ITS track
+       //
+       Int_t labelITS = TMath::Abs(track->GetITSLabel()); 
+        particleITS = stack->Particle(labelITS);
+        if(particleITS && particleITS->GetPDG() && particleITS->GetPDG()->Charge()!=0.)
+       {
+         particleMotherITS = GetMother(particleITS,stack);
+          mechITS = particleITS->GetUniqueID();
+          isPrimITS = stack->IsPhysicalPrimary(labelITS);
+         isFromStrangessITS  = IsFromStrangeness(labelITS,stack);
+         isFromConversionITS = IsFromConversion(labelITS,stack);
+          isFromMaterialITS   = IsFromMaterial(labelITS,stack);
+        }
+      }
+
+      //
+      Bool_t dumpToTree=kFALSE;
+      
+      if(isOKtpcInnerC  && isOKtrackInnerC) dumpToTree = kTRUE;
+      if(fUseESDfriends && isOKtrackInnerC2 && isOKouterITSc) dumpToTree = kTRUE;
+      if(fUseMCInfo     && isOKtrackInnerC3) dumpToTree = kTRUE;
+
+      //
+      if(fTreeSRedirector && dumpToTree) 
+      {
+        (*fTreeSRedirector)<<"highPt"<<
+          "fileName.="<<&fileName<<
+          "runNumber="<<runNumber<<
+          "evtTimeStamp="<<evtTimeStamp<<
+          "evtNumberInFile="<<evtNumberInFile<<
+          "Bz="<<bz<<
+          "vtxESD.="<<vtxESD<<
+         "IRtot="<<ir1<<
+         "IRint2="<<ir2<<
+          "mult="<<mult<<
+          "esdTrack.="<<track<<
+          "extTPCInnerC.="<<tpcInnerC<<
+          "extInnerParamC.="<<trackInnerC<<
+          "extInnerParam.="<<trackInnerC2<<
+          "extOuterITS.="<<outerITSc<<
+          "extInnerParamRef.="<<trackInnerC3<<
+          "refTPCIn.="<<refTPCIn<<
+          "refITS.="<<refITS<<
+          "chi2TPCInnerC="<<chi2(0,0)<<
+          "chi2InnerC="<<chi2trackC(0,0)<<
+          "chi2OuterITS="<<chi2OuterITS(0,0)<<
+          "centralityF="<<centralityF<<
+          "particle.="<<particle<<
+                 "particleMother.="<<particleMother<<
+          "mech="<<mech<<
+          "isPrim="<<isPrim<<
+         "isFromStrangess="<<isFromStrangess<<
+         "isFromConversion="<<isFromConversion<<
+          "isFromMaterial="<<isFromMaterial<<
+          "particleTPC.="<<particleTPC<<
+                 "particleMotherTPC.="<<particleMotherTPC<<
+          "mechTPC="<<mechTPC<<
+          "isPrimTPC="<<isPrimTPC<<
+         "isFromStrangessTPC="<<isFromStrangessTPC<<
+         "isFromConversionTPC="<<isFromConversionTPC<<
+          "isFromMaterialTPC="<<isFromMaterialTPC<<
+          "particleITS.="<<particleITS<<
+                 "particleMotherITS.="<<particleMotherITS<<
+          "mechITS="<<mechITS<<
+          "isPrimITS="<<isPrimITS<<
+         "isFromStrangessITS="<<isFromStrangessITS<<
+         "isFromConversionITS="<<isFromConversionITS<<
+          "isFromMaterialITS="<<isFromMaterialITS<<
+          "\n";
+        }
+      
+       if(tpcInnerC) delete tpcInnerC;
+       if(trackInnerC) delete trackInnerC;
+       if(trackInnerC2) delete trackInnerC2;
+       if(outerITSc) delete outerITSc;
+       if(trackInnerC3) delete trackInnerC3;
+    }
+  }
+  
+}
+
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessMCEff(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
+{
+  //
+  // Fill tree for efficiency studies MC only
+
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+   if(!mcEvent) {
+    AliDebug(AliLog::kError, "mcEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    AliDebug(AliLog::kError, "cuts not available");
+    return;
+  }
+
+  // trigger selection
+  Bool_t isEventTriggered = kTRUE;
+  AliPhysicsSelection *physicsSelection = NULL;
+  AliTriggerAnalysis* triggerAnalysis = NULL;
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+   
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // trigger
+  if(evtCuts->IsTriggerRequired())  
+  {
+    // always MB
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
+
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
+    if(!physicsSelection) return;
+
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
+      // set trigger (V0AND)
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();
+      if(!triggerAnalysis) return;
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
+    }
+  }
+
+  // centrality determination
+  Float_t centralityF = -1;
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
+
+  // use MC information
+  AliHeader* header = 0;
+  AliGenEventHeader* genHeader = 0;
+  AliStack* stack = 0;
+  TArrayF vtxMC(3);
+
+  Int_t multMCTrueTracks = 0;
+  if(IsUseMCInfo())
+  {
+    //
+    if(!mcEvent) {
+      AliDebug(AliLog::kError, "mcEvent not available");
+      return;
+    }
+    // get MC event header
+    header = mcEvent->Header();
+    if (!header) {
+      AliDebug(AliLog::kError, "Header not available");
+      return;
+    }
+    // MC particle stack
+    stack = mcEvent->Stack();
+    if (!stack) {
+      AliDebug(AliLog::kError, "Stack not available");
+      return;
+    }
+
+    // get MC vertex
+    genHeader = header->GenEventHeader();
+    if (!genHeader) {
+      AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
+      return;
+    }
+    genHeader->PrimaryVertex(vtxMC);
+
+    // multipliticy of all MC primary tracks
+    // in Zv, pt and eta ranges)
+    multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);
+
+  } // end bUseMC
+
+  // get reconstructed vertex  
+  //const AliESDVertex* vtxESD = 0; 
+  AliESDVertex* vtxESD = 0; 
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();
+  }
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();
+  }
+  else {
+       return;
+  }
+
+  if(!vtxESD) return;
+
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+  // check event cuts
+  if(isEventOK && isEventTriggered)
+  {
+    if(IsUseMCInfo()) 
+    {
+      if(!stack) return;
+
+      //
+      // MC info
+      //
+      TParticle *particle=NULL;
+      TParticle *particleMother=NULL;
+      Int_t mech=-1;
+
+      // reco event info
+      Double_t vert[3] = {0}; 
+      vert[0] = vtxESD->GetXv();
+      vert[1] = vtxESD->GetYv();
+      vert[2] = vtxESD->GetZv();
+      Int_t mult = vtxESD->GetNContributors();
+      Double_t bz = esdEvent->GetMagneticField();
+      Double_t runNumber = esdEvent->GetRunNumber();
+      Double_t evtTimeStamp = esdEvent->GetTimeStamp();
+      Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+
+      // loop over MC stack
+      for (Int_t iMc = 0; iMc < stack->GetNtrack(); ++iMc) 
+      {
+         particle = stack->Particle(iMc);
+         if (!particle)
+         continue;
+
+         // only charged particles
+         if(!particle->GetPDG()) continue;
+         Double_t charge = particle->GetPDG()->Charge()/3.;
+         if (TMath::Abs(charge) < 0.001)
+         continue;
+
+         // only primary particles
+         Bool_t prim = stack->IsPhysicalPrimary(iMc);
+         if(!prim) continue;
+
+         // downscale low-pT particles
+         Double_t scalempt= TMath::Min(particle->Pt(),10.);
+         Double_t downscaleF = gRandom->Rndm();
+         downscaleF *= fLowPtTrackDownscaligF;
+         if(TMath::Exp(2*scalempt)<downscaleF) continue;
+
+         // is particle in acceptance
+         if(!accCuts->AcceptTrack(particle)) continue;
+       
+         // check if particle reconstructed
+         Bool_t isRec = kFALSE;
+         Int_t  trackIndex = -1;
+         for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+         {
+           
+           AliESDtrack *track = esdEvent->GetTrack(iTrack);
+           if(!track) continue;
+           if(track->Charge()==0) continue;
+           if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) 
+           {
+             Int_t label =  TMath::Abs(track->GetLabel());
+             if(label == iMc) {
+               isRec = kTRUE;
+               trackIndex = iTrack;
+               break;
+             }
+           } 
+         }
+
+         // Store information in the output tree
+         AliESDtrack *recTrack = NULL; 
+         if(trackIndex>-1)  { 
+           recTrack = esdEvent->GetTrack(trackIndex); 
+         } else {
+           recTrack = new AliESDtrack(); 
+         } 
+
+        particleMother = GetMother(particle,stack);
+         mech = particle->GetUniqueID();
+
+         //MC particle track length
+         Double_t tpcTrackLength = 0.;
+         AliMCParticle *mcParticle = (AliMCParticle*) mcEvent->GetTrack(iMc);
+         if(mcParticle) {
+           Int_t counter;
+           tpcTrackLength = mcParticle->GetTPCTrackLength(bz,0.05,counter,3.0);
+         } 
+
+
+         //
+         if(fTreeSRedirector) {
+           (*fTreeSRedirector)<<"MCEffTree"<<
+           "fileName.="<<&fileName<<
+           "runNumber="<<runNumber<<
+           "evtTimeStamp="<<evtTimeStamp<<
+           "evtNumberInFile="<<evtNumberInFile<<
+           "Bz="<<bz<<
+           "vtxESD.="<<vtxESD<<
+           "mult="<<mult<<
+           "esdTrack.="<<recTrack<<
+           "isRec="<<isRec<<
+           "tpcTrackLength="<<tpcTrackLength<<
+           "particle.="<<particle<<
+                  "particleMother.="<<particleMother<<
+           "mech="<<mech<<
+           "\n";
+         }
+
+         if(trackIndex <0 && recTrack) delete recTrack; recTrack=0;
+      }
+    }
+  }
+  
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::IsHighDeDxParticle(AliESDtrack * track) {
+  //
+  // check if particle is Z > 1 
+  //
+  if (track->GetTPCNcls() < 60) return kFALSE;
+  Double_t mom = track->GetInnerParam()->GetP();
+  if (mom < 0.2) return kFALSE; // protection against unexpected behavior of Aleph parameterization
+  Float_t dca[2], bCov[3];
+  track->GetImpactParameters(dca,bCov);
+  //
+
+  Double_t triggerDeDx = 4*AliExternalTrackParam::BetheBlochAleph((mom*2)/(0.938*3),1.0288,31.9806,5.04114e-11,2.13096,2.38541);
+
+  if (track->GetTPCsignal() > triggerDeDx && track->GetTPCsignal()<1000 && TMath::Abs(dca[0])<3.) return kTRUE;
+
+  return kFALSE;
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessV0(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
+{
+  //
+  // Select real events with V0 (K0s and Lambda) high-pT candidates
+  //
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    AliDebug(AliLog::kError, "cuts not available");
+    return;
+  }
+
+  // trigger selection
+  Bool_t isEventTriggered = kTRUE;
+  AliPhysicsSelection *physicsSelection = NULL;
+  AliTriggerAnalysis* triggerAnalysis = NULL;
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+   
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // trigger
+  if(evtCuts->IsTriggerRequired())  
+  {
+    // always MB
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
+
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
+    if(!physicsSelection) return;
+    //SetPhysicsTriggerSelection(physicsSelection);
+
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
+      // set trigger (V0AND)
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();
+      if(!triggerAnalysis) return;
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
+    }
+  }
+
+  // centrality determination
+  Float_t centralityF = -1;
+  AliCentrality *esdCentrality = esdEvent->GetCentrality();
+  centralityF = esdCentrality->GetCentralityPercentile(fCentralityEstimator.Data());
+
+
+  // get reconstructed vertex  
+  //const AliESDVertex* vtxESD = 0; 
+  AliESDVertex* vtxESD = 0; 
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();
+  }
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();
+  }
+  else {
+       return;
+  }
+
+  if(!vtxESD) return;
+
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+  // check event cuts
+  if(isEventOK && isEventTriggered) {
+  //
+  // Dump the pt downscaled V0 into the tree
+  // 
+  Int_t ntracks = esdEvent->GetNumberOfTracks();
+  Int_t nV0s = esdEvent->GetNumberOfV0s();
+  Int_t run = esdEvent->GetRunNumber();
+  Int_t time= esdEvent->GetTimeStamp();
+  Int_t evNr=esdEvent->GetEventNumberInFile();
+  Double_t bz = esdEvent->GetMagneticField();
+
+
+  for (Int_t iv0=0; iv0<nV0s; iv0++){
+    AliESDv0 * v0 = esdEvent->GetV0(iv0);
+    if (!v0) continue;
+    AliESDtrack * track0 = esdEvent->GetTrack(v0->GetIndex(0));
+    AliESDtrack * track1 = esdEvent->GetTrack(v0->GetIndex(1));
+    if (!track0) continue;
+    if (!track1) continue;
+    if (track0->GetSign()<0) {
+      track1 = esdEvent->GetTrack(v0->GetIndex(0));
+      track0 = esdEvent->GetTrack(v0->GetIndex(1));
+    }
+    //
+    Bool_t isDownscaled = IsV0Downscaled(v0);
+    if (isDownscaled) continue;
+    AliKFParticle kfparticle; //
+    Int_t type=GetKFParticle(v0,esdEvent,kfparticle);
+    if (type==0) continue;   
+
+    if(!fTreeSRedirector) return;
+    (*fTreeSRedirector)<<"V0s"<<
+      "isDownscaled="<<isDownscaled<<
+      "Bz="<<bz<<
+      "fileName.="<<&fileName<<
+      "runNumber="<<run<<
+      "evtTimeStamp="<<time<<
+      "evtNumberInFile="<<evNr<<
+      "type="<<type<<
+      "ntracks="<<ntracks<<
+      "v0.="<<v0<<
+      "kf.="<<&kfparticle<<
+      "track0.="<<track0<<
+      "track1.="<<track1<<
+      "centralityF="<<centralityF<<
+      "\n";
+  }
+  }
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::ProcessdEdx(AliESDEvent *const esdEvent, AliMCEvent * const mcEvent, AliESDfriend *const /*esdFriend*/)
+{
+  //
+  // Select real events with large TPC dEdx signal
+  //
+  if(!esdEvent) {
+    AliDebug(AliLog::kError, "esdEvent not available");
+    return;
+  }
+
+  // get selection cuts
+  AlidNdPtEventCuts *evtCuts = GetEventCuts(); 
+  AlidNdPtAcceptanceCuts *accCuts = GetAcceptanceCuts(); 
+  AliESDtrackCuts *esdTrackCuts = GetTrackCuts(); 
+
+  if(!evtCuts || !accCuts  || !esdTrackCuts) {
+    AliDebug(AliLog::kError, "cuts not available");
+    return;
+  }
+
+  // get file name
+  TTree *chain = (TChain*)GetInputData(0);
+  if(!chain) { 
+    Printf("ERROR: Could not receive input chain");
+    return;
+  }
+  TObjString fileName(chain->GetCurrentFile()->GetName());
+
+  // trigger
+  Bool_t isEventTriggered = kTRUE;
+  AliPhysicsSelection *physicsSelection = NULL;
+  AliTriggerAnalysis* triggerAnalysis = NULL;
+
+  // 
+  AliInputEventHandler* inputHandler = (AliInputEventHandler*) AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler();
+  if (!inputHandler)
+  {
+    Printf("ERROR: Could not receive input handler");
+    return;
+  }
+
+  if(evtCuts->IsTriggerRequired())  
+  {
+    // always MB
+    isEventTriggered = inputHandler->IsEventSelected() & AliVEvent::kMB;
+
+    physicsSelection = static_cast<AliPhysicsSelection*> (inputHandler->GetEventSelection());
+    if(!physicsSelection) return;
+
+    if (isEventTriggered && (GetTrigger() == AliTriggerAnalysis::kV0AND)) {
+      // set trigger (V0AND)
+      triggerAnalysis = physicsSelection->GetTriggerAnalysis();
+      if(!triggerAnalysis) return;
+      isEventTriggered = triggerAnalysis->IsOfflineTriggerFired(esdEvent, GetTrigger());
+    }
+  }
+
+  // get reconstructed vertex  
+  AliESDVertex* vtxESD = 0; 
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) {
+        vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTPC();
+  }
+  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS) {
+     vtxESD = (AliESDVertex*)esdEvent->GetPrimaryVertexTracks();
+  }
+  else {
+       return;
+  }
+  if(!vtxESD) return;
+
+  Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD); 
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());
+
+
+  // check event cuts
+  if(isEventOK && isEventTriggered)
+  {
+    Double_t vert[3] = {0}; 
+    vert[0] = vtxESD->GetXv();
+    vert[1] = vtxESD->GetYv();
+    vert[2] = vtxESD->GetZv();
+    Int_t mult = vtxESD->GetNContributors();
+    Double_t bz = esdEvent->GetMagneticField();
+    Double_t runNumber = esdEvent->GetRunNumber();
+    Double_t evtTimeStamp = esdEvent->GetTimeStamp();
+    Int_t evtNumberInFile = esdEvent->GetEventNumberInFile();
+
+    // large dEdx
+    for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
+    {
+      AliESDtrack *track = esdEvent->GetTrack(iTrack);
+      if(!track) continue;
+      if(track->Charge()==0) continue;
+      if(!esdTrackCuts->AcceptTrack(track)) continue;
+      if(!accCuts->AcceptTrack(track)) continue;
+
+      if(!IsHighDeDxParticle(track)) continue;
+      
+      if(!fTreeSRedirector) return;
+      (*fTreeSRedirector)<<"dEdx"<<
+      "fileName.="<<&fileName<<
+      "runNumber="<<runNumber<<
+      "evtTimeStamp="<<evtTimeStamp<<
+      "evtNumberInFile="<<evtNumberInFile<<
+      "Bz="<<bz<<
+      "vtxESD.="<<vtxESD<<
+      "mult="<<mult<<
+      "esdTrack.="<<track<<
+      "\n";
+    }
+  }
+}
+
+//_____________________________________________________________________________
+Int_t   AlidNdPtTrackDumpTask::GetKFParticle(AliESDv0 *const v0, AliESDEvent * const event, AliKFParticle & kfparticle)
+{
+  //
+  // Create KF particle in case the V0 fullfill selection criteria
+  //
+  // Selection criteria
+  //  0. algorithm cut
+  //  1. track cut
+  //  3. chi2 cut
+  //  4. rough mass cut
+  //  5. Normalized pointing angle cut
+  //
+  const Double_t cutMass=0.2;
+  const Double_t kSigmaDCACut=3;
+  //
+  // 0.) algo cut - accept only on the fly
+  //
+  if (v0->GetOnFlyStatus() ==kFALSE) return 0;     
+  //
+  // 1.) track cut
+  // 
+  AliESDtrack * track0 = event->GetTrack(v0->GetIndex(0));
+  AliESDtrack * track1 = event->GetTrack(v0->GetIndex(1));
+  /*
+    TCut cutD="abs(track0.fD/sqrt(track0.fCdd))>2&&abs(track1.fD/sqrt(track1.fCdd))>2";
+    TCut cutTheta="abs(track0.fP[3])<1&&abs(track1.fP[3])<1";
+    TCut cutNcl="track0.GetTPCClusterInfo(2,1)>100&&track1.GetTPCClusterInfo(2,1)>100";
+  */  
+  if (TMath::Abs(track0->GetTgl())>1) return 0;
+  if (TMath::Abs(track1->GetTgl())>1) return 0;
+  if ((track0->GetTPCClusterInfo(2,1))<100) return 0;
+  if ((track1->GetTPCClusterInfo(2,1))<100) return 0;
+  //if ((track0->GetITSclusters(0))<2) return 0;
+  //if ((track1->GetITSclusters(0))<2) return 0; 
+  Float_t pos0[2]={0}, cov0[3]={0};
+  Float_t pos1[2]={0}, cov1[3]={0};
+  track0->GetImpactParameters(pos0,cov0);
+  track0->GetImpactParameters(pos1,cov1);
+  //
+  if (TMath::Abs(pos0[0])<kSigmaDCACut*TMath::Sqrt(cov0[0])) return 0;
+  if (TMath::Abs(pos1[0])<kSigmaDCACut*TMath::Sqrt(cov1[0])) return 0;
+  // 
+  //
+  // 3.) Chi2 cut
+  //
+  Double_t chi2KF = v0->GetKFInfo(2,2,2);
+  if (chi2KF>25) return 0;
+  //
+  // 4.) Rough mass cut - 0.200 GeV
+  //
+  static Double_t masses[2]={-1};
+  if (masses[0]<0){
+    masses[0] = TDatabasePDG::Instance()->GetParticle("K_S0")->Mass();
+    masses[1] = TDatabasePDG::Instance()->GetParticle("Lambda0")->Mass();
+  }
+  Double_t mass00=  v0->GetEffMass(0,0);
+  Double_t mass22=  v0->GetEffMass(2,2);
+  Double_t mass42=  v0->GetEffMass(4,2);
+  Double_t mass24=  v0->GetEffMass(2,4);
+  Bool_t massOK=kFALSE;
+  Int_t type=0;
+  Int_t ptype=0;
+  Double_t dmass=1;
+  Int_t p1=0, p2=0;
+  if (TMath::Abs(mass00-0)<cutMass) {
+    massOK=kTRUE; type+=1; 
+    if (TMath::Abs(mass00-0)<dmass) {
+      ptype=1;
+      dmass=TMath::Abs(mass00-0);      
+      p1=0; p2=0;
+    } 
+  }
+  if (TMath::Abs(mass24-masses[1])<cutMass) {
+    massOK=kTRUE; type+=2; 
+    if (TMath::Abs(mass24-masses[1])<dmass){
+      dmass = TMath::Abs(mass24-masses[1]);
+      ptype=2;
+      p1=2; p2=4;
+    }
+  }
+  if (TMath::Abs(mass42-masses[1])<cutMass) {
+    massOK=kTRUE; type+=4;
+    if (TMath::Abs(mass42-masses[1])<dmass){
+      dmass = TMath::Abs(mass42-masses[1]);
+      ptype=4;
+      p1=4; p2=2;
+    }
+  }
+  if (TMath::Abs(mass22-masses[0])<cutMass) {
+    massOK=kTRUE; type+=8;
+    if (TMath::Abs(mass22-masses[0])<dmass){
+      dmass = TMath::Abs(mass22-masses[0]);
+      ptype=8;
+      p1=2; p2=2;
+    }
+  }
+  if (type==0) return 0;
+  //
+  const Int_t spdg[5]={kPositron,kMuonPlus,kPiPlus, kKPlus, kProton};
+  const AliExternalTrackParam *paramP = v0->GetParamP();
+  const AliExternalTrackParam *paramN = v0->GetParamN();
+  if (paramP->GetSign()<0){
+    paramP=v0->GetParamP();
+    paramN=v0->GetParamN();
+  }
+  //Double_t *pparam1 = (Double_t*)paramP->GetParameter();
+  //Double_t *pparam2 = (Double_t*)paramN->GetParameter();
+  //
+  AliKFParticle kfp1( *paramP, spdg[p1]  );
+  AliKFParticle kfp2( *paramN, -1 *spdg[p2]  );
+  AliKFParticle V0KF;
+  (V0KF)+=kfp1;
+  (V0KF)+=kfp2;
+  kfparticle=V0KF;
+  //
+  // Pointing angle
+  //
+  Double_t  errPhi    = V0KF.GetErrPhi();
+  Double_t  pointAngle= TMath::ACos(v0->GetV0CosineOfPointingAngle());
+  if (pointAngle/errPhi>10) return 0;  
+  //
+  return ptype;  
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::IsV0Downscaled(AliESDv0 *const v0)
+{
+  //
+  // Downscale randomly low pt V0
+  //
+  //return kFALSE;
+  Double_t maxPt= TMath::Max(v0->GetParamP()->Pt(), v0->GetParamN()->Pt());
+  Double_t scalempt= TMath::Min(maxPt,10.);
+  Double_t downscaleF = gRandom->Rndm();
+  downscaleF *= fLowPtV0DownscaligF;
+  
+  //printf("V0 TMath::Exp(2*scalempt) %e, downscaleF %e \n",TMath::Exp(2*scalempt), downscaleF);
+  if (TMath::Exp(2*scalempt)<downscaleF) return kTRUE;
+  return kFALSE;
+
+  /*
+    TH1F his1("his1","his1",100,0,10);
+    TH1F his2("his2","his2",100,0,10);
+    {for (Int_t i=0; i<10000; i++){
+       Double_t rnd=gRandom->Exp(1);
+       Bool_t isDownscaled =TMath::Exp(rnd)<100*gRandom->Rndm();
+       his1->Fill(rnd); 
+       if (!isDownscaled) his2->Fill(rnd); 
+    }}
+
+   */
+
+}
+
+
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::ConstrainTPCInner(AliExternalTrackParam *const tpcInnerC, const AliESDVertex* vtx, Double_t b[3])
+{
+ // Constrain TPC inner params constrained
+ //
+      if(!tpcInnerC) return kFALSE; 
+      if(!vtx) return kFALSE;
+
+      Double_t dz[2],cov[3];
+      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();
+      //if(!tpcInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; 
+      //if(!tpcInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; 
+      if(!tpcInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; 
+
+
+      Double_t covar[6]; vtx->GetCovMatrix(covar);
+      Double_t p[2]={tpcInnerC->GetParameter()[0]-dz[0],tpcInnerC->GetParameter()[1]-dz[1]};
+      Double_t c[3]={covar[2],0.,covar[5]};
+      Double_t chi2C=tpcInnerC->GetPredictedChi2(p,c);
+      if (chi2C>kVeryBig) return kFALSE; 
+
+      if(!tpcInnerC->Update(p,c)) return kFALSE;
+
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::ConstrainTrackInner(AliExternalTrackParam *const trackInnerC, const AliESDVertex* vtx, Double_t mass, Double_t b[3])
+{
+ // Constrain TPC inner params constrained
+ //
+      if(!trackInnerC) return kFALSE; 
+      if(!vtx) return kFALSE;
+
+      const Double_t kRadius  = 2.8; 
+      const Double_t kMaxStep = 1.0; 
+
+      Double_t dz[2],cov[3];
+
+      //AliESDVertex *vtx= (AliESDVertex *)esdEvent->GetPrimaryVertex();
+      //if(!trackInnerC->PropagateToDCA(vtx, esdEvent->GetMagneticField(), 3, dz, cov)) return kFALSE; 
+      //if(!trackInnerC->PropagateToDCA(vtx, Bz, 3, dz, cov)) return kFALSE; 
+
+      if(!AliTracker::PropagateTrackToBxByBz(trackInnerC,kRadius,mass,kMaxStep,kFALSE)) return kFALSE;
+      if(!trackInnerC->PropagateToDCABxByBz(vtx, b, 3, dz, cov)) return kFALSE; 
+
+      //
+      Double_t covar[6]; vtx->GetCovMatrix(covar);
+      Double_t p[2]={trackInnerC->GetParameter()[0]-dz[0],trackInnerC->GetParameter()[1]-dz[1]};
+      Double_t c[3]={covar[2],0.,covar[5]};
+      Double_t chi2C=trackInnerC->GetPredictedChi2(p,c);
+      if (chi2C>kVeryBig) return kFALSE; 
+
+      if(!trackInnerC->Update(p,c)) return kFALSE;
+
+  return kTRUE;
+}
+
+
+//_____________________________________________________________________________
+TParticle *AlidNdPtTrackDumpTask::GetMother(TParticle *const particle, AliStack *const stack) 
+{
+  if(!particle) return NULL;
+  if(!stack) return NULL;
+
+  Int_t motherLabel = TMath::Abs(particle->GetMother(0));  
+  TParticle* mother = NULL; 
+  mother = stack->Particle(motherLabel); 
+
+return mother;
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::IsFromConversion(const Int_t label, AliStack *const stack) 
+{
+  Bool_t isFromConversion = kFALSE;
+
+  if(stack) {
+    TParticle* particle = stack->Particle(label);
+
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) 
+    {
+       Int_t mech = particle->GetUniqueID(); // production mechanism 
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);
+
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  
+       TParticle* mother = stack->Particle(motherLabel); 
+       if(mother) {
+          Int_t motherPdg = mother->GetPdgCode();
+
+          if(!isPrim && mech==5 && motherPdg==kGamma) { 
+            isFromConversion=kTRUE; 
+          }
+       }
+    } 
+  } 
+
+  return isFromConversion;
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::IsFromMaterial(const Int_t label, AliStack *const stack) 
+{
+  Bool_t isFromMaterial = kFALSE;
+
+  if(stack) {
+    TParticle* particle = stack->Particle(label);
+
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) 
+    {
+       Int_t mech = particle->GetUniqueID(); // production mechanism 
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);
+
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  
+       TParticle* mother = stack->Particle(motherLabel); 
+       if(mother) {
+          if(!isPrim && mech==13) { 
+            isFromMaterial=kTRUE; 
+          }
+       }
+     } 
+  } 
+
+  return isFromMaterial;
+}
+
+//_____________________________________________________________________________
+Bool_t AlidNdPtTrackDumpTask::IsFromStrangeness(const Int_t label, AliStack *const stack) 
+{
+  Bool_t isFromStrangeness = kFALSE;
+
+  if(stack) {
+    TParticle* particle = stack->Particle(label);
+
+    if(particle && particle->GetPDG() && particle->GetPDG()->Charge()!=0) 
+    {
+       Int_t mech = particle->GetUniqueID(); // production mechanism 
+       Bool_t isPrim = stack->IsPhysicalPrimary(label);
+
+       Int_t motherLabel = TMath::Abs(particle->GetMother(0));  
+       TParticle* mother = stack->Particle(motherLabel); 
+       if(mother) {
+          Int_t motherPdg = mother->GetPdgCode();
+
+          // K+-, lambda, antilambda, K0s decays
+          if(!isPrim && mech==4 && 
+             (TMath::Abs(motherPdg)==kKPlus || TMath::Abs(motherPdg)==kLambda0 || motherPdg==kK0Short))
+          {
+            isFromStrangeness = kTRUE;
+          } 
+       }
+    } 
+  } 
+
+  return isFromStrangeness;
+}
+
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::FinishTaskOutput() 
+{
+  //
+  // Called one at the end 
+  // locally on working node
+  //
+
+  // must be deleted to store trees
+  if(fTreeSRedirector)  delete fTreeSRedirector; fTreeSRedirector=0;
+
+  // open temporary file and copy trees to the ouptut container
+
+  TChain* chain = 0;
+  /*
+  TTree* tree1 = 0;
+  TTree* tree2 = 0;
+  TTree* tree3 = 0;
+  TTree* tree4 = 0;
+  TTree* tree5 = 0;
+  TTree* tree6 = 0;
+  */
+  //
+  chain = new TChain("highPt");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree1 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree1) fTree1->Print();
+
+  //
+  chain = new TChain("V0s");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree2 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree2) fTree2->Print();
+
+  //
+  chain = new TChain("dEdx");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree3 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree3) fTree3->Print();
+
+  //
+  chain = new TChain("Laser");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree4 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree4) fTree4->Print();
+
+  //
+  chain = new TChain("MCEffTree");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree5 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree5) fTree5->Print();
+
+  //
+  chain = new TChain("CosmicPairs");
+  if(chain) { 
+    chain->Add("jotwinow_Temp_Trees.root");
+    fTree6 = chain->CopyTree("1");
+    delete chain; chain=0; 
+  }
+  if(fTree6) fTree6->Print();  
+
+
+  OpenFile(1);
+
+  // Post output data.
+  PostData(1, fTree1);
+  PostData(2, fTree2);
+  PostData(3, fTree3);
+  PostData(4, fTree4);
+  PostData(5, fTree5);
+  PostData(6, fTree6);
+}
+
+//_____________________________________________________________________________
+void AlidNdPtTrackDumpTask::Terminate(Option_t *) 
+{
+  // Called one at the end 
+  /*
+  fOutputSummary = dynamic_cast<TTree*> (GetOutputData(1));
+  if(fOutputSummary) delete fOutputSummary; fOutputSummary=0;
+  TChain* chain = new TChain("highPt");
+  if(!chain) return;
+  chain->Add("jotwinow_HighPt_TrackAndV0_Trees.root");
+  TTree *tree = chain->CopyTree("1");
+  if (chain) { delete chain; chain=0; }
+  if(!tree) return;
+  tree->Print();
+  fOutputSummary = tree;
+
+  if (!fOutputSummary) {
+    Printf("ERROR: AlidNdPtTrackDumpTask::Terminate(): Output data not avaiable %p \n", GetOutputData(1));
+    return;
+  }
+  */
+}