]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
- add new and update user tasks
authorjbook <jbook@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 29 Jan 2013 12:16:50 +0000 (12:16 +0000)
committerjbook <jbook@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 29 Jan 2013 12:16:50 +0000 (12:16 +0000)
PWGDQ/dielectron/macrosJPSI/AddTaskJPSIFilter.C [new file with mode: 0644]
PWGDQ/dielectron/macrosJPSI/AddTask_jpsi_JPsiME.C [new file with mode: 0644]
PWGDQ/dielectron/macrosJPSI/AddTask_mwinn_JPsi.C
PWGDQ/dielectron/macrosJPSI/ConfigBJpsi_ff_PbPbFilter.C [new file with mode: 0644]
PWGDQ/dielectron/macrosJPSI/ConfigJpsiME_jpsi_PbPb.C [new file with mode: 0644]
PWGDQ/dielectron/macrosJPSI/ConfigJpsiQA_jpsi_PbPb.C
PWGDQ/dielectron/macrosJPSI/ConfigJpsi_mw_pPb.C [new file with mode: 0644]

diff --git a/PWGDQ/dielectron/macrosJPSI/AddTaskJPSIFilter.C b/PWGDQ/dielectron/macrosJPSI/AddTaskJPSIFilter.C
new file mode 100644 (file)
index 0000000..6709aa1
--- /dev/null
@@ -0,0 +1,94 @@
+AliAnalysisTask *AddTaskJPSIFilter(Bool_t storeLS = kTRUE, Bool_t hasMC_aod = kFALSE){
+  //get the current analysis manager
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  if (!mgr) {
+    Error("AddTaskJPSIFilter", "No analysis manager found.");
+    return 0;
+  }
+  
+  //check for output aod handler
+  if (!mgr->GetOutputEventHandler()||mgr->GetOutputEventHandler()->IsA()!=AliAODHandler::Class()) {
+    Warning("AddTaskJPSIFilter","No AOD output handler available. Not adding the task!");
+    return 0;
+  }
+
+  //Do we have an MC handler?
+  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0)||hasMC_aod;
+  
+  //Do we run on AOD?
+  Bool_t isAOD=mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class();
+
+  //gROOT->LoadMacro("$ALICE_ROOT/PWGDQ/dielectron/macros/ConfigBJpsi_ff_PbPbFilter.C");
+  gROOT->LoadMacro("ConfigBJpsi_ff_PbPbFilter.C");
+  AliDielectron *jpsi=ConfigBJpsi_ff_PbPbFilter(0,hasMC);
+  
+  if(isAOD) {
+    //add options to AliAODHandler to duplicate input event
+    AliAODHandler *aodHandler = (AliAODHandler*)mgr->GetOutputEventHandler();
+    aodHandler->SetCreateNonStandardAOD();
+    aodHandler->SetNeedsHeaderReplication();
+    aodHandler->SetNeedsTOFHeaderReplication();
+    aodHandler->SetNeedsVZEROReplication();
+    /*aodHandler->SetNeedsTracksBranchReplication();
+    aodHandler->SetNeedsCaloClustersBranchReplication();
+    aodHandler->SetNeedsVerticesBranchReplication();
+    aodHandler->SetNeedsV0sBranchReplication();
+    aodHandler->SetNeedsCascadesBranchReplication();
+    aodHandler->SetNeedsTrackletsBranchReplication();
+    aodHandler->SetNeedsPMDClustersBranchReplication();
+    aodHandler->SetNeedsJetsBranchReplication();
+    aodHandler->SetNeedsFMDClustersBranchReplication();
+    //aodHandler->SetNeedsMCParticlesBranchReplication();
+    aodHandler->SetNeedsDimuonsBranchReplication();*/
+    if(hasMC) aodHandler->SetNeedsMCParticlesBranchReplication();
+    jpsi->SetHasMC(hasMC);
+  }
+  
+  //Create task and add it to the analysis manager
+  AliAnalysisTaskDielectronFilter *task=new AliAnalysisTaskDielectronFilter("jpsi_DielectronFilter");
+  task->SetTriggerMask(AliVEvent::kMB+AliVEvent::kCentral+AliVEvent::kSemiCentral);  
+  if (!hasMC) task->UsePhysicsSelection();
+
+  //Add event filter
+  AliDielectronEventCuts *eventCuts=new AliDielectronEventCuts("eventCuts","Vertex Track && |vtxZ|<10 && ncontrib>0");
+  if(!hasMC) eventCuts->SetRequireVertex();
+  if (isAOD) eventCuts->SetVertexType(AliDielectronEventCuts::kVtxAny);
+  eventCuts->SetMinVtxContributors(1);
+  eventCuts->SetVertexZ(-10.,10.);
+  eventCuts->SetCentralityRange(0.0,80.0);
+  task->SetEventFilter(eventCuts);
+
+  task->SetDielectron(jpsi);
+  if(storeLS) task->SetStoreLikeSignCandidates(storeLS);
+  task->SetStoreTrackLegs(kTRUE);
+  mgr->AddTask(task);
+
+  //----------------------
+  //create data containers
+  //----------------------
+  
+  
+  TString containerName = mgr->GetCommonFileName();
+  containerName += ":PWGDQ_dielectronFilter";
+  //create output container
+  
+  AliAnalysisDataContainer *cOutputHist1 =
+    mgr->CreateContainer("jpsi_FilterQA",
+                         THashList::Class(),
+                         AliAnalysisManager::kOutputContainer,
+                         containerName.Data());
+  
+  AliAnalysisDataContainer *cOutputHist2 =
+    mgr->CreateContainer("jpsi_FilterEventStat",
+                         TH1D::Class(),
+                         AliAnalysisManager::kOutputContainer,
+                         containerName.Data());
+  
+  
+  mgr->ConnectInput(task,  0, mgr->GetCommonInputContainer());
+  mgr->ConnectOutput(task, 1, cOutputHist1);
+  mgr->ConnectOutput(task, 2, cOutputHist2);
+  
+  return task;
+}
diff --git a/PWGDQ/dielectron/macrosJPSI/AddTask_jpsi_JPsiME.C b/PWGDQ/dielectron/macrosJPSI/AddTask_jpsi_JPsiME.C
new file mode 100644 (file)
index 0000000..a365a89
--- /dev/null
@@ -0,0 +1,104 @@
+AliAnalysisTask *AddTask_jpsi_JPsiME(TString prod="",
+                                    Bool_t gridconf=kFALSE,
+                                    ULong64_t triggers=AliVEvent::kCentral | AliVEvent::kSemiCentral | AliVEvent::kMB) {
+
+  //get the current analysis manager
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+  if (!mgr) {
+    Error("AddTask_jpsi_JPsiME", "No analysis manager found.");
+    return 0;
+  }
+  
+  //Do we have an MC handler?
+  Bool_t hasMC = kFALSE;
+  TString list = gSystem->Getenv("LIST");
+  if( list.IsNull()) list=prod;
+  if( list.Contains("LHC10h")   || list.Contains("LHC11h")   ) hasMC=kFALSE;
+  if( list.Contains("LHC11a10") || list.Contains("LHC12a17") ) hasMC=kTRUE;
+
+  //Do we have an AOD handler?
+  Bool_t isAOD=(mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class() ? kTRUE : kFALSE);
+
+  // set AOD debug levels
+  if(isAOD) {
+    mgr->AddClassDebug("AliAODTrack", AliLog::kFatal);
+    mgr->AddClassDebug("AliAODpidUtil", AliLog::kInfo);
+  }
+
+  //set config file name
+  TString configFile("");
+  printf("%s \n",gSystem->pwd());
+  TString trainRoot=gSystem->Getenv("TRAIN_ROOT");
+  if (!trainRoot.IsNull())
+    configFile="$TRAIN_ROOT/jbook_jpsi/ConfigJpsiME_jpsi_PbPb.C";   // gsi config
+  else if(!gSystem->Exec("alien_cp alien:///alice/cern.ch/user/j/jbook/PWGDQ/dielectron/macrosJPSI/ConfigJpsiME_jpsi_PbPb.C ."))
+    configFile=Form("%s/ConfigJpsiME_jpsi_PbPb.C",gSystem->pwd());                        // alien config
+
+  if(!gridconf)
+    configFile="$ALICE_ROOT/PWGDQ/dielectron/macrosJPSI/ConfigJpsiME_jpsi_PbPb.C"; // aliroot config
+
+  //create task and add it to the manager
+  AliAnalysisTaskMultiDielectron *task;
+
+  // trigger selection
+  ULong64_t triggerSets[]={AliVEvent::kCentral , AliVEvent::kSemiCentral , AliVEvent::kMB,
+                          AliVEvent::kCentral | AliVEvent::kSemiCentral | AliVEvent::kMB};
+  const char* triggerNames[]={"Central","SemiCentral","MB","MB+Cent+SemiCent"};
+
+  // find out the configured triggers
+  Int_t j=0;
+  for(j=0; j<4; j++) {
+    if(triggers!=triggerSets[j]) continue;
+    else break;
+  }
+
+  // print task configuration
+  printf("production: %s MC: %d \n",  list.Data(),hasMC);
+  printf("triggers:   %s \n",         triggerNames[j]  );
+  printf("config:     %s Grid: %d \n",configFile.Data(),gridconf);
+
+  task = new AliAnalysisTaskMultiDielectron((Form("MultiDieJB_%s",triggerNames[j])));
+  task->SetBeamEnergy(1380.);
+  task->SetTriggerMask(triggers);
+  if (!hasMC) task->UsePhysicsSelection();
+  mgr->AddTask(task);
+
+  //load dielectron configuration file
+  TString checkconfig="ConfigJpsiME_jpsi_PbPb";
+  if (!gROOT->GetListOfGlobalFunctions()->FindObject(checkconfig.Data()))
+    gROOT->LoadMacro(configFile.Data());
+
+  //add dielectron analysis with different cuts to the task
+  for (Int_t i=0; i<nDie; ++i) { //nDie defined in config file
+    AliDielectron *jpsi=ConfigJpsiME_jpsi_PbPb(i,list,triggers);
+    if (jpsi ) task->AddDielectron(jpsi);
+    if (jpsi ) printf(" %s added\n",jpsi->GetName());
+  }
+
+  //create output container
+  AliAnalysisDataContainer *cOutputHist1 =
+    mgr->CreateContainer(Form("jpsiME_QA_%s",triggerNames[j]),
+                        TList::Class(),
+                        AliAnalysisManager::kOutputContainer,
+                        Form("jpsiME_%s.root",triggerNames[j]));
+
+  AliAnalysisDataContainer *cOutputHist2 =
+    mgr->CreateContainer(Form("jpsiME_CF_%s",triggerNames[j]),
+                        TList::Class(),
+                        AliAnalysisManager::kOutputContainer,
+                        Form("jpsiME_%s.root",triggerNames[j]));
+
+  AliAnalysisDataContainer *cOutputHist3 =
+    mgr->CreateContainer(Form("jpsiME_EventStat_%s",triggerNames[j]),
+                        TH1D::Class(),
+                        AliAnalysisManager::kOutputContainer,
+                        Form("jpsiME_%s.root",triggerNames[j]));
+
+  mgr->ConnectInput(task,  0, mgr->GetCommonInputContainer());
+  //  mgr->ConnectOutput(task, 0, coutput1 );
+  mgr->ConnectOutput(task, 1, cOutputHist1);
+  mgr->ConnectOutput(task, 2, cOutputHist2);
+  mgr->ConnectOutput(task, 3, cOutputHist3);
+
+  return task;
+}
index b5a91cda43b3fdb18823ac8c14bb2b3c09df1bb6..278c3c3b15e8c6b066226c7afb70b37a64380de3 100644 (file)
@@ -6,96 +6,92 @@ AliAnalysisTask *AddTask_mwinn_JPsi(){
     return 0;
   }
 
-  if (mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()){
-    ::Info("AddTask_mwinn_JPsi", "Not used in AOD!!!");
-    return 0;
-  }
 
+  //Do we have an MC handler?
+  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+  
   //Get the current train configuration
-  //NOTE train config not there on grid, PbPb anyhow not used for correlations
-  //TString trainConfig=gSystem->Getenv("CONFIG_FILE");
-
+  TString trainConfig=gSystem->Getenv("CONFIG_FILE");
+  
   //set config file name
-  //for grid running: "$ALICE_ROOT/PWGDQ/dielectron/macros/ConfigJpsi2eeDebugTree.C"
-  //for gsi running "$TRAIN_ROOT/jpsi_JPSI/ConfigJpsi2eeDebugTree.C"
-  TString configFile("$ALICE_ROOT/PWGDQ/dielectron/macrosJPSI/ConfigJpsi_mw_pp.C");
-  //NOTE train config not there on grid, PbPb anyhow not used for correlations
-  //if ( trainConfig.Contains("PbPb") ) configFile="$TRAIN_ROOT/jpsi_JPSI/ConfigJpsi2eeDebugTreePbPb.C";
+  // TString configFile("$TRAIN_ROOT/mwinn_jpsiCorr/ConfigJpsi2eeData.C");
+  TString configFile("$ALICE_ROOT/PWGDQ/dielectron/macros/ConfigJpsi_mw_pPb.C");
+  //TString configFile("$TRAIN_ROOT/jpsi_JPSI/ConfigJpsiStandard.C");
+  // if ( trainConfig.Contains("PbPb") ) configFile="$TRAIN_ROOT/jpsi_JPSI/ConfigJpsi2eePbPb.C";
   
-    //load dielectron configuration file
-  gROOT->LoadMacro(configFile.Data());
+  //if (mgr->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()){
+  //  ::Info("AddTaskJPSI", "Using AOD configuration");
+  //  configFile="$TRAIN_ROOT/util/dielectron/dielectron/macros/ConfigJpsi2eeDataAOD.C";
+  // }
 
-  
-  //Do we have an MC handler?
-  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
-  
+  TString list=gSystem->Getenv("LIST");
   //create task and add it to the manager
-  AliAnalysisTaskMultiDielectron *task=new AliAnalysisTaskMultiDielectron("mwinn_JPsi");
-  if (!hasMC) task->UsePhysicsSelection();
-         //NOTE trigger selection for EMCAL triggered data...
-       task->SetTriggerMask(AliVEvent::kEMC7);
+  AliAnalysisTaskMultiDielectron *task=new AliAnalysisTaskMultiDielectron("MultiDieData");
+  if (!hasMC&&(!list.Contains("LHC12h")) ) task->UsePhysicsSelection();//taking out for testing
+  task->SelectCollisionCandidates(AliVEvent::kINT7); //kINT7?, MB-trigger for MB pPb
+  if (list.Contains("LHC11d")) task->SetTriggerMask(AliVEvent::kEMCEJE+AliVEvent::kEMC7+AliVEvent::kEMCEGA);
+  //if (list.Contains("LHC12h")) task->SetTRDtrigger(1+2);
   mgr->AddTask(task);
+
   
-  //load dielectron configuration file, already done before!
-  //gROOT->LoadMacro(configFile.Data());
+  //load dielectron configuration file
+  gROOT->LoadMacro(configFile.Data());
   
   //add dielectron analysis with different cuts to the task
-       //NOTE: for 11d running just taking one single configuration, see configjpsi2eeDebugTree
+  cout << "!!!!!!!!!!!! nDie = " << nDie << endl;
   for (Int_t i=0; i<nDie; ++i){ //nDie defined in config file
-    AliDielectron *jpsi=ConfigJpsi_mw_pp(i);
-    if(jpsi) {
-      jpsi->SetDontClearArrays();
-      task->AddDielectron(jpsi);
-    }
+    AliDielectron *jpsi=ConfigJpsi_mw_pPb(i);
+    if (!jpsi) continue;
+    task->AddDielectron(jpsi);
+//    printf("add: %s\n",jpsi->GetName());
   }
-
   
   //Add event filter
   AliDielectronEventCuts *eventCuts=new AliDielectronEventCuts("eventCuts","Vertex Track && |vtxZ|<10 && ncontrib>0");
-  eventCuts->SetRequireVertex();
+  eventCuts->SetRequireVertex();//NOTE: all of these cuts can for some reasons not be applied to self-filtered AODs by mwinn in 
+  //(list/hera/alice/mwinn/mwinn/train/lists/...)
   eventCuts->SetMinVtxContributors(1);
   eventCuts->SetVertexZ(-10.,10.);
-  //NOTE train config not there on grid, PbPb anyhow not used for correlations
-  //  if ( trainConfig.Contains("PbPb") ) eventCuts->SetCentralityRange(40.,80.);
-  task->SetEventFilter(eventCuts);
-  
-  //   task->SetTriggerOnV0AND();
+//   eventCuts->SetVertexType(AliDielectronEventCuts::kVtxTracksOrSPD);
+//   eventCuts->SetRequireV0and();
+//   if ( trainConfig=="PbPb" ){
+//     eventCuts->SetCutOnMultipicityITSTPC();
+//   }
+   task->SetEventFilter(eventCuts);
+
+//   task->SetTriggerOnV0AND();
+  if ( trainConfig=="pp" ) task->SetRejectPileup();
   
   //create output container
   AliAnalysisDataContainer *coutput1 =
-    mgr->CreateContainer("mwinn_tree",
+    mgr->CreateContainer("jpsi_mwinn_tree",
                          TTree::Class(),
                          AliAnalysisManager::kExchangeContainer,
-                         "mwinn_default");
-                                                                                                
+                         "jpsi_mwinn_default");
+  
   AliAnalysisDataContainer *cOutputHist1 =
-    mgr->CreateContainer("mwinn_QA",
+    mgr->CreateContainer("jpsi_mwinn_QA",
                          TList::Class(),
                          AliAnalysisManager::kOutputContainer,
-                         "mwinn.root");
+                         "jpsi_mwinn.root");
 
   AliAnalysisDataContainer *cOutputHist2 =
-    mgr->CreateContainer("mwinn_CF",
+    mgr->CreateContainer("jpsi_mwinn_CF",
                          TList::Class(),
-                         AliAnalysisManager::kExchangeContainer,
-                         "mwinn.root");
-                                                                                                
-
-
+                         AliAnalysisManager::kOutputContainer,
+                         "jpsi_mwinn.root");
+  
   AliAnalysisDataContainer *cOutputHist3 =
-    mgr->CreateContainer("mwinn_EventStat",
+    mgr->CreateContainer("jpsi_mwinn_EventStat",
                          TH1D::Class(),
                          AliAnalysisManager::kOutputContainer,
-                         "mwinn.root");
-
-                                                                                                
-       //is the first output type  a problem??!
+                         "jpsi_mwinn.root");
+  
   mgr->ConnectInput(task,  0, mgr->GetCommonInputContainer());
   mgr->ConnectOutput(task, 0, coutput1 );
   mgr->ConnectOutput(task, 1, cOutputHist1);
   mgr->ConnectOutput(task, 2, cOutputHist2);
   mgr->ConnectOutput(task, 3, cOutputHist3);
-
   
   return task;
 }
diff --git a/PWGDQ/dielectron/macrosJPSI/ConfigBJpsi_ff_PbPbFilter.C b/PWGDQ/dielectron/macrosJPSI/ConfigBJpsi_ff_PbPbFilter.C
new file mode 100644 (file)
index 0000000..ad0a6e8
--- /dev/null
@@ -0,0 +1,455 @@
+void InitHistograms(AliDielectron *die, Int_t cutDefinition);
+
+void SetupTrackCuts(Bool_t isESD, AliDielectron *die, Int_t cutDefinition);
+void SetupPairCuts(AliDielectron *die, Int_t cutDefinition);
+
+void AddMCSignals(AliDielectron *die);
+void SetEtaCorrection();
+
+TString names=("TOFTRDany");
+enum { kTOFTRD};
+
+TObjArray *arrNames=names.Tokenize(";");
+const Int_t nDie=arrNames->GetEntries();
+
+Bool_t hasMC=kFALSE;
+
+AliDielectron* ConfigBJpsi_ff_PbPbFilter(Int_t cutDefinition, Bool_t isMC=kFALSE)
+{
+  //
+  // Setup the instance of AliDielectron
+  //
+  
+
+  // MC event handler?
+  hasMC=isMC;
+    //(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);    
+
+  //ESD handler?
+  Bool_t isESD=(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class());
+  
+  
+  // create the actual framework object
+  TString name=Form("%02d",cutDefinition);
+  if (cutDefinition<arrNames->GetEntriesFast()){
+    name=arrNames->At(cutDefinition)->GetName();
+  }
+  AliDielectron *die = new AliDielectron(Form("%s",name.Data()),
+                                         Form("Track cuts: %s",name.Data()));
+  
+  // Monte Carlo Signals and TRD efficiency tables
+  if(hasMC) {
+    AddMCSignals(die);
+    
+    // trd tables
+    TString pidTab="$TRAIN_ROOT/util/dielectron/dielectron/TRDpidEff_eleProb07_TRDntr4_6.root";
+    TString trainRoot=gSystem->Getenv("TRAIN_ROOT");
+    if (trainRoot.IsNull()) pidTab="$ALICE_ROOT/PWGDQ/dielectron/files/TRDpidEff_eleProb07_TRDntr4_6.root";
+
+    if (gSystem->AccessPathName(gSystem->ExpandPathName(pidTab.Data())))
+      Error("ConfigPbPb","PID table not found: %s",pidTab.Data());
+    else 
+      die->SetTRDcorrectionFilename(pidTab.Data());
+  }
+  
+  // cut setup
+  SetupTrackCuts(isESD,die,cutDefinition);
+  SetupPairCuts(die,cutDefinition);
+  
+  // histogram setup
+  if(cutDefinition == kTOFTRD) 
+    InitHistograms(die,cutDefinition);
+  
+  // setup eta correction
+  SetEtaCorrection();
+  
+  return die;
+}
+
+//______________________________________________________________________________________
+void SetupTrackCuts(Bool_t isESD, AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Setup the track cuts
+  //
+  
+  // Quality cuts
+  AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
+  die->GetTrackFilter().AddCuts(cuts);
+  //Pt cut, should make execution a bit faster
+  AliDielectronVarCuts *pt = new AliDielectronVarCuts("Pt>.85","Pt>.85");
+  pt->AddCut(AliDielectronVarManager::kPt,0.85,1e30);
+  cuts->AddCut(pt);
+  
+  // track cuts ESD and AOD
+  AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
+  varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
+  varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
+  varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
+  varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
+  varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
+  varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
+
+   AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
+   varCuts->AddCut(AliDielectronVarManager::kITSLayerFirstCls,-0.01,1.5); //ITS(0-1) = SPDany
+  cuts->AddCut(varCuts);
+  trkCuts->SetRequireITSRefit(kTRUE);
+  trkCuts->SetRequireTPCRefit(kTRUE);
+  cuts->AddCut(trkCuts);
+  
+  //Do we have an MC handler?
+  //  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+  
+  /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
+  AliDielectronPID *pid = new AliDielectronPID("PID","PID");
+  
+  ////////////////////////////////// DATA
+  if(!hasMC) {
+    
+    pid->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.0,3.0,0.,0.,kTRUE);
+    pid->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-3.0,3.0,0.,0.,kTRUE);
+  }
+  
+  ////////////////////////////////// MC
+  if(hasMC) {
+    
+    // electron
+    Double_t nSigmaPi = 3.5; Double_t nSigmaP = 3.5;
+    Double_t resolution=0.0549;
+    Double_t BBpro[5] = {0};
+    Double_t BBpio[5] = {0};
+    
+    for(Int_t icent=0; icent<8; icent++) {
+      
+      switch (icent) {
+        case 0:  // 0-10%
+          BBpro[0] = 0.031555;  BBpro[1] = 26.0595; BBpro[2] = 3.02422e-11;  BBpro[3] = 2.05594; BBpro[4] = 5.99848;
+          BBpio[0] = 0.0252122; BBpio[1] = 38.8991; BBpio[2] = 4.0901e-11;   BBpio[3] = 5.27988; BBpio[4] = 4.3108;
+          break;
+        case 1:  // 10-20%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.0252127; BBpio[1] = 33.8617; BBpio[2] = 3.56866e-11;  BBpio[3] = 5.24831; BBpio[4] = 4.31093;
+          break;
+        case 2:  // 20-30%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.0263205; BBpio[1] = 37.9307; BBpio[2] = 4.29724e-11;  BBpio[3] = 5.74458; BBpio[4] = 4.32459;
+          break;
+        case 3:  // 30-40%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.026294;  BBpio[1] = 39.0346; BBpio[2] = 4.12261e-11;  BBpio[3] = 5.28808; BBpio[4] = 4.31301;
+          break;
+        case 4:  // 40-50%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11;  BBpio[3] = 5.78125; BBpio[4] = 4.31363;
+          break;
+        case 5:  // 50-60%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11;  BBpio[3] = 5.78125; BBpio[4] = 4.31363;
+          break;
+        case 6:  // 60-70%
+          BBpro[0] = 0.031555;  BBpro[1] = 26.0595; BBpro[2] = 3.02422e-11;  BBpro[3] = 2.05594; BBpro[4] = 5.99848;
+          BBpio[0] = 0.026302;  BBpio[1] = 38.6888; BBpio[2] = 3.56792e-11;  BBpio[3] = 5.2465;  BBpio[4] = 4.31094;
+          break;
+        case 7:  // 70-80%
+          BBpro[0] = 0.0315171; BBpro[1] = 25.8656; BBpro[2] = 3.03896e-11;  BBpro[3] = 2.05802; BBpro[4] = 5.99999;
+          BBpio[0] = 0.0263134; BBpio[1] = 38.2084; BBpio[2] = 3.75159e-11;  BBpio[3] = 5.78125; BBpio[4] = 4.31363;
+          break;
+        case 8:  // 80-90%
+          BBpro[0] = 0.0313438; BBpro[1] = 25.8666; BBpro[2] = 4.5457e-11;   BBpro[3] = 2.07912; BBpro[4] = 5.99986;
+          BBpio[0] = 0.0252127; BBpio[1] = 33.8617; BBpio[2] = 3.56866e-11;  BBpio[3] = 5.24831; BBpio[4] = 4.31093;
+          break;
+        case 9:  // 90-100%
+          BBpro[0] = 0.0319126; BBpro[1] = 36.8784; BBpro[2] = 3.4274e-11;   BBpro[3] = 3.2431;  BBpro[4] = 5.93388;
+          BBpio[0] = 0.027079;  BBpio[1] = 67.5936; BBpio[2] = 9.72548e-11;  BBpio[3] = 9.61382; BBpio[4] = 5.99372;
+          break;
+      }
+      
+      
+      TF1 *ffPro=new TF1(Form("fBethe%d_c%d",AliPID::kProton,icent), Form("(%f*%f+(AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])-AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])))/%f", nSigmaP,resolution, AliPID::ParticleMass(AliPID::kProton), AliPID::ParticleMass(AliPID::kElectron), resolution), 0.05,200.);
+      
+      TF1 *ffPio=new TF1(Form("fBethe%d_c%d",AliPID::kPion,icent), Form("(%f*%f+(AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])-AliExternalTrackParam::BetheBlochAleph(x/%f,[0],[1],[2],[3],[4])))/%f", nSigmaPi,resolution, AliPID::ParticleMass(AliPID::kPion), AliPID::ParticleMass(AliPID::kElectron), resolution), 0.05,200.);
+      
+      TString list=gSystem->Getenv("LIST");
+      
+      //LHC11a10b
+      if (list.Contains("LHC11a10b") || list.IsNull()) {
+        printf("LHC11a10b parameters\n");
+        ffPro->SetParameters(BBpro[0],BBpro[1],BBpro[2],BBpro[3],BBpro[4]);
+        ffPio->SetParameters(BBpio[0],BBpio[1],BBpio[2],BBpio[3],BBpio[4]);
+        
+        // proton cut
+        pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,ffPro,10,((double)icent)*10.,((double)icent+1)*10,
+                    kFALSE,AliDielectronPID::kRequire,AliDielectronVarManager::kCentrality);
+        // pion cut
+        pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,ffPio,10,((double)icent)*10.,((double)icent+1)*10,
+                    kFALSE,AliDielectronPID::kRequire,AliDielectronVarManager::kCentrality);
+      }
+    }
+    
+    // shifts for the nSigma electrons
+    TGraph* nSigmaCorrection = new TGraph();
+    // LHC11a10b
+    if (list.Contains("LHC11a10b") || list.IsNull()) {
+      nSigmaCorrection->SetPoint(0, 137161., -0.50-(0.28));
+      nSigmaCorrection->SetPoint(1, 139510., -0.50-(0.28));
+      pid->SetCorrGraph(nSigmaCorrection);
+    }
+    
+  } //hasMC
+  
+  ////////////////////////////////// DATA + MC
+  // pid cuts TPC + TOF 
+  pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-4.,4.);
+    pid->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,AliDielectronPID::kIfAvailable);
+  
+  cuts->AddCut(pid);  
+  /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PID CUTS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
+  
+  
+  // exclude conversion electrons selected by the tender
+  AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
+  noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
+  cuts->AddCut(noconv);
+  
+}
+
+//______________________________________________________________________________________
+void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Setup the pair cuts
+  //
+  
+  // conversion rejection
+  Double_t gCut = 0.05;             // default
+  
+  AliDielectronVarCuts *gammaCut=new AliDielectronVarCuts("gammaCut","gammaCut");
+  gammaCut->AddCut(AliDielectronVarManager::kM,0.,gCut);
+  die->GetPairPreFilter().AddCuts(gammaCut);
+  
+  
+}
+
+//______________________________________________________________________________________
+void InitHistograms(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Initialise the histograms
+  //
+  //  Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+  
+  //Setup histogram Manager
+  AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(),die->GetTitle());
+  
+  
+  //add histograms to event class
+  histos->AddClass("Event");
+  histos->AddClass("Event_noCuts");
+  histos->UserHistogram("Event","VtxZ","Vertex Z;z (cm)",
+                        300,-15.,15.,AliDielectronVarManager::kZvPrim);
+ histos->UserHistogram("Event_noCuts","VtxZ","Vertex Z;z (cm)",
+                        300,-15.,15.,AliDielectronVarManager::kZvPrim);
+  histos->UserHistogram("Event","Centrality","Centrality;centrality (%)",
+                        20,0.,100.,AliDielectronVarManager::kCentrality);
+
+  histos->UserHistogram("Event","Multiplicity","Multiplicity V0;Multiplicity V0",
+                        500,0.,25000., AliDielectronVarManager::kMultV0);
+  histos->UserHistogram("Event","Multiplicity_nTracks","Multiplicity V0 vs #tracks; #tracks; Multiplicity V0;",
+                        500,0.,25000.,500,0.,25000.,AliDielectronVarManager::kNTrk, AliDielectronVarManager::kMultV0);
+
+  histos->UserHistogram("Event","Cent_Mult","Centrality vs. Multiplicity;centrality (%);Multiplicity V0",
+                        10,0.,100., 500,0.,500.,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kMultV0);
+  histos->UserProfile("Event","Cent_Nacc",
+                      "accepted tracks;centrality (%)",
+                      AliDielectronVarManager::kNacc,
+                      "0.,5.,10.,20.,40.,50.,60.,80.,100.",
+                      AliDielectronVarManager::kCentrality);
+  histos->UserProfile("Event","Cent_NVtxContrib",
+                      "number of vertex contributors;centrality (%)",
+                      AliDielectronVarManager::kNVtxContrib,
+                      "0.,5.,10.,20.,40.,50.,60.,80.,100.",
+                      AliDielectronVarManager::kCentrality);
+  
+  
+  
+  
+  //Initialise histogram classes
+  histos->SetReservedWords("Track;Pair");
+  
+  
+  //Pair classes
+  // to fill also mixed event histograms loop until 10
+  for (Int_t i=0; i<3; ++i){
+    histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
+  }
+  
+  if(cutDefinition <= kTOFTRD) {
+    
+    //legs from pair
+    for (Int_t i=0; i<3; ++i){
+      histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
+    }
+    
+    //Track classes
+    //to fill also track info from 2nd event loop until 2
+    for (Int_t i=0; i<2; ++i){
+      histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
+    }
+    
+    //add histograms to Track classes
+    //histos->UserHistogram("Track","TOFbit","TOFbit;bit;#tracks",19,-9.5,9.5,AliDielectronVarManager::kTOFPIDBit);
+    histos->UserHistogram("Track","Pt","Pt;Pt [GeV];#tracks",
+                          400,0,20.,
+                          AliDielectronVarManager::kPt);
+   
+    histos->UserHistogram("Track","TPCnCls","Number of Clusters TPC;TPC number clusteres;#tracks",
+                          160,-0.5,159.5,
+                          AliDielectronVarManager::kNclsTPC);
+    histos->UserHistogram("Track","TPCsignalN","Number of Clusters TPC;TPC number clusteres;#tracks",
+                          160,-0.5,159.5,
+                          AliDielectronVarManager::kTPCsignalN);
+    
+    histos->UserHistogram("Track","dXY","dXY;dXY [cm];#tracks",
+                          500,-1.,1.,
+                          AliDielectronVarManager::kImpactParXY);
+    histos->UserHistogram("Track","dZ","dZ;dZ [cm];#tracks",
+                          600,-3.,3.,
+                          AliDielectronVarManager::kImpactParZ);
+
+    histos->UserHistogram("Track","Centrality_Eta_Nsigma","Cent_Eta_nSigma; Centrality; #eta; TPCnSigma_Electron",20,0.,100.,200,-1.,1.,200,-10.,10.,AliDielectronVarManager::kCentrality,AliDielectronVarManager::kEta,AliDielectronVarManager::kTPCnSigmaEle);
+
+    histos->UserHistogram("Track","Eta_Phi","Eta Phi Map; Eta; Phi;#tracks",
+                          200,-1,1,200,0,6.285,
+                          AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi);
+    
+    histos->UserHistogram("Track","dEdx_P","dEdx;P [GeV];TPC signal (arb units);#tracks",
+                          400,0.2,20.,200,0.,200.,
+                          AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
+
+    histos->UserHistogram("Track","TPCnSigmaEle_P","TPC number of sigmas Electrons;P [GeV];TPC number of sigmas Electrons;#tracks",400,0.2,20.,200,-10.,10., AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
+
+    histos->UserHistogram("Track","nSigmaTOF_P","TOF sigmas Electrons;P [GeV];TOF number of sigmas Electrons;#tracks", 400,0.2,20.,200,-10.,10., AliDielectronVarManager::kPIn,AliDielectronVarManager::kTOFnSigmaEle,kTRUE);
+    
+    histos->UserHistogram("Track","Ncl",";Number clusters TPC;Number clusters TPC",
+                          160,-0.5,159.5,
+                          AliDielectronVarManager::kNclsTPC);
+    histos->UserHistogram("Track","NclFr",";Number of findable clusters (robust);Number findable clusters TPC",
+                          160,-0.5,159.5,
+                          AliDielectronVarManager::kNFclsTPCr);
+    histos->UserHistogram("Track","Ncl_NclFr","Number of (findable) clusters TPC;found clusters;findable clusters",
+                          160,-0.5,159.5,160,-0.5,159.5,
+                          AliDielectronVarManager::kNclsTPC,AliDielectronVarManager::kNFclsTPCr);
+    histos->UserHistogram("Track","NtrklTRD",";Number tracklets TRD for pid;Number tracklets TRD",
+                          8,-0.5,7.5,
+                          AliDielectronVarManager::kTRDpidQuality);
+    
+    //add histograms to Pair classes
+    histos->UserHistogram("Pair","InvMass","Inv.Mass;Inv. Mass [GeV];#pairs",
+                          300,.0,300*0.04,
+                          AliDielectronVarManager::kM); // 40MeV bins, 12GeV/c2
+    histos->UserHistogram("Pair","Rapidity","Rapidity;Rapidity;#pairs",
+                          100,-1.,1.,
+                          AliDielectronVarManager::kY);
+    histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
+                          100,0.,3.15,
+                          AliDielectronVarManager::kOpeningAngle);
+    histos->UserHistogram("Pair","Chi2NDF","#chi^{2}/NDF;#chi^{2}/NDF",
+                          100,0.,20,
+                          AliDielectronVarManager::kChi2NDF);
+  
+   histos->UserHistogram("Pair","PseudoProperTime","Pseudoproper decay length; pseudoproper-decay-length[#mum];Entries/40#mum",
+                          150,-0.3.,0.3,AliDielectronVarManager::kPseudoProperTime);
+
+
+   }
+  
+  die->SetHistogramManager(histos);
+}
+
+
+void AddMCSignals(AliDielectron *die){
+  //Do we have an MC handler?
+  //Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+  if (!hasMC) return;
+  
+  AliDielectronSignalMC* inclusiveJpsi = new AliDielectronSignalMC("inclusiveJpsi","Inclusive J/psi");
+  inclusiveJpsi->SetLegPDGs(11,-11);
+  inclusiveJpsi->SetMotherPDGs(443,443);
+  inclusiveJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
+  inclusiveJpsi->SetFillPureMCStep(kTRUE);
+  inclusiveJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
+  inclusiveJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
+  die->AddSignalMC(inclusiveJpsi);
+  
+  AliDielectronSignalMC* promptJpsi = new AliDielectronSignalMC("promptJpsi","Prompt J/psi");   // prompt J/psi (not from beauty decays)
+  promptJpsi->SetLegPDGs(11,-11);
+  promptJpsi->SetMotherPDGs(443,443);
+  promptJpsi->SetGrandMotherPDGs(503,503,kTRUE,kTRUE);   // not from beauty hadrons
+  promptJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
+  promptJpsi->SetFillPureMCStep(kTRUE);
+  promptJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
+  promptJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
+  promptJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
+  promptJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
+  die->AddSignalMC(promptJpsi);
+  
+  AliDielectronSignalMC* beautyJpsi = new AliDielectronSignalMC("beautyJpsi","Beauty J/psi");
+  beautyJpsi->SetLegPDGs(11,-11);
+  beautyJpsi->SetMotherPDGs(443,443);
+  beautyJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
+  beautyJpsi->SetGrandMotherPDGs(500,500);
+  beautyJpsi->SetFillPureMCStep(kTRUE);
+  beautyJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
+  beautyJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
+  beautyJpsi->SetCheckBothChargesGrandMothers(kTRUE,kTRUE);
+  die->AddSignalMC(beautyJpsi);
+  
+  AliDielectronSignalMC* directJpsi = new AliDielectronSignalMC("directJpsi","Direct J/psi");   // embedded J/psi
+  directJpsi->SetLegPDGs(11,-11);
+  directJpsi->SetMotherPDGs(443,443);
+  directJpsi->SetMothersRelation(AliDielectronSignalMC::kSame);
+  directJpsi->SetFillPureMCStep(kTRUE);
+  directJpsi->SetLegSources(AliDielectronSignalMC::kFinalState, AliDielectronSignalMC::kFinalState);
+  directJpsi->SetMotherSources(AliDielectronSignalMC::kDirect, AliDielectronSignalMC::kDirect);
+  directJpsi->SetCheckBothChargesLegs(kTRUE,kTRUE);
+  directJpsi->SetCheckBothChargesMothers(kTRUE,kTRUE);
+  die->AddSignalMC(directJpsi);
+}
+
+void SetEtaCorrection()
+{
+
+  if (AliDielectronPID::GetEtaCorrFunction()) return;
+  
+  //TString list=gSystem->Getenv("LIST");
+  TString list="LHC11h.pass2";
+
+  //TString etaMap="$TRAIN_ROOT/jpsi_JPSI/EtaCorrMaps.root";
+  //TString trainRoot=gSystem->Getenv("TRAIN_ROOT");
+  //if (trainRoot.IsNull()) 
+  TString etaMap="$ALICE_ROOT/PWGDQ/dielectron/files/EtaCorrMaps.root";
+  if (gSystem->AccessPathName(gSystem->ExpandPathName(etaMap.Data()))){
+    Error("ConfigPbPb","Eta map not found: %s",etaMap.Data());
+    return;
+  }
+
+  TFile f(etaMap.Data());
+  if (!f.IsOpen()) return;
+  TList *keys=f.GetListOfKeys();
+
+  for (Int_t i=0; i<keys->GetEntries(); ++i){
+    TString kName=keys->At(i)->GetName();
+    TPRegexp reg(kName);
+    if (reg.MatchB(list)){
+      printf("Using Eta Correction Function: %s\n",kName.Data());
+      AliDielectronPID::SetEtaCorrFunction((TF1*)f.Get(kName.Data()));
+    }
+  }
+}
+
diff --git a/PWGDQ/dielectron/macrosJPSI/ConfigJpsiME_jpsi_PbPb.C b/PWGDQ/dielectron/macrosJPSI/ConfigJpsiME_jpsi_PbPb.C
new file mode 100644 (file)
index 0000000..4b38c21
--- /dev/null
@@ -0,0 +1,319 @@
+void InitHistograms(AliDielectron *die, Int_t cutDefinition);
+
+void SetupEventCuts(AliDielectron *die, ULong64_t triggers, Int_t cutDefinition);
+void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition);
+void SetupPairCuts( AliDielectron *die,  Int_t cutDefinition);
+
+void ConfigEvtPlane(AliDielectron *die,  Int_t cutDefinition);
+void ConfigBgrd(    AliDielectron *die,  Int_t cutDefinition);
+
+TString names=("NoBins;Zvtx;ZvtxCent;ZvtxNcontr;ZvtxNcontrPE;ZvtxNcontrPEepTPC;ZvtxNcontrPEepTPCmag");
+enum { kNoBins=0, kZvtx, kZvtxCent, kZvtxNcontr, kZvtxNcontrPE, kZvtxNcontrPEepTPC, kZvtxNcontrPEepTPCmag};
+
+TObjArray *arrNames=names.Tokenize(";");
+const Int_t nDie=arrNames->GetEntries();
+
+Bool_t  isESD = kTRUE;
+Bool_t  hasMC = kFALSE;
+TString list  = gSystem->Getenv("LIST");
+
+AliDielectron* ConfigJpsiME_jpsi_PbPb(Int_t cutDefinition, TString prod="", ULong64_t triggers=AliVEvent::kCentral | AliVEvent::kSemiCentral | AliVEvent::kMB)
+{
+  //
+  // Setup the instance of AliDielectron
+  //
+
+  // gsi train?
+  TString trainRoot = gSystem->Getenv("TRAIN_ROOT");
+  Bool_t isGSItrain = (trainRoot.IsNull()?kFALSE:kTRUE); 
+
+  // find mc or not?
+  if( list.IsNull()) list=prod;
+  if( list.Contains("LHC10h")   || list.Contains("LHC11h")   ) hasMC=kFALSE;
+  if( list.Contains("LHC11a10") || list.Contains("LHC12a17") ) hasMC=kTRUE;
+
+  //ESD handler?
+  isESD=(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class());
+
+  // task name
+  TString name=Form("%02d",cutDefinition);
+  if (cutDefinition<arrNames->GetEntriesFast())  name=arrNames->At(cutDefinition)->GetName();
+  printf(" Adding %s%s config %s for %s \n",(isESD?"ESD":"AOD"),(hasMC?" MC":""),name.Data(),list.Data());
+
+  // init AliDielectron
+  AliDielectron *die = new AliDielectron(Form("%s",name.Data()), Form("ME config: %s",name.Data()));
+  die->SetHasMC(hasMC);
+
+  // cut setup
+  SetupEventCuts(die,triggers,cutDefinition);
+  SetupTrackCuts(die,cutDefinition);
+  SetupPairCuts(die,cutDefinition);
+
+  // histogram setup
+  InitHistograms(die,cutDefinition);
+  printf(" Add %d class types to the histo manager \n",die->GetHistogramList()->GetEntries());
+
+  // bgrd estimators
+  ConfigBgrd(die,cutDefinition);
+
+  // tpc event plane configuration
+  ConfigEvtPlane(die,cutDefinition);
+
+  // prefilter settings
+  die->SetPreFilterUnlikeOnly();
+  //die->SetPreFilterAllSigns();
+  //die->SetNoPairing();
+
+  return die;
+}
+
+//______________________________________________________________________________________
+void SetupEventCuts(AliDielectron *die, ULong64_t triggers, Int_t cutDefinition)
+{
+  //
+  // Setup the event cuts
+  //
+
+  // trigger specific centrality cuts (reject trigger inefficiencies)
+  Double_t minCent=0.0, maxCent=100.;
+  if(!hasMC) {
+    switch(triggers) {
+    case AliVEvent::kCentral:     minCent= 0.; maxCent= 9.; break;
+    case AliVEvent::kSemiCentral: minCent=12.; maxCent=53.; break;
+    case AliVEvent::kMB:          minCent= 0.; maxCent=80.; break;
+    default:                      minCent= 0.; maxCent=80.; break;
+    }
+  }
+
+  // VZERO multiplicity vs. number ob global tracks cut
+  TF1 *fMean  = new TF1("fMean", "pol1",               0,25e+3);
+  fMean->SetParameters(691.633, 1.4892);
+  TF1 *fSigma = new TF1("fSigma","[0]+sqrt([1]*x+[2])",0,25e+3);
+  fSigma->SetParameters(-83.6599, 36.7677, 69530.7);
+
+  // number of vertex contributors TPC vs. global cut
+  TF1* vtxContribUp = new TF1("vtxContribUp","pol1",0.,20000.);
+  vtxContribUp->SetParameters(0.,1.38);      //  --> strong cut, removes about 40% of events
+  TF1* vtxContribLow= new TF1("vtxContribLow","pol1",0.,20000.);
+  vtxContribLow->SetParameters(-100.,1.2);
+
+  AliDielectronEventCuts *eventCuts=new AliDielectronEventCuts("eventCuts","eventCuts");
+  if(!isESD) eventCuts->SetVertexType(AliDielectronEventCuts::kVtxAny);
+  eventCuts->SetRequireVertex();
+  eventCuts->SetMinVtxContributors(1);
+  eventCuts->SetVertexZ(-10.,+10.);
+  eventCuts->SetCentralityRange(minCent,maxCent);
+  
+  // apply pile-up event (PE) rejection
+  switch(cutDefinition) {
+  case kZvtxNcontrPE:
+  case kZvtxNcontrPEepTPC:
+  case kZvtxNcontrPEepTPCmag:
+    eventCuts->SetCutOnV0MultipicityNTrks(fMean, fSigma, 4.0);
+    //    eventCuts->SetCutOnNVtxContributorsGloablTPC(vtxContribLow, vtxContribUp);
+  }
+  eventCuts->Print();
+  die->GetEventFilter().AddCuts(eventCuts);
+
+}
+
+//______________________________________________________________________________________
+void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Setup the track cuts
+  //
+
+  // Quality cuts
+  AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
+  die->GetTrackFilter().AddCuts(cuts);
+
+  // AOD track filter (needs to be first cut to speed up)
+  AliDielectronTrackCuts *trkFilter = new AliDielectronTrackCuts("TrkFilter","TrkFilter");
+  trkFilter->SetAODFilterBit(AliDielectronTrackCuts::kTPCqual);
+  //  trkFilter->SetMinNCrossedRowsOverFindable(0.6);
+  if(!isESD) cuts->AddCut(trkFilter);
+
+  //Pt cut, should make execution a bit faster
+  AliDielectronVarCuts *pt = new AliDielectronVarCuts("PtCut","PtCut");
+  pt->AddCut(AliDielectronVarManager::kPt,1.1,1e30);    //0.8
+  cuts->AddCut(pt);
+
+  // track cuts ESD and AOD
+  AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
+  varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
+  varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
+  varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9); // -0.9, 0.9
+  varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
+  varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
+  varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
+  varCuts->AddCut(AliDielectronVarManager::kTOFbeta,      0.2,   0.9, kTRUE);
+  cuts->AddCut(varCuts);
+  varCuts->Print();
+
+  AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
+  trkCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 3); // ITS-4 = 1+2+4+8
+  trkCuts->SetRequireITSRefit(kTRUE);
+  trkCuts->SetRequireTPCRefit(kTRUE);
+  cuts->AddCut(trkCuts);
+
+  /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
+  AliDielectronPID *pid = new AliDielectronPID("PID","PID");
+  pid->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-100.,4.0,0.,0.,kTRUE);
+  pid->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-100.,3.5,0.,0.,kTRUE);
+  pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-4.,4.);
+  pid->AddCut(AliDielectronPID::kTOF,AliPID::kElectron,-3,3.,0.,0.,kFALSE,AliDielectronPID::kIfAvailable);
+  cuts->AddCut(pid);
+  /* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PID CUTS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
+
+  // exclude conversion electrons selected by the tender
+  AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
+  noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
+  //  cuts->AddCut(noconv);
+
+}
+
+//______________________________________________________________________________________
+void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Setup the pair cuts
+  //
+
+  // conversion rejection
+  Double_t gCut = 0.05;
+  AliDielectronVarCuts *gammaCuts = new AliDielectronVarCuts("GammaCuts","GammaCuts");
+//  gammaCuts->AddCut(AliDielectronVarManager::kOpeningAngle, 0.0,   0.1,  kTRUE);
+//  gammaCuts->AddCut(AliDielectronVarManager::kLegDist,      0.0,   0.25, kTRUE);
+//  gammaCuts->AddCut(AliDielectronVarManager::kR,            3.0,   90.0, kTRUE);
+//  gammaCuts->AddCut(AliDielectronVarManager::kPsiPair,      0.0,   0.05, kTRUE);
+//  gammaCuts->AddCut(AliDielectronVarManager::kChi2NDF,      0.0,   10.0, kTRUE);
+  gammaCuts->AddCut(AliDielectronVarManager::kM,            0.0,   gCut);
+  die->GetPairPreFilter().AddCuts(gammaCuts);
+
+  // rapidity selection
+  //  AliDielectronVarCuts *rapCut=new AliDielectronVarCuts("|Y|<.9","|Y|<.9");
+  // rapCut->AddCut(AliDielectronVarManager::kY,-0.9,0.9);
+  // die->GetPairFilter().AddCuts(rapCut);
+
+}
+
+//______________________________________________________________________________________
+void ConfigBgrd(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Configurate the background estimators
+  //
+
+  // add mixed events
+  AliDielectronMixingHandler *mix=new AliDielectronMixingHandler;
+
+  // mixing handler
+  switch(cutDefinition) {
+  case kNoBins: /* */ break;
+  case kZvtx:
+    mix->AddVariable(AliDielectronVarManager::kZvPrim, "-10.,-5.,-4.,-3.,-2.,-1.,0.,1.,2.,3.,4.,5.,10.");
+    break;
+  case kZvtxCent:
+    mix->AddVariable(AliDielectronVarManager::kZvPrim, "-10.,-5.,-4.,-3.,-2.,-1.,0.,1.,2.,3.,4.,5.,10.");
+    mix->AddVariable(AliDielectronVarManager::kCentrality,  8,  0.,80.);
+    break;
+  case kZvtxNcontrPEepTPCmag:
+    mix->AddVariable(AliDielectronVarManager::kTPCmagH2,    "0.,20.,50.,80.,110.,150.,500.");
+  case kZvtxNcontrPEepTPC:
+    mix->AddVariable(AliDielectronVarManager::kTPCrpH2,     8,  TMath::Pi()/-2., TMath::Pi()/2.);
+  case kZvtxNcontrPE:
+  case kZvtxNcontr:
+    mix->AddVariable(AliDielectronVarManager::kNVtxContrib, 32, 0.,3200.);
+    mix->AddVariable(AliDielectronVarManager::kZvPrim, "-10.,-5.,-4.,-3.,-2.,-1.,0.,1.,2.,3.,4.,5.,10.");
+    break;
+  }
+  mix->SetMixType(AliDielectronMixingHandler::kOSonly);
+  mix->SetDepth(150);
+  mix->Print();
+
+  die->SetMixingHandler(mix);
+}
+
+//______________________________________________________________________________________
+void ConfigEvtPlane(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Configurate the TPC event plane 
+  //
+
+  if(cutDefinition!=kZvtxNcontrPEepTPC && cutDefinition!=kZvtxNcontrPEepTPCmag) return;
+
+  Double_t gGap = 0.0;
+  AliDielectronVarCuts *poi = new AliDielectronVarCuts("PoI","PoI");
+  poi->AddCut(AliDielectronVarManager::kM,2.92,3.20);     // particles of interest, jpsi mass window
+  die->GetEventPlanePOIPreFilter().AddCuts(poi);
+
+  // eta gap in tpc event plane
+  //AliDielectronVarCuts *etaGap = new AliDielectronVarCuts(AliDielectronVarManager::GetValueName(AliDielectronVarManager::kEta),"etaGap");
+  //etaGap->AddCut(AliDielectronVarManager::kEta,-1*gGap,gGap,kTRUE);
+  //die->GetEventPlanePreFilter().AddCuts(etaGap);
+  //if(cutDefinition==kSubLS) die->SetLikeSignSubEvents();
+
+  die->SetPreFilterEventPlane();
+}
+
+//______________________________________________________________________________________
+void InitHistograms(AliDielectron *die, Int_t cutDefinition)
+{
+  //
+  // Initialise the histograms
+  //
+
+  //Setup histogram Manager
+  AliDielectronHistos *histos=new AliDielectronHistos(die->GetName(),die->GetTitle());
+
+  //add histograms to event class
+  histos->AddClass("Event");
+
+
+  switch(cutDefinition) {
+  case kNoBins: /* */ break;
+  case kZvtxCent:
+    histos->UserHistogram("Event","","", 200,-10.,   10.,    AliDielectronVarManager::kZvPrim);
+    histos->UserHistogram("Event","","", 100,  0.0, 100.0,   AliDielectronVarManager::kCentrality);
+    break;
+  case kZvtxNcontrPEepTPCmag:
+    histos->UserHistogram("Event","","", 250,  0.,  500.,    AliDielectronVarManager::kTPCmagH2);
+  case kZvtxNcontrPEepTPC:
+    histos->UserHistogram("Event","","", 16, TMath::Pi()/-2., TMath::Pi()/2.,    AliDielectronVarManager::kTPCrpH2);
+  case kZvtxNcontrPE:
+  case kZvtxNcontr:
+    histos->UserHistogram("Event","","", 200,  0., 4000.,    AliDielectronVarManager::kNVtxContrib);
+  case kZvtx:
+    histos->UserHistogram("Event","","", 200,-10.,   10.,    AliDielectronVarManager::kZvPrim);
+    break;
+  }
+
+  //Initialise histogram classes
+  histos->SetReservedWords("Pair");
+  //Pair classes inclusive mixed events
+  histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(0)));
+  histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(1)));
+  histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(2)));
+  histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(4)));
+
+  ///// add histograms to Pair classes /////
+  histos->UserHistogram("Pair","","",  300,.0,300*0.04, AliDielectronVarManager::kM); // 40MeV bins, 12GeV/c2
+  histos->UserHistogram("Pair","","",  100,-1.,1.,      AliDielectronVarManager::kY);
+  histos->UserHistogram("Pair","","",  400,0,20.,       AliDielectronVarManager::kPt);
+
+
+  //legs from pair (fill SE)
+  //  for (Int_t i=0; i<3; ++i){
+  //  histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
+  // }
+  //Track classes
+  //to fill also track info from 2nd event loop until 2
+  //for (Int_t i=0; i<2; ++i){
+  //  histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
+  //}
+
+
+  die->SetHistogramManager(histos);
+}
index cf5b559be79a016c06a50c31ad4a6365b878cc7d..8ce9a9afb6bdb9fe9773c0e27cc14d1082c8c74c 100644 (file)
@@ -6,8 +6,6 @@ void SetupPairCuts(AliDielectron *die,  Int_t cutDefinition);
 
 void AddMCSignals(AliDielectron *die);
 
-void SetupNanoTrackCuts(AliDielectron *die, Int_t cutDefinition);
-
 void SetEtaCorrection();
 TVectorD *GetRunNumbers();
 
@@ -57,9 +55,8 @@ AliDielectron* ConfigJpsiQA_jpsi_PbPb(Int_t cutDefinition, TString prod="", ULon
 
   // cut setup
   SetupEventCuts(die,triggers);
-  //SetupTrackCuts(die,cutDefinition);
-  SetupNanoTrackCuts(die,cutDefinition);
-  //  SetupPairCuts(die,cutDefinition);
+  SetupTrackCuts(die,cutDefinition);
+  SetupPairCuts(die,cutDefinition);
 
   // MC signals
   if(hasMC) {
@@ -190,15 +187,15 @@ void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
 
   // track cuts ESD and AOD
   AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
-  //varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
-  //varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
-  //  varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
+  varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
+  varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
+  varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
   varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
   //varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
   varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     50.0, 160.0);
-  //varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
+  varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
   //varCuts->AddCut(AliDielectronVarManager::kTOFbeta,      0.2,   0.9, kTRUE);
-  //varCuts->Print();
+  varCuts->Print();
   cuts->AddCut(varCuts);
 
   /* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv PID CUTS vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
@@ -246,42 +243,6 @@ void SetupTrackCuts(AliDielectron *die, Int_t cutDefinition)
 
 }
 
-void SetupNanoTrackCuts(AliDielectron *die, Int_t cutDefinition)
-{
-  //
-  // Setup the track cuts
-  //
-
-  // Quality cuts
-  AliDielectronCutGroup* cuts = new AliDielectronCutGroup("cuts","cuts",AliDielectronCutGroup::kCompAND);
-  die->GetTrackFilter().AddCuts(cuts);
-
-  AliDielectronTrackCuts *trkCuts = new AliDielectronTrackCuts("TrkCuts","TrkCuts");
-  //trkCuts->SetITSclusterCut(AliDielectronTrackCuts::kOneOf, 15); // ITS-4 = 1+2+4+8
-  trkCuts->SetRequireITSRefit(kTRUE);
-  trkCuts->SetRequireTPCRefit(kTRUE);
-  //  cuts->AddCut(trkCuts);
-
-  //Pt cut, should make execution a bit faster
-  AliDielectronVarCuts *pt = new AliDielectronVarCuts("PtCut","PtCut");
-  pt->AddCut(AliDielectronVarManager::kPt,0.7,1e30);    //1.1
-  cuts->AddCut(pt);
-  pt->Print();
-
-  // track cuts ESD and AOD
-  AliDielectronVarCuts *varCuts = new AliDielectronVarCuts("VarCuts","VarCuts");
-  varCuts->AddCut(AliDielectronVarManager::kImpactParXY, -1.0,   1.0);
-  varCuts->AddCut(AliDielectronVarManager::kImpactParZ,  -3.0,   3.0);
-  varCuts->AddCut(AliDielectronVarManager::kEta,         -0.9,   0.9);
-  varCuts->AddCut(AliDielectronVarManager::kTPCchi2Cl,    0.0,   4.0);
-  varCuts->AddCut(AliDielectronVarManager::kNclsTPC,     70.0, 160.0);
-  //varCuts->AddCut(AliDielectronVarManager::kKinkIndex0,   0.0);
-  varCuts->AddCut(AliDielectronVarManager::kTPCnSigmaEle,-3.2,   4.0);
-  //varCuts->Print();
-  //cuts->AddCut(varCuts);
-
-}
-
 //______________________________________________________________________________________
 void SetupPairCuts(AliDielectron *die, Int_t cutDefinition)
 {
@@ -391,7 +352,9 @@ void InitHistograms(AliDielectron *die, Int_t cutDefinition)
                          GetRunNumbers(), 
                          AliDielectronVarManager::kNTrk, AliDielectronVarManager::kMultV0C,  AliDielectronVarManager::kRunNumber);
 
-
+    histos->UserHistogram("Event","","", 110,0.,1.1, AliDielectronVarManager::kMatchEffITSTPC);
+    histos->UserHistogram("Event","","", 200,0.,20000., 110,0.,1.1,
+                         AliDielectronVarManager::kNTrk, AliDielectronVarManager::kMatchEffITSTPC);
     histos->UserHistogram("Event","","", 80.,0.,80., 80.,0.,80., AliDielectronVarManager::kCentrality, AliDielectronVarManager::kCentralitySPD);
 
 
diff --git a/PWGDQ/dielectron/macrosJPSI/ConfigJpsi_mw_pPb.C b/PWGDQ/dielectron/macrosJPSI/ConfigJpsi_mw_pPb.C
new file mode 100644 (file)
index 0000000..77d8eb1
--- /dev/null
@@ -0,0 +1,322 @@
+void SetupTrackCutsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD);
+void SetupPairCutsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD);
+void InitHistogramsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD);
+void InitCFDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD);
+
+//AliESDtrackCuts *SetupESDtrackCutsDieleData(Int_t cutDefinition);
+
+TString namesDieleData=("basicQ+SPDfirst+pt>1+PID; basicQ+SPDany+pt>1+PID; basicQ+ITS012+pt>1+PID; basiQ+SPDany+pt>1+p>1.2+TPCsignalfrom70to110");
+//TString namesDieleData=("basicQ+SPDfirst+pt>1+PID");
+
+TObjArray *arrNamesDieleData=namesDieleData.Tokenize("; ");
+
+const Int_t nDie=arrNamesDieleData->GetEntries();
+
+AliDielectron* ConfigJpsi_mw_pPb(Int_t cutDefinition, Bool_t isAOD=kFALSE/*must be kTRUE for AODs old setting*/) 
+{
+  //
+  // Setup the instance of AliDielectron
+  //
+  
+  // create the actual framework object
+  TString name=Form("%02d",cutDefinition);
+  if (cutDefinition<arrNamesDieleData->GetEntriesFast()){
+    name=arrNamesDieleData->At(cutDefinition)->GetName();
+  }
+  AliDielectron *diele = new AliDielectron(Form("%s",name.Data()),
+                             Form("Track cuts: %s",name.Data()));
+
+  
+  // estimators filename
+  //NOTE: what does this mean?: estimator for pp multiplicity, not needed for instance for my pA-purpose(mwinn 16.1.2012)..
+  diele->SetEstimatorFilename("$ALICE_ROOT/PWGDQ/dielectron/files/estimators.root");
+  //diele->SetEstimatorFilename("estimators.root");
+  // cut setup
+  SetupTrackCutsDieleData(diele, cutDefinition, isAOD);
+  SetupPairCutsDieleData(diele, cutDefinition, isAOD);
+  //
+  // histogram setup
+  // only if an AliDielectronHistos object is attached to the
+  // dielelectron framework histograms will be filled
+  //
+  InitHistogramsDieleData(diele, cutDefinition, isAOD);
+  
+  // the last definition uses no cuts and only the QA histograms should be filled!, now for all cuts
+  if(cutDefinition == 0 || cutDefinition == 1 || cutDefinition == 2 || cutDefinition == 3) InitCFDieleData(diele, cutDefinition, isAOD);
+
+  AliDielectronTrackRotator *rot=new AliDielectronTrackRotator;
+  if(cutDefinition == 0 || cutDefinition == 1 || cutDefinition == 2 || cutDefinition == 3) rot->SetConeAnglePhi(TMath::Pi());
+  //else if(cutDefinition == 2) rot->SetConeAnglePhi(TMath::Pi()/180.*135.);
+  //rot->SetIterations(10);
+  rot->SetIterations(20);
+  diele->SetTrackRotator(rot);
+  
+  return diele;
+}
+
+//______________________________________________________________________________________
+void SetupTrackCutsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD)
+{
+  //
+  // Setup the track cuts
+  //
+  
+  if (!isAOD) {
+    //exclude conversion electrons selected by the tender
+    AliDielectronTrackCuts *noconv=new AliDielectronTrackCuts("noConv","noConv");
+    noconv->SetV0DaughterCut(AliPID::kElectron,kTRUE);
+    diele->GetTrackFilter().AddCuts(noconv);
+    }/* else {
+    //this is only for AODs
+    AliDielectronTrackCuts *trackCuts=new AliDielectronTrackCuts("trackCuts","trackCuts");
+    if (cutDefinition==0)
+      trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
+    else if ((cutDefinition==1)||(cutDefinition ==3))
+      trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+      trackCuts->SetRequireTPCRefit(kTRUE);
+      trackCuts->SetRequireITSRefit(kTRUE);
+      diele->GetTrackFilter().AddCuts(trackCuts);
+      }*/
+    AliDielectronTrackCuts *trackCuts=new AliDielectronTrackCuts("ITSandgeneral_trackCuts","ITSandgeneral_trackCuts");
+    //ITS related cuts
+    if (cutDefinition==0)
+      trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
+    else if ((cutDefinition==1)||(cutDefinition ==3))
+      trackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+      trackCuts->SetRequireTPCRefit(kTRUE);
+      trackCuts->SetRequireITSRefit(kTRUE);
+      diele->GetTrackFilter().AddCuts(trackCuts);
+  
+  //Pt cut ----------------------------------------------------------
+  AliDielectronVarCuts *pt = new AliDielectronVarCuts("trackkineandTPCQ","trackkine_and_TPCQ");
+  pt->AddCut(AliDielectronVarManager::kPt,1.,1e30);
+  pt->AddCut(AliDielectronVarManager::kKinkIndex0,0.);
+  // ITS 0 1 2 : only for third variant
+  if (cutDefinition==2) pt->AddCut(AliDielectronVarManager::kITSLayerFirstCls,0.,2.5);
+  //AOD additions since there are no AliESDtrackCuts -----------------
+  //
+  // TPC #clusteres cut
+  pt->AddCut(AliDielectronVarManager::kNclsTPC,70.,160.);
+  //chi square cut TOC missing...
+  pt->AddCut(AliDielectronVarManager::kTPCchi2Cl,0.,4.);
+  pt->AddCut(AliDielectronVarManager::kEta,-0.9,0.9);
+  //TODO: DCA cuts to be investigated!!! NOTE: why?? (mwinn, 15.01.2013)
+  pt->AddCut(AliDielectronVarManager::kImpactParXY,-1.,1.);
+  pt->AddCut(AliDielectronVarManager::kImpactParZ,-3.,3.);
+  
+  diele->GetTrackFilter().AddCuts(pt);
+    
+  // PID cuts --------------------------------------------------------
+  if(cutDefinition ==0 || cutDefinition ==1 ||cutDefinition ==2){
+    AliDielectronPID *pid = new AliDielectronPID("PID10","TPC nSigma |e|<3 + |Pi|>3.5 + P>3");
+    pid->AddCut(AliDielectronPID::kTPC,AliPID::kElectron,-3.,3.);
+    pid->AddCut(AliDielectronPID::kTPC,AliPID::kPion,-3.5,3.5,0.,0.,kTRUE);
+    pid->AddCut(AliDielectronPID::kTPC,AliPID::kProton,-20.,3.,0.,0.,kTRUE);
+    diele->GetTrackFilter().AddCuts(pid);
+  }
+  if(cutDefinition ==3){
+    AliDielectronVarCuts *pidsubs = new AliDielectronVarCuts("pidSubs","pidsubs cut");
+     pidsubs->AddCut(AliDielectronVarManager::kP,1.2,1e30);
+     pidsubs->AddCut(AliDielectronVarManager::kTPCsignal,70.,110.);
+     diele->GetTrackFilter().AddCuts(pidsubs);
+  }
+}
+
+//______________________________________________________________________________________
+void SetupPairCutsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD)
+{
+  //
+  // Setup the pair cuts
+  //
+  // conversion rejection
+  //Double_t gCut = 0.05;             // default
+   Double_t gCut = 0.100;             // default
+
+  AliDielectronVarCuts *gammaCut=new AliDielectronVarCuts("gammaCut","gammaCut");
+  gammaCut->AddCut(AliDielectronVarManager::kM,0.,gCut);
+  diele->GetPairPreFilter().AddCuts(gammaCut);
+  diele->SetPreFilterUnlikeOnly();
+  //Invariant mass and rapidity selection
+  AliDielectronVarCuts *pairCut=new AliDielectronVarCuts("2<M<4+|Y|<.9","2<M<4 + |Y|<.9");
+  // pairCut->AddCut(AliDielectronVarManager::kM,2.,4.);
+  pairCut->AddCut(AliDielectronVarManager::kY,-0.9,0.9);
+  diele->GetPairFilter().AddCuts(pairCut);
+}
+/*
+//______________________________________________________________________________________
+AliESDtrackCuts *SetupESDtrackCutsDieleData(Int_t cutDefinition)
+{
+  //
+  // Setup default AliESDtrackCuts
+  //
+  AliESDtrackCuts *esdTrackCuts = new AliESDtrackCuts;
+
+  // basic track quality cuts  (basicQ)
+ //done esdTrackCuts->SetMaxDCAToVertexZ(3.0);
+ //done esdTrackCuts->SetMaxDCAToVertexXY(1.0);
+
+//done  esdTrackCuts->SetEtaRange( -0.9 , 0.9 );
+
+//done esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+//done  esdTrackCuts->SetRequireITSRefit(kTRUE);
+//done esdTrackCuts->SetRequireTPCRefit(kTRUE);
+
+//done  esdTrackCuts->SetPtRange(1.,1e30);
+
+
+//done  esdTrackCuts->SetMinNClustersTPC(70);
+
+//done  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+   // default SPD any
+  if ((cutDefinition==1)||(cutDefinition==3)) esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kAny);
+
+  if (cutDefinition==0)
+    esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,AliESDtrackCuts::kFirst);
+
+  return esdTrackCuts;
+}
+*/
+
+//______________________________________________________________________________________
+void InitHistogramsDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD)
+{
+  //
+  // Initialise the histograms
+  //
+  
+  //Setup histogram Manager
+  AliDielectronHistos *histos=new AliDielectronHistos(diele->GetName(),diele->GetTitle());
+  
+  //Initialise histogram classes
+  histos->SetReservedWords("Track;Pair");
+  
+  //Track classes
+  //to fill also track info from 2nd event loop until 2
+  for (Int_t i=0; i<2; ++i){
+    histos->AddClass(Form("Track_%s",AliDielectron::TrackClassName(i)));
+  }
+  
+  //Pair classes
+  // to fill also mixed event histograms loop until 10
+  for (Int_t i=0; i<3; ++i){
+    histos->AddClass(Form("Pair_%s",AliDielectron::PairClassName(i)));
+  }
+  
+  //legs from pair
+  for (Int_t i=0; i<3; ++i){
+    histos->AddClass(Form("Track_Legs_%s",AliDielectron::PairClassName(i)));
+  }
+   //track rotation
+   histos->AddClass(Form("Pair_%s",PairClassName(AliDielectron::kEv1PMRot)));
+   histos->AddClass(Form("Track_Legs_%s",PairClassName(AliDielectron::kEv1PMRot)));
+  
+  
+  //add histograms to event class
+  if (cutDefinition==0) {
+    histos->AddClass("Event");
+    histos->AddClass("Event_noCuts"); 
+   histos->UserHistogram("Event","VtxZ","Vertex Z;Z[cm]",300,-15.,15.,AliDielectronVarManager::kZvPrim);
+    // nAcc
+    histos->UserHistogram("Event","NAccRaw","Accepted raw SPD tracklets, |y|<1; nTrackl; #Entries",101,-0.5,100.5, AliDielectronVarManager::kNaccTrckltsEsd10); 
+    histos->UserHistogram("Event","NAccCorr","Accepted corr SPD tracklets, |y|<1; nTrackl; #Entries",101,-0.5,100.5, AliDielectronVarManager::kNaccTrckltsEsd10Corr); 
+   // nAcc vs Zvtx
+   histos->UserHistogram("Event","NAccRaw_vs_Zvtx","Accepted raw SPD tracklets vs Z vtx, |y|<1; Zvtx[cm]; nTrackl ",300,-15.,15.,101,-0.5,100.5, AliDielectronVarManager::kZvPrim,AliDielectronVarManager::kNaccTrckltsEsd10);
+    histos->UserHistogram("Event","NAccCorr_vs_Zvtx","Accepted corr SPD tracklets vs Z vtx, |y|<1; Zvtx[cm]; nTrackl ",300,-15.,15.,101,-0.5,100.5, AliDielectronVarManager::kZvPrim,AliDielectronVarManager::kNaccTrckltsEsd10Corr);
+
+   // no event cuts 
+   histos->UserHistogram("Event_noCuts","VtxZ","Vertex Z;Z[cm]",300,-15.,15.,AliDielectronVarManager::kZvPrim);
+    // nAcc
+    histos->UserHistogram("Event_noCuts","NAccRaw","Accepted raw SPD tracklets, |y|<1; nTrackl; #Entries",101,-0.5,100.5, AliDielectronVarManager::kNaccTrckltsEsd10);
+    histos->UserHistogram("Event_noCuts","NAccCorr","Accepted corr SPD tracklets, |y|<1; nTrackl; #Entries",101,-0.5,100.5, AliDielectronVarManager::kNaccTrckltsEsd10Corr);
+   // nAcc vs Zvtx
+   histos->UserHistogram("Event_noCuts","NAccRaw_vs_Zvtx","Accepted raw SPD tracklets vs Z vtx, |y|<1; Zvtx[cm]; nTrackl ",300,-15.,15.,101,-0.5,100.5, AliDielectronVarManager::kZvPrim,AliDielectronVarManager::kNaccTrckltsEsd10);
+    histos->UserHistogram("Event_noCuts","NAccCorr_vs_Zvtx","Accepted corr SPD tracklets vs Z vtx, |y|<1; Zvtx[cm]; nTrackl ",300,-15.,15.,101,-0.5,100.5, AliDielectronVarManager::kZvPrim,AliDielectronVarManager::kNaccTrckltsEsd10Corr);
+
+   }
+  
+  //add histograms to Track classes
+  histos->UserHistogram("Track","Pt","Pt;Pt [GeV];#tracks",400,0,20.,AliDielectronVarManager::kPt);
+  histos->UserHistogram("Track","TPCnCls","Number of Clusters TPC;TPC number clusteres;#tracks",160,-0.5,159.5,AliDielectronVarManager::kNclsTPC);
+  
+  histos->UserHistogram("Track","dXY","dXY;dXY [cm];#tracks",500,-1.,1.,AliDielectronVarManager::kImpactParXY);
+  histos->UserHistogram("Track","dZ","dZ;dZ [cm];#tracks",600,-3.,3.,AliDielectronVarManager::kImpactParZ);
+  histos->UserHistogram("Track","Eta_Phi","Eta Phi Map; Eta; Phi;#tracks",
+                        100,-1,1,144,0,6.285,AliDielectronVarManager::kEta,AliDielectronVarManager::kPhi);
+
+  histos->UserHistogram("Track","dEdx_P","dEdx;P [GeV];TPC signal (arb units);#tracks",
+                        200,0.2,20.,100,0.,200.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCsignal,kTRUE);
+  histos->UserHistogram("Track","TPCnSigmaEle_P","TPC number of sigmas Electrons;P [GeV];TPC number of sigmas Electrons;#tracks",
+                        200,0.2,20.,100,-10.,10.,AliDielectronVarManager::kPIn,AliDielectronVarManager::kTPCnSigmaEle,kTRUE);
+      
+  //add histograms to Pair classes
+  histos->UserHistogram("Pair","InvMass","Inv.Mass;Inv. Mass [GeV];#pairs",
+                        125,0.,125*.04,AliDielectronVarManager::kM);
+  histos->UserHistogram("Pair","Rapidity","Rapidity;Rapidity;#pairs",
+                        100,-1.,1.,AliDielectronVarManager::kY);
+  histos->UserHistogram("Pair","OpeningAngle","Opening angle;angle",
+                        100,0.,3.15,AliDielectronVarManager::kOpeningAngle);
+
+ // 3D histos: invMass - Multiplicity - ptJpsi
+  histos->UserHistogram("Pair","InvMass_NaccRaw_PtJpsi","Inv.Mass - NaccRaw - PtJpsi;Inv. Mass [GeV];NaccRaw; pTJpsi[GeV/c]", 125,0.,125*.04,101,-0.5,100.5, 100, 0.,10., AliDielectronVarManager::kM,AliDielectronVarManager::kNaccTrckltsEsd10, AliDielectronVarManager::kPt);
+  histos->UserHistogram("Pair","InvMass_NaccCorr_PtJpsi","Inv.Mass - NaccCorr - PtJpsi;Inv. Mass [GeV];NaccCor; pTJpsi[GeV/c]", 125,0.,125*.04,101,-0.5,100.5,100,0.,10., AliDielectronVarManager::kM,AliDielectronVarManager::kNaccTrckltsEsd10Corr, AliDielectronVarManager::kPt);
+  diele->SetHistogramManager(histos);
+}
+
+
+void InitCFDieleData(AliDielectron *diele, Int_t cutDefinition, Bool_t isAOD)
+{
+  //
+  // Setupd the CF Manager if needed
+  //
+  
+  AliDielectronCF *cf=new AliDielectronCF(diele->GetName(),diele->GetTitle());
+  
+  //pair variables
+  cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 1.0, 1.3, 2.0, 3.0, 5., 7.0, 10.0, 100.0");
+  cf->AddVariable(AliDielectronVarManager::kY,"-5,-1,-0.9,-0.8,-0.7,-0.5,-0.3,0.3,0.5,0.7,0.8,0.9,1.0,5");
+  cf->AddVariable(AliDielectronVarManager::kM,125,0.,125*.04); //40Mev Steps
+  cf->AddVariable(AliDielectronVarManager::kPseudoProperTime,150,-0.3,0.3);
+  cf->AddVariable(AliDielectronVarManager::kPseudoProperTimeErr,600,0.,0.3);
+  cf->AddVariable(AliDielectronVarManager::kPairType,"-0.5,0.5,1.5,2.5,9.5,10.5");
+  
+
+  //leg variables
+  cf->AddVariable(AliDielectronVarManager::kPt,"0.0, 0.8, 0.9, 0.95, 1.0, 1.05, 1.1, 1.2, 100.0",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kNclsTPC,"0, 70, 75, 80, 85, 90, 100, 120, 160",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kTPCchi2Cl,"0, 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4.",kTRUE);  
+  cf->AddVariable(AliDielectronVarManager::kEta,"-5,-1,-0.9,-0.85,-0.8,-0.75,0.75,0.8,0.85,0.9,1.0,5",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kTPCnSigmaEle,"-2.5,-2,-1.5,-1,-0.5,4.",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kTPCnSigmaPio,"3.,3.5,4.,100",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kTPCnSigmaPro,"3.,3.5,4.,100",kTRUE);
+  cf->AddVariable(AliDielectronVarManager::kITSLayerFirstCls,6,-0.5,5.5,kTRUE);
+
+  //event variables
+  //cf->AddVariable(AliDielectronVarManager::kNaccTrcklts,"0.0, 9.0, 17.0, 25.0, 36.0, 55.0, 500.0");
+  cf->AddVariable(AliDielectronVarManager::kNaccTrckltsEsd10,101,-0.5,100.5);
+  cf->AddVariable(AliDielectronVarManager::kNaccTrckltsEsd10Corr,101,-0.5,100.5);
+  cf->AddVariable(AliDielectronVarManager::kZvPrim,"-20.,-15.,-10.,-5.,0.,5.,10.,15.,20.");
+  if (!isAOD){
+    Bool_t hasMC=(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()!=0x0);
+    if (hasMC){
+      cf->AddVariable(AliDielectronVarManager::kPdgCode,10000,-5000.5,4999.5,kTRUE);
+      cf->AddVariable(AliDielectronVarManager::kPdgCodeMother,10000,-5000.5,4999.5,kTRUE);
+      cf->AddVariable(AliDielectronVarManager::kPdgCodeGrandMother,10000,-5000.5,4999.5,kTRUE);
+    }
+  }
+  
+  //only in this case write MC truth info
+  //if (cutDefinition==0){
+  //  cf->SetStepForMCtruth();
+  //}
+
+  diele->SetCFManagerPair(cf);
+  
+}
+