]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Update from Francesco Noferini: Added Macros to PID methods
authoriseliouj <iseliouj@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 10 Jan 2013 14:48:12 +0000 (14:48 +0000)
committeriseliouj <iseliouj@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 10 Jan 2013 14:48:12 +0000 (14:48 +0000)
PWGCF/FLOW/macros/AddTaskFlowCentralityPIDQC.C [new file with mode: 0644]
PWGCF/FLOW/macros/AddTaskFlowCentralityPIDSP.C [new file with mode: 0644]
PWGCF/FLOW/macros/AddTaskPidQC.C [new file with mode: 0644]
PWGCF/FLOW/macros/AddTaskPidVZEROSP.C [new file with mode: 0644]

diff --git a/PWGCF/FLOW/macros/AddTaskFlowCentralityPIDQC.C b/PWGCF/FLOW/macros/AddTaskFlowCentralityPIDQC.C
new file mode 100644 (file)
index 0000000..95dbd01
--- /dev/null
@@ -0,0 +1,653 @@
+/////////////////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// AddTask* macro for flow analysis\r
+// Creates a Flow Event task and adds it to the analysis manager.\r
+// Sets the cuts using the correction framework (CORRFW) classes.\r
+// Also creates Flow Analysis tasks and connects them to the output of the flow event task.\r
+//\r
+/////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+void AddTaskFlowCentralityPIDQC( Float_t centrMin=10.,\r
+                               Float_t centrMax=20.,\r
+                               TString fileNameBase="output",\r
+                               Bool_t isPID = kTRUE,\r
+                               AliPID::EParticleType particleType=AliPID::kPion,\r
+                               AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian,\r
+                               Int_t charge=0,\r
+                               Int_t harmonic=2,\r
+                               Bool_t doQA=kFALSE,\r
+                               TString uniqueStr="" )\r
+{\r
+  // Define the range for eta subevents (for SP method)\r
+  Double_t minA = -5;\r
+  Double_t maxA = -1.5;\r
+  Double_t minB = 1.5;\r
+  Double_t maxB = 5;\r
+\r
+  // AFTERBURNER\r
+  Bool_t useAfterBurner=kFALSE;\r
+  Double_t v1=0.0;\r
+  Double_t v2=0.0;\r
+  Double_t v3=0.0;\r
+  Double_t v4=0.0;\r
+  Int_t numberOfTrackClones=0; //non-flow\r
+\r
+  // Define a range of the detector to exclude\r
+  Bool_t ExcludeRegion = kFALSE;\r
+  Double_t excludeEtaMin = -0.;\r
+  Double_t excludeEtaMax = 0.;\r
+  Double_t excludePhiMin = 0.;\r
+  Double_t excludePhiMax = 0.;\r
+\r
+  // use physics selection class\r
+  Bool_t  UsePhysicsSelection = kTRUE;\r
+\r
+  // QA\r
+  Bool_t runQAtask=kFALSE;\r
+  Bool_t FillQAntuple=kFALSE;\r
+  Bool_t DoQAcorrelations=kFALSE;\r
+\r
+  // RUN SETTINGS\r
+  // Flow analysis method can be:(set to kTRUE or kFALSE)\r
+  Bool_t SP       = kFALSE;  // scalar product method (similar to eventplane method)\r
+  Bool_t QC       = kTRUE;  // cumulants using Q vectors\r
+  \r
+  //these are OBSOLETE, use at own peril\r
+  Bool_t GFC      = kFALSE;  // cumulants based on generating function\r
+  Bool_t MCEP     = kFALSE;  // correlation with Monte Carlo reaction plane\r
+  Bool_t FQD      = kFALSE;  // fit of the distribution of the Q vector (only integrated v)\r
+  Bool_t LYZ1SUM  = kFALSE;  // Lee Yang Zeroes using sum generating function (integrated v)\r
+  Bool_t LYZ1PROD = kFALSE;  // Lee Yang Zeroes using product generating function (integrated v)\r
+  Bool_t LYZ2SUM  = kFALSE; // Lee Yang Zeroes using sum generating function (second pass differential v)\r
+  Bool_t LYZ2PROD = kFALSE; // Lee Yang Zeroes using product generating function (second pass differential v)\r
+  Bool_t LYZEP    = kFALSE; // Lee Yang Zeroes Event plane using sum generating function (gives eventplane + weight)\r
+  Bool_t MH       = kFALSE;  // azimuthal correlators in mixed harmonics  \r
+  Bool_t NL       = kFALSE;  // nested loops (for instance distribution of phi1-phi2 for all distinct pairs)\r
+\r
+  Bool_t METHODS[] = {SP,LYZ1SUM,LYZ1PROD,LYZ2SUM,LYZ2PROD,LYZEP,GFC,QC,FQD,MCEP,MH,NL};\r
+\r
+  // Boolean to use/not use weights for the Q vector\r
+  Bool_t WEIGHTS[] = {kFALSE,kFALSE,kFALSE}; //Phi, v'(pt), v'(eta)\r
+\r
+  // SETTING THE CUTS\r
+\r
+  //---------Data selection----------\r
+  //kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet\r
+  AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;\r
+  AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;\r
+\r
+  //---------Parameter mixing--------\r
+  //kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt\r
+  AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;\r
+  AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;\r
+\r
+\r
+  const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);\r
+  const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);\r
+\r
+  //===========================================================================\r
+  // EVENTS CUTS:\r
+  AliFlowEventCuts* cutsEvent = new AliFlowEventCuts("event cuts");\r
+  cutsEvent->SetCentralityPercentileRange(centrMin,centrMax);\r
+  cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);\r
+  cutsEvent->SetRefMultMethod(AliFlowEventCuts::kV0);\r
+  //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);\r
+//  cutsEvent->SetNContributorsRange(2);\r
+  cutsEvent->SetPrimaryVertexZrange(-10.,10.);\r
+  cutsEvent->SetQA(doQA);\r
+  \r
+  // RP TRACK CUTS:\r
+  AliFlowTrackCuts* cutsRP2 = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts();\r
+  AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts("TPConlyRP");\r
+  cutsRP->SetParamType(rptype);\r
+  cutsRP->SetParamMix(rpmix);\r
+  cutsRP->SetPtRange(0.2,5.);\r
+  cutsRP->SetEtaRange(-0.8,0.8);\r
+  cutsRP->SetMinNClustersTPC(70);\r
+//  cutsRP->SetMinChi2PerClusterTPC(0.1);\r
+//  cutsRP->SetMaxChi2PerClusterTPC(4.0);\r
+  cutsRP->SetMaxDCAToVertexXY(3.0);\r
+  cutsRP->SetMaxDCAToVertexZ(3.0);\r
+  cutsRP->SetAcceptKinkDaughters(kFALSE);\r
+  cutsRP->SetMinimalTPCdedx(10.);\r
+  cutsRP->SetQA(doQA);\r
+\r
+  // POI TRACK CUTS:\r
+  AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts("GlobalPOI");\r
+  cutsPOI->SetParamType(poitype);\r
+  cutsPOI->SetParamMix(poimix);\r
+  cutsPOI->SetPtRange(0.0,10.);\r
+  cutsPOI->SetEtaRange(-0.8,0.8);\r
+  //cutsPOI->SetRequireCharge(kTRUE);\r
+  //cutsPOI->SetPID(PdgRP);\r
+  cutsPOI->SetMinNClustersTPC(70);\r
+//  cutsPOI->SetMinChi2PerClusterTPC(0.1);\r
+//  cutsPOI->SetMaxChi2PerClusterTPC(4.0);\r
+//  cutsPOI->SetRequireITSRefit(kTRUE);\r
+//  cutsPOI->SetRequireTPCRefit(kTRUE);\r
+//  cutsPOI->SetMinNClustersITS(2);\r
+  //cutsPOI->SetMaxChi2PerClusterITS(1.e+09);\r
+  cutsPOI->SetMaxDCAToVertexXY(3.0);\r
+  cutsPOI->SetMaxDCAToVertexZ(3.0);\r
+  //cutsPOI->SetDCAToVertex2D(kTRUE);\r
+  //cutsPOI->SetMaxNsigmaToVertex(1.e+10);\r
+  //cutsPOI->SetRequireSigmaToVertex(kFALSE);\r
+  cutsPOI->SetAcceptKinkDaughters(kFALSE);\r
+  if(isPID) cutsPOI->SetPID(particleType, sourcePID);\r
+  if (charge!=0) cutsPOI->SetCharge(charge);\r
+  //cutsPOI->SetAllowTOFmismatch(kFALSE);\r
+  cutsPOI->SetRequireStrictTOFTPCagreement(kTRUE);\r
+  //iexample: francesco's tunig TPC Bethe Bloch for data:\r
+  //cutsPOI->GetESDpid().GetTPCResponse().SetBetheBlochParameters(4.36414e-02,1.75977e+01,1.14385e-08,2.27907e+00,3.36699e+00);\r
+  //cutsPOI->GetESDpid().GetTPCResponse().SetMip(49);\r
+  cutsPOI->SetMinimalTPCdedx(10.);\r
+  cutsPOI->SetQA(doQA);\r
+  cutsPOI->SetPriors((centrMin+centrMax)*0.5); // set priors and PID as a function of the centrality\r
+\r
+  TString outputSlotName("");\r
+  outputSlotName+=uniqueStr;\r
+  outputSlotName+=Form("QC(%i) ",harmonic);\r
+  outputSlotName+=cutsRP->GetName();\r
+  outputSlotName+=" ";\r
+  outputSlotName+=cutsPOI->GetName();\r
+  outputSlotName+=Form(" %.0f-",centrMin);\r
+  outputSlotName+=Form("%.0f ",centrMax);\r
+  if(isPID){\r
+     outputSlotName+=AliFlowTrackCuts::PIDsourceName(sourcePID);\r
+     outputSlotName+=" ";\r
+     outputSlotName+=AliPID::ParticleName(particleType);\r
+  }\r
+  else{\r
+     outputSlotName+="AllCharged";\r
+  }\r
+  if (charge<0) outputSlotName+="-";\r
+  if (charge>0) outputSlotName+="+";\r
+\r
+  TString fileName(fileNameBase);\r
+  fileName.Append(".root");\r
+\r
+  Bool_t useWeights  = WEIGHTS[0] || WEIGHTS[1] || WEIGHTS[2];\r
+  if (useWeights) cout<<"Weights are used"<<endl;\r
+  else cout<<"Weights are not used"<<endl;\r
+  \r
+  // Get the pointer to the existing analysis manager via the static access method.\r
+  //==============================================================================\r
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
+  if (!mgr) {\r
+    Error("AddTaskFlowEvent", "No analysis manager to connect to.");\r
+    return NULL;\r
+  }\r
+  \r
+  // Check the analysis type using the event handlers connected to the analysis\r
+  // manager. The availability of MC handler can also be checked here.\r
+  //==============================================================================\r
+  if (!mgr->GetInputEventHandler()) {\r
+    ::Error("AddTaskFlowEvent", "This task requires an input event handler");\r
+    return NULL;\r
+  }  \r
+\r
+  // Open external input files\r
+  //===========================================================================\r
+  //weights: \r
+  TFile *weightsFile = NULL;\r
+  TList *weightsList = NULL;\r
+\r
+  if(useWeights) {\r
+    //open the file with the weights:\r
+    weightsFile = TFile::Open("weights.root","READ");\r
+    if(weightsFile) {\r
+      //access the list which holds the histos with weigths:\r
+      weightsList = (TList*)weightsFile->Get("weights");\r
+    }\r
+    else {\r
+      cout<<" WARNING: the file <weights.root> with weights from the previous run was not available."<<endl;\r
+      break;\r
+    } \r
+  }\r
+  \r
+  //LYZ2\r
+  if (LYZ2SUM || LYZ2PROD) {\r
+    //read the outputfile of the first run\r
+    TString outputFileName = "AnalysisResults1.root";\r
+    TString pwd(gSystem->pwd());\r
+    pwd+="/";\r
+    pwd+=outputFileName.Data();\r
+    TFile *outputFile = NULL;\r
+    if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
+      cout<<"WARNING: You do not have an output file:"<<endl;\r
+      cout<<"         "<<pwd.Data()<<endl;\r
+      exit(0);\r
+    } else { outputFile = TFile::Open(pwd.Data(),"READ");}\r
+    \r
+    if (LYZ2SUM){  \r
+      // read the output directory from LYZ1SUM \r
+      TString inputFileNameLYZ2SUM = "outputLYZ1SUManalysis" ;\r
+      inputFileNameLYZ2SUM += rptypestr;\r
+      cout<<"The input directory is "<<inputFileNameLYZ2SUM.Data()<<endl;\r
+      TFile* fInputFileLYZ2SUM = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2SUM.Data());\r
+      if(!fInputFileLYZ2SUM || fInputFileLYZ2SUM->IsZombie()) { \r
+       cerr << " ERROR: To run LYZ2SUM you need the output file from LYZ1SUM. This file is not there! Please run LYZ1SUM first." << endl ; \r
+       break;\r
+      }\r
+      else {\r
+       TList* fInputListLYZ2SUM = (TList*)fInputFileLYZ2SUM->Get("LYZ1SUM");\r
+       if (!fInputListLYZ2SUM) {cout<<"list is NULL pointer!"<<endl;}\r
+      }\r
+      cout<<"LYZ2SUM input file/list read..."<<endl;\r
+    }\r
+\r
+    if (LYZ2PROD){  \r
+      // read the output directory from LYZ1PROD \r
+      TString inputFileNameLYZ2PROD = "outputLYZ1PRODanalysis" ;\r
+      inputFileNameLYZ2PROD += rptypestr;\r
+      cout<<"The input directory is "<<inputFileNameLYZ2PROD.Data()<<endl;\r
+      TFile* fInputFileLYZ2PROD = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2PROD.Data());\r
+      if(!fInputFileLYZ2PROD || fInputFileLYZ2PROD->IsZombie()) { \r
+       cerr << " ERROR: To run LYZ2PROD you need the output file from LYZ1PROD. This file is not there! Please run LYZ1PROD first." << endl ; \r
+       break;\r
+      }\r
+      else {\r
+       TList* fInputListLYZ2PROD = (TList*)fInputFileLYZ2PROD->Get("LYZ1PROD");\r
+       if (!fInputListLYZ2PROD) {cout<<"list is NULL pointer!"<<endl;}\r
+      }\r
+      cout<<"LYZ2PROD input file/list read..."<<endl;\r
+    }\r
+  }\r
+\r
+  if (LYZEP) {\r
+    //read the outputfile of the second run\r
+    TString outputFileName = "AnalysisResults2.root";\r
+    TString pwd(gSystem->pwd());\r
+    pwd+="/";\r
+    pwd+=outputFileName.Data();\r
+    TFile *outputFile = NULL;\r
+    if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
+      cout<<"WARNING: You do not have an output file:"<<endl;\r
+      cout<<"         "<<pwd.Data()<<endl;\r
+      exit(0);\r
+    } else {\r
+      outputFile = TFile::Open(pwd.Data(),"READ");\r
+    }\r
+    \r
+    // read the output file from LYZ2SUM\r
+    TString inputFileNameLYZEP = "outputLYZ2SUManalysis" ;\r
+    inputFileNameLYZEP += rptypestr;\r
+    cout<<"The input file is "<<inputFileNameLYZEP.Data()<<endl;\r
+    TFile* fInputFileLYZEP = (TFile*)outputFile->FindObjectAny(inputFileNameLYZEP.Data());\r
+    if(!fInputFileLYZEP || fInputFileLYZEP->IsZombie()) { \r
+      cerr << " ERROR: To run LYZEP you need the output file from LYZ2SUM. This file is not there! Please run LYZ2SUM first." << endl ; \r
+      break;\r
+    }\r
+    else {\r
+      TList* fInputListLYZEP = (TList*)fInputFileLYZEP->Get("LYZ2SUM");\r
+      if (!fInputListLYZEP) {cout<<"list is NULL pointer!"<<endl;}\r
+    }\r
+    cout<<"LYZEP input file/list read..."<<endl;\r
+  }\r
+  \r
+  \r
+  // Create the FMD task and add it to the manager\r
+  //===========================================================================\r
+  if (rptypestr == "FMD") {\r
+    AliFMDAnalysisTaskSE *taskfmd = NULL;\r
+    if (rptypestr == "FMD") {\r
+      taskfmd = new AliFMDAnalysisTaskSE("TaskFMD");\r
+      mgr->AddTask(taskfmd);\r
+      \r
+      AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();\r
+      pars->Init();\r
+      pars->SetProcessPrimary(kTRUE); //for MC only\r
+      pars->SetProcessHits(kFALSE);\r
+      \r
+      //pars->SetRealData(kTRUE); //for real data\r
+      //pars->SetProcessPrimary(kFALSE); //for real data\r
+    }\r
+  }\r
+  \r
+  // Create the flow event task, add it to the manager.\r
+  //===========================================================================\r
+  AliAnalysisTaskFlowEvent *taskFE = NULL;\r
+\r
+  if(useAfterBurner)\r
+    { \r
+      taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA,1);\r
+      taskFE->SetFlow(v1,v2,v3,v4); \r
+      taskFE->SetNonFlowNumberOfTrackClones(numberOfTrackClones);\r
+      taskFE->SetAfterburnerOn();\r
+    }\r
+  else {taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA); }\r
+  if (ExcludeRegion) {\r
+    taskFE->DefineDeadZone(excludeEtaMin, excludeEtaMax, excludePhiMin, excludePhiMax); \r
+  }\r
+  taskFE->SetSubeventEtaRange(minA, maxA, minB, maxB);\r
+  if (UsePhysicsSelection) {\r
+    taskFE->SelectCollisionCandidates(AliVEvent::kMB);\r
+    cout<<"Using Physics Selection"<<endl;\r
+  }\r
+  mgr->AddTask(taskFE);\r
+  \r
+  // Pass cuts for RPs and POIs to the task:\r
+  taskFE->SetCutsEvent(cutsEvent);\r
+  taskFE->SetCutsRP(cutsRP);\r
+  taskFE->SetCutsPOI(cutsPOI);\r
+  if (cutsRP->GetParamType()==AliFlowTrackCuts::kV0)\r
+  { \r
+    //TODO: since this is set in a static object all analyses in an analysis train\r
+    //will be affected.\r
+    taskFE->SetHistWeightvsPhiMin(0.);\r
+    taskFE->SetHistWeightvsPhiMax(200.);\r
+  }\r
+\r
+  // Create the analysis tasks, add them to the manager.\r
+  //===========================================================================\r
+  if (SP){\r
+    AliAnalysisTaskScalarProduct *taskSP = new AliAnalysisTaskScalarProduct(Form("TaskScalarProduct %s",outputSlotName.Data()),WEIGHTS[0]);\r
+    taskSP->SetRelDiffMsub(1.0);\r
+    taskSP->SetApplyCorrectionForNUA(kTRUE);\r
+    mgr->AddTask(taskSP);\r
+  }\r
+  if (LYZ1SUM){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ1SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kTRUE);\r
+    taskLYZ1SUM->SetFirstRunLYZ(kTRUE);\r
+    taskLYZ1SUM->SetUseSumLYZ(kTRUE);\r
+    mgr->AddTask(taskLYZ1SUM);\r
+  }\r
+  if (LYZ1PROD){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ1PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kTRUE);\r
+    taskLYZ1PROD->SetFirstRunLYZ(kTRUE);\r
+    taskLYZ1PROD->SetUseSumLYZ(kFALSE);\r
+    mgr->AddTask(taskLYZ1PROD);\r
+  }\r
+  if (LYZ2SUM){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ2SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kFALSE);\r
+    taskLYZ2SUM->SetFirstRunLYZ(kFALSE);\r
+    taskLYZ2SUM->SetUseSumLYZ(kTRUE);\r
+    mgr->AddTask(taskLYZ2SUM);\r
+  }\r
+  if (LYZ2PROD){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ2PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kFALSE);\r
+    taskLYZ2PROD->SetFirstRunLYZ(kFALSE);\r
+    taskLYZ2PROD->SetUseSumLYZ(kFALSE);\r
+    mgr->AddTask(taskLYZ2PROD);\r
+  }\r
+  if (LYZEP){\r
+    AliAnalysisTaskLYZEventPlane *taskLYZEP = new AliAnalysisTaskLYZEventPlane(Form("TaskLYZEventPlane %s",outputSlotName.Data()));\r
+    mgr->AddTask(taskLYZEP);\r
+  }\r
+  if (GFC){\r
+    AliAnalysisTaskCumulants *taskGFC = new AliAnalysisTaskCumulants(Form("TaskCumulants %s",outputSlotName.Data()),useWeights);\r
+    taskGFC->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskGFC->SetUsePtWeights(WEIGHTS[1]);\r
+    taskGFC->SetUseEtaWeights(WEIGHTS[2]); \r
+    mgr->AddTask(taskGFC);\r
+  }\r
+  if (QC){\r
+    AliAnalysisTaskQCumulants *taskQC = new AliAnalysisTaskQCumulants(Form("TaskQCumulants %s",outputSlotName.Data()),useWeights);\r
+    taskQC->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskQC->SetUsePtWeights(WEIGHTS[1]);\r
+    taskQC->SetUseEtaWeights(WEIGHTS[2]); \r
+    taskQC->SetCalculateCumulantsVsM(kFALSE);\r
+    taskQC->SetnBinsMult(10000);\r
+    taskQC->SetMinMult(0.);\r
+    taskQC->SetMaxMult(10000.);\r
+    taskQC->SetHarmonic(harmonic);\r
+    taskQC->SetApplyCorrectionForNUA(kFALSE);\r
+    taskQC->SetFillMultipleControlHistograms(kFALSE);     \r
+    mgr->AddTask(taskQC);\r
+  }\r
+  if (FQD){\r
+    AliAnalysisTaskFittingQDistribution *taskFQD = new AliAnalysisTaskFittingQDistribution(Form("TaskFittingQDistribution %s",outputSlotName.Data()),kFALSE);\r
+    taskFQD->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskFQD->SetqMin(0.);\r
+    taskFQD->SetqMax(1000.);\r
+    taskFQD->SetqNbins(10000);\r
+    mgr->AddTask(taskFQD);\r
+  }\r
+  if (MCEP){\r
+    AliAnalysisTaskMCEventPlane *taskMCEP = new AliAnalysisTaskMCEventPlane(Form("TaskMCEventPlane %s",outputSlotName.Data()));\r
+    mgr->AddTask(taskMCEP);\r
+  }\r
+  if (MH){\r
+    AliAnalysisTaskMixedHarmonics *taskMH = new AliAnalysisTaskMixedHarmonics(Form("TaskMixedHarmonics %s",outputSlotName.Data()),useWeights);\r
+    taskMH->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
+    taskMH->SetNoOfMultipicityBins(10000);\r
+    taskMH->SetMultipicityBinWidth(1.);\r
+    taskMH->SetMinMultiplicity(1.);\r
+    taskMH->SetCorrectForDetectorEffects(kTRUE);\r
+    taskMH->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>> (Remark: two nested loops)    \r
+    taskMH->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges  \r
+    mgr->AddTask(taskMH);\r
+  }  \r
+  if (NL){\r
+    AliAnalysisTaskNestedLoops *taskNL = new AliAnalysisTaskNestedLoops(Form("TaskNestedLoops %s",outputSlotName.Data()),useWeights);\r
+    taskNL->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
+    taskNL->SetEvaluateNestedLoopsForRAD(kTRUE); // RAD = Relative Angle Distribution\r
+    taskNL->SetEvaluateNestedLoopsForMH(kTRUE); // evalaute <<cos[n(phi1+phi2-2phi3)]>> (Remark: three nested loops)   \r
+    taskNL->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>>  (Remark: three nested loops)   \r
+    taskNL->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges  \r
+    mgr->AddTask(taskNL);\r
+  }\r
+\r
+  // Create the output container for the data produced by the task\r
+  // Connect to the input and output containers\r
+  //===========================================================================\r
+  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();\r
+  \r
+  if (rptypestr == "FMD") {\r
+    AliAnalysisDataContainer *coutputFMD = \r
+      mgr->CreateContainer(Form("BackgroundCorrected %s",outputSlotName.Data()), TList::Class(), AliAnalysisManager::kExchangeContainer);\r
+    //input and output taskFMD     \r
+    mgr->ConnectInput(taskfmd, 0, cinput1);\r
+    mgr->ConnectOutput(taskfmd, 1, coutputFMD);\r
+    //input into taskFE\r
+    mgr->ConnectInput(taskFE,1,coutputFMD);\r
+  }\r
+  \r
+  AliAnalysisDataContainer *coutputFE = \r
+  mgr->CreateContainer(Form("FlowEventSimple %s",outputSlotName.Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);\r
+  mgr->ConnectInput(taskFE,0,cinput1); \r
+  mgr->ConnectOutput(taskFE,1,coutputFE);\r
\r
+  if (taskFE->GetQAOn())\r
+  {\r
+    TString outputQA = fileName;\r
+    outputQA += ":QA";\r
+    AliAnalysisDataContainer* coutputFEQA = \r
+    mgr->CreateContainer(Form("QA %s",outputSlotName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA);\r
+    mgr->ConnectOutput(taskFE,2,coutputFEQA);\r
+  }\r
+\r
+  // Create the output containers for the data produced by the analysis tasks\r
+  // Connect to the input and output containers\r
+  //===========================================================================\r
+  if (useWeights) {    \r
+    AliAnalysisDataContainer *cinputWeights = mgr->CreateContainer(Form("Weights %s",outputSlotName.Data()),\r
+                                                                  TList::Class(),AliAnalysisManager::kInputContainer); \r
+  }\r
+\r
+  if(SP) {\r
+    TString outputSP = fileName;\r
+    outputSP += ":outputSPanalysis";\r
+    outputSP+= rptypestr;\r
+    AliAnalysisDataContainer *coutputSP = mgr->CreateContainer(Form("SP %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputSP); \r
+    mgr->ConnectInput(taskSP,0,coutputFE); \r
+    mgr->ConnectOutput(taskSP,1,coutputSP); \r
+    if (WEIGHTS[0]) {\r
+      mgr->ConnectInput(taskSP,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    }\r
+  }\r
+  if(LYZ1SUM) {\r
+    TString outputLYZ1SUM = fileName;\r
+    outputLYZ1SUM += ":outputLYZ1SUManalysis";\r
+    outputLYZ1SUM+= rptypestr;\r
+    AliAnalysisDataContainer *coutputLYZ1SUM = mgr->CreateContainer(Form("LYZ1SUM %s",outputSlotName.Data()), \r
+                                                                   TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1SUM); \r
+    mgr->ConnectInput(taskLYZ1SUM,0,coutputFE);\r
+    mgr->ConnectOutput(taskLYZ1SUM,1,coutputLYZ1SUM);\r
+  }\r
+  if(LYZ1PROD) {\r
+    TString outputLYZ1PROD = fileName;\r
+    outputLYZ1PROD += ":outputLYZ1PRODanalysis";\r
+    outputLYZ1PROD+= rptypestr;\r
+    AliAnalysisDataContainer *coutputLYZ1PROD = mgr->CreateContainer(Form("LYZ1PROD %s",outputSlotName.Data()), \r
+                                                                    TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1PROD); \r
+    mgr->ConnectInput(taskLYZ1PROD,0,coutputFE); \r
+    mgr->ConnectOutput(taskLYZ1PROD,1,coutputLYZ1PROD);\r
+  }\r
+  if(LYZ2SUM) {\r
+    AliAnalysisDataContainer *cinputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUMin %s",outputSlotName.Data()),\r
+                                                                  TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZ2SUM = fileName;\r
+    outputLYZ2SUM += ":outputLYZ2SUManalysis";\r
+    outputLYZ2SUM+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUM %s",outputSlotName.Data()), \r
+                                                                   TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2SUM); \r
+    mgr->ConnectInput(taskLYZ2SUM,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZ2SUM,1,cinputLYZ2SUM);\r
+    mgr->ConnectOutput(taskLYZ2SUM,1,coutputLYZ2SUM); \r
+    cinputLYZ2SUM->SetData(fInputListLYZ2SUM);\r
+  }\r
+  if(LYZ2PROD) {\r
+    AliAnalysisDataContainer *cinputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PRODin %s",outputSlotName.Data()),\r
+                                                                   TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZ2PROD = fileName;\r
+    outputLYZ2PROD += ":outputLYZ2PRODanalysis";\r
+    outputLYZ2PROD+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PROD %s",outputSlotName.Data()), \r
+                                                                    TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2PROD); \r
+    mgr->ConnectInput(taskLYZ2PROD,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZ2PROD,1,cinputLYZ2PROD);\r
+    mgr->ConnectOutput(taskLYZ2PROD,1,coutputLYZ2PROD); \r
+    cinputLYZ2PROD->SetData(fInputListLYZ2PROD);\r
+  }\r
+  if(LYZEP) {\r
+    AliAnalysisDataContainer *cinputLYZEP = mgr->CreateContainer(Form("LYZEPin %s",outputSlotName.Data()),\r
+                                                                TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZEP = fileName;\r
+    outputLYZEP += ":outputLYZEPanalysis";\r
+    outputLYZEP+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZEP = mgr->CreateContainer(Form("LYZEP %s",outputSlotName.Data()), \r
+                                                                 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZEP); \r
+    mgr->ConnectInput(taskLYZEP,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZEP,1,cinputLYZEP);\r
+    mgr->ConnectOutput(taskLYZEP,1,coutputLYZEP); \r
+    cinputLYZEP->SetData(fInputListLYZEP);\r
+  }\r
+  if(GFC) {\r
+    TString outputGFC = fileName;\r
+    outputGFC += ":outputGFCanalysis";\r
+    outputGFC+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputGFC = mgr->CreateContainer(Form("GFC %s",outputSlotName.Data()), \r
+                                                               TList::Class(),AliAnalysisManager::kOutputContainer,outputGFC); \r
+    mgr->ConnectInput(taskGFC,0,coutputFE); \r
+    mgr->ConnectOutput(taskGFC,1,coutputGFC);\r
+    if (useWeights) {\r
+      mgr->ConnectInput(taskGFC,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    } \r
+  }\r
+  if(QC) {\r
+    TString outputQC = fileName;\r
+    outputQC += ":outputQCanalysis";\r
+    outputQC+= rptypestr;\r
+\r
+    AliAnalysisDataContainer *coutputQC = mgr->CreateContainer(Form("QC %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputQC); \r
+    mgr->ConnectInput(taskQC,0,coutputFE); \r
+    mgr->ConnectOutput(taskQC,1,coutputQC);\r
+    if (useWeights) {\r
+      mgr->ConnectInput(taskQC,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    }\r
+  }\r
+  if(FQD) {\r
+    TString outputFQD = fileName;\r
+    outputFQD += ":outputFQDanalysis";\r
+    outputFQD+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputFQD = mgr->CreateContainer(Form("FQD %s",outputSlotName.Data()), \r
+                                                               TList::Class(),AliAnalysisManager::kOutputContainer,outputFQD); \r
+    mgr->ConnectInput(taskFQD,0,coutputFE); \r
+    mgr->ConnectOutput(taskFQD,1,coutputFQD);\r
+    if(useWeights) {\r
+      mgr->ConnectInput(taskFQD,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    } \r
+  }\r
+  if(MCEP) {\r
+    TString outputMCEP = fileName;\r
+    outputMCEP += ":outputMCEPanalysis";\r
+    outputMCEP+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer(Form("MCEP %s",outputSlotName.Data()), \r
+                                                                TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP); \r
+    mgr->ConnectInput(taskMCEP,0,coutputFE);\r
+    mgr->ConnectOutput(taskMCEP,1,coutputMCEP); \r
+  }\r
+  if(MH) {\r
+    TString outputMH = fileName;\r
+    outputMH += ":outputMHanalysis";\r
+    outputMH += rptypestr;\r
+        \r
+    AliAnalysisDataContainer *coutputMH = mgr->CreateContainer(Form("MH %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputMH); \r
+    mgr->ConnectInput(taskMH,0,coutputFE); \r
+    mgr->ConnectOutput(taskMH,1,coutputMH); \r
+    //if (useWeights) {\r
+    //  mgr->ConnectInput(taskMH,1,cinputWeights);\r
+    //  cinputWeights->SetData(weightsList);\r
+    //} \r
+  }\r
+  if(NL) {\r
+    TString outputNL = fileName;\r
+    outputNL += ":outputNLanalysis";\r
+    outputNL += rptypestr;\r
+\r
+    AliAnalysisDataContainer *coutputNL = mgr->CreateContainer(Form("NL %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputNL); \r
+    mgr->ConnectInput(taskNL,0,coutputFE);\r
+    mgr->ConnectOutput(taskNL,1,coutputNL);\r
+    //if (useWeights) {\r
+    //  mgr->ConnectInput(taskNL,1,cinputWeights);\r
+    //  cinputWeights->SetData(weightsList);\r
+    //} \r
+  }\r
+\r
+  ///////////////////////////////////////////////////////////////////////////////////////////\r
+  if (runQAtask)\r
+  {\r
+    AliAnalysisTaskQAflow* taskQAflow = new AliAnalysisTaskQAflow(Form("TaskQAflow %s",outputSlotName.Data()));\r
+    taskQAflow->SetEventCuts(cutsEvent);\r
+    taskQAflow->SetTrackCuts(cutsRP);\r
+    taskQAflow->SetFillNTuple(FillQAntuple);\r
+    taskQAflow->SetDoCorrelations(DoQAcorrelations);\r
+    mgr->AddTask(taskQAflow);\r
+    \r
+    Printf("outputSlotName %s",outputSlotName.Data());\r
+    TString taskQAoutputFileName(fileNameBase);\r
+    taskQAoutputFileName.Append("_QA.root");\r
+    AliAnalysisDataContainer* coutputQAtask = mgr->CreateContainer(Form("flowQA %s",outputSlotName.Data()),\r
+                                              TObjArray::Class(),\r
+                                              AliAnalysisManager::kOutputContainer,\r
+                                              taskQAoutputFileName);\r
+    AliAnalysisDataContainer* coutputQAtaskTree = mgr->CreateContainer(Form("flowQAntuple %s",outputSlotName.Data()),\r
+                                              TNtuple::Class(),\r
+                                              AliAnalysisManager::kOutputContainer,\r
+                                              taskQAoutputFileName);\r
+    mgr->ConnectInput(taskQAflow,0,mgr->GetCommonInputContainer());\r
+    mgr->ConnectInput(taskQAflow,1,coutputFE);\r
+    mgr->ConnectOutput(taskQAflow,1,coutputQAtask);\r
+    if (FillQAntuple) mgr->ConnectOutput(taskQAflow,2,coutputQAtaskTree);\r
+  }\r
+}\r
+\r
+\r
+\r
+\r
+\r
diff --git a/PWGCF/FLOW/macros/AddTaskFlowCentralityPIDSP.C b/PWGCF/FLOW/macros/AddTaskFlowCentralityPIDSP.C
new file mode 100644 (file)
index 0000000..a057955
--- /dev/null
@@ -0,0 +1,652 @@
+/////////////////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// AddTask* macro for flow analysis\r
+// Creates a Flow Event task and adds it to the analysis manager.\r
+// Sets the cuts using the correction framework (CORRFW) classes.\r
+// Also creates Flow Analysis tasks and connects them to the output of the flow event task.\r
+//\r
+/////////////////////////////////////////////////////////////////////////////////////////////\r
+\r
+void AddTaskFlowCentralityPIDSP( Float_t centrMin=10.,\r
+                               Float_t centrMax=20.,\r
+                               TString fileNameBase="output",\r
+                               Bool_t isPID = kTRUE,\r
+                               AliPID::EParticleType particleType=AliPID::kPion,\r
+                               AliFlowTrackCuts::PIDsource sourcePID = AliFlowTrackCuts::kTOFbayesian,\r
+                               Int_t charge=0,\r
+                               Int_t harmonic=2,\r
+                               Bool_t doQA=kFALSE,\r
+                               TString uniqueStr="" )\r
+{\r
+  // Define the range for eta subevents (for SP method)\r
+  Double_t minA = -5;\r
+  Double_t maxA = -1.5;\r
+  Double_t minB = 1.5;\r
+  Double_t maxB = 5;\r
+\r
+  // AFTERBURNER\r
+  Bool_t useAfterBurner=kFALSE;\r
+  Double_t v1=0.0;\r
+  Double_t v2=0.0;\r
+  Double_t v3=0.0;\r
+  Double_t v4=0.0;\r
+  Int_t numberOfTrackClones=0; //non-flow\r
+\r
+  // Define a range of the detector to exclude\r
+  Bool_t ExcludeRegion = kFALSE;\r
+  Double_t excludeEtaMin = -0.;\r
+  Double_t excludeEtaMax = 0.;\r
+  Double_t excludePhiMin = 0.;\r
+  Double_t excludePhiMax = 0.;\r
+\r
+  // use physics selection class\r
+  Bool_t  UsePhysicsSelection = kTRUE;\r
+\r
+  // QA\r
+  Bool_t runQAtask=kFALSE;\r
+  Bool_t FillQAntuple=kFALSE;\r
+  Bool_t DoQAcorrelations=kFALSE;\r
+\r
+  // RUN SETTINGS\r
+  // Flow analysis method can be:(set to kTRUE or kFALSE)\r
+  Bool_t SP       = kTRUE;  // scalar product method (similar to eventplane method)\r
+  Bool_t QC       = kFALSE;  // cumulants using Q vectors\r
+  \r
+  //these are OBSOLETE, use at own peril\r
+  Bool_t GFC      = kFALSE;  // cumulants based on generating function\r
+  Bool_t MCEP     = kFALSE;  // correlation with Monte Carlo reaction plane\r
+  Bool_t FQD      = kFALSE;  // fit of the distribution of the Q vector (only integrated v)\r
+  Bool_t LYZ1SUM  = kFALSE;  // Lee Yang Zeroes using sum generating function (integrated v)\r
+  Bool_t LYZ1PROD = kFALSE;  // Lee Yang Zeroes using product generating function (integrated v)\r
+  Bool_t LYZ2SUM  = kFALSE; // Lee Yang Zeroes using sum generating function (second pass differential v)\r
+  Bool_t LYZ2PROD = kFALSE; // Lee Yang Zeroes using product generating function (second pass differential v)\r
+  Bool_t LYZEP    = kFALSE; // Lee Yang Zeroes Event plane using sum generating function (gives eventplane + weight)\r
+  Bool_t MH       = kFALSE;  // azimuthal correlators in mixed harmonics  \r
+  Bool_t NL       = kFALSE;  // nested loops (for instance distribution of phi1-phi2 for all distinct pairs)\r
+\r
+  Bool_t METHODS[] = {SP,LYZ1SUM,LYZ1PROD,LYZ2SUM,LYZ2PROD,LYZEP,GFC,QC,FQD,MCEP,MH,NL};\r
+\r
+  // Boolean to use/not use weights for the Q vector\r
+  Bool_t WEIGHTS[] = {kFALSE,kFALSE,kFALSE}; //Phi, v'(pt), v'(eta)\r
+\r
+  // SETTING THE CUTS\r
+\r
+  //---------Data selection----------\r
+  //kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet\r
+  AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;\r
+  AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;\r
+\r
+  //---------Parameter mixing--------\r
+  //kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt\r
+  AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;\r
+  AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;\r
+\r
+\r
+  const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);\r
+  const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);\r
+\r
+  //===========================================================================\r
+  // EVENTS CUTS:\r
+  AliFlowEventCuts* cutsEvent = new AliFlowEventCuts("event cuts");\r
+  cutsEvent->SetCentralityPercentileRange(centrMin,centrMax);\r
+  cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);\r
+  cutsEvent->SetRefMultMethod(AliFlowEventCuts::kV0);\r
+  //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);\r
+//  cutsEvent->SetNContributorsRange(2);\r
+  cutsEvent->SetPrimaryVertexZrange(-10.,10.);\r
+  cutsEvent->SetQA(doQA);\r
+  \r
+  // RP TRACK CUTS:\r
+  AliFlowTrackCuts* cutsRP2 = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts();\r
+  AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts("TPConlyRP");\r
+  cutsRP->SetParamType(rptype);\r
+  cutsRP->SetParamMix(rpmix);\r
+  cutsRP->SetPtRange(0.2,5.);\r
+  cutsRP->SetEtaRange(-0.8,0.8);\r
+  cutsRP->SetMinNClustersTPC(70);\r
+//  cutsRP->SetMinChi2PerClusterTPC(0.1);\r
+//  cutsRP->SetMaxChi2PerClusterTPC(4.0);\r
+  cutsRP->SetMaxDCAToVertexXY(3.0);\r
+  cutsRP->SetMaxDCAToVertexZ(3.0);\r
+  cutsRP->SetAcceptKinkDaughters(kFALSE);\r
+  cutsRP->SetMinimalTPCdedx(10.);\r
+  cutsRP->SetQA(doQA);\r
+\r
+  // POI TRACK CUTS:\r
+  AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts("GlobalPOI");\r
+  cutsPOI->SetParamType(poitype);\r
+  cutsPOI->SetParamMix(poimix);\r
+  cutsPOI->SetPtRange(0.0,10.);\r
+  cutsPOI->SetEtaRange(-0.8,0.8);\r
+  cutsPOI->SetMinNClustersTPC(70);\r
+//  cutsPOI->SetMinChi2PerClusterTPC(0.1);\r
+//  cutsPOI->SetMaxChi2PerClusterTPC(4.0);\r
+//  cutsPOI->SetRequireITSRefit(kTRUE);\r
+//  cutsPOI->SetRequireTPCRefit(kTRUE);\r
+//  cutsPOI->SetMinNClustersITS(2);\r
+  //cutsPOI->SetMaxChi2PerClusterITS(1.e+09);\r
+  cutsPOI->SetMaxDCAToVertexXY(3.0);\r
+  cutsPOI->SetMaxDCAToVertexZ(3.0);\r
+  //cutsPOI->SetDCAToVertex2D(kTRUE);\r
+  //cutsPOI->SetMaxNsigmaToVertex(1.e+10);\r
+  //cutsPOI->SetRequireSigmaToVertex(kFALSE);\r
+  cutsPOI->SetAcceptKinkDaughters(kFALSE);\r
+  if(isPID) cutsPOI->SetPID(particleType, sourcePID);\r
+  if (charge!=0) cutsPOI->SetCharge(charge);\r
+  //cutsPOI->SetAllowTOFmismatch(kFALSE);\r
+  cutsPOI->SetRequireStrictTOFTPCagreement(kTRUE);\r
+  //iexample: francesco's tunig TPC Bethe Bloch for data:\r
+  //cutsPOI->GetESDpid().GetTPCResponse().SetBetheBlochParameters(4.36414e-02,1.75977e+01,1.14385e-08,2.27907e+00,3.36699e+00);\r
+  //cutsPOI->GetESDpid().GetTPCResponse().SetMip(49);\r
+  cutsPOI->SetMinimalTPCdedx(10.);\r
+  cutsPOI->SetQA(doQA);\r
+  cutsPOI->SetPriors((centrMin+centrMax)*0.5); // set priors and PID as a function of the centrality\r
+\r
+\r
+  TString outputSlotName("");\r
+  outputSlotName+=uniqueStr;\r
+  outputSlotName+=Form("V%i ",harmonic);\r
+  outputSlotName+=cutsRP->GetName();\r
+  outputSlotName+=" ";\r
+  outputSlotName+=cutsPOI->GetName();\r
+  outputSlotName+=Form(" %.0f-",centrMin);\r
+  outputSlotName+=Form("%.0f ",centrMax);\r
+  if(isPID){\r
+     outputSlotName+=AliFlowTrackCuts::PIDsourceName(sourcePID);\r
+     outputSlotName+=" ";\r
+     outputSlotName+=AliPID::ParticleName(particleType);\r
+  }\r
+  else{\r
+     outputSlotName+="AllCharged";\r
+  }\r
+  if (charge<0) outputSlotName+="-";\r
+  if (charge>0) outputSlotName+="+";\r
+\r
+  TString fileName(fileNameBase);\r
+  fileName.Append(".root");\r
+\r
+  Bool_t useWeights  = WEIGHTS[0] || WEIGHTS[1] || WEIGHTS[2];\r
+  if (useWeights) cout<<"Weights are used"<<endl;\r
+  else cout<<"Weights are not used"<<endl;\r
+  \r
+  // Get the pointer to the existing analysis manager via the static access method.\r
+  //==============================================================================\r
+  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();\r
+  if (!mgr) {\r
+    Error("AddTaskFlowEvent", "No analysis manager to connect to.");\r
+    return NULL;\r
+  }\r
+  \r
+  // Check the analysis type using the event handlers connected to the analysis\r
+  // manager. The availability of MC handler can also be checked here.\r
+  //==============================================================================\r
+  if (!mgr->GetInputEventHandler()) {\r
+    ::Error("AddTaskFlowEvent", "This task requires an input event handler");\r
+    return NULL;\r
+  }  \r
+\r
+  // Open external input files\r
+  //===========================================================================\r
+  //weights: \r
+  TFile *weightsFile = NULL;\r
+  TList *weightsList = NULL;\r
+\r
+  if(useWeights) {\r
+    //open the file with the weights:\r
+    weightsFile = TFile::Open("weights.root","READ");\r
+    if(weightsFile) {\r
+      //access the list which holds the histos with weigths:\r
+      weightsList = (TList*)weightsFile->Get("weights");\r
+    }\r
+    else {\r
+      cout<<" WARNING: the file <weights.root> with weights from the previous run was not available."<<endl;\r
+      break;\r
+    } \r
+  }\r
+  \r
+  //LYZ2\r
+  if (LYZ2SUM || LYZ2PROD) {\r
+    //read the outputfile of the first run\r
+    TString outputFileName = "AnalysisResults1.root";\r
+    TString pwd(gSystem->pwd());\r
+    pwd+="/";\r
+    pwd+=outputFileName.Data();\r
+    TFile *outputFile = NULL;\r
+    if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
+      cout<<"WARNING: You do not have an output file:"<<endl;\r
+      cout<<"         "<<pwd.Data()<<endl;\r
+      exit(0);\r
+    } else { outputFile = TFile::Open(pwd.Data(),"READ");}\r
+    \r
+    if (LYZ2SUM){  \r
+      // read the output directory from LYZ1SUM \r
+      TString inputFileNameLYZ2SUM = "outputLYZ1SUManalysis" ;\r
+      inputFileNameLYZ2SUM += rptypestr;\r
+      cout<<"The input directory is "<<inputFileNameLYZ2SUM.Data()<<endl;\r
+      TFile* fInputFileLYZ2SUM = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2SUM.Data());\r
+      if(!fInputFileLYZ2SUM || fInputFileLYZ2SUM->IsZombie()) { \r
+       cerr << " ERROR: To run LYZ2SUM you need the output file from LYZ1SUM. This file is not there! Please run LYZ1SUM first." << endl ; \r
+       break;\r
+      }\r
+      else {\r
+       TList* fInputListLYZ2SUM = (TList*)fInputFileLYZ2SUM->Get("LYZ1SUM");\r
+       if (!fInputListLYZ2SUM) {cout<<"list is NULL pointer!"<<endl;}\r
+      }\r
+      cout<<"LYZ2SUM input file/list read..."<<endl;\r
+    }\r
+\r
+    if (LYZ2PROD){  \r
+      // read the output directory from LYZ1PROD \r
+      TString inputFileNameLYZ2PROD = "outputLYZ1PRODanalysis" ;\r
+      inputFileNameLYZ2PROD += rptypestr;\r
+      cout<<"The input directory is "<<inputFileNameLYZ2PROD.Data()<<endl;\r
+      TFile* fInputFileLYZ2PROD = (TFile*)outputFile->FindObjectAny(inputFileNameLYZ2PROD.Data());\r
+      if(!fInputFileLYZ2PROD || fInputFileLYZ2PROD->IsZombie()) { \r
+       cerr << " ERROR: To run LYZ2PROD you need the output file from LYZ1PROD. This file is not there! Please run LYZ1PROD first." << endl ; \r
+       break;\r
+      }\r
+      else {\r
+       TList* fInputListLYZ2PROD = (TList*)fInputFileLYZ2PROD->Get("LYZ1PROD");\r
+       if (!fInputListLYZ2PROD) {cout<<"list is NULL pointer!"<<endl;}\r
+      }\r
+      cout<<"LYZ2PROD input file/list read..."<<endl;\r
+    }\r
+  }\r
+\r
+  if (LYZEP) {\r
+    //read the outputfile of the second run\r
+    TString outputFileName = "AnalysisResults2.root";\r
+    TString pwd(gSystem->pwd());\r
+    pwd+="/";\r
+    pwd+=outputFileName.Data();\r
+    TFile *outputFile = NULL;\r
+    if(gSystem->AccessPathName(pwd.Data(),kFileExists)) {\r
+      cout<<"WARNING: You do not have an output file:"<<endl;\r
+      cout<<"         "<<pwd.Data()<<endl;\r
+      exit(0);\r
+    } else {\r
+      outputFile = TFile::Open(pwd.Data(),"READ");\r
+    }\r
+    \r
+    // read the output file from LYZ2SUM\r
+    TString inputFileNameLYZEP = "outputLYZ2SUManalysis" ;\r
+    inputFileNameLYZEP += rptypestr;\r
+    cout<<"The input file is "<<inputFileNameLYZEP.Data()<<endl;\r
+    TFile* fInputFileLYZEP = (TFile*)outputFile->FindObjectAny(inputFileNameLYZEP.Data());\r
+    if(!fInputFileLYZEP || fInputFileLYZEP->IsZombie()) { \r
+      cerr << " ERROR: To run LYZEP you need the output file from LYZ2SUM. This file is not there! Please run LYZ2SUM first." << endl ; \r
+      break;\r
+    }\r
+    else {\r
+      TList* fInputListLYZEP = (TList*)fInputFileLYZEP->Get("LYZ2SUM");\r
+      if (!fInputListLYZEP) {cout<<"list is NULL pointer!"<<endl;}\r
+    }\r
+    cout<<"LYZEP input file/list read..."<<endl;\r
+  }\r
+  \r
+  \r
+  // Create the FMD task and add it to the manager\r
+  //===========================================================================\r
+  if (rptypestr == "FMD") {\r
+    AliFMDAnalysisTaskSE *taskfmd = NULL;\r
+    if (rptypestr == "FMD") {\r
+      taskfmd = new AliFMDAnalysisTaskSE("TaskFMD");\r
+      mgr->AddTask(taskfmd);\r
+      \r
+      AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();\r
+      pars->Init();\r
+      pars->SetProcessPrimary(kTRUE); //for MC only\r
+      pars->SetProcessHits(kFALSE);\r
+      \r
+      //pars->SetRealData(kTRUE); //for real data\r
+      //pars->SetProcessPrimary(kFALSE); //for real data\r
+    }\r
+  }\r
+  \r
+  // Create the flow event task, add it to the manager.\r
+  //===========================================================================\r
+  AliAnalysisTaskFlowEvent *taskFE = NULL;\r
+\r
+  if(useAfterBurner)\r
+    { \r
+      taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA,1);\r
+      taskFE->SetFlow(v1,v2,v3,v4); \r
+      taskFE->SetNonFlowNumberOfTrackClones(numberOfTrackClones);\r
+      taskFE->SetAfterburnerOn();\r
+    }\r
+  else {taskFE = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent %s",outputSlotName.Data()),"",doQA); }\r
+  if (ExcludeRegion) {\r
+    taskFE->DefineDeadZone(excludeEtaMin, excludeEtaMax, excludePhiMin, excludePhiMax); \r
+  }\r
+  taskFE->SetSubeventEtaRange(minA, maxA, minB, maxB);\r
+  if (UsePhysicsSelection) {\r
+    taskFE->SelectCollisionCandidates(AliVEvent::kMB);\r
+    cout<<"Using Physics Selection"<<endl;\r
+  }\r
+  mgr->AddTask(taskFE);\r
+  \r
+  // Pass cuts for RPs and POIs to the task:\r
+  taskFE->SetCutsEvent(cutsEvent);\r
+  taskFE->SetCutsRP(cutsRP2);\r
+  taskFE->SetCutsPOI(cutsPOI);\r
+  if (cutsRP->GetParamType()==AliFlowTrackCuts::kV0)\r
+  { \r
+    //TODO: since this is set in a static object all analyses in an analysis train\r
+    //will be affected.\r
+    taskFE->SetHistWeightvsPhiMin(0.);\r
+    taskFE->SetHistWeightvsPhiMax(200.);\r
+  }\r
+\r
+  // Create the analysis tasks, add them to the manager.\r
+  //===========================================================================\r
+  if (SP){\r
+    AliAnalysisTaskScalarProduct *taskSP = new AliAnalysisTaskScalarProduct(Form("TaskScalarProduct %s",outputSlotName.Data()),WEIGHTS[0]);\r
+    taskSP->SetRelDiffMsub(1.0);\r
+    taskSP->SetApplyCorrectionForNUA(kTRUE);\r
+    mgr->AddTask(taskSP);\r
+  }\r
+  if (LYZ1SUM){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ1SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kTRUE);\r
+    taskLYZ1SUM->SetFirstRunLYZ(kTRUE);\r
+    taskLYZ1SUM->SetUseSumLYZ(kTRUE);\r
+    mgr->AddTask(taskLYZ1SUM);\r
+  }\r
+  if (LYZ1PROD){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ1PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kTRUE);\r
+    taskLYZ1PROD->SetFirstRunLYZ(kTRUE);\r
+    taskLYZ1PROD->SetUseSumLYZ(kFALSE);\r
+    mgr->AddTask(taskLYZ1PROD);\r
+  }\r
+  if (LYZ2SUM){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ2SUM = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosSUM %s",outputSlotName.Data()),kFALSE);\r
+    taskLYZ2SUM->SetFirstRunLYZ(kFALSE);\r
+    taskLYZ2SUM->SetUseSumLYZ(kTRUE);\r
+    mgr->AddTask(taskLYZ2SUM);\r
+  }\r
+  if (LYZ2PROD){\r
+    AliAnalysisTaskLeeYangZeros *taskLYZ2PROD = new AliAnalysisTaskLeeYangZeros(Form("TaskLeeYangZerosPROD %s",outputSlotName.Data()),kFALSE);\r
+    taskLYZ2PROD->SetFirstRunLYZ(kFALSE);\r
+    taskLYZ2PROD->SetUseSumLYZ(kFALSE);\r
+    mgr->AddTask(taskLYZ2PROD);\r
+  }\r
+  if (LYZEP){\r
+    AliAnalysisTaskLYZEventPlane *taskLYZEP = new AliAnalysisTaskLYZEventPlane(Form("TaskLYZEventPlane %s",outputSlotName.Data()));\r
+    mgr->AddTask(taskLYZEP);\r
+  }\r
+  if (GFC){\r
+    AliAnalysisTaskCumulants *taskGFC = new AliAnalysisTaskCumulants(Form("TaskCumulants %s",outputSlotName.Data()),useWeights);\r
+    taskGFC->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskGFC->SetUsePtWeights(WEIGHTS[1]);\r
+    taskGFC->SetUseEtaWeights(WEIGHTS[2]); \r
+    mgr->AddTask(taskGFC);\r
+  }\r
+  if (QC){\r
+    AliAnalysisTaskQCumulants *taskQC = new AliAnalysisTaskQCumulants(Form("TaskQCumulants %s",outputSlotName.Data()),useWeights);\r
+    taskQC->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskQC->SetUsePtWeights(WEIGHTS[1]);\r
+    taskQC->SetUseEtaWeights(WEIGHTS[2]); \r
+    taskQC->SetCalculateCumulantsVsM(kFALSE);\r
+    taskQC->SetnBinsMult(10000);\r
+    taskQC->SetMinMult(0.);\r
+    taskQC->SetMaxMult(10000.);\r
+    taskQC->SetHarmonic(harmonic);\r
+    taskQC->SetApplyCorrectionForNUA(kFALSE);\r
+    taskQC->SetFillMultipleControlHistograms(kFALSE);     \r
+    mgr->AddTask(taskQC);\r
+  }\r
+  if (FQD){\r
+    AliAnalysisTaskFittingQDistribution *taskFQD = new AliAnalysisTaskFittingQDistribution(Form("TaskFittingQDistribution %s",outputSlotName.Data()),kFALSE);\r
+    taskFQD->SetUsePhiWeights(WEIGHTS[0]); \r
+    taskFQD->SetqMin(0.);\r
+    taskFQD->SetqMax(1000.);\r
+    taskFQD->SetqNbins(10000);\r
+    mgr->AddTask(taskFQD);\r
+  }\r
+  if (MCEP){\r
+    AliAnalysisTaskMCEventPlane *taskMCEP = new AliAnalysisTaskMCEventPlane(Form("TaskMCEventPlane %s",outputSlotName.Data()));\r
+    mgr->AddTask(taskMCEP);\r
+  }\r
+  if (MH){\r
+    AliAnalysisTaskMixedHarmonics *taskMH = new AliAnalysisTaskMixedHarmonics(Form("TaskMixedHarmonics %s",outputSlotName.Data()),useWeights);\r
+    taskMH->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
+    taskMH->SetNoOfMultipicityBins(10000);\r
+    taskMH->SetMultipicityBinWidth(1.);\r
+    taskMH->SetMinMultiplicity(1.);\r
+    taskMH->SetCorrectForDetectorEffects(kTRUE);\r
+    taskMH->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>> (Remark: two nested loops)    \r
+    taskMH->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges  \r
+    mgr->AddTask(taskMH);\r
+  }  \r
+  if (NL){\r
+    AliAnalysisTaskNestedLoops *taskNL = new AliAnalysisTaskNestedLoops(Form("TaskNestedLoops %s",outputSlotName.Data()),useWeights);\r
+    taskNL->SetHarmonic(1); // n in cos[n(phi1+phi2-2phi3)] and cos[n(psi1+psi2-2phi3)]\r
+    taskNL->SetEvaluateNestedLoopsForRAD(kTRUE); // RAD = Relative Angle Distribution\r
+    taskNL->SetEvaluateNestedLoopsForMH(kTRUE); // evalaute <<cos[n(phi1+phi2-2phi3)]>> (Remark: three nested loops)   \r
+    taskNL->SetEvaluateDifferential3pCorrelator(kFALSE); // evaluate <<cos[n(psi1+psi2-2phi3)]>>  (Remark: three nested loops)   \r
+    taskNL->SetOppositeChargesPOI(kFALSE); // POIs psi1 and psi2 in cos[n(psi1+psi2-2phi3)] will have opposite charges  \r
+    mgr->AddTask(taskNL);\r
+  }\r
+\r
+  // Create the output container for the data produced by the task\r
+  // Connect to the input and output containers\r
+  //===========================================================================\r
+  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();\r
+  \r
+  if (rptypestr == "FMD") {\r
+    AliAnalysisDataContainer *coutputFMD = \r
+      mgr->CreateContainer(Form("BackgroundCorrected %s",outputSlotName.Data()), TList::Class(), AliAnalysisManager::kExchangeContainer);\r
+    //input and output taskFMD     \r
+    mgr->ConnectInput(taskfmd, 0, cinput1);\r
+    mgr->ConnectOutput(taskfmd, 1, coutputFMD);\r
+    //input into taskFE\r
+    mgr->ConnectInput(taskFE,1,coutputFMD);\r
+  }\r
+  \r
+  AliAnalysisDataContainer *coutputFE = \r
+  mgr->CreateContainer(Form("FlowEventSimple %s",outputSlotName.Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);\r
+  mgr->ConnectInput(taskFE,0,cinput1); \r
+  mgr->ConnectOutput(taskFE,1,coutputFE);\r
\r
+  if (taskFE->GetQAOn())\r
+  {\r
+    TString outputQA = fileName;\r
+    outputQA += ":QA";\r
+    AliAnalysisDataContainer* coutputFEQA = \r
+    mgr->CreateContainer(Form("QA %s",outputSlotName.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA);\r
+    mgr->ConnectOutput(taskFE,2,coutputFEQA);\r
+  }\r
+\r
+  // Create the output containers for the data produced by the analysis tasks\r
+  // Connect to the input and output containers\r
+  //===========================================================================\r
+  if (useWeights) {    \r
+    AliAnalysisDataContainer *cinputWeights = mgr->CreateContainer(Form("Weights %s",outputSlotName.Data()),\r
+                                                                  TList::Class(),AliAnalysisManager::kInputContainer); \r
+  }\r
+\r
+  if(SP) {\r
+    TString outputSP = fileName;\r
+    outputSP += ":outputSPanalysis";\r
+    outputSP+= rptypestr;\r
+    AliAnalysisDataContainer *coutputSP = mgr->CreateContainer(Form("SP %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputSP); \r
+    mgr->ConnectInput(taskSP,0,coutputFE); \r
+    mgr->ConnectOutput(taskSP,1,coutputSP); \r
+    if (WEIGHTS[0]) {\r
+      mgr->ConnectInput(taskSP,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    }\r
+  }\r
+  if(LYZ1SUM) {\r
+    TString outputLYZ1SUM = fileName;\r
+    outputLYZ1SUM += ":outputLYZ1SUManalysis";\r
+    outputLYZ1SUM+= rptypestr;\r
+    AliAnalysisDataContainer *coutputLYZ1SUM = mgr->CreateContainer(Form("LYZ1SUM %s",outputSlotName.Data()), \r
+                                                                   TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1SUM); \r
+    mgr->ConnectInput(taskLYZ1SUM,0,coutputFE);\r
+    mgr->ConnectOutput(taskLYZ1SUM,1,coutputLYZ1SUM);\r
+  }\r
+  if(LYZ1PROD) {\r
+    TString outputLYZ1PROD = fileName;\r
+    outputLYZ1PROD += ":outputLYZ1PRODanalysis";\r
+    outputLYZ1PROD+= rptypestr;\r
+    AliAnalysisDataContainer *coutputLYZ1PROD = mgr->CreateContainer(Form("LYZ1PROD %s",outputSlotName.Data()), \r
+                                                                    TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ1PROD); \r
+    mgr->ConnectInput(taskLYZ1PROD,0,coutputFE); \r
+    mgr->ConnectOutput(taskLYZ1PROD,1,coutputLYZ1PROD);\r
+  }\r
+  if(LYZ2SUM) {\r
+    AliAnalysisDataContainer *cinputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUMin %s",outputSlotName.Data()),\r
+                                                                  TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZ2SUM = fileName;\r
+    outputLYZ2SUM += ":outputLYZ2SUManalysis";\r
+    outputLYZ2SUM+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZ2SUM = mgr->CreateContainer(Form("LYZ2SUM %s",outputSlotName.Data()), \r
+                                                                   TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2SUM); \r
+    mgr->ConnectInput(taskLYZ2SUM,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZ2SUM,1,cinputLYZ2SUM);\r
+    mgr->ConnectOutput(taskLYZ2SUM,1,coutputLYZ2SUM); \r
+    cinputLYZ2SUM->SetData(fInputListLYZ2SUM);\r
+  }\r
+  if(LYZ2PROD) {\r
+    AliAnalysisDataContainer *cinputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PRODin %s",outputSlotName.Data()),\r
+                                                                   TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZ2PROD = fileName;\r
+    outputLYZ2PROD += ":outputLYZ2PRODanalysis";\r
+    outputLYZ2PROD+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZ2PROD = mgr->CreateContainer(Form("LYZ2PROD %s",outputSlotName.Data()), \r
+                                                                    TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZ2PROD); \r
+    mgr->ConnectInput(taskLYZ2PROD,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZ2PROD,1,cinputLYZ2PROD);\r
+    mgr->ConnectOutput(taskLYZ2PROD,1,coutputLYZ2PROD); \r
+    cinputLYZ2PROD->SetData(fInputListLYZ2PROD);\r
+  }\r
+  if(LYZEP) {\r
+    AliAnalysisDataContainer *cinputLYZEP = mgr->CreateContainer(Form("LYZEPin %s",outputSlotName.Data()),\r
+                                                                TList::Class(),AliAnalysisManager::kInputContainer);\r
+    TString outputLYZEP = fileName;\r
+    outputLYZEP += ":outputLYZEPanalysis";\r
+    outputLYZEP+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputLYZEP = mgr->CreateContainer(Form("LYZEP %s",outputSlotName.Data()), \r
+                                                                 TList::Class(),AliAnalysisManager::kOutputContainer,outputLYZEP); \r
+    mgr->ConnectInput(taskLYZEP,0,coutputFE); \r
+    mgr->ConnectInput(taskLYZEP,1,cinputLYZEP);\r
+    mgr->ConnectOutput(taskLYZEP,1,coutputLYZEP); \r
+    cinputLYZEP->SetData(fInputListLYZEP);\r
+  }\r
+  if(GFC) {\r
+    TString outputGFC = fileName;\r
+    outputGFC += ":outputGFCanalysis";\r
+    outputGFC+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputGFC = mgr->CreateContainer(Form("GFC %s",outputSlotName.Data()), \r
+                                                               TList::Class(),AliAnalysisManager::kOutputContainer,outputGFC); \r
+    mgr->ConnectInput(taskGFC,0,coutputFE); \r
+    mgr->ConnectOutput(taskGFC,1,coutputGFC);\r
+    if (useWeights) {\r
+      mgr->ConnectInput(taskGFC,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    } \r
+  }\r
+  if(QC) {\r
+    TString outputQC = fileName;\r
+    outputQC += ":outputQCanalysis";\r
+    outputQC+= rptypestr;\r
+\r
+    AliAnalysisDataContainer *coutputQC = mgr->CreateContainer(Form("QC %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputQC); \r
+    mgr->ConnectInput(taskQC,0,coutputFE); \r
+    mgr->ConnectOutput(taskQC,1,coutputQC);\r
+    if (useWeights) {\r
+      mgr->ConnectInput(taskQC,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    }\r
+  }\r
+  if(FQD) {\r
+    TString outputFQD = fileName;\r
+    outputFQD += ":outputFQDanalysis";\r
+    outputFQD+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputFQD = mgr->CreateContainer(Form("FQD %s",outputSlotName.Data()), \r
+                                                               TList::Class(),AliAnalysisManager::kOutputContainer,outputFQD); \r
+    mgr->ConnectInput(taskFQD,0,coutputFE); \r
+    mgr->ConnectOutput(taskFQD,1,coutputFQD);\r
+    if(useWeights) {\r
+      mgr->ConnectInput(taskFQD,1,cinputWeights);\r
+      cinputWeights->SetData(weightsList);\r
+    } \r
+  }\r
+  if(MCEP) {\r
+    TString outputMCEP = fileName;\r
+    outputMCEP += ":outputMCEPanalysis";\r
+    outputMCEP+= rptypestr;\r
+    \r
+    AliAnalysisDataContainer *coutputMCEP = mgr->CreateContainer(Form("MCEP %s",outputSlotName.Data()), \r
+                                                                TList::Class(),AliAnalysisManager::kOutputContainer,outputMCEP); \r
+    mgr->ConnectInput(taskMCEP,0,coutputFE);\r
+    mgr->ConnectOutput(taskMCEP,1,coutputMCEP); \r
+  }\r
+  if(MH) {\r
+    TString outputMH = fileName;\r
+    outputMH += ":outputMHanalysis";\r
+    outputMH += rptypestr;\r
+        \r
+    AliAnalysisDataContainer *coutputMH = mgr->CreateContainer(Form("MH %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputMH); \r
+    mgr->ConnectInput(taskMH,0,coutputFE); \r
+    mgr->ConnectOutput(taskMH,1,coutputMH); \r
+    //if (useWeights) {\r
+    //  mgr->ConnectInput(taskMH,1,cinputWeights);\r
+    //  cinputWeights->SetData(weightsList);\r
+    //} \r
+  }\r
+  if(NL) {\r
+    TString outputNL = fileName;\r
+    outputNL += ":outputNLanalysis";\r
+    outputNL += rptypestr;\r
+\r
+    AliAnalysisDataContainer *coutputNL = mgr->CreateContainer(Form("NL %s",outputSlotName.Data()), \r
+                                                              TList::Class(),AliAnalysisManager::kOutputContainer,outputNL); \r
+    mgr->ConnectInput(taskNL,0,coutputFE);\r
+    mgr->ConnectOutput(taskNL,1,coutputNL);\r
+    //if (useWeights) {\r
+    //  mgr->ConnectInput(taskNL,1,cinputWeights);\r
+    //  cinputWeights->SetData(weightsList);\r
+    //} \r
+  }\r
+\r
+  ///////////////////////////////////////////////////////////////////////////////////////////\r
+  if (runQAtask)\r
+  {\r
+    AliAnalysisTaskQAflow* taskQAflow = new AliAnalysisTaskQAflow(Form("TaskQAflow %s",outputSlotName.Data()));\r
+    taskQAflow->SetEventCuts(cutsEvent);\r
+    taskQAflow->SetTrackCuts(cutsRP);\r
+    taskQAflow->SetFillNTuple(FillQAntuple);\r
+    taskQAflow->SetDoCorrelations(DoQAcorrelations);\r
+    mgr->AddTask(taskQAflow);\r
+    \r
+    Printf("outputSlotName %s",outputSlotName.Data());\r
+    TString taskQAoutputFileName(fileNameBase);\r
+    taskQAoutputFileName.Append("_QA.root");\r
+    AliAnalysisDataContainer* coutputQAtask = mgr->CreateContainer(Form("flowQA %s",outputSlotName.Data()),\r
+                                              TObjArray::Class(),\r
+                                              AliAnalysisManager::kOutputContainer,\r
+                                              taskQAoutputFileName);\r
+    AliAnalysisDataContainer* coutputQAtaskTree = mgr->CreateContainer(Form("flowQAntuple %s",outputSlotName.Data()),\r
+                                              TNtuple::Class(),\r
+                                              AliAnalysisManager::kOutputContainer,\r
+                                              taskQAoutputFileName);\r
+    mgr->ConnectInput(taskQAflow,0,mgr->GetCommonInputContainer());\r
+    mgr->ConnectInput(taskQAflow,1,coutputFE);\r
+    mgr->ConnectOutput(taskQAflow,1,coutputQAtask);\r
+    if (FillQAntuple) mgr->ConnectOutput(taskQAflow,2,coutputQAtaskTree);\r
+  }\r
+}\r
+\r
+\r
+\r
+\r
+\r
diff --git a/PWGCF/FLOW/macros/AddTaskPidQC.C b/PWGCF/FLOW/macros/AddTaskPidQC.C
new file mode 100644 (file)
index 0000000..a65c790
--- /dev/null
@@ -0,0 +1,132 @@
+AddTaskPidQC(){\r
+  gROOT->LoadMacro("$ALICE_ROOT/PWGCF/FLOW/macros/AddTaskFlowCentralityPIDQC.C");\r
+\r
+  const Int_t ncentr = 9;\r
+  Int_t cmin[ncentr]={0,5,10,20,30,40,50,60,70};\r
+  Int_t cmax[ncentr]={5,10,20,30,40,50,60,70,80};\r
+\r
+  for(Int_t i=0;i < ncentr;i++){\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kFALSE,AliPID::kPion,AliFlowTrackCuts::kTOFbayesian,0); // no pid\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kPion,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kKaon,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTOFbayesian,-1);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kPion,AliFlowTrackCuts::kTPCbayesian,0);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kKaon,AliFlowTrackCuts::kTPCbayesian,0);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTPCbayesian,-1);\r
+    AddTaskFlowCentralityPIDQC(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTPCbayesian,0);\r
+  }\r
+}\r
+\r
+createQC4res(){\r
+  gSystem->Load("libVMC.so");\r
+  gSystem->Load("libPhysics.so");\r
+  gSystem->Load("libTree.so");\r
+  gSystem->Load("libMinuit.so");\r
+  gSystem->Load("libSTEERBase.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libAOD.so");\r
+  gSystem->Load("libESD.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libANALYSISalice.so");\r
+  gSystem->Load("libCORRFW.so");\r
+  gSystem->Load("libNetx.so");\r
+  gSystem->Load("libPWGflowBase.so");\r
+  \r
+  char name[200];\r
+  char *spe[4]={"pion","kaon","antipr","proton"};\r
+  char *tech[2]={"TOF","TPC"};\r
+  Int_t cmin[9]={0,5,10,20,30,40,50,60,70};\r
+  Int_t cmax[9]={5,10,20,30,40,50,60,70,80};\r
+  \r
+  TFile *f = new TFile("AnalysisResults.root");\r
+  TFile *fo = new TFile("resultsQC4.root","RECREATE");\r
+  TDirectory* directory = dynamic_cast<TDirectory*>(f->Get("outputQCanalysisTPCstandalone"));\r
+  TList* listTemp = directory->GetListOfKeys();\r
+  for(Int_t i=0;i < 9;i++){\r
+    TList* list2 = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9)->GetName()));\r
+    AliFlowAnalysisWithQCumulants* sp2 = new AliFlowAnalysisWithQCumulants();\r
+    sp2->GetOutputHistograms(list2);\r
+    sp2->Finish();\r
+    AliFlowCommonHistResults* res2=sp2->GetCommonHistsResults4th();\r
+    TH1D *h2=res2->GetHistDiffFlowPtPOI();\r
+    sprintf(name,"v2QC4_%s_%i_%i","AllCharged",cmin[i],cmax[i]);\r
+    h2->SetName(name);\r
+    fo->cd();\r
+    h2->Write();\r
+    for(Int_t j=0;j < 2;j++){\r
+      for(Int_t k=0;k < 4;k++){\r
+               TList* list = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9+j*4+k+1)->GetName()));\r
+       AliFlowAnalysisWithQCumulants* sp = new AliFlowAnalysisWithQCumulants();\r
+       sp->GetOutputHistograms(list);\r
+       sp->Finish();\r
+       AliFlowCommonHistResults* res=sp->GetCommonHistsResults4th();\r
+       TH1D *h=res->GetHistDiffFlowPtPOI();\r
+       sprintf(name,"v2QC4_%s_%i_%i%s",spe[k],cmin[i],cmax[i],tech[j]);\r
+       h->SetName(name);\r
+       fo->cd();\r
+       h->Write();\r
+      }\r
+    }\r
+  }\r
+  fo->Close();\r
+}\r
+\r
+\r
+\r
+createQC2res(){\r
+  gSystem->Load("libVMC.so");\r
+  gSystem->Load("libPhysics.so");\r
+  gSystem->Load("libTree.so");\r
+  gSystem->Load("libMinuit.so");\r
+  gSystem->Load("libSTEERBase.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libAOD.so");\r
+  gSystem->Load("libESD.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libANALYSISalice.so");\r
+  gSystem->Load("libCORRFW.so");\r
+  gSystem->Load("libNetx.so");\r
+  gSystem->Load("libPWGflowBase.so");\r
+  \r
+  char name[200];\r
+  char *spe[4]={"pion","kaon","antipr","proton"};\r
+  char *tech[2]={"TOF","TPC"};\r
+  Int_t cmin[9]={0,5,10,20,30,40,50,60,70};\r
+  Int_t cmax[9]={5,10,20,30,40,50,60,70,80};\r
+  \r
+  TFile *f = new TFile("AnalysisResults.root");\r
+  TFile *fo = new TFile("resultsQC2.root","RECREATE");\r
+  TDirectory* directory = dynamic_cast<TDirectory*>(f->Get("outputQCanalysisTPCstandalone"));\r
+  TList* listTemp = directory->GetListOfKeys();\r
+  for(Int_t i=0;i < 9;i++){\r
+    TList* list2 = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9)->GetName()));\r
+    AliFlowAnalysisWithQCumulants* sp2 = new AliFlowAnalysisWithQCumulants();\r
+    sp2->GetOutputHistograms(list2);\r
+    sp2->Finish();\r
+    AliFlowCommonHistResults* res2=sp2->GetCommonHistsResults2nd();\r
+    TH1D *h2=res2->GetHistDiffFlowPtPOI();\r
+    sprintf(name,"v2QC2_%s_%i_%i","AllCharged",cmin[i],cmax[i]);\r
+    h2->SetName(name);\r
+    fo->cd();\r
+    h2->Write();\r
+    for(Int_t j=0;j < 2;j++){\r
+      for(Int_t k=0;k < 4;k++){\r
+       TList* list = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9+j*4+k+1)->GetName()));\r
+       AliFlowAnalysisWithQCumulants* sp = new AliFlowAnalysisWithQCumulants();\r
+       sp->GetOutputHistograms(list);\r
+       sp->Finish();\r
+       AliFlowCommonHistResults* res=sp->GetCommonHistsResults2nd();\r
+       TH1D *h=res->GetHistDiffFlowPtPOI();\r
+       sprintf(name,"v2QC2_%s_%i_%i%s",spe[k],cmin[i],cmax[i],tech[j]);\r
+       h->SetName(name);\r
+       fo->cd();\r
+       h->Write();\r
+      }\r
+    }\r
+  }\r
+  fo->Close();\r
+}\r
+\r
+\r
+\r
diff --git a/PWGCF/FLOW/macros/AddTaskPidVZEROSP.C b/PWGCF/FLOW/macros/AddTaskPidVZEROSP.C
new file mode 100644 (file)
index 0000000..c5f0c4b
--- /dev/null
@@ -0,0 +1,77 @@
+AddTaskPidVZEROSP(){\r
+  gROOT->LoadMacro("$ALICE_ROOT/PWGCF/FLOW/macros/AddTaskFlowCentralityPID.C");\r
+\r
+  const Int_t ncentr = 9;\r
+  Int_t cmin[ncentr]={0,5,10,20,30,40,50,60,70};\r
+  Int_t cmax[ncentr]={5,10,20,30,40,50,60,70,80};\r
+\r
+  for(Int_t i=0;i < ncentr;i++){\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kFALSE,AliPID::kPion,AliFlowTrackCuts::kTOFbayesian,0); // no pid\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kPion,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kKaon,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTOFbayesian,-1);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTOFbayesian,0);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kPion,AliFlowTrackCuts::kTPCbayesian,0);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kKaon,AliFlowTrackCuts::kTPCbayesian,0);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTPCbayesian,-1);\r
+    AddTaskFlowCentralityPIDSP(cmin[i],cmax[i],"AnalysisResults",kTRUE,AliPID::kProton,AliFlowTrackCuts::kTPCbayesian,0);\r
+  }\r
+}\r
+\r
+createSPres(){\r
+  gSystem->Load("libVMC.so");\r
+  gSystem->Load("libPhysics.so");\r
+  gSystem->Load("libTree.so");\r
+  gSystem->Load("libMinuit.so");\r
+  gSystem->Load("libSTEERBase.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libAOD.so");\r
+  gSystem->Load("libESD.so");\r
+  gSystem->Load("libANALYSIS.so");\r
+  gSystem->Load("libANALYSISalice.so");\r
+  gSystem->Load("libCORRFW.so");\r
+  gSystem->Load("libNetx.so");\r
+  gSystem->Load("libPWGflowBase.so");\r
+  \r
+  char name[200];\r
+  char *spe[4]={"pion","kaon","antipr","proton"};\r
+  char *tech[2]={"TOF","TPC"};\r
+  Int_t cmin[9]={0,5,10,20,30,40,50,60,70};\r
+  Int_t cmax[9]={5,10,20,30,40,50,60,70,80};\r
+  \r
+  TFile *f = new TFile("AnalysisResults.root");\r
+  TFile *fo = new TFile("results.root","RECREATE");\r
+  TDirectory* directory = dynamic_cast<TDirectory*>(f->Get("outputSPanalysisTPCstandalone"));\r
+  TList* listTemp = directory->GetListOfKeys();\r
+  for(Int_t i=0;i < 9;i++){\r
+    TList* list2 = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9)->GetName()));\r
+    AliFlowAnalysisWithScalarProduct* sp2 = new AliFlowAnalysisWithScalarProduct();\r
+    sp2->GetOutputHistograms(list2);\r
+    sp2->Finish();\r
+    AliFlowCommonHistResults* res2=sp2->GetCommonHistsRes();\r
+    TH1D *h2=res2->GetHistDiffFlowPtPOI();\r
+    sprintf(name,"v2SP_%s_%i_%i","AllCharged",cmin[i],cmax[i]);\r
+    h2->SetName(name);\r
+    fo->cd();\r
+    h2->Write();\r
+    for(Int_t j=0;j < 2;j++){\r
+      for(Int_t k=0;k < 4;k++){\r
+       TList* list = dynamic_cast<TList*>(directory->Get(listTemp->At(i*9+j*4+k+1)->GetName()));\r
+       AliFlowAnalysisWithScalarProduct* sp = new AliFlowAnalysisWithScalarProduct();\r
+       sp->GetOutputHistograms(list);\r
+       sp->Finish();\r
+       AliFlowCommonHistResults* res=sp->GetCommonHistsRes();\r
+       TH1D *h=res->GetHistDiffFlowPtPOI();\r
+       sprintf(name,"v2SP_%s_%i_%i%s",spe[k],cmin[i],cmax[i],tech[j]);\r
+       h->SetName(name);\r
+       fo->cd();\r
+       h->Write();\r
+      }\r
+    }\r
+  }\r
+  fo->Close();\r
+}\r
+\r
+\r
+\r
+\r