]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
new addtask macros from naghmeh
authorrbertens <rbertens@cern.ch>
Mon, 14 Apr 2014 13:20:21 +0000 (15:20 +0200)
committerrbertens <rbertens@cern.ch>
Mon, 14 Apr 2014 13:44:21 +0000 (15:44 +0200)
PWGCF/FLOW/macros/AddTaskPIDFlowQC.C [new file with mode: 0644]
PWGCF/FLOW/macros/AddTaskPIDFlowSP.C [new file with mode: 0644]

diff --git a/PWGCF/FLOW/macros/AddTaskPIDFlowQC.C b/PWGCF/FLOW/macros/AddTaskPIDFlowQC.C
new file mode 100644 (file)
index 0000000..2a92305
--- /dev/null
@@ -0,0 +1,287 @@
+//AddTask macro for higher harmonic flow analysis with QC method only.
+
+class AliAnalysisDataContainer;
+class AliFlowTrackCuts;
+class AliFlowEventCuts;
+
+
+void AddTaskPIDFlowQC(Int_t triggerSelectionString=AliVEvent::kMB,
+                                   Float_t etamin=-0.8,
+                                   Float_t etamax=0.8,
+                                   TString fileNameBase="AnalysisResults",
+                                   TString uniqueStr="Pion_02",
+                                   Int_t AODfilterBitRP = 272,
+                                   Int_t AODfilterBitPOI = 272,
+                                   Int_t charge=0,
+                                   Int_t MinTPCdedx = 10,
+                                   Int_t ncentrality = 6,
+                                   Bool_t doQA=kTRUE,
+                                   Bool_t isPID = kTRUE,
+                                   AliPID::EParticleType particleType=AliPID::kPion,
+                                   AliFlowTrackCuts::PIDsource sourcePID=AliFlowTrackCuts::kTOFbayesian) {
+
+// Define a range of the detector to exclude
+Bool_t ExcludeRegion = kFALSE;
+Double_t excludeEtaMin = -0.;
+Double_t excludeEtaMax = 0.;
+Double_t excludePhiMin = 0.;
+Double_t excludePhiMax = 0.;
+    
+int centrMin[9] = {0,5,10,20,30,40,50,60,70};
+int centrMax[9] = {5,10,20,30,40,50,60,70,80};
+const int ncentr = ncentrality;
+    
+    
+//---------Data selection----------
+//kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet
+AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;
+AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;
+    
+//---------Parameter mixing--------
+//kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt
+AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;
+AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;
+    
+const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);
+const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);
+
+
+//===========================================================================
+// EVENTS CUTS:
+AliFlowEventCuts* cutsEvent[ncentr];
+AliFlowTrackCuts* cutsRP[ncentr];
+AliFlowTrackCuts* cutsPOI[ncentr];
+TString outputSlotName[ncentr][4];
+TString suffixName[ncentr];
+    
+for(int icentr=0;icentr<ncentr;icentr++){
+    cutsEvent[icentr] = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
+    //cutsEvent[icentr]->SetUsedDataset(is2011);
+    cutsEvent[icentr]->SetCentralityPercentileRange(centrMin[icentr],centrMax[icentr]);
+    cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
+    //  cutsEvent->SetRefMultMethod(AliFlowEventCuts::kVZERO);
+    //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);
+    //cutsEvent->SetNContributorsRange(2);
+    cutsEvent[icentr]->SetPrimaryVertexZrange(-10.,10.);
+    cutsEvent[icentr]->SetQA(doQA);
+    cutsEvent[icentr]->SetCutTPCmultiplicityOutliers();
+    
+    
+    // RP TRACK CUTS:
+    cutsRP[icentr] = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
+    cutsRP[icentr]->SetParamType(rptype);
+    cutsRP[icentr]->SetParamMix(rpmix);
+    cutsRP[icentr]->SetPtRange(0.2,5.);
+    cutsRP[icentr]->SetEtaRange(etamin,etamax);
+    cutsRP[icentr]->SetMinNClustersTPC(70);
+    //  cutsRP->SetMinChi2PerClusterTPC(0.1);//
+    // cutsRP->SetMaxChi2PerClusterTPC(4.0);//
+    cutsRP[icentr]->SetMaxDCAToVertexXY(3.0);
+    cutsRP[icentr]->SetMaxDCAToVertexZ(3.0);
+    cutsRP[icentr]->SetAcceptKinkDaughters(kFALSE);
+    cutsRP[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+    cutsRP[icentr]->SetAODfilterBit(AODfilterBitRP);
+    cutsRP[icentr]->SetQA(doQA);
+
+    
+    //POIs for SP and QC method
+    //===========================================================================
+    AliFlowTrackCuts  *SP_POI[ncentr];
+    //half window for POIs
+    //=======================SP POI Cuts
+    SP_POI[icentr] = DefinePOIcuts(icentr);
+
+    SP_POI[icentr]->GetBayesianResponse()->ForceOldDedx(); // for 2010 data to use old TPC PID Response instead of the official one
+    SP_POI[icentr]->SetParamType(poitype);
+    SP_POI[icentr]->SetParamMix(poimix);
+    SP_POI[icentr]->SetPtRange(0.2,5.);//
+    SP_POI[icentr]->SetMinNClustersTPC(70);
+    SP_POI[icentr]->SetEtaRange( etamin,etamax );
+  
+    // SP_POI->SetMinChi2PerClusterTPC(0.1); //
+    // SP_POI->SetMaxChi2PerClusterTPC(4.0); //
+    //  SP_POI->SetRequireITSRefit(kTRUE);
+    //  SP_POI->SetRequireTPCRefit(kTRUE);
+    //  SP_POI->SetMinNClustersITS(2);
+    //  SP_POI->SetMaxChi2PerClusterITS(1.e+09);
+    SP_POI[icentr]->SetMaxDCAToVertexXY(3.0);
+    SP_POI[icentr]->SetMaxDCAToVertexZ(3.0);
+    //SP_POI->SetDCAToVertex2D(kTRUE);
+    //SP_POI->SetMaxNsigmaToVertex(1.e+10);
+    //SP_POI->SetRequireSigmaToVertex(kFALSE);
+    SP_POI[icentr]->SetAcceptKinkDaughters(kFALSE);
+    if(isPID) SP_POI[icentr]->SetPID(particleType, sourcePID);//particleType, sourcePID
+    if (charge!=0) SP_POI[icentr]->SetCharge(charge);
+    //SP_POI->SetAllowTOFmismatch(kFALSE);
+    SP_POI[icentr]->SetRequireStrictTOFTPCagreement(kTRUE);
+    SP_POI[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+    SP_POI[icentr]->SetAODfilterBit(AODfilterBitPOI);
+    SP_POI[icentr]->SetQA(doQA);
+    SP_POI[icentr]->SetPriors((centrMin[icentr]+centrMax[icentr])*0.5);
+
+
+
+
+    //=====================================================================
+    suffixName[icentr] = "highharmflow";
+    suffixName[icentr] += Form("%i_", centrMin[icentr]);
+    suffixName[icentr] += Form("%i_", centrMax[icentr]);
+
+    if(isPID){
+        suffixName[icentr]+=AliFlowTrackCuts::PIDsourceName(sourcePID);
+        suffixName[icentr]+="_";
+        suffixName[icentr]+=AliPID::ParticleName(particleType);//particleType
+    }
+    else{
+        suffixName[icentr]+="AllCharged";
+    }
+    if (charge<0) suffixName[icentr]+="-";
+    if (charge>0) suffixName[icentr]+="+";
+
+
+    for(int harmonic=2;harmonic<6;harmonic++){  //for v2,v3,v4 and v5
+        outputSlotName[icentr][harmonic-2] = "";
+        outputSlotName[icentr][harmonic-2]+=uniqueStr;
+        outputSlotName[icentr][harmonic-2]+=Form("_v%i_",harmonic);
+        outputSlotName[icentr][harmonic-2]+=cutsRP[icentr]->GetName();
+        outputSlotName[icentr][harmonic-2]+="_";
+        outputSlotName[icentr][harmonic-2]+=SP_POI[icentr]->GetName();
+        outputSlotName[icentr][harmonic-2]+=Form("_%i-",centrMin[icentr]);
+        outputSlotName[icentr][harmonic-2]+=Form("%i_",centrMax[icentr]);
+        
+        
+        if(isPID){
+            outputSlotName[icentr][harmonic-2]+=AliFlowTrackCuts::PIDsourceName(sourcePID);//sourcePID
+            outputSlotName[icentr][harmonic-2]+="_";
+            outputSlotName[icentr][harmonic-2]+=AliPID::ParticleName(particleType);//particleType
+        }
+        else{
+            outputSlotName[icentr][harmonic-2]+="AllCharged";
+        }
+        if (charge<0) outputSlotName[icentr][harmonic-2]+="-";
+        if (charge>0) outputSlotName[icentr][harmonic-2]+="+";
+    }
+}
+
+
+TString fileName(fileNameBase);
+fileName.Append(".root");
+
+
+    
+//====================================FLOWPACKAGE TASKS=========================//
+AliAnalysisDataContainer *cinput1[ncentr];
+AliAnalysisDataContainer *coutputFE[ncentr];
+AliAnalysisDataContainer* coutputFEQA[ncentr];
+AliAnalysisTaskFlowEvent *taskFE[ncentr];
+
+
+AliAnalysisDataContainer *coutputQC[ncentr][4];
+AliAnalysisTaskQCumulants *taskQC[ncentr][4];
+
+TString outputQA[ncentr];
+
+for (int icentr=0; icentr<ncentr; icentr++) {
+        
+    // Get the pointer to the existing analysis manager via the static access method.
+        //==============================================================================
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    if (!mgr) {
+        Error("AddTaskFlowEvent", "No analysis manager to connect to.");
+        return NULL;
+    }
+        
+    // Check the analysis type using the event handlers connected to the analysis
+    // manager. The availability of MC handler can also be checked here.
+    //==============================================================================
+    if (!mgr->GetInputEventHandler()) {
+        ::Error("AddTaskFlowEvent", "This task requires an input event handler");
+        return NULL;
+    }
+
+    taskFE[icentr] = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent_%s",suffixName[icentr].Data()),"",doQA);
+    taskFE[icentr]->SelectCollisionCandidates(triggerSelectionString);
+    mgr->AddTask(taskFE[icentr]);
+
+    // Pass cuts for RPs and POIs to the task:
+    taskFE[icentr]->SetCutsEvent(cutsEvent[icentr]);
+    taskFE[icentr]->SetCutsRP(cutsRP[icentr]);
+    taskFE[icentr]->SetCutsPOI(SP_POI[icentr]);
+    if (cutsRP[icentr]->GetParamType()==AliFlowTrackCuts::kVZERO)
+    {
+        //TODO: since this is set in a static object all analyses in an analysis train
+        //will be affected.
+        taskFE[icentr]->SetHistWeightvsPhiMin(0.);
+        taskFE[icentr]->SetHistWeightvsPhiMax(200.);
+    }
+    
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    
+    cinput1[icentr] = mgr->GetCommonInputContainer();
+    
+    coutputFE[icentr] = mgr->CreateContainer(Form("FlowEvent_%s",suffixName[icentr].Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
+
+    mgr->ConnectInput(taskFE[icentr],0,cinput1[icentr]);
+    mgr->ConnectOutput(taskFE[icentr],1,coutputFE[icentr]);
+    //==========================================================
+
+    for(int harm=2;harm<6;harm++){
+        
+        taskQC[icentr][harm-2] = new AliAnalysisTaskQCumulants(Form("TaskQCumulants_%s",outputSlotName[icentr][harm-2].Data()),kFALSE);
+        taskQC[icentr][harm-2]->SelectCollisionCandidates(triggerSelectionString);
+      //  taskQC[icentr][harm-2]->SetUsePhiWeights(WEIGHTS[0]);
+      //  taskQC[icentr][harm-2]->SetUsePtWeights(WEIGHTS[1]);
+      //  taskQC[icentr][harm-2]->SetUseEtaWeights(WEIGHTS[2]);
+        taskQC[icentr][harm-2]->SetCalculateCumulantsVsM(kFALSE);
+        taskQC[icentr][harm-2]->SetnBinsMult(10000);
+        taskQC[icentr][harm-2]->SetMinMult(0.);
+        taskQC[icentr][harm-2]->SetMaxMult(10000.);
+        taskQC[icentr][harm-2]->SetHarmonic(harm);
+        taskQC[icentr][harm-2]->SetApplyCorrectionForNUA(kFALSE);
+        taskQC[icentr][harm-2]->SetFillMultipleControlHistograms(kFALSE);
+        mgr->AddTask(taskQC[icentr][harm-2]);
+
+        TString outputQC = fileName;
+        outputQC += ":outputQCanalysis";
+        outputQC+= rptypestr;
+        
+        coutputQC[icentr][harm-2] = mgr->CreateContainer(Form("QC_%s",outputSlotName[icentr][harm-2].Data()),
+                                            TList::Class(),AliAnalysisManager::kOutputContainer,outputQC);
+        mgr->ConnectInput(taskQC[icentr][harm-2],0,coutputFE[icentr]);
+        mgr->ConnectOutput(taskQC[icentr][harm-2],1,coutputQC[icentr][harm-2]);
+
+    }
+
+
+    if (taskFE[icentr]->GetQAOn()) {
+        outputQA[icentr] = fileName;
+        outputQA[icentr] += ":QA";
+        coutputFEQA[icentr] = mgr->CreateContainer(Form("QA_%s",suffixName[icentr].Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA[icentr]);
+        mgr->ConnectOutput(taskFE[icentr],2,coutputFEQA[icentr]);
+    }
+
+
+}
+
+}
+
+//===========================================================================
+
+AliFlowEventCuts* DefinecutsEvent(Int_t icentr){
+    AliFlowEventCuts* cutsEvent = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
+    return cutsEvent;
+}
+AliFlowTrackCuts* DefineRPcuts(Int_t icentr){
+    AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
+    return cutsRP;
+}
+AliFlowTrackCuts* DefinePOIcuts(Int_t icentr){
+    AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts(Form("TPConlyPOI_%d",icentr));
+    return cutsPOI;
+}
+
+
+
+
+
diff --git a/PWGCF/FLOW/macros/AddTaskPIDFlowSP.C b/PWGCF/FLOW/macros/AddTaskPIDFlowSP.C
new file mode 100644 (file)
index 0000000..b67dc96
--- /dev/null
@@ -0,0 +1,323 @@
+//AddTask macro for higher harmonic flow analysis with SP method only.
+
+class AliAnalysisDataContainer;
+class AliFlowTrackCuts;
+class AliFlowEventCuts;
+
+
+void AddTaskFlowSP(Int_t triggerSelectionString=AliVEvent::kMB,
+                                   Float_t etamin=-0.8,
+                                   Float_t etamax=0.8,
+                                   Float_t EtaGap=0.2,
+                                   TString fileNameBase="AnalysisResults",
+                                   TString uniqueStr="Pion_02",
+                                   TString Qvector ="Qa",
+                                   Int_t AODfilterBitRP = 272,
+                                   Int_t AODfilterBitPOI = 272,
+                                   Int_t charge=0,
+                                   Int_t MinTPCdedx = 10,
+                                   Int_t ncentrality = 6,
+                                   Bool_t doQA=kTRUE,
+                                   Bool_t isPID = kTRUE,
+                                   AliPID::EParticleType particleType=AliPID::kPion,
+                                   AliFlowTrackCuts::PIDsource sourcePID=AliFlowTrackCuts::kTOFbayesian) {
+
+// Define a range of the detector to exclude
+Bool_t ExcludeRegion = kFALSE;
+Double_t excludeEtaMin = -0.;
+Double_t excludeEtaMax = 0.;
+Double_t excludePhiMin = 0.;
+Double_t excludePhiMax = 0.;
+   
+//Define the range for eta subevents (for SP method)
+Double_t minA = -0.8;//
+Double_t maxA = -0.5*EtaGap;//
+Double_t minB = +0.5*EtaGap;//
+Double_t maxB = +0.8;//
+
+    
+int centrMin[9] = {0,5,10,20,30,40,50,60,70};
+int centrMax[9] = {5,10,20,30,40,50,60,70,80};
+const int ncentr = ncentrality;
+    
+    
+//---------Data selection----------
+//kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet
+AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;
+AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;
+    
+//---------Parameter mixing--------
+//kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt
+AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;
+AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;
+    
+const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);
+const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype);
+
+    
+//===========================================================================
+// EVENTS CUTS:
+AliFlowEventCuts* cutsEvent[ncentr];
+AliFlowTrackCuts* cutsRP[ncentr];
+AliFlowTrackCuts* cutsPOI[ncentr];
+TString outputSlotName[ncentr][4];
+TString suffixName[ncentr];
+    
+for(int icentr=0;icentr<ncentr;icentr++){
+    cutsEvent[icentr] = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
+    //cutsEvent[icentr]->SetUsedDataset(is2011);
+    cutsEvent[icentr]->SetCentralityPercentileRange(centrMin[icentr],centrMax[icentr]);
+    cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
+    //  cutsEvent->SetRefMultMethod(AliFlowEventCuts::kVZERO);
+    //cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);
+    //cutsEvent->SetNContributorsRange(2);
+    cutsEvent[icentr]->SetPrimaryVertexZrange(-10.,10.);
+    cutsEvent[icentr]->SetQA(doQA);
+    cutsEvent[icentr]->SetCutTPCmultiplicityOutliers();
+    
+    
+    // RP TRACK CUTS:
+    cutsRP[icentr] = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
+    cutsRP[icentr]->SetParamType(rptype);
+    cutsRP[icentr]->SetParamMix(rpmix);
+    cutsRP[icentr]->SetPtRange(0.2,5.);
+    cutsRP[icentr]->SetEtaRange(etamin,etamax);
+    cutsRP[icentr]->SetMinNClustersTPC(70);
+    //  cutsRP->SetMinChi2PerClusterTPC(0.1);//
+    // cutsRP->SetMaxChi2PerClusterTPC(4.0);//
+    cutsRP[icentr]->SetMaxDCAToVertexXY(3.0);
+    cutsRP[icentr]->SetMaxDCAToVertexZ(3.0);
+    cutsRP[icentr]->SetAcceptKinkDaughters(kFALSE);
+    cutsRP[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+    cutsRP[icentr]->SetAODfilterBit(AODfilterBitRP);
+    cutsRP[icentr]->SetQA(doQA);
+
+    
+    //POIs for SP and QC method
+    //===========================================================================
+    AliFlowTrackCuts  *SP_POI[ncentr];
+    //half window for POIs
+    //=======================SP POI Cuts
+    SP_POI[icentr] = DefinePOIcuts(icentr);
+
+    SP_POI[icentr]->GetBayesianResponse()->ForceOldDedx(); // for 2010 data to use old TPC PID Response instead of the official one
+    SP_POI[icentr]->SetParamType(poitype);
+    SP_POI[icentr]->SetParamMix(poimix);
+    SP_POI[icentr]->SetPtRange(0.2,5.);//
+    SP_POI[icentr]->SetMinNClustersTPC(70);
+    if(Qvector=="Qa"){
+        SP_POI[icentr]->SetEtaRange( +0.5*EtaGap, etamax );
+    }
+    if(Qvector=="Qb"){
+        SP_POI[icentr]->SetEtaRange( etamin,-0.5*EtaGap );
+    }
+
+    // SP_POI->SetMinChi2PerClusterTPC(0.1); //
+    // SP_POI->SetMaxChi2PerClusterTPC(4.0); //
+    //  SP_POI->SetRequireITSRefit(kTRUE);
+    //  SP_POI->SetRequireTPCRefit(kTRUE);
+    //  SP_POI->SetMinNClustersITS(2);
+    //  SP_POI->SetMaxChi2PerClusterITS(1.e+09);
+    SP_POI[icentr]->SetMaxDCAToVertexXY(3.0);
+    SP_POI[icentr]->SetMaxDCAToVertexZ(3.0);
+    //SP_POI->SetDCAToVertex2D(kTRUE);
+    //SP_POI->SetMaxNsigmaToVertex(1.e+10);
+    //SP_POI->SetRequireSigmaToVertex(kFALSE);
+    SP_POI[icentr]->SetAcceptKinkDaughters(kFALSE);
+    if(isPID) SP_POI[icentr]->SetPID(particleType, sourcePID);//particleType, sourcePID
+    if (charge!=0) SP_POI[icentr]->SetCharge(charge);
+    //SP_POI->SetAllowTOFmismatch(kFALSE);
+    SP_POI[icentr]->SetRequireStrictTOFTPCagreement(kTRUE);
+    SP_POI[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+    SP_POI[icentr]->SetAODfilterBit(AODfilterBitPOI);
+    SP_POI[icentr]->SetQA(doQA);
+    SP_POI[icentr]->SetPriors((centrMin[icentr]+centrMax[icentr])*0.5);
+
+
+
+
+    //=====================================================================
+    if(Qvector=="Qa") suffixName[icentr] = "Qa";
+    if(Qvector=="Qb") suffixName[icentr] = "Qb";
+    suffixName[icentr] += "-highharmflow";
+    suffixName[icentr] += Form("%i_", centrMin[icentr]);
+    suffixName[icentr] += Form("%i_", centrMax[icentr]);
+    suffixName[icentr] += Form("%.f_", EtaGap*10);
+
+    if(isPID){
+        suffixName[icentr]+=AliFlowTrackCuts::PIDsourceName(sourcePID);
+        suffixName[icentr]+="_";
+        suffixName[icentr]+=AliPID::ParticleName(particleType);//particleType
+    }
+    else{
+        suffixName[icentr]+="AllCharged";
+    }
+    if (charge<0) suffixName[icentr]+="-";
+    if (charge>0) suffixName[icentr]+="+";
+
+
+    for(int harmonic=2;harmonic<6;harmonic++){  //for v2,v3,v4 and v5
+        outputSlotName[icentr][harmonic-2] = "";
+        outputSlotName[icentr][harmonic-2]+=uniqueStr;
+        outputSlotName[icentr][harmonic-2]+=Form("_v%i_",harmonic);
+        outputSlotName[icentr][harmonic-2]+=cutsRP[icentr]->GetName();
+        outputSlotName[icentr][harmonic-2]+="_";
+        outputSlotName[icentr][harmonic-2]+=SP_POI[icentr]->GetName();
+        outputSlotName[icentr][harmonic-2]+=Form("_%i-",centrMin[icentr]);
+        outputSlotName[icentr][harmonic-2]+=Form("%i_",centrMax[icentr]);
+        
+        
+        if(isPID){
+            outputSlotName[icentr][harmonic-2]+=AliFlowTrackCuts::PIDsourceName(sourcePID);//sourcePID
+            outputSlotName[icentr][harmonic-2]+="_";
+            outputSlotName[icentr][harmonic-2]+=AliPID::ParticleName(particleType);//particleType
+        }
+        else{
+            outputSlotName[icentr][harmonic-2]+="AllCharged";
+        }
+        if (charge<0) outputSlotName[icentr][harmonic-2]+="-";
+        if (charge>0) outputSlotName[icentr][harmonic-2]+="+";
+    }
+}
+
+
+TString fileName(fileNameBase);
+fileName.Append(".root");
+
+
+    
+//====================================FLOWPACKAGE TASKS=========================//
+AliAnalysisDataContainer *cinput1[ncentr];
+AliAnalysisDataContainer *coutputFE[ncentr];
+AliAnalysisDataContainer* coutputFEQA[ncentr];
+AliAnalysisTaskFlowEvent *taskFE[ncentr];
+
+AliAnalysisDataContainer *flowEvent[ncentr][4];
+AliAnalysisTaskFilterFE *tskFilter[ncentr][4];
+
+AliAnalysisDataContainer *coutputSP[ncentr][4];
+AliAnalysisTaskScalarProduct *taskSP[ncentr][4];
+
+TString outputQA[ncentr];
+TString myNameSP[ncentr][4];
+TString slot[ncentr][4];
+
+for (int icentr=0; icentr<ncentr; icentr++) {
+        
+    // Get the pointer to the existing analysis manager via the static access method.
+        //==============================================================================
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    if (!mgr) {
+        Error("AddTaskFlowEvent", "No analysis manager to connect to.");
+        return NULL;
+    }
+        
+    // Check the analysis type using the event handlers connected to the analysis
+    // manager. The availability of MC handler can also be checked here.
+    //==============================================================================
+    if (!mgr->GetInputEventHandler()) {
+        ::Error("AddTaskFlowEvent", "This task requires an input event handler");
+        return NULL;
+    }
+
+    taskFE[icentr] = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent_%s",suffixName[icentr].Data()),"",doQA);
+    taskFE[icentr]->SelectCollisionCandidates(triggerSelectionString);
+    taskFE[icentr]->SetSubeventEtaRange(minA, maxA, minB, maxB);
+    mgr->AddTask(taskFE[icentr]);
+
+    // Pass cuts for RPs and POIs to the task:
+    taskFE[icentr]->SetCutsEvent(cutsEvent[icentr]);
+    taskFE[icentr]->SetCutsRP(cutsRP[icentr]);
+    taskFE[icentr]->SetCutsPOI(SP_POI[icentr]);
+    if (cutsRP[icentr]->GetParamType()==AliFlowTrackCuts::kVZERO)
+    {
+        //TODO: since this is set in a static object all analyses in an analysis train
+        //will be affected.
+        taskFE[icentr]->SetHistWeightvsPhiMin(0.);
+        taskFE[icentr]->SetHistWeightvsPhiMax(200.);
+    }
+    
+    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+    
+    cinput1[icentr] = mgr->GetCommonInputContainer();
+    
+    coutputFE[icentr] = mgr->CreateContainer(Form("FlowEvent_%s",suffixName[icentr].Data()),AliFlowEventSimple::Class(),AliAnalysisManager::kExchangeContainer);
+
+    mgr->ConnectInput(taskFE[icentr],0,cinput1[icentr]);
+    mgr->ConnectOutput(taskFE[icentr],1,coutputFE[icentr]);
+    //==========================================================
+    
+    TString Species = "";
+    if(isPID) Species += AliPID::ParticleName(particleType);
+    else      Species += "Allcharged";
+        
+
+    for(int harm=2;harm<6;harm++){
+        myNameSP[icentr][harm-2] = "SP_";
+        myNameSP[icentr][harm-2] += Qvector;
+        myNameSP[icentr][harm-2] += Form("_v%i_%s_%.f",harm,outputSlotName[icentr][harm-2].Data(),EtaGap*10);
+        
+        flowEvent[icentr][harm-2] = mgr->CreateContainer( Form("Filter_%s", myNameSP[icentr][harm-2].Data()),
+                                                                   AliFlowEventSimple::Class(),
+                                                                   AliAnalysisManager::kExchangeContainer );
+        
+        tskFilter[icentr][harm-2] = new AliAnalysisTaskFilterFE( Form("TaskFilter_%s",myNameSP[icentr][harm-2].Data()),cutsRP[icentr], NULL);
+        tskFilter[icentr][harm-2]->SetSubeventEtaRange(etamin, -.5*EtaGap, +.5*EtaGap, etamax);
+        
+        mgr->AddTask(tskFilter[icentr][harm-2]);
+        mgr->ConnectInput( tskFilter[icentr][harm-2],0,coutputFE[icentr]);
+        mgr->ConnectOutput(tskFilter[icentr][harm-2],1,flowEvent[icentr][harm-2]);
+        
+        
+        taskSP[icentr][harm-2] = new AliAnalysisTaskScalarProduct(Form("TaskScalarProduct_%s",outputSlotName[icentr][harm-2].Data()),kFALSE);
+        taskSP[icentr][harm-2]->SetHarmonic(harm);
+        taskSP[icentr][harm-2]->SelectCollisionCandidates(triggerSelectionString);
+        taskSP[icentr][harm-2]->SetRelDiffMsub(1.0);
+        taskSP[icentr][harm-2]->SetTotalQvector(Qvector);
+        taskSP[icentr][harm-2]->SetApplyCorrectionForNUA(kTRUE);
+        
+        TString outputSP = fileName;
+        outputSP += ":outputSPanalysis";
+        outputSP+= rptypestr;
+        slot[icentr][harm-2] = "SP_";
+        slot[icentr][harm-2] += outputSlotName[icentr][harm-2];
+        slot[icentr][harm-2] += "_";
+        slot[icentr][harm-2] += Qvector;
+        coutputSP[icentr][harm-2] = mgr->CreateContainer(Form("%s_%.f",slot[icentr][harm-2].Data(),EtaGap*10),
+                                         TList::Class(),AliAnalysisManager::kOutputContainer,outputSP);
+        mgr->AddTask(taskSP[icentr][harm-2]);
+        mgr->ConnectInput(taskSP[icentr][harm-2],0,flowEvent[icentr][harm-2]);
+        mgr->ConnectOutput(taskSP[icentr][harm-2],1,coutputSP[icentr][harm-2]);
+    }
+
+
+    if (taskFE[icentr]->GetQAOn()) {
+        outputQA[icentr] = fileName;
+        outputQA[icentr] += ":QA";
+        coutputFEQA[icentr] = mgr->CreateContainer(Form("QA_%s",suffixName[icentr].Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputQA[icentr]);
+        mgr->ConnectOutput(taskFE[icentr],2,coutputFEQA[icentr]);
+    }
+
+
+}
+}
+
+//===========================================================================
+
+AliFlowEventCuts* DefinecutsEvent(Int_t icentr){
+    AliFlowEventCuts* cutsEvent = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
+    return cutsEvent;
+}
+AliFlowTrackCuts* DefineRPcuts(Int_t icentr){
+    AliFlowTrackCuts* cutsRP = new AliFlowTrackCuts(Form("TPConlyRP_%d",icentr));
+    return cutsRP;
+}
+AliFlowTrackCuts* DefinePOIcuts(Int_t icentr){
+    AliFlowTrackCuts* cutsPOI = new AliFlowTrackCuts(Form("TPConlyPOI_%d",icentr));
+    return cutsPOI;
+}
+
+
+
+