]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliAnalysisTaskMultiDielectronTG.cxx
including switch to set on/off iso-track core removal, cleaning and bug fix
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliAnalysisTaskMultiDielectronTG.cxx
index d5c56613f0efe25e95db856601ea82b6888ab591..2ab96b032f87cb5194775386f7e2025a000d0257 100644 (file)
@@ -49,9 +49,6 @@
 #include <cstdlib> 
 #include <TRandom.h>
 
-using std::vector;
-using std::deque;
-
 const char* kPairClassNamesTG[7] = {
   "unlike",
   "like_pp",
@@ -98,9 +95,12 @@ AliAnalysisTaskMultiDielectronTG::AliAnalysisTaskMultiDielectronTG() :
   fVemtmp(0x0),
   fVeptmp(0x0),
   fdconvphiv(acos(-1.0)),
+  fdconvMee(100),
   fdop(0),
   fbz(0),
-  fdv0mixing(kTRUE)
+  fdv0mixing(kTRUE),
+  fBGRejUnlike(kFALSE),
+  fBGRejLike(kTRUE)
 {
   //
   // Constructor
@@ -139,9 +139,12 @@ AliAnalysisTaskMultiDielectronTG::AliAnalysisTaskMultiDielectronTG(const char *n
   fVemtmp(0x0),
   fVeptmp(0x0),
   fdconvphiv(acos(-1.0)),
+  fdconvMee(100),
   fdop(0),
   fbz(0),
-  fdv0mixing(kTRUE)
+  fdv0mixing(kTRUE),
+  fBGRejUnlike(kFALSE),
+  fBGRejLike(kTRUE)
 {
   //
   // Constructor
@@ -619,7 +622,10 @@ void AliAnalysisTaskMultiDielectronTG::FinishTaskOutput()
     die->SaveDebugTree();
     AliDielectronMixingHandler *mix=die->GetMixingHandler();
 //    printf("\n\n\n===============\ncall mix in Terminate: %p (%p)\n=================\n\n",mix,die);
-    if (mix) mix->MixRemaining(die);
+    if(!mix) continue;
+    for (Int_t ipool=0; ipool<mix->GetNumberOfBins(); ++ipool){
+      mix->MixRemaining(die, ipool);
+    }
   }
   PostData(1, &fListHistos);
   PostData(2, &fListCF);
@@ -637,7 +643,9 @@ void AliAnalysisTaskMultiDielectronTG::CheckGhostPairs(vector<AliDielectronSingl
     for(int i1=0; i1<(int)e1.size(); i1++){
       reject = false;
       for(int i2=i1+1; i2<(int)e1.size(); i2++){
-        if( fabs(e1[i1]->Phi() - e1[i2]->Phi())<0.01 ){
+        if( fabs(e1[i1]->Phi() - e1[i2]->Phi())<0.01 && 
+           fabs(e1[i1]->Eta() - e1[i2]->Eta())<0.005
+           ){
           reject = true;
           e1[i2]->SetGstFlag(0);
         }
@@ -647,6 +655,25 @@ void AliAnalysisTaskMultiDielectronTG::CheckGhostPairs(vector<AliDielectronSingl
   }
 }
 
+//_________________________________________________________________________________
+Bool_t AliAnalysisTaskMultiDielectronTG::CheckGhost(vector<AliDielectronSingleTG*> e1, vector<AliDielectronSingleTG*> e2)
+{
+  ////// To be sure whether there are no ghost pairs in h event mixing 
+
+  if(e1.size()>0 && e2.size()>0){
+    for(int i1=0; i1<(int)e1.size(); i1++){
+      for(int i2=0; i2<(int)e2.size(); i2++){
+        if( fabs(e1[i1]->Phi() - e2[i2]->Phi())<0.01 && 
+           fabs(e1[i1]->Eta() - e2[i2]->Eta())<0.005
+           ){
+         return true;
+        }
+      }
+    }
+  }
+  return false;
+}
+
 //_________________________________________________________________________________
 void AliAnalysisTaskMultiDielectronTG::RandomizePool(vector<AliDielectronSingleTG*> e1, vector<AliDielectronSingleTG*> e2)
 {
@@ -753,7 +780,7 @@ void AliAnalysisTaskMultiDielectronTG::CalcPair(vector<AliDielectronSingleTG*> v
     nmixed = 0;
     for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
       int ntry = 0;
-      while(ntry<fgkMAXTRY) {
+      while((fBGRejUnlike && CheckGhost(ve1, fvem[ibuf][idie][izbin][icent][irp])) &&  ntry<fgkMAXTRY) {
         ReshuffleBuffer(fvem[ibuf][idie][izbin][icent][irp],fpoolm[idie][izbin][icent][irp]);
         ntry++;
       }
@@ -772,7 +799,7 @@ void AliAnalysisTaskMultiDielectronTG::CalcPair(vector<AliDielectronSingleTG*> v
     nmixed = 0;
     for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
       int ntry = 0;
-      while(ntry<fgkMAXTRY) {
+      while((fBGRejUnlike && CheckGhost(ve2, fvep[ibuf][idie][izbin][icent][irp])) &&  ntry<fgkMAXTRY) {
         ReshuffleBuffer(fvep[ibuf][idie][izbin][icent][irp],fpoolp[idie][izbin][icent][irp]);
         ntry++;
       }
@@ -792,7 +819,7 @@ void AliAnalysisTaskMultiDielectronTG::CalcPair(vector<AliDielectronSingleTG*> v
     nmixed = 0;
     for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
       int ntry = 0;
-      while(ntry<fgkMAXTRY) {
+      while((fBGRejLike && CheckGhost(ve1, fvep[ibuf][idie][izbin][icent][irp])) &&  ntry<fgkMAXTRY) {
         ReshuffleBuffer(fvep[ibuf][idie][izbin][icent][irp],fpoolp[idie][izbin][icent][irp]);
         ntry++;
       }
@@ -812,7 +839,7 @@ void AliAnalysisTaskMultiDielectronTG::CalcPair(vector<AliDielectronSingleTG*> v
     nmixed = 0;
     for(int ibuf=0;(nmixed<fgkNMix);ibuf++) {
       int ntry = 0;
-      while(ntry<fgkMAXTRY) {
+      while((fBGRejLike && CheckGhost(ve2, fvem[ibuf][idie][izbin][icent][irp])) &&  ntry<fgkMAXTRY) {
         ReshuffleBuffer(fvem[ibuf][idie][izbin][icent][irp],fpoolm[idie][izbin][icent][irp]);
         ntry++;
       }
@@ -943,7 +970,7 @@ void AliAnalysisTaskMultiDielectronTG::FillPair(AliDielectronSingleTG *iep,
   Bool_t pairClass1=fHistos->GetHistogramList()->FindObject(className1.Data())!=0x0;
   Bool_t pairClass2=fHistos->GetHistogramList()->FindObject(className2.Data())!=0x0;
 
-  if (pairClass1 && PairTrackcut(dphiv, dcos, idie)==true){
+  if (pairClass1 && PairTrackcut(dphiv, dcos, dmass, idie)==true){
     ///import pair variables to values!!
     values[AliDielectronVarManager::kPx] = dpxpair;
     values[AliDielectronVarManager::kPy] = dpypair;
@@ -960,11 +987,12 @@ void AliAnalysisTaskMultiDielectronTG::FillPair(AliDielectronSingleTG *iep,
     values[AliDielectronVarManager::kPhivPair] = dphiv;
     values[AliDielectronVarManager::kPhi]  = dphipair;
     values[AliDielectronVarManager::kOpeningAngle]  = dcos;
+    values[AliDielectronVarManager::kCosPointingAngle]  = TMath::Abs(TMath::ATan2(TMath::Sin(iep->Phi()-iem->Phi()),TMath::Cos(iep->Phi()-iem->Phi())));
     fHistos->FillClass(className1, AliDielectronVarManager::kNMaxValues, values);
   }
 
 
-  if (pairClass2 && PairTrackcut(dphiv, dopeningangle, idie)==true){
+  if (pairClass2 && PairTrackcut(dphiv, dopeningangle, dv0mass, idie)==true){
     values[AliDielectronVarManager::kPx] = dv0pxpair;
     values[AliDielectronVarManager::kPy] = dv0pypair;
     values[AliDielectronVarManager::kPz] = dv0pzpair;
@@ -980,6 +1008,7 @@ void AliAnalysisTaskMultiDielectronTG::FillPair(AliDielectronSingleTG *iep,
     values[AliDielectronVarManager::kPhivPair] = dphivpair;
     values[AliDielectronVarManager::kPhi]  = dv0phipair;
     values[AliDielectronVarManager::kOpeningAngle]  = dopeningangle;
+    values[AliDielectronVarManager::kCosPointingAngle]  = TMath::Abs(TMath::ATan2(TMath::Sin(iep->Phi()-iem->Phi()),TMath::Cos(iep->Phi()-iem->Phi())));
     fHistos->FillClass(className2, AliDielectronVarManager::kNMaxValues, values);
   }
 
@@ -988,7 +1017,7 @@ void AliAnalysisTaskMultiDielectronTG::FillPair(AliDielectronSingleTG *iep,
 }
 
 //_________________________________________________________________________________
-bool AliAnalysisTaskMultiDielectronTG::PairTrackcut(double phiv, double op, int idie)
+bool AliAnalysisTaskMultiDielectronTG::PairTrackcut(double phiv, double op, double mass, int idie)
 {
 
   //
@@ -1001,9 +1030,9 @@ bool AliAnalysisTaskMultiDielectronTG::PairTrackcut(double phiv, double op, int
   if(fRejectPairFlag[idie] == 1 || fRejectPairFlag[idie] == 2 ||
      fRejectPairFlag[idie] == 3 || fRejectPairFlag[idie] == 4 ){
     if(fRejectPairFlag[idie] == 2 || fRejectPairFlag[idie] == 4 ){
-      if(fbz>0 && phiv>fdconvphiv){
+      if(fbz>0 && (phiv>fdconvphiv && mass < fdconvMee) ){
        pairOK = false;
-      }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+      }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv  && mass < fdconvMee){
        pairOK = false;
       }
     }else if(fRejectPairFlag[idie] == 1 || fRejectPairFlag[idie] == 3){
@@ -1040,9 +1069,7 @@ void AliAnalysisTaskMultiDielectronTG::CalcVars(AliDielectronSingleTG *iep, AliD
     + sqrt(me*me+iem->Px()*iem->Px()+iem->Py()*iem->Py()+iem->Pz()*iem->Pz());
   
   mass =  e*e-px*px-py*py-pz*pz;
-  if(mass<0){
-    mass = mass;
-  }else{
+  if(mass>=0){
     mass = sqrt(mass);
   }
    
@@ -1153,10 +1180,11 @@ void AliAnalysisTaskMultiDielectronTG::RejectPairs(vector<AliDielectronSingleTG*
          }
        }else if(fRejectPairFlag[idie]==2){
          Double_t phiv = GetPhiv(e1[i1], e2[i2]);
-         if(fbz>0 && phiv>fdconvphiv){
+         Double_t mee = GetMass(e1[i1], e2[i2]);
+         if(fbz>0 && ( phiv>fdconvphiv && mee < fdconvMee) ){
            e1[i1]->SetConvFlag(0);
            e2[i2]->SetConvFlag(0);
-         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
            e1[i1]->SetConvFlag(0);
            e2[i2]->SetConvFlag(0);
          }
@@ -1164,7 +1192,6 @@ void AliAnalysisTaskMultiDielectronTG::RejectPairs(vector<AliDielectronSingleTG*
       }
     }
   }
-
   if(e1.size()>0){
     for(int i1=0; i1<(int)e1.size(); i1++){
       for(int i2=i1+1; i2<(int)e1.size(); i2++){
@@ -1176,10 +1203,11 @@ void AliAnalysisTaskMultiDielectronTG::RejectPairs(vector<AliDielectronSingleTG*
          }
        }else if(fRejectPairFlag[idie]==2){
          Double_t phiv = GetPhiv(e1[i1], e1[i2]);
-         if(fbz>0 && phiv>fdconvphiv){
+         Double_t mee = GetMass(e1[i1], e1[i2]);
+         if(fbz>0 && phiv>fdconvphiv && mee < fdconvMee){
            e1[i1]->SetConvFlag(0);
            e1[i2]->SetConvFlag(0);
-         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
            e1[i1]->SetConvFlag(0);
            e1[i2]->SetConvFlag(0);
          }
@@ -1199,10 +1227,11 @@ void AliAnalysisTaskMultiDielectronTG::RejectPairs(vector<AliDielectronSingleTG*
          }
        }else if(fRejectPairFlag[idie]==2){
          Double_t phiv = GetPhiv(e2[i1], e2[i2]);
-         if(fbz>0 && phiv>fdconvphiv){
+         Double_t mee = GetMass(e2[i1], e2[i2]);
+         if(fbz>0 && phiv>fdconvphiv && mee < fdconvMee){
            e2[i1]->SetConvFlag(0);
            e2[i2]->SetConvFlag(0);
-         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv){
+         }else if(fbz<0 && phiv<acos(-1.0)-fdconvphiv && mee < fdconvMee){
            e2[i1]->SetConvFlag(0);
            e2[i2]->SetConvFlag(0);
          }
@@ -1233,7 +1262,7 @@ Double_t AliAnalysisTaskMultiDielectronTG::GetOpeningAngle(AliDielectronSingleTG
 Double_t AliAnalysisTaskMultiDielectronTG::GetPhiv(AliDielectronSingleTG* e1, AliDielectronSingleTG* e2){
 
   //////////////////////
-  //////// calculate pairs and get opening angle 
+  //////// calculate pairs and get phiv
   //////////////////////
 
   double dmass, dphiv, dpxpair, dpypair, dpzpair;
@@ -1244,3 +1273,19 @@ Double_t AliAnalysisTaskMultiDielectronTG::GetPhiv(AliDielectronSingleTG* e1, Al
 
   return dphiv;
 }
+
+//_________________________________________________________________________________
+Double_t AliAnalysisTaskMultiDielectronTG::GetMass(AliDielectronSingleTG* e1, AliDielectronSingleTG* e2){
+
+  //////////////////////
+  //////// calculate pairs and get mass
+  //////////////////////
+
+  double dmass, dphiv, dpxpair, dpypair, dpzpair;
+  double dptpair, depair, dphipair, detapair, dcos, dpsi;
+  
+  CalcVars(e1, e2, dmass, dphiv, dpxpair, dpypair, dpzpair, 
+            dptpair, depair, dphipair, detapair, dcos, dpsi);
+
+  return dmass;
+}