]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG0/dNdPt/AlidNdPtCorrection.cxx
change histogram bining
[u/mrichter/AliRoot.git] / PWG0 / dNdPt / AlidNdPtCorrection.cxx
index f7545f433c177d5d732914cae6a555feba45b953..36363b592afccc3baca3885dff585dac5e0ba3a3 100644 (file)
@@ -48,6 +48,7 @@
 \r
 #include "AliPWG0Helper.h"\r
 #include "AlidNdPtHelper.h"\r
+#include "AlidNdPtAnalysis.h"\r
 #include "AlidNdPtCorrection.h"\r
 \r
 using namespace std;\r
@@ -94,6 +95,7 @@ ClassImp(AlidNdPtCorrection)
   fEventMultCorrelationMatrix(0),\r
   fZvNorm(0),\r
   fZvEmptyEventsNorm(0),\r
+  fLHCBin0Background(0),\r
   fCorrTriggerMBtoInelEventMatrix(0),\r
   fCorrTriggerMBtoNDEventMatrix(0),\r
   fCorrTriggerMBtoNSDEventMatrix(0),\r
@@ -107,7 +109,8 @@ ClassImp(AlidNdPtCorrection)
   fContTrackMatrix(0),\r
   fContMultTrackMatrix(0),\r
   fCorrMatrixFileName(""),\r
-  fCosmicsHisto(0)\r
+  fCosmicsHisto(0),\r
+  fEventCount(0)\r
 {\r
   // default constructor\r
   for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) { \r
@@ -170,6 +173,7 @@ AlidNdPtCorrection::AlidNdPtCorrection(Char_t* name, Char_t* title, TString corr
   fEventMultCorrelationMatrix(0),\r
   fZvNorm(0),\r
   fZvEmptyEventsNorm(0),\r
+  fLHCBin0Background(0),\r
   fCorrTriggerMBtoInelEventMatrix(0),\r
   fCorrTriggerMBtoNDEventMatrix(0),\r
   fCorrTriggerMBtoNSDEventMatrix(0),\r
@@ -183,7 +187,8 @@ AlidNdPtCorrection::AlidNdPtCorrection(Char_t* name, Char_t* title, TString corr
   fContTrackMatrix(0),\r
   fContMultTrackMatrix(0),\r
   fCorrMatrixFileName(corrMatrixFileName),\r
-  fCosmicsHisto(0)\r
+  fCosmicsHisto(0),\r
+  fEventCount(0)\r
 {\r
   // constructor\r
   for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) { \r
@@ -256,6 +261,7 @@ AlidNdPtCorrection::~AlidNdPtCorrection() {
   if(fMCEventPrimTrackMeanPtTrueMult1) delete fMCEventPrimTrackMeanPtTrueMult1; fMCEventPrimTrackMeanPtTrueMult1=0;\r
 \r
   if(fCosmicsHisto) delete fCosmicsHisto; fCosmicsHisto=0;\r
+  if(fEventCount) delete fEventCount; fEventCount=0;\r
 \r
   for(Int_t i=0; i<AlidNdPtHelper::kCutSteps; i++) { \r
     if(fRecTrackHist1[i]) delete fRecTrackHist1[i]; fRecTrackHist1[i]=0;\r
@@ -290,8 +296,18 @@ void AlidNdPtCorrection::Init(){
   //const Int_t ptNbins = 52; \r
   //Double_t binsPt[ptNbins+1] = { 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90, 2.00, 2.10, 2.20, 2.30, 2.40, 2.50, 2.60, 2.70, 2.80, 2.90, 3.00, 3.10, 3.20, 3.30, 3.40, 3.50, 3.60, 3.70, 3.80, 3.90, 4.00, 4.20, 4.40, 4.60, 4.80, 5.00, 5.20, 5.40, 5.60, 5.80, 6.00, 7.00, 7.60, 8.80, 9.60 }; \r
 \r
+ /*\r
   const Int_t ptNbins = 56; \r
   Double_t binsPt[ptNbins+1] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,2.8,3.0,3.2,3.4,3.6,3.8,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0};\r
+  Double_t binsEta[etaNbins+1] = {-1.5,-1.4,-1.3,-1.2,-1.1,-1.0,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};\r
+  Double_t binsZv[zvNbins+1] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};\r
+  */\r
+\r
+\r
+  const Int_t ptNbins = 68;\r
+  Double_t binsPt[ptNbins+1] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.2,2.4,2.6,2.8,3.0,3.2,3.4,3.6,3.8,4.0,4.5,5.0,5.5,6.0,6.5,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,18.0,20.0,22.0,24.0,26.0,28.0,30.0,32.0,34.0,36.0,40.0,45.0,50.0};\r
+\r
+\r
   Double_t binsEta[etaNbins+1] = {-1.5,-1.4,-1.3,-1.2,-1.1,-1.0,-0.9,-0.8,-0.7,-0.6,-0.5,-0.4,-0.3,-0.2,-0.1,0.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5};\r
   Double_t binsZv[zvNbins+1] = {-30.,-25.,-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.,25.,30.};\r
 \r
@@ -840,6 +856,16 @@ void AlidNdPtCorrection::Init(){
   fCosmicsHisto->GetAxis(2)->SetTitle("pt (GV/c)");\r
   fCosmicsHisto->Sumw2();\r
 \r
+  //\r
+  Int_t binsEventCount[2]={2,2};\r
+  Double_t minEventCount[2]={0,0}; \r
+  Double_t maxEventCount[2]={2,2}; \r
+  fEventCount = new THnSparseF("fEventCount","trig vs trig+vertex",2,binsEventCount,minEventCount,maxEventCount);\r
+  fEventCount->GetAxis(0)->SetTitle("trig");\r
+  fEventCount->GetAxis(1)->SetTitle("trig+vert");\r
+  fEventCount->Sumw2();\r
+\r
+\r
   // init output folder\r
   fCorrectionFolder = CreateFolder("folderdNdPt","Correction dNdPt Folder");\r
 \r
@@ -858,6 +884,7 @@ void AlidNdPtCorrection::Init(){
       fEventMultCorrelationMatrix = (THnSparseF*)folder->FindObject("event_mult_correlation_matrix");\r
       if(!fEventMultCorrelationMatrix) {\r
          Printf("No %s matrix \n", "event_mult_correlation_matrix");\r
+        return;\r
       }\r
 \r
       //\r
@@ -868,24 +895,28 @@ void AlidNdPtCorrection::Init(){
       fCorrTriggerMBtoNDEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoND_corr_matrix");\r
       if(!fCorrTriggerMBtoNDEventMatrix) {\r
          Printf("No %s matrix \n", "zv_mult_trig_MBtoND_corr_matrix");\r
+        return;\r
       }\r
 \r
       // trigger bias correction (MBtoNSD)\r
       fCorrTriggerMBtoNSDEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoNSD_corr_matrix");\r
       if(!fCorrTriggerMBtoNSDEventMatrix) {\r
          Printf("No %s matrix \n", "zv_mult_trig_MBtoNSD_corr_matrix");\r
+        return;\r
       }\r
 \r
       // trigger bias correction (MBtoInel)\r
       fCorrTriggerMBtoInelEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_trig_MBtoInel_corr_matrix");\r
       if(!fCorrTriggerMBtoInelEventMatrix) {\r
          Printf("No %s matrix \n", "zv_mult_trig_MBtoInel_corr_matrix"); \r
+        return;\r
       }\r
      \r
       // vertex reconstruction efficiency correction\r
       fCorrEventMatrix = (THnSparseF*)folder->FindObject("zv_mult_event_corr_matrix");\r
       if(!fCorrEventMatrix) {\r
          Printf("No %s matrix \n", "zv_mult_event_corr_matrix");\r
+        return;\r
       }\r
 \r
       //\r
@@ -894,11 +925,19 @@ void AlidNdPtCorrection::Init(){
       fZvNorm = (TH1D*)folder->FindObject("zv_distribution_norm");\r
       if(!fZvNorm) {\r
          Printf("No %s matrix \n", "fZvNorm");\r
+        return;\r
       }\r
 \r
       fZvEmptyEventsNorm = (TH1D*)folder->FindObject("zv_empty_events_norm");\r
       if(!fZvEmptyEventsNorm) {\r
          Printf("No %s matrix \n", "fZvEmptyEventsNorm");\r
+        return;\r
+      }\r
+\r
+      fLHCBin0Background = (TH1D*)folder->FindObject("hLHCBin0Background");\r
+      if(!fLHCBin0Background) {\r
+         Printf("No %s matrix \n", "fLHCBin0Background");\r
+        return;\r
       }\r
 \r
       //\r
@@ -909,48 +948,56 @@ void AlidNdPtCorrection::Init(){
       fCorrTriggerMBtoNDTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoND_corr_matrix");\r
       if(!fCorrTriggerMBtoNDTrackEventMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoND_corr_matrix");\r
+        return;\r
       }\r
 \r
       // trigger bias correction (MBtoNSD)\r
       fCorrTriggerMBtoNSDTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoNSD_corr_matrix");\r
       if(!fCorrTriggerMBtoNSDTrackEventMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoNSD_corr_matrix");\r
+        return;\r
       }\r
 \r
       // trigger bias correction (MBtoInel) \r
       fCorrTriggerMBtoInelTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_trig_MBtoInel_corr_matrix");\r
       if(!fCorrTriggerMBtoInelTrackEventMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_trig_MBtoInel_corr_matrix");\r
+        return;\r
       }\r
     \r
       // vertex reconstruction efficiency correction (zv,pt,eta)\r
       fCorrTrackEventMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_event_corr_matrix");\r
       if(!fCorrTrackEventMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_event_corr_matrix");\r
+        return;\r
       }\r
 \r
       // track reconstruction efficiency correction (zv,pt,eta)\r
       fCorrTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_corr_matrix");\r
       if(!fCorrTrackMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_corr_matrix");\r
+        return;\r
       }\r
 \r
       // high pt track reconstruction efficiency correction (zv,pt,eta)\r
       fCorrHighPtTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_highPt_track_corr_matrix");\r
       if(!fCorrHighPtTrackMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_highPt_track_corr_matrix");\r
+        return;\r
       }\r
 \r
       // secondary tracks contamination correction (zv,pt,eta)\r
       fContTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_track_cont_matrix");\r
       if(!fContTrackMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_track_cont_matrix");\r
+        return;\r
       }\r
 \r
       // multiply reconstructed tracks correction\r
       fContMultTrackMatrix = (THnSparseF*)folder->FindObject("zv_pt_eta_mult_track_cont_matrix");\r
       if(!fContMultTrackMatrix) {\r
          Printf("No %s matrix \n", "zv_pt_eta_mult_track_cont_matrix");\r
+        return;\r
       }\r
     }\r
   }\r
@@ -980,25 +1027,131 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
 \r
   // trigger selection\r
   Bool_t isEventTriggered = kTRUE;\r
+  AliPhysicsSelection *trigSel = NULL;\r
+  AliTriggerAnalysis *trigAna = NULL; // needed for andV0\r
+\r
   if(evtCuts->IsTriggerRequired())  \r
   {\r
-    AliPhysicsSelection *trigSel = GetPhysicsTriggerSelection();\r
+    //\r
+    trigSel = GetPhysicsTriggerSelection();\r
     if(!trigSel) {\r
       AliDebug(AliLog::kError, "cannot get trigSel");\r
       return;\r
     }\r
-\r
-    if(IsUseMCInfo()) { \r
-      //static AliTriggerAnalysis* triggerAnalysis = new AliTriggerAnalysis;\r
-      //isEventTriggered = triggerAnalysis->IsTriggerFired(esdEvent, GetTrigger());\r
+    \r
+    if(IsUseMCInfo()) \r
+    { \r
       trigSel->SetAnalyzeMC();\r
-      isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+\r
+      if(GetParticleMode() == AlidNdPtHelper::kVZEROCase1)\r
+      {\r
+        // check V0 systematics (case1)\r
+       // Initialization done in the macro\r
+        trigAna = trigSel->GetTriggerAnalysis();\r
+        if(!trigAna) \r
+          return;\r
+\r
+        //trigAna->SetV0HwPars(15, 61.5, 86.5);\r
+        //trigAna->SetV0AdcThr(15);\r
+\r
+        isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+        //printf("MB1 & kVZEROCase1  %d \n",isEventTriggered);\r
+        //isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+       \r
+        if(GetTrigger() == AliTriggerAnalysis::kV0AND) \r
+       {\r
+          isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+          //printf("V0AND %d \n",isEventTriggered);\r
+        }\r
+      }\r
+      else if(GetParticleMode() == AlidNdPtHelper::kVZEROCase2)\r
+      {\r
+        // check V0 systematics (case2 only in MC)\r
+       // Initialization done in the macro\r
+\r
+        trigAna = trigSel->GetTriggerAnalysis();\r
+        if(!trigAna) \r
+          return;\r
+\r
+        //trigAna->SetV0HwPars(0, 0, 125);\r
+        //trigAna->SetV0AdcThr(0);\r
+\r
+        isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+        //isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+       \r
+       if(GetTrigger() == AliTriggerAnalysis::kV0AND) \r
+       {\r
+          isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+          //printf("V0AND %d \n",isEventTriggered);\r
+        }\r
+      }\r
+      else {\r
+        isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+        //printf("MB1 %d \n",isEventTriggered);\r
+       \r
+        if(GetTrigger() == AliTriggerAnalysis::kV0AND) \r
+       {\r
+          trigAna = trigSel->GetTriggerAnalysis();\r
+          if(!trigAna) \r
+            return;\r
+\r
+          isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+          //printf("V0AND %d \n",isEventTriggered);\r
+        }\r
+      }\r
     }\r
     else {\r
-      isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+      //\r
+      // 0-multiplicity bin for LHC background correction\r
+      //\r
+      if( GetAnalysisMode() == AlidNdPtHelper::kTPCITS || \r
+          GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtx || \r
+         GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtxUpdate || \r
+          GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || \r
+         GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt ) \r
+      {\r
+        trigSel->SetBin0CallbackViaPointer(&AlidNdPtAnalysis::IsBinZeroTrackSPDvtx);\r
+      } else {\r
+        trigSel->SetBin0CallbackViaPointer(&AlidNdPtAnalysis::IsBinZeroSPDvtx);\r
+      }\r
+\r
+      if(GetParticleMode() == AlidNdPtHelper::kVZEROCase1)\r
+      {\r
+        // check V0 systematics (case1)\r
+       // Initialization done in the macro\r
+        trigAna = trigSel->GetTriggerAnalysis();\r
+        if(!trigAna) \r
+          return;\r
+\r
+        //trigAna->SetV0HwPars(15, 61.5, 86.5);\r
+        //trigAna->SetV0AdcThr(15);\r
+\r
+        isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+        //isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+       \r
+        if(GetTrigger() == AliTriggerAnalysis::kV0AND) \r
+       {\r
+          isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+          //printf("V0AND %d \n",isEventTriggered);\r
+        }\r
+      }\r
+      else {\r
+        isEventTriggered = trigSel->IsCollisionCandidate(esdEvent);\r
+        //printf("MB1 %d \n",isEventTriggered);\r
+       \r
+        if(GetTrigger() == AliTriggerAnalysis::kV0AND) \r
+       {\r
+          trigAna = trigSel->GetTriggerAnalysis();\r
+          if(!trigAna) \r
+            return;\r
+\r
+          isEventTriggered = trigAna->IsOfflineTriggerFired(esdEvent, GetTrigger());\r
+          //printf("V0AND %d \n",isEventTriggered);\r
+        }\r
+      }\r
     }\r
   }\r
-  \r
+\r
   // use MC information\r
   AliHeader* header = 0;\r
   AliGenEventHeader* genHeader = 0;\r
@@ -1045,7 +1198,7 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
     fMCEventHist1->Fill(vMCEventHist1);\r
 \r
     // multipliticy of all MC primary tracks\r
-    // in Zvtx, pt and eta ranges\r
+    // in Zvtx, eta ranges\r
     multMCTrueTracks = AlidNdPtHelper::GetMCTrueTrackMult(mcEvent,evtCuts,accCuts);\r
 \r
   } // end bUseMC\r
@@ -1058,60 +1211,53 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
     Bool_t bRedoTPCVertex = evtCuts->IsRedoTPCVertex();\r
     Bool_t bUseConstraints = evtCuts->IsUseBeamSpotConstraint();\r
     vtxESD = AlidNdPtHelper::GetVertex(esdEvent,evtCuts,accCuts,esdTrackCuts,GetAnalysisMode(),kFALSE,bRedoTPCVertex,bUseConstraints); \r
-    isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, GetAnalysisMode(), kFALSE); \r
+    isRecVertex = AlidNdPtHelper::TestRecVertex(vtxESD, esdEvent->GetPrimaryVertexSPD(), GetAnalysisMode(), kFALSE);\r
   }\r
-  if( IsUseMCInfo() &&  !evtCuts->IsRecVertexRequired() ) {\r
-    vtxESD = new AliESDVertex(vtxMC[2],10.,genHeader->NProduced());\r
+\r
+  if( IsUseMCInfo() && !evtCuts->IsRecVertexRequired() ) {\r
+    vtxESD = new AliESDVertex(vtxMC[2],10.,genHeader->NProduced(),"smearMC");\r
     isRecVertex = kTRUE;\r
   }\r
+\r
   Bool_t isEventOK = evtCuts->AcceptEvent(esdEvent,mcEvent,vtxESD) && isRecVertex; \r
-  //printf("isEventOK %d, isRecVertex %d, nContributors %d, Zv %f\n",isEventOK, isRecVertex, vtxESD->GetNContributors(), vtxESD->GetZv());\r
+  //printf("isEventOK %d, isEventTriggered %d \n",isEventOK, isEventTriggered);\r
+  //printf("GetAnalysisMode() %d \n",GetAnalysisMode());\r
 \r
-  //\r
-  // get multiplicity vertex contributors\r
-  //\r
+  // vertex contributors\r
   Int_t multMBTracks = 0; \r
-  if(GetAnalysisMode() == AlidNdPtHelper::kTPC || GetAnalysisMode() == AlidNdPtHelper::kMCRec) {  \r
-    multMBTracks = AlidNdPtHelper::GetTPCMBTrackMult(esdEvent,evtCuts,accCuts,esdTrackCuts);\r
+  if(GetAnalysisMode() == AlidNdPtHelper::kTPC) \r
+  {  \r
+     if(vtxESD->GetStatus() && isRecVertex)\r
+       multMBTracks = AlidNdPtHelper::GetTPCMBTrackMult(esdEvent,evtCuts,accCuts,esdTrackCuts);\r
   } \r
-  else if(GetAnalysisMode() == AlidNdPtHelper::kTPCITS || GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || \r
-          GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode() == AlidNdPtHelper::kMCRec || \r
-         GetAnalysisMode()==AlidNdPtHelper::kTPCITSHybrid) {\r
-    //if(vtxESD->GetStatus())\r
-    //   multMBTracks = vtxESD->GetNContributors();\r
-\r
-    // origin Jan Fiete GO\r
-    const AliMultiplicity* mult = esdEvent->GetMultiplicity();\r
-    if (mult) {\r
-      Int_t trackletCount = 0;\r
-\r
-      for(Int_t i=0; i<mult->GetNumberOfTracklets(); ++i) {\r
-        Float_t deltaPhi = mult->GetDeltaPhi(i);\r
-        // prevent values to be shifted by 2 Pi()\r
-        if (deltaPhi < -TMath::Pi())\r
-          deltaPhi += TMath::Pi() * 2;\r
-        if (deltaPhi > TMath::Pi())\r
-          deltaPhi -= TMath::Pi() * 2;\r
-\r
-         //if (fDeltaPhiCut > 0 && TMath::Abs(deltaPhi) > fDeltaPhiCut)\r
-         // continue;\r
-\r
-       trackletCount++;\r
-       }\r
-       //multMBTracks = mult->GetNumberOfTracklets();\r
-       multMBTracks = trackletCount;\r
-       //printf("trackletCount %d \n", trackletCount);\r
-     }\r
-     else {\r
-       AliDebug(AliLog::kError, Form("Multiplicty %p", mult));\r
-       return; \r
-     }\r
+  else if( GetAnalysisMode() == AlidNdPtHelper::kTPCITS ||  GetAnalysisMode() == AlidNdPtHelper::kTPCSPDvtx || \r
+           GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode()==AlidNdPtHelper::kTPCITSHybrid ) \r
+  {\r
+     const AliMultiplicity* mult = esdEvent->GetMultiplicity();\r
+     //if(mult && vtxESD->GetStatus() && isRecVertex)\r
+     if(mult)\r
+       multMBTracks = mult->GetNumberOfTracklets();\r
+    \r
   } \r
+  else if( GetAnalysisMode() == AlidNdPtHelper::kTPCITS || \r
+           GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtx || \r
+          GetAnalysisMode() == AlidNdPtHelper::kTPCTrackSPDvtxUpdate || \r
+           GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || \r
+          GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt )\r
+  {\r
+     if(vtxESD->GetStatus() && isRecVertex)\r
+       multMBTracks = vtxESD->GetNContributors();\r
+\r
+  }\r
   else {\r
-    AliDebug(AliLog::kError, Form("Found analysis type %s", GetAnalysisMode()));\r
+    AliDebug(AliLog::kError, Form("Found analysis type %d", GetAnalysisMode()));\r
     return; \r
   }\r
 \r
+  Bool_t isTrigAndVertex = isEventTriggered && isEventOK;\r
+  Double_t vEventCount[2] = { isEventTriggered, isTrigAndVertex};\r
+  fEventCount->Fill(vEventCount);\r
+\r
   //\r
   // correct event and track histograms\r
   //\r
@@ -1120,6 +1266,7 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
   Int_t *labelsRec=0;\r
   Bool_t isCosmic = kFALSE;\r
 \r
+\r
   if(isEventOK && isEventTriggered)\r
   {\r
     // get all charged tracks\r
@@ -1171,9 +1318,11 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
         if(!isCosmic) continue;\r
       }\r
 \r
-      if(esdTrackCuts->AcceptTrack(track) && accCuts->AcceptTrack(track)) \r
-        multRecTemp++;\r
-    }  \r
+      if(esdTrackCuts->AcceptTrack(track)) \r
+      {\r
+          if(accCuts->AcceptTrack(track)) multRecTemp++;\r
+      }  \r
+    }\r
 \r
     //\r
     for(Int_t i=0; i<entries;++i) \r
@@ -1182,7 +1331,6 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
       if(!track) continue;\r
       if(track->Charge()==0) continue;\r
 \r
-\r
       // only postive charged \r
       if(GetParticleMode() == AlidNdPtHelper::kPlus && track->Charge() < 0) \r
       continue;\r
@@ -1192,8 +1340,9 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
       continue;\r
         \r
       // track-level corrections\r
-      if(esdTrackCuts->AcceptTrack(track)) \r
-      {\r
+      if(!esdTrackCuts->AcceptTrack(track))  continue;\r
+      //if(GetAnalysisMode()==AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt && !AlidNdPtHelper::IsGoodImpPar(track)) continue;\r
+\r
         // cosmics analysis\r
         isCosmic = kFALSE;\r
         if( GetParticleMode()==AlidNdPtHelper::kCosmic )\r
@@ -1221,10 +1370,10 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
         // if TPC-ITS hybrid tracking (kTPCITSHybrid)\r
         // replace track parameters with TPC-ony track parameters\r
         //\r
-        if( GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybrid ) \r
+        if( GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybrid || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtx || GetAnalysisMode() == AlidNdPtHelper::kTPCITSHybridTrackSPDvtxDCArPt\r
         {\r
-          // Relate TPC-only tracks to SPD vertex\r
-          isOK = track->RelateToVertexTPCBxByBz(esdEvent->GetPrimaryVertexSPD(), b, kVeryBig);\r
+          // Relate TPC-only tracks to Tracks or SPD vertex\r
+          isOK = track->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);\r
           if(!isOK) continue;\r
 \r
          // replace esd track parameters with TPCinner\r
@@ -1236,13 +1385,13 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
         } \r
 \r
         //\r
-        if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate) \r
+        if (GetAnalysisMode()==AlidNdPtHelper::kTPCSPDvtxUpdate || GetAnalysisMode()==AlidNdPtHelper::kTPCTrackSPDvtxUpdate\r
         {\r
           //\r
           // update track parameters\r
           //\r
            AliExternalTrackParam cParam;\r
-          isOK = track->RelateToVertexTPC(esdEvent->GetPrimaryVertexSPD(),esdEvent->GetMagneticField(),kVeryBig,&cParam);\r
+          isOK = track->RelateToVertexTPC(vtxESD,esdEvent->GetMagneticField(),kVeryBig,&cParam);\r
           if(!isOK) continue;\r
           track->Set(cParam.GetX(),cParam.GetAlpha(),cParam.GetParameter(),cParam.GetCovariance());\r
 \r
@@ -1273,10 +1422,11 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
             multRec++;\r
           }\r
          }\r
-       }\r
-    }\r
+      }\r
+\r
     // event-level corrections\r
-    if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) { \r
+    if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) \r
+    { \r
       FillHistograms(AlidNdPtHelper::kRecEvents,vtxMC[2],multMBTracks);\r
     }\r
     else {\r
@@ -1285,43 +1435,45 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
 \r
     // calculate meanPt from the event\r
     Double_t meanPtMult[8] = {0};  \r
-    Double_t meanPtTrueMult[8] = {0};  \r
     for (Int_t i = 0; i<8; i++) {\r
       if(!fCorrRecTrackMultHist1[i]) continue;\r
-      meanPtMult[i] = fCorrRecTrackPt1[i]->Projection(0)->GetMean();    \r
+      TH1D *hp = (TH1D *)fCorrRecTrackPt1[i]->Projection(0);\r
+      if(!hp) continue;\r
+      meanPtMult[i] = hp->GetMean();    \r
       Double_t vCorrRecTrackMeanPtMultHist1[2] = {meanPtMult[i],multRecTemp};\r
       fCorrRecTrackMeanPtMultHist1[i]->Fill(vCorrRecTrackMeanPtMultHist1); \r
       \r
       if( IsUseMCInfo() ) {\r
-        if(!fCorrRecTrackPt1[i]) continue;\r
-        meanPtTrueMult[i] = fCorrRecTrackPt1[i]->Projection(0)->GetMean();    \r
         Double_t vCorrRecTrackMeanPtTrueMultHist1[2] = {meanPtMult[i],multMCTrueTracks};\r
         fCorrRecTrackMeanPtTrueMultHist1[i]->Fill(vCorrRecTrackMeanPtTrueMultHist1); \r
       }\r
 \r
       // reset pt histo for the next event\r
       if(fCorrRecTrackPt1[i])  fCorrRecTrackPt1[i]->Reset();\r
+      if(hp) delete hp;\r
     }\r
 \r
     // control event histograms\r
     Double_t vRecEventHist1[3] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv()};\r
     fRecEventHist1->Fill(vRecEventHist1);\r
 \r
-    // correlation track multiplicity vs tracklet multiplicity\r
-    Double_t vRecEventMultHist1[3] = {multRecTemp, multMBTracks};\r
+    // correlation track multiplicity vs MB track multiplicity\r
+    Double_t vRecEventMultHist1[3] = {multRec, multMBTracks};\r
     fRecEventMultHist1->Fill(vRecEventMultHist1);\r
-\r
-  } \r
+  }\r
 \r
   // empty events corrections\r
   // no reconstructed zv\r
-  if(isEventTriggered && multMBTracks==0) {\r
-    if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) {\r
+  if( isEventTriggered && multMBTracks==0 ) \r
+  {\r
+    if(GetAnalysisMode()==AlidNdPtHelper::kMCRec && IsUseMCInfo()) \r
+    {\r
       FillHistograms(AlidNdPtHelper::kTriggeredEvents,vtxMC[2],multMBTracks);\r
     }\r
     else {\r
       Double_t zv = fZvNorm->GetRandom();\r
-      FillHistograms(AlidNdPtHelper::kTriggeredEvents,zv,multMBTracks);\r
+      if(zv>evtCuts->GetMinZv() && zv<evtCuts->GetMaxZv())\r
+        FillHistograms(AlidNdPtHelper::kTriggeredEvents,zv,multMBTracks);\r
     }\r
   }\r
 \r
@@ -1335,14 +1487,19 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
       //\r
       Double_t vMCEventMatrix[2] = {vtxMC[2],multMBTracks};\r
       fMCAllEventMultHist1->Fill(vMCEventMatrix);\r
+\r
       if(evtType == AliPWG0Helper::kND) {\r
         fMCAllNDEventMultHist1->Fill(vMCEventMatrix);\r
       }\r
       if(evtType != AliPWG0Helper::kSD) {\r
         fMCAllNSDEventMultHist1->Fill(vMCEventMatrix);\r
       }\r
-      if(isEventTriggered) fMCTriggerMultHist1->Fill(vMCEventMatrix);\r
-      if(isEventTriggered && isEventOK) fMCEventMultHist1->Fill(vMCEventMatrix);\r
+      if(isEventTriggered) {\r
+        fMCTriggerMultHist1->Fill(vMCEventMatrix);\r
+      }\r
+      if(isEventTriggered && isEventOK) {\r
+        fMCEventMultHist1->Fill(vMCEventMatrix);\r
+      }\r
 \r
       //\r
       // MC histograms for efficiency studies\r
@@ -1359,6 +1516,8 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
         continue;\r
 \r
         // only charged particles\r
+         \r
+        if(!particle->GetPDG()) continue;\r
         Double_t charge = particle->GetPDG()->Charge()/3.;\r
         if (TMath::Abs(charge) < 0.001)\r
           continue;\r
@@ -1384,9 +1543,9 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
         // sum up pt in the event\r
        sumPtMC +=gpt; \r
 \r
-        Double_t valMCAllTrackMultHist1[3] = {gpt,geta,multRec};         \r
+        Double_t valMCAllTrackMultHist1[3] = {gpt,geta,multRecTemp};     \r
         Double_t valMCAllTrackTrueMultHist1[3] = {gpt,geta,multMCTrueTracks};    \r
-        Double_t valMCAllTrackTrueMultHist2[3] = {gpt,multRec,multMCTrueTracks};         \r
+        Double_t valMCAllTrackTrueMultHist2[3] = {gpt,multRecTemp,multMCTrueTracks};     \r
 \r
         fMCAllPrimTrackMultHist1->Fill(valMCAllTrackMultHist1);\r
         fMCAllPrimTrackTrueMultHist1->Fill(valMCAllTrackTrueMultHist1);\r
@@ -1419,10 +1578,14 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
       //\r
       Double_t meanPtMCMult = 0;\r
       Double_t meanPtMCTrueMult = 0;\r
-      if(multRec) meanPtMCMult = sumPtMC/multRec; \r
-      if(multMCTrueTracks) meanPtMCTrueMult = sumPtMC/multMCTrueTracks; \r
+      if(multRecTemp) { \r
+        meanPtMCMult = sumPtMC/multRecTemp; \r
+      }\r
+      if(multMCTrueTracks) { \r
+        meanPtMCTrueMult = sumPtMC/multMCTrueTracks; \r
+      }\r
 \r
-      Double_t valMCMeanPtMult[2] = {meanPtMCMult,multRec};      \r
+      Double_t valMCMeanPtMult[2] = {meanPtMCMult,multRecTemp};          \r
       Double_t valMCMeanPtTrueMult[2] = {meanPtMCTrueMult,multMCTrueTracks};     \r
 \r
       fMCAllPrimTrackMeanPtMult1->Fill(valMCMeanPtMult);\r
@@ -1444,7 +1607,6 @@ void AlidNdPtCorrection::Process(AliESDEvent *esdEvent, AliMCEvent *mcEvent)
           fMCEventPrimTrackMeanPtMult1->Fill(valMCMeanPtMult);\r
           fMCEventPrimTrackMeanPtTrueMult1->Fill(valMCMeanPtTrueMult);\r
       }\r
-\r
     }\r
   } // end bUseMC\r
 \r
@@ -1482,18 +1644,23 @@ void AlidNdPtCorrection::FillHistograms(AlidNdPtHelper::EventObject eventObj, Do
 \r
   if(eventObj==AlidNdPtHelper::kTriggeredEvents && multMBTracks==0) // empty triggered events\r
   {\r
+    Double_t factLHCBack = 1.;\r
+    if(!IsUseMCInfo()) factLHCBack = fLHCBin0Background->GetBinContent(1); \r
+\r
+\r
     Int_t bin = fZvEmptyEventsNorm->FindBin(zv);\r
     Double_t factZ = fZvEmptyEventsNorm->GetBinContent(bin);\r
+\r
     Double_t corrToInelF0 = GetCorrFactZvMult(fCorrTriggerMBtoInelEventMatrix,zv,multMBTracks);\r
     Double_t corrToNDF0 = GetCorrFactZvMult(fCorrTriggerMBtoNDEventMatrix,zv,multMBTracks);\r
     Double_t corrToNSDF0 = GetCorrFactZvMult(fCorrTriggerMBtoNSDEventMatrix,zv,multMBTracks);\r
-    //printf("factZ %f, corrToInelF0 %f, corrToNDF0 %f, corrToNSDF0 %f \n",factZ,corrToInelF0,corrToNDF0,corrToNSDF0);\r
+    //printf("factLHCBack %f, factZ %f, corrToInelF0 %f, corrToNDF0 %f, corrToNSDF0 %f \n",factLHCBack,factZ,corrToInelF0,corrToNDF0,corrToNSDF0);\r
 \r
     fCorrRecEventHist2[0]->Fill(vEventMatrix);\r
-    fCorrRecEventHist2[1]->Fill(vEventMatrix,factZ);\r
-    fCorrRecEventHist2[2]->Fill(vEventMatrix,factZ*corrToInelF0);\r
-    fCorrRecEventHist2[3]->Fill(vEventMatrix,factZ*corrToNDF0);\r
-    fCorrRecEventHist2[4]->Fill(vEventMatrix,factZ*corrToNSDF0);\r
+    fCorrRecEventHist2[1]->Fill(vEventMatrix,factLHCBack*factZ);\r
+    fCorrRecEventHist2[2]->Fill(vEventMatrix,factLHCBack*factZ*corrToInelF0);\r
+    fCorrRecEventHist2[3]->Fill(vEventMatrix,factLHCBack*factZ*corrToNDF0);\r
+    fCorrRecEventHist2[4]->Fill(vEventMatrix,factLHCBack*factZ*corrToNSDF0);\r
   }\r
 }\r
 \r
@@ -1517,6 +1684,7 @@ void AlidNdPtCorrection::FillHistograms(AliESDtrack * const esdTrack, AliStack *
     TParticle* particle = stack->Particle(label);\r
     if(!particle) return;\r
    \r
+    if(!particle->GetPDG()) return;\r
     Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3\r
     if(TMath::Abs(gq)<0.001) return;\r
     Float_t gpt = particle->Pt();\r
@@ -1542,7 +1710,7 @@ void AlidNdPtCorrection::FillHistograms(AliESDtrack * const esdTrack, AliStack *
   {\r
     // track level corrections\r
     Double_t trackEffF = 1.0;  \r
-    if(pt < 2.5) trackEffF = GetCorrFactZvPtEta(fCorrTrackMatrix,zv,pt,eta);\r
+    if(pt < 2.6) trackEffF = GetCorrFactZvPtEta(fCorrTrackMatrix,zv,pt,eta);\r
     else trackEffF = GetCorrFactZvPtEta(fCorrHighPtTrackMatrix,zv,pt,eta);\r
 \r
     Double_t trackContF = GetContFactZvPtEta(fContTrackMatrix,zv,pt,eta);\r
@@ -1603,6 +1771,7 @@ void AlidNdPtCorrection::FillHistograms(AliStack * const stack, Int_t /*label*/,
   if(mother) mother_pdg = TMath::Abs(mother->GetPdgCode()); // take abs for visualisation only\r
   Int_t mech = particle->GetUniqueID(); // production mechanism\r
 \r
+  if(!particle->GetPDG()) return;\r
   Double_t gq = particle->GetPDG()->Charge()/3.0; // Charge units |e|/3 \r
   Float_t gpt = particle->Pt();\r
   Float_t qgpt = particle->Pt() * gq;\r
@@ -1663,7 +1832,15 @@ Double_t AlidNdPtCorrection::GetContFactZvPtEta(THnSparse * const hist, Double_t
  Int_t binz = az->FindBin(eta);\r
  Int_t dim[3] = {binx,biny,binz};\r
 \r
- Double_t fact  = 1.0-hist->GetBinContent(dim);  \r
+ //\r
+ //  additional correction for secondary \r
+ //  particles with strangeness (data driven)\r
+ // \r
+ Double_t corrFact = 1.;\r
+ if(!IsUseMCInfo()) corrFact = AlidNdPtHelper::GetStrangenessCorrFactor(pt);\r
+ //printf("pt %f, corrFact %f \n", pt, corrFact);\r
+\r
+ Double_t fact  = 1.0 - corrFact*hist->GetBinContent(dim);  \r
  //Double_t fact  = hist->GetBinContent(dim);  \r
 \r
 return fact;\r
@@ -1719,11 +1896,18 @@ Long64_t AlidNdPtCorrection::Merge(TCollection* const list)
 \r
   // collection of generated histograms\r
 \r
+  // physics selection\r
+  TList *collPhysSelection = new TList;\r
+\r
   Int_t count=0;\r
   while((obj = iter->Next()) != 0) {\r
     AlidNdPtCorrection* entry = dynamic_cast<AlidNdPtCorrection*>(obj);\r
     if (entry == 0) continue; \r
   \r
+    collPhysSelection->Add(entry->GetPhysicsTriggerSelection());\r
+\r
+    fEventCount->Add(entry->fEventCount);\r
+\r
     fMCEventHist1->Add(entry->fMCEventHist1);\r
     fRecEventHist1->Add(entry->fRecEventHist1);\r
     fRecEventMultHist1->Add(entry->fRecEventMultHist1);\r
@@ -1789,6 +1973,11 @@ Long64_t AlidNdPtCorrection::Merge(TCollection* const list)
   count++;\r
   }\r
 \r
+  //\r
+  AliPhysicsSelection *trigSelection = GetPhysicsTriggerSelection();\r
+  trigSelection->Merge(collPhysSelection);\r
+  if(collPhysSelection) delete collPhysSelection;\r
+\r
 return count;\r
 }\r
  \r
@@ -1850,6 +2039,12 @@ void AlidNdPtCorrection::Analyse()
  \r
   printf("minEta %f, maxEta %f \n",minEta, maxEta);\r
 \r
+  //\r
+  // LHC backgraund in all and 0-bins\r
+  //\r
+  AliPhysicsSelection *trigSel = GetPhysicsTriggerSelection();\r
+  trigSel->SaveHistograms("physics_selection");\r
+\r
   //\r
   // cosmics background histo\r
   //\r