--- /dev/null
+/////////////////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+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
--- /dev/null
+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