]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/JetTasks/AliPWG4HighPtQAMC.cxx
updates to PT QA MC, adding tpc tracks constrained to spd vertex, adding simplified...
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliPWG4HighPtQAMC.cxx
index 8a6684fc341288d9ea66c8b051401be57432b59a..d2b1451696e5436d807df2880ca69412ff3ec338 100644 (file)
 #include "TH1.h"
 #include "TH2.h"
 #include "TH3.h"
+#include "TProfile.h"
 #include "TList.h"
+#include "TFile.h"
 #include "TChain.h"
 #include "TH3F.h"
+#include "TKey.h"
+#include "TSystem.h"
+
+#include "AliAnalysisTask.h"
 #include "AliAnalysisManager.h"
 #include "AliESDInputHandler.h"
 #include "AliMCEvent.h"
 #include "AliESDtrackCuts.h"
 #include "AliExternalTrackParam.h"
 #include "AliLog.h"
+#include "AliGenPythiaEventHeader.h"
+#include "AliGenCocktailEventHeader.h"
+//#include "AliAnalysisHelperJetTasks.h"
 
 using namespace std; //required for resolving the 'cout' symbol
 
 ClassImp(AliPWG4HighPtQAMC)
 
-AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(): AliAnalysisTask("AliPWG4HighPtQAMC", ""), 
+AliPWG4HighPtQAMC::AliPWG4HighPtQAMC()
+: AliAnalysisTask("AliPWG4HighPtQAMC", ""), 
   fESD(0), 
+  fMC(0),
+  fStack(0),
+  fVtx(0x0),
   fTrackCuts(0), 
   fTrackCutsITS(0),
+  fTrackType(0),
+  fPtMax(100.),
+  fAvgTrials(1),
   fNEventAll(0),
   fNEventSel(0),
+  fNEventReject(0),
+  fh1Xsec(0),
+  fh1Trials(0),
+  fh1PtHard(0),
+  fh1PtHardTrials(0),
   fPtAll(0),  
   fPtSel(0),  
+  fPtSelFakes(0),
+  fNPointTPCFakes(0),
+  fPtSelLargeLabel(0),
+  fMultRec(0),
+  fNPointTPCMultRec(0),
+  fDeltaPtMultRec(0),
   fPtAllminPtMCvsPtAll(0),
   fPtAllminPtMCvsPtAllNPointTPC(0),
   fPtAllminPtMCvsPtAllDCAR(0),
@@ -83,14 +110,31 @@ AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(): AliAnalysisTask("AliPWG4HighPtQAMC", "")
 }
 //________________________________________________________________________
 AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(const char *name): 
-  AliAnalysisTask(name, ""), 
+  AliAnalysisTask(name,""), 
   fESD(0),
+  fMC(0),
+  fStack(0),
+  fVtx(0x0),
   fTrackCuts(),
   fTrackCutsITS(),
+  fTrackType(0),
+  fPtMax(100.),
+  fAvgTrials(1),
   fNEventAll(0),
   fNEventSel(0),
+  fNEventReject(0),
+  fh1Xsec(0),
+  fh1Trials(0),
+  fh1PtHard(0),
+  fh1PtHardTrials(0),
   fPtAll(0),
   fPtSel(0),
+  fPtSelFakes(0),
+  fNPointTPCFakes(0),
+  fPtSelLargeLabel(0),
+  fMultRec(0),
+  fNPointTPCMultRec(0),
+  fDeltaPtMultRec(0),
   fPtAllminPtMCvsPtAll(0),
   fPtAllminPtMCvsPtAllNPointTPC(0),
   fPtAllminPtMCvsPtAllDCAR(0),
@@ -122,34 +166,41 @@ AliPWG4HighPtQAMC::AliPWG4HighPtQAMC(const char *name):
   AliDebug(2,Form("AliPWG4HighPtQAMC Calling Constructor"));
   // Input slot #0 works with a TChain ESD
   DefineInput(0, TChain::Class());
-  // Output slot #0 writes into a TList
+  // Output slot #0, #1 write into a TList
   DefineOutput(0, TList::Class());
-  // Output slot #1 writes into a TList
   DefineOutput(1, TList::Class());
-  // Output slot #2 writes into a TList
-  DefineOutput(2, TList::Class());
 }
 
 //________________________________________________________________________
 void AliPWG4HighPtQAMC::ConnectInputData(Option_t *) 
 {
-  // Connect ESD here
+  // Connect ESD and MC event handler here
   // Called once
   AliDebug(2,Form(">> AliPWG4HighPtSpectra::ConnectInputData \n"));
   TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
   if (!tree) {
-    AliDebug(2,Form("ERROR: Could not read chain from input slot 0"));
-  } else {
-    
-    AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-    
-    if (!esdH) {
-      AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
-    } else
-      fESD = esdH->GetEvent();
+    AliDebug(2,Form( "ERROR: Could not read chain from input slot 0 \n"));
+    return;
   }
+
+  AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
+
+  if (!esdH) {
+    AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
+    return;
+  } else
+    fESD = esdH->GetEvent();
+  
+  AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+  if (!eventHandler) {
+    AliDebug(2,Form( "ERROR: Could not retrieve MC event handler \n"));
+  }
+  else
+    fMC = eventHandler->MCEvent();
+
 }
 
+
 //________________________________________________________________________
 void AliPWG4HighPtQAMC::CreateOutputObjects() {
   //Create output objects
@@ -160,8 +211,10 @@ void AliPWG4HighPtQAMC::CreateOutputObjects() {
 
   OpenFile(0);
   fHistList = new TList();
+  fHistList->SetOwner(kTRUE);
   OpenFile(1);
   fHistListITS = new TList();
+  fHistListITS->SetOwner(kTRUE);
 
   Int_t fgkNPhiBins=18;
   Float_t kMinPhi = 0.;
@@ -169,18 +222,61 @@ void AliPWG4HighPtQAMC::CreateOutputObjects() {
   
   Int_t fgkNPtBins=98;
   Float_t fgkPtMin=2.;
-  Float_t fgkPtMax=100.;
+  Float_t fgkPtMax=fPtMax;
   Int_t fgkResPtBins=80;
 
   fNEventAll = new TH1F("fNEventAll","NEventAll",1,-0.5,0.5);
   fHistList->Add(fNEventAll);
   fNEventSel = new TH1F("fNEventSel","NEvent Selected for analysis",1,-0.5,0.5);
   fHistList->Add(fNEventSel);
+  fNEventReject = new TH1F("fNEventReject","Reason events are rejectected for analysis",20,0,20);
+  //Set labels
+  fNEventReject->Fill("noESD",0);
+  fNEventReject->Fill("Trigger",0);
+  fNEventReject->Fill("noMCEvent",0);
+  fNEventReject->Fill("NTracks<2",0);
+  fNEventReject->Fill("noVTX",0);
+  fNEventReject->Fill("VtxStatus",0);
+  fNEventReject->Fill("NCont<2",0);
+  fNEventReject->Fill("ZVTX>10",0);
+  fHistList->Add(fNEventReject);
+
+  fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
+  fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
+  fHistList->Add(fh1Xsec);
+
+  fh1Trials = new TH1F("fh1Trials","trials root file",1,0,1);
+  fh1Trials->GetXaxis()->SetBinLabel(1,"#sum{ntrials}");
+  fHistList->Add(fh1Trials);
+
+  fh1PtHard       = new TH1F("fh1PtHard","PYTHIA Pt hard;p_{T,hard}",350,-.5,349.5);
+  fHistList->Add(fh1PtHard);
+  fh1PtHardTrials = new TH1F("fh1PtHardTrials","PYTHIA Pt hard weight with trials;p_{T,hard}",350,-.5,349.5);
+  fHistList->Add(fh1PtHardTrials);
+
   fPtAll = new TH1F("fPtAll","PtAll",fgkNPtBins, fgkPtMin, fgkPtMax);
   fHistList->Add(fPtAll);
   fPtSel = new TH1F("fPtSel","PtSel",fgkNPtBins, fgkPtMin, fgkPtMax);
   fHistList->Add(fPtSel);
-  
+
+  fPtSelFakes = new TH1F("fPtSelFakes","PtSelFakes",fgkNPtBins, fgkPtMin, fgkPtMax);
+  fHistList->Add(fPtSelFakes);
+
+  fNPointTPCFakes = new TH1F("fNPointTPCFakes","fNPointTPCFakes",160,0.5,160.5);
+  fHistList->Add(fNPointTPCFakes);
+
+  fPtSelLargeLabel = new TH1F("fPtSelLargeLabel","PtSelLargeLabel",fgkNPtBins, fgkPtMin, fgkPtMax);
+  fHistList->Add(fPtSelLargeLabel);
+
+  fMultRec = new TH1F("fMultRec","Multiple reconstruction of tracks",20,0,20);
+  fHistList->Add(fMultRec);
+
+  fNPointTPCMultRec = new TH1F("fNPointTPCMultRec","Multiple reconstruction of tracks",160,0.5,160.5);
+  fHistList->Add(fNPointTPCMultRec);
+
+  fDeltaPtMultRec = new TH2F("fDeltaPtMultRec","Delta pT vs pT for multiple reconstructed tracks",100,0.,50.,100,-20.,20.);
+  fHistList->Add(fDeltaPtMultRec);
+
   fPtAllminPtMCvsPtAll = new TH2F("fPtAllminPtMCvsPtAll","PtAllminPtMCvsPtAll",fgkNPtBins, fgkPtMin,fgkPtMax,fgkResPtBins,-1.,1.);
   fPtAllminPtMCvsPtAll->SetXTitle("p_{t}^{MC}");
   fPtAllminPtMCvsPtAll->SetYTitle("(1/p_{t}^{All}-1/p_{t}^{MC})/(1/p_{t}^{MC})");
@@ -301,132 +397,225 @@ void AliPWG4HighPtQAMC::CreateOutputObjects() {
   TH1::AddDirectory(oldStatus); 
 
 }
+
 //________________________________________________________________________
-void AliPWG4HighPtQAMC::Exec(Option_t *) {  
-  // Main loop
-  // Called for each event
-  AliDebug(2,Form(">> AliPWG4HighPtQATPConly::Exec \n"));  
-  
-  // All events without selection
-  fNEventAll->Fill(0.);
+Bool_t AliPWG4HighPtQAMC::SelectEvent() {
+  //
+  // Decide if event should be selected for analysis
+  //
+
+  // Checks following requirements:
+  // - fESD available
+  // - trigger info from AliPhysicsSelection
+  // - MCevent available
+  // - number of reconstructed tracks > 1
+  // - primary vertex reconstructed
+  // - z-vertex < 10 cm
 
+  Bool_t selectEvent = kTRUE;
+
+  //fESD object available?
   if (!fESD) {
-    AliDebug(2,Form("ERROR: fESD not available"));
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
+    AliDebug(2,Form("ERROR: fInputEvent not available\n"));
+    fNEventReject->Fill("noESD",1);
+    selectEvent = kFALSE;
+    return selectEvent;
   }
 
-  Bool_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
-  if(!isSelected) { //Select collison candidates
+  //Trigger
+  UInt_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
+  if(!(isSelected&AliVEvent::kMB)) { //Select collison candidates
     AliDebug(2,Form(" Trigger Selection: event REJECTED ... "));
-    // Post output data
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
-  }
-  
- AliMCEventHandler* eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
-  if (!eventHandler) {
-    AliDebug(2,Form("ERROR: Could not retrieve MC event handler"));
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
+    fNEventReject->Fill("Trigger",1);
+    selectEvent = kFALSE;
+    return selectEvent;
   }
 
-  AliMCEvent* mcEvent = eventHandler->MCEvent();
-  if (!mcEvent) {
-    AliDebug(2,Form("ERROR: Could not retrieve MC event"));
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
+  //MCEvent available?
+  //if yes: get stack
+  if(fMC) {
+    AliDebug(2,Form("MC particles: %d", fMC->GetNumberOfTracks()));
+    fStack = fMC->Stack();                //Particles Stack
+    AliDebug(2,Form("MC particles stack: %d", fStack->GetNtrack()));
+  } else {
+    AliDebug(2,Form("ERROR: Could not retrieve MC eventHandler"));
+    fNEventReject->Fill("noMCEvent",1);
+    selectEvent = kFALSE;
+    return selectEvent;
   }
 
-  AliDebug(2,Form("MC particles: %d", mcEvent->GetNumberOfTracks()));
-
-  if (!fESD) {
-    AliDebug(2,Form("ERROR: fESD not available"));
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
+  //Check if number of reconstructed tracks is larger than 1
+  if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2)  {
+    fNEventReject->Fill("NTracks<2",1);
+    selectEvent = kFALSE;
+    return selectEvent;
   }
 
-  AliStack* stack = mcEvent->Stack();                //Particles Stack
-
-  AliDebug(2,Form("MC particles stack: %d", stack->GetNtrack()));
+  //Check if vertex is reconstructed
+  if(fTrackType==1) fVtx = fESD->GetPrimaryVertexTPC();
+  else              fVtx = fESD->GetPrimaryVertexSPD();
 
-  const AliESDVertex *vtx = fESD->GetPrimaryVertex();
+  if(!fVtx) {
+    fNEventReject->Fill("noVTX",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+   
+  if(!fVtx->GetStatus()) {
+    fNEventReject->Fill("VtxStatus",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+  
   // Need vertex cut
-  TString vtxName(vtx->GetName());
-  if(vtx->GetNContributors() < 2 || (vtxName.Contains("TPCVertex")) ) {
-    // SPD vertex
-    vtx = fESD->GetPrimaryVertexSPD();
-    if(vtx->GetNContributors()<2) {
-      vtx = 0x0;
-      // Post output data
-      PostData(0, fHistList);
-      PostData(1, fHistListITS);
-      return;
-    }
+  //  TString vtxName(fVtx->GetName());
+  if(fVtx->GetNContributors()<2) {
+    fNEventReject->Fill("NCont<2",1);
+    selectEvent = kFALSE;
+    return selectEvent;
   }
-
+  
+  //Check if z-vertex < 10 cm
   double primVtx[3];
-  vtx->GetXYZ(primVtx);
-  //  printf("primVtx: %g  %g  %g \n",primVtx[0],primVtx[1],primVtx[2]);
+  fVtx->GetXYZ(primVtx);
   if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
+    fNEventReject->Fill("ZVTX>10",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",fVtx->GetTitle(), fVtx->GetStatus(), fVtx->GetNContributors()));
+
+  return selectEvent;
+
+}
+
+//________________________________________________________________________
+void AliPWG4HighPtQAMC::Exec(Option_t *) {  
+  // Main loop
+  // Called for each event
+  AliDebug(2,Form(">> AliPWG4HighPtQATPConly::Exec \n"));  
+  // All events without selection
+  fNEventAll->Fill(0.);
+
+  if(!SelectEvent()) {
     // Post output data
     PostData(0, fHistList);
     PostData(1, fHistListITS);
     return;
   }
+
+  // ---- Get MC Header information (for MC productions in pThard bins) ----
+  Double_t ptHard = 0.;
+  Double_t nTrials = 1; // trials for MC trigger weight for real data
   
-  AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",vtx->GetTitle(), vtx->GetStatus(), vtx->GetNContributors()));
+  if(fMC){
+    AliGenPythiaEventHeader*  pythiaGenHeader = GetPythiaEventHeader(fMC);
+     if(pythiaGenHeader){
+       nTrials = pythiaGenHeader->Trials();
+       ptHard  = pythiaGenHeader->GetPtHard();
+       
+       fh1PtHard->Fill(ptHard);
+       fh1PtHardTrials->Fill(ptHard,nTrials);
+       
+       fh1Trials->Fill("#sum{ntrials}",fAvgTrials);
+     }
+  }
 
-  // Need to keep track of evts without vertex
+  //Need to keep track of selected events
   fNEventSel->Fill(0.);
 
-  if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2)  {
-    PostData(0, fHistList);
-    PostData(1, fHistListITS);
-    return;
-  }
-
   Int_t nTracks = fESD->GetNumberOfTracks();
-  AliDebug(2,Form("nTracks %d", nTracks));
+  AliDebug(2,Form("nTracks ESD%d", nTracks));
 
-  int nMCtracks = stack->GetNtrack();
+  int nMCtracks = fStack->GetNtrack();
+
+  Float_t pt      = 0.;
+  Float_t ptMC    = 0.;
+  Float_t phi     = 0.;
+  Float_t dca2D   = 0.;
+  Float_t dcaZ    = 0.;
+  Int_t nPointITS = 0;
+  Float_t chi2C   = 0.;
+  Float_t nSigmaToVertex    = 0.;
+  Float_t relUncertainty1Pt = 0.;
 
   for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
     
-    AliESDtrack *track = fESD->GetTrack(iTrack);
-    if(!track) continue;
+    AliESDtrack *track;
+    AliESDtrack *esdtrack = fESD->GetTrack(iTrack);
+    if(!esdtrack) continue;
+
+    if(fTrackType==1)
+      track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
+    else if(fTrackType==2) {
+      track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
+      if(!track) {
+       delete track;
+       continue;
+      }
+      AliExternalTrackParam exParam;
+      Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
+      if( !relate ) {
+       delete track;
+       continue;
+      }
+      track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
+    }
+    else
+      track = esdtrack;
+    
+    if(!track) {
+      if(fTrackType==1 || fTrackType==2) delete track;
+      continue;
+    }
+
     Int_t label = TMath::Abs(track->GetLabel());
-    if(label>=nMCtracks)continue;
-    TParticle *particle = stack->Particle(label) ;
-    if(!particle) continue;
-
-    Float_t pt = track->Pt();
-    Float_t ptMC = particle->Pt();
-    Float_t phi = track->Phi();
-    Float_t dca2D, dcaZ;
-    track->GetImpactParameters(dca2D,dcaZ);
+    if(label>=nMCtracks) {
+      if (fTrackCuts->AcceptTrack(track)) { fPtSelLargeLabel->Fill(pt); }
+      if(fTrackType==1 || fTrackType==2) delete track;
+      continue;
+    }
+    TParticle *particle = fStack->Particle(label) ;
+    if(!particle) {
+      if(fTrackType==1 || fTrackType==2) delete track;
+      continue;
+    }
+
+    ptMC = particle->Pt();
+
+    if(fTrackType==0) {       //Global
+      pt  = track->Pt();
+      phi = track->Phi();
+      track->GetImpactParameters(dca2D,dcaZ);
+    }
+    else if(fTrackType==1 || fTrackType==2) {  //TPConly
+      pt  = track->Pt();
+      phi = track->Phi();
+      track->GetImpactParametersTPC(dca2D,dcaZ);
+    }
+    else {continue;}
+
+    
     UChar_t itsMap = track->GetITSClusterMap();
-    Int_t nPointITS = 0;
     for (Int_t i=0; i < 6; i++) {
       if (itsMap & (1 << i))
        nPointITS ++;
     }
-    Float_t nSigmaToVertex = fTrackCuts->GetSigmaToVertex(track);// Calculates the number of sigma to the vertex for a track.
-    Float_t chi2C = track->GetConstrainedChi2();
-    Float_t relUncertainty1Pt = TMath::Sqrt(track->GetSigma1Pt2())*pt;
-
+    nSigmaToVertex = fTrackCuts->GetSigmaToVertex(track);// Calculates the number of sigma to the vertex for a track.
+    chi2C = track->GetConstrainedChi2();
+    relUncertainty1Pt = TMath::Sqrt(track->GetSigma1Pt2())*pt;
+    
     fPtAll->Fill(pt);
     fPtAllMC->Fill(ptMC);
-    
+
     if (fTrackCuts->AcceptTrack(track)) {
 
       fPtSel->Fill(pt);
-      
+      if(track->GetLabel()<0) {
+        fPtSelFakes->Fill(pt);
+        fNPointTPCFakes->Fill(track->GetTPCNcls());
+      }
       fPtSelMC->Fill(ptMC);
       fPtAllminPtMCvsPtAll->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC) );
       fPtAllminPtMCvsPtAllNPointTPC->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),track->GetTPCNcls());
@@ -437,11 +626,56 @@ void AliPWG4HighPtQAMC::Exec(Option_t *) {
       fPtAllminPtMCvsPtAllNSigmaToVertex->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),nSigmaToVertex);
       fPtAllminPtMCvsPtAllChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
       fPtAllminPtMCvsPtAllRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
-    }//fTrackCuts selection
-    
+
     
+      //Check if track is reconstructed multiple times
+      int multCounter = 1;
+      for (Int_t iTrack2 = iTrack+1; iTrack2 < nTracks; iTrack2++) {
+       //   AliESDtrack *track2 = GetTrackForAnalysis(iTrack2);
+       AliESDtrack *track2;
+       AliESDtrack *esdtrack2 = fESD->GetTrack(iTrack2);
+       if(!esdtrack2) continue;
+      
+       if(fTrackType==1)
+         track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
+       else if(fTrackType==2) {
+         track2 = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack2->GetID());
+         if(!track2) { 
+           delete track2;
+           continue;
+         }
+         AliExternalTrackParam exParam2;
+         Bool_t relate = track2->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam2);
+         if( !relate ) {
+           delete track2;
+           continue;
+         }
+         track2->Set(exParam2.GetX(),exParam2.GetAlpha(),exParam2.GetParameter(),exParam2.GetCovariance());
+       }
+       else
+         track2 = esdtrack2;
+       if(!track2) {
+         if(fTrackType==1 || fTrackType==2) delete track2;
+         continue;
+       }
+      
+       if (fTrackCuts->AcceptTrack(track2)) {
+         Int_t label2 = TMath::Abs(track2->GetLabel());
+         if(label==label2) {
+           fNPointTPCMultRec->Fill(track->GetTPCNcls());
+           fNPointTPCMultRec->Fill(track2->GetTPCNcls());
+           fDeltaPtMultRec->Fill(track->Pt(),track->Pt()-track2->Pt());
+           multCounter++;
+         }
+       }
+       if(fTrackType==1 || fTrackType==2) delete track2;
+      }//track2 loop
+      if(multCounter>1) fMultRec->Fill(multCounter);
+
+    }//fTrackCuts selection
+
     //ITSrefit selection
-    if (fTrackCutsITS->AcceptTrack(track)) {
+    if (fTrackCutsITS->AcceptTrack(track) && fTrackType==0) {
       
       fPtSelITS->Fill(pt);
       fPtSelMCITS->Fill(ptMC);
@@ -455,7 +689,9 @@ void AliPWG4HighPtQAMC::Exec(Option_t *) {
       fPtITSminPtMCvsPtITSChi2C->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),chi2C);
       fPtITSminPtMCvsPtITSRel1PtUncertainty->Fill(ptMC,(1./pt-1./ptMC)/(1./ptMC),relUncertainty1Pt);
     }//fTrackCutsITS loop
-      
+
+    if(fTrackType==1 || fTrackType==2) delete track;    
+
   }//ESD track loop
    
   // Post output data
@@ -463,6 +699,135 @@ void AliPWG4HighPtQAMC::Exec(Option_t *) {
   PostData(1, fHistListITS);
 
 }
+//________________________________________________________________________
+Bool_t AliPWG4HighPtQAMC::PythiaInfoFromFile(const char* currFile,Float_t &fXsec,Float_t &fTrials){
+  //
+  // get the cross section and the trails either from pyxsec.root or from pysec_hists.root
+  // This is to called in Notify and should provide the path to the AOD/ESD file
+  // Copied from AliAnalysisTaskJetSpectrum2
+  //
+
+  TString file(currFile);  
+  fXsec = 0;
+  fTrials = 1;
+
+  if(file.Contains("root_archive.zip#")){
+    Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
+    Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
+    file.Replace(pos+1,20,"");
+  }
+  else {
+    // not an archive take the basename....
+    file.ReplaceAll(gSystem->BaseName(file.Data()),"");
+  }
+  //  Printf("%s",file.Data());
+   
+
+  TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
+  if(!fxsec){
+    // next trial fetch the histgram file
+    fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
+    if(!fxsec){
+       // not a severe condition but inciate that we have no information
+      return kFALSE;
+    }
+    else{
+      // find the tlist we want to be independtent of the name so use the Tkey
+      TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0); 
+      if(!key){
+       fxsec->Close();
+       return kFALSE;
+      }
+      TList *list = dynamic_cast<TList*>(key->ReadObj());
+      if(!list){
+       fxsec->Close();
+       return kFALSE;
+      }
+      fXsec = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
+      fTrials  = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
+      fxsec->Close();
+    }
+  } // no tree pyxsec.root
+  else {
+    TTree *xtree = (TTree*)fxsec->Get("Xsection");
+    if(!xtree){
+      fxsec->Close();
+      return kFALSE;
+    }
+    UInt_t   ntrials  = 0;
+    Double_t  xsection  = 0;
+    xtree->SetBranchAddress("xsection",&xsection);
+    xtree->SetBranchAddress("ntrials",&ntrials);
+    xtree->GetEntry(0);
+    fTrials = ntrials;
+    fXsec = xsection;
+    fxsec->Close();
+  }
+  return kTRUE;
+}
+//________________________________________________________________________
+Bool_t AliPWG4HighPtQAMC::Notify()
+{
+  //
+  // Implemented Notify() to read the cross sections
+  // and number of trials from pyxsec.root
+  // Copied from AliAnalysisTaskJetSpectrum2
+  // 
+
+  TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
+  Float_t xsection = 0;
+  Float_t ftrials  = 1;
+
+  fAvgTrials = 1;
+  if(tree){
+    TFile *curfile = tree->GetCurrentFile();
+    if (!curfile) {
+      Error("Notify","No current file");
+      return kFALSE;
+    }
+    if(!fh1Xsec||!fh1Trials){
+      //      Printf("%s%d No Histogram fh1Xsec",(char*)__FILE__,__LINE__);
+      return kFALSE;
+    }
+    PythiaInfoFromFile(curfile->GetName(),xsection,ftrials);
+    fh1Xsec->Fill("<#sigma>",xsection);
+    // construct a poor man average trials 
+    Float_t nEntries = (Float_t)tree->GetTree()->GetEntries();
+    if(ftrials>=nEntries && nEntries>0.)fAvgTrials = ftrials/nEntries;
+  }  
+  return kTRUE;
+}
+
+//________________________________________________________________________
+AliGenPythiaEventHeader*  AliPWG4HighPtQAMC::GetPythiaEventHeader(AliMCEvent *mcEvent){
+  
+  if(!mcEvent)return 0;
+  AliGenEventHeader* genHeader = mcEvent->GenEventHeader();
+  AliGenPythiaEventHeader* pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(genHeader);
+  if(!pythiaGenHeader){
+    // cocktail ??
+    AliGenCocktailEventHeader* genCocktailHeader = dynamic_cast<AliGenCocktailEventHeader*>(genHeader);
+    
+    if (!genCocktailHeader) {
+      //      AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Unknown header type (not Pythia or Cocktail)");
+      //      AliWarning(Form("%s %d: Unknown header type (not Pythia or Cocktail)",(char*)__FILE__,__LINE__));
+      return 0;
+    }
+    TList* headerList = genCocktailHeader->GetHeaders();
+    for (Int_t i=0; i<headerList->GetEntries(); i++) {
+      pythiaGenHeader = dynamic_cast<AliGenPythiaEventHeader*>(headerList->At(i));
+      if (pythiaGenHeader)
+        break;
+    }
+    if(!pythiaGenHeader){
+      AliWarningGeneral(Form(" %s:%d",(char*)__FILE__,__LINE__),"Pythia event header not found");
+      return 0;
+    }
+  }
+  return pythiaGenHeader;
+
+}
+
 //________________________________________________________________________
 void AliPWG4HighPtQAMC::Terminate(Option_t *)
 {