]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
addtask update from andrea and naghmeh
authorrbertens <rbertens@cern.ch>
Wed, 14 Jan 2015 12:32:17 +0000 (13:32 +0100)
committerrbertens <rbertens@cern.ch>
Wed, 14 Jan 2015 12:32:42 +0000 (13:32 +0100)
PWGCF/FLOW/macros/AddTaskPIDFlowSP.C

index a716a3b02ecb79daa22c20e1b5019ddf8694fafb..ebbcce626d1ec82b8bf089d3015f3af52ae23791 100644 (file)
@@ -7,352 +7,355 @@ class AliFlowEventSimpleCuts;
 
 
 void AddTaskPIDFlowSP(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 AODfilterBit = 272,
-                                   Int_t charge=0,
-                                   Int_t MinTPCdedx = 10,
-                                   Int_t ncentrality = 6,
-                                   Int_t maxITSCls = 7,
-                                   Double_t maxChi2ITSCls = 37,
-                                   Bool_t doQA=kTRUE,
-                                   Bool_t isPID = kTRUE,
-                                   Bool_t VZERO = kFALSE, // use vzero sp method
-                                   Bool_t is2011 = kFALSE,
-                                   Bool_t isAOD = kTRUE,
-                                   Bool_t UsePIDParContours = kFALSE,
-                                   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) with TPC
-Double_t minA = -0.8;//
-Double_t maxA = -0.5*EtaGap;//
-Double_t minB = +0.5*EtaGap;//
-Double_t maxB = +0.8;//
+                      Int_t uptoWhichHarmonics = 2, // 2 --> v2 only, 3 --> v2 and v3, and so on
+                      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 AODfilterBit = 272,
+                      Int_t charge=0,
+                      Int_t MinTPCdedx = 10,
+                      Int_t ncentralityminlim = 0,//0 start from 0-5cc
+                      Int_t ncentralitymaxlim = 6,//6 runo over all the full centrlity classes
+                      Int_t maxITSCls = 7,
+                      Double_t maxChi2ITSCls = 37,
+                      Bool_t doQA=kTRUE,
+                      Bool_t isPID = kTRUE,
+                      Bool_t VZERO = kFALSE, // use vzero sp method
+                      Bool_t is2011 = kFALSE,
+                      Bool_t isAOD = kTRUE,
+                      Bool_t UsePIDParContours = kFALSE,
+                      AliPID::EParticleType particleType=AliPID::kPion,
+                      AliFlowTrackCuts::PIDsource sourcePID=AliFlowTrackCuts::kTOFbayesian) {
     
-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;
+    // 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) with TPC
+    Double_t minA = -0.8;//
+    Double_t maxA = -0.5*EtaGap;//
+    Double_t minB = +0.5*EtaGap;//
+    Double_t maxB = +0.8;//
     
-//---------Data selection---------- ESD only!!!
-//kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet
-AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;
-AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;
+    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 ncentrminlim = ncentralityminlim;
+    const int ncentrmaxlim = ncentralitymaxlim;
     
-//---------Parameter mixing--------
-//kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt
-AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;
-AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;
     
-const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);  //ESD
-const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype); //ESD
-
+    //---------Data selection---------- ESD only!!!
+    //kMC, kGlobal, kESD_TPConly, kESD_SPDtracklet
+    AliFlowTrackCuts::trackParameterType rptype = AliFlowTrackCuts::kTPCstandalone;
+    AliFlowTrackCuts::trackParameterType poitype = AliFlowTrackCuts::kTPCstandalone;
     
-//===========================================================================
-// EVENTS CUTS:
-AliFlowEventCuts* cutsEvent[ncentr];
-AliFlowTrackCuts* cutsRP[ncentr];
-AliFlowTrackCuts* cutsPOI[ncentr];
-TString outputSlotName[ncentr][4];
-TString suffixName[ncentr];
+    //---------Parameter mixing--------
+    //kPure - no mixing, kTrackWithMCkine, kTrackWithMCPID, kTrackWithMCpt
+    AliFlowTrackCuts::trackParameterMix rpmix = AliFlowTrackCuts::kPure;
+    AliFlowTrackCuts::trackParameterMix poimix = AliFlowTrackCuts::kPure;
     
-for(int icentr=0;icentr<ncentr;icentr++){
-    cutsEvent[icentr] = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
-    cutsEvent[icentr]->SetLHC11h(is2011);
-    cutsEvent[icentr]->SetCentralityPercentileRange(centrMin[icentr],centrMax[icentr]);
-    cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
-    //  cutsEvent[icentr]->SetRefMultMethod(AliFlowEventCuts::kVZERO);
-    //cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);
-    //cutsEvent[icentr]->SetNContributorsRange(2);
-    cutsEvent[icentr]->SetPrimaryVertexZrange(-10.,10.);
-    cutsEvent[icentr]->SetQA(doQA);
-    cutsEvent[icentr]->SetCutTPCmultiplicityOutliers();
+    const char* rptypestr = AliFlowTrackCuts::GetParamTypeName(rptype);  //ESD
+    const char* poitypestr = AliFlowTrackCuts::GetParamTypeName(poitype); //ESD
     
     
-    // RP TRACK CUTS:
-    if(!VZERO){
-        cutsRP[icentr] = new AliFlowTrackCuts(Form("RP_%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[icentr]->SetMinChi2PerClusterTPC(0.1);
-        cutsRP[icentr]->SetMaxChi2PerClusterTPC(4.0);
-        cutsRP[icentr]->SetMaxDCAToVertexXY(2.4);
-        cutsRP[icentr]->SetMaxDCAToVertexZ(3.0);
-        cutsRP[icentr]->SetAcceptKinkDaughters(kFALSE);
-        cutsRP[icentr]->SetMinimalTPCdedx(MinTPCdedx);
-        cutsRP[icentr]->SetAODfilterBit(AODfilterBit);
-    }
+    //===========================================================================
+    // EVENTS CUTS:
+    AliFlowEventCuts* cutsEvent[ncentr];
+    AliFlowTrackCuts* cutsRP[ncentr];
+    AliFlowTrackCuts* cutsPOI[ncentr];
+    TString outputSlotName[ncentr][4];
+    TString suffixName[ncentr];
     
-    if(VZERO) { // use vzero sub analysis
-        if(!is2011) cutsRP[icentr] = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2010(); // select vzero tracks
-        if(is2011)  cutsRP[icentr] = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2011(); // select vzero tracks
+    for(int icentr=ncentrminlim;icentr<ncentrmaxlim;icentr++){
+        cutsEvent[icentr] = new AliFlowEventCuts(Form("eventcuts_%d",icentr));
+        cutsEvent[icentr]->SetLHC11h(is2011);
+        cutsEvent[icentr]->SetCentralityPercentileRange(centrMin[icentr],centrMax[icentr]);
+        cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
+        //  cutsEvent[icentr]->SetRefMultMethod(AliFlowEventCuts::kVZERO);
+        //cutsEvent[icentr]->SetCentralityPercentileMethod(AliFlowEventCuts::kSPD1tracklets);
+        //cutsEvent[icentr]->SetNContributorsRange(2);
+        cutsEvent[icentr]->SetPrimaryVertexZrange(-10.,10.);
+        cutsEvent[icentr]->SetQA(doQA);
+        cutsEvent[icentr]->SetCutTPCmultiplicityOutliers();
+        
         
-        if(!cutsRP[icentr]) {
-            cout << " Fatal error: no RP cuts found! " << endl;
-            return 0x0;
+        // RP TRACK CUTS:
+        if(!VZERO){
+            cutsRP[icentr] = new AliFlowTrackCuts(Form("RP_%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[icentr]->SetMinChi2PerClusterTPC(0.1);
+            cutsRP[icentr]->SetMaxChi2PerClusterTPC(4.0);
+            cutsRP[icentr]->SetMaxDCAToVertexXY(2.4);
+            cutsRP[icentr]->SetMaxDCAToVertexZ(3.0);
+            cutsRP[icentr]->SetAcceptKinkDaughters(kFALSE);
+            cutsRP[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+            cutsRP[icentr]->SetAODfilterBit(AODfilterBit);
         }
-
-     }//vzero is not a tracking device it is just a scintillator. so pt range or DCAtoVertex are not set here.
-    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
-    if(!isAOD){
-        SP_POI[icentr]->SetMaxSharedITSCluster(maxITSCls);
-        SP_POI[icentr]->SetMaxChi2perITSCluster(maxChi2ITSCls);
-        SP_POI[icentr]->SetMinNClustersITS(2);
-        SP_POI[icentr]->SetRequireITSRefit(kTRUE);
-        SP_POI[icentr]->SetRequireTPCRefit(kTRUE);
-        SP_POI[icentr]->SetMaxDCAToVertexXY(0.3);
-        SP_POI[icentr]->SetMaxDCAToVertexZ(0.3);
+        
+        if(VZERO) { // use vzero sub analysis
+            if(!is2011) cutsRP[icentr] = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2010(); // select vzero tracks
+            if(is2011)  cutsRP[icentr] = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts2011(); // select vzero tracks
+            
+            if(!cutsRP[icentr]) {
+                cout << " Fatal error: no RP cuts found! " << endl;
+                return 0x0;
+            }
+            
+        }//vzero is not a tracking device it is just a scintillator. so pt range or DCAtoVertex are not set here.
+        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
+        if(!isAOD){
+            SP_POI[icentr]->SetMaxSharedITSCluster(maxITSCls);
+            SP_POI[icentr]->SetMaxChi2perITSCluster(maxChi2ITSCls);
+            SP_POI[icentr]->SetMinNClustersITS(2);
+            SP_POI[icentr]->SetRequireITSRefit(kTRUE);
+            SP_POI[icentr]->SetRequireTPCRefit(kTRUE);
+            SP_POI[icentr]->SetMaxDCAToVertexXY(0.3);
+            SP_POI[icentr]->SetMaxDCAToVertexZ(0.3);
+            SP_POI[icentr]->SetAcceptKinkDaughters(kFALSE);
+            SP_POI[icentr]->SetMinimalTPCdedx(10.);
+        }
+        //SP_POI[icentr]->SetParamMix(poimix);
+        SP_POI[icentr]->SetPtRange(0.2,6.);//
+        SP_POI[icentr]->SetMinNClustersTPC(70);
+        SP_POI[icentr]->SetMinChi2PerClusterTPC(0.1);
+        SP_POI[icentr]->SetMaxChi2PerClusterTPC(4.0);
+        
+        
+        
+        if(!VZERO && Qvector=="Qa"){
+            SP_POI[icentr]->SetEtaRange( +0.5*EtaGap, etamax );
+            printf(" > NOTE: Using half TPC (Qa) as POI selection u < \n");
+            
+        }
+        if(!VZERO && Qvector=="Qb"){
+            SP_POI[icentr]->SetEtaRange( etamin,-0.5*EtaGap );
+            printf(" > NOTE: Using half TPC (Qb) as POI selection u < \n");
+            
+        }
+        if(VZERO){
+            SP_POI[icentr]->SetEtaRange( etamin,etamax );
+            printf(" > NOTE: Using full TPC as POI selection u < \n");
+        }
+        //SP_POI->SetRequireITSRefit(kTRUE);
+        //SP_POI->SetRequireTPCRefit(kTRUE);
+        //SP_POI->SetMinNClustersITS(2);
+        //SP_POI->SetMaxChi2PerClusterITS(1.e+09);
+        SP_POI[icentr]->SetMaxDCAToVertexXY(2.4);
+        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);
-        SP_POI[icentr]->SetMinimalTPCdedx(10.);
-    }
-    //SP_POI[icentr]->SetParamMix(poimix);
-    SP_POI[icentr]->SetPtRange(0.2,6.);//
-    SP_POI[icentr]->SetMinNClustersTPC(70);
-    SP_POI[icentr]->SetMinChi2PerClusterTPC(0.1);
-    SP_POI[icentr]->SetMaxChi2PerClusterTPC(4.0);
-    
-    
-    if(!VZERO && Qvector=="Qa"){
-        SP_POI[icentr]->SetEtaRange( +0.5*EtaGap, etamax );
-        printf(" > NOTE: Using half TPC (Qa) as POI selection u < \n");
-
-    }
-    if(!VZERO && Qvector=="Qb"){
-        SP_POI[icentr]->SetEtaRange( etamin,-0.5*EtaGap );
-        printf(" > NOTE: Using half TPC (Qb) as POI selection u < \n");
-
-    }
-    if(VZERO){
-        SP_POI[icentr]->SetEtaRange( etamin,etamax );
-        printf(" > NOTE: Using full TPC as POI selection u < \n");
-    }
-    //SP_POI->SetRequireITSRefit(kTRUE);
-    //SP_POI->SetRequireTPCRefit(kTRUE);
-    //SP_POI->SetMinNClustersITS(2);
-    //SP_POI->SetMaxChi2PerClusterITS(1.e+09);
-    SP_POI[icentr]->SetMaxDCAToVertexXY(2.4);
-    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
-        SP_POI[icentr]->SetTPCTOFNsigmaPIDCutContours(UsePIDParContours,centrMin[icentr],centrMax[icentr]);
-    }
-    
-    if (charge!=0) SP_POI[icentr]->SetCharge(charge);
-    //SP_POI->SetAllowTOFmismatch(kFALSE);
-    SP_POI[icentr]->SetRequireStrictTOFTPCagreement(kTRUE);
-    SP_POI[icentr]->SetMinimalTPCdedx(MinTPCdedx);
-    if(isAOD) SP_POI[icentr]->SetAODfilterBit(AODfilterBit);
-    SP_POI[icentr]->SetQA(doQA);
-    SP_POI[icentr]->SetPriors((centrMin[icentr]+centrMax[icentr])*0.5);
-
-
-
-
-    //=====================================================================
-    if(!VZERO && Qvector=="Qa") suffixName[icentr] = "Qa";
-    if(!VZERO && Qvector=="Qb") suffixName[icentr] = "Qb";
-    if(VZERO) suffixName[icentr] = "vzero";
-    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]+=uniqueStr;
-        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){
+            SP_POI[icentr]->SetPID(particleType, sourcePID);//particleType, sourcePID
+            SP_POI[icentr]->SetTPCTOFNsigmaPIDCutContours(UsePIDParContours,centrMin[icentr],centrMax[icentr]);
+        }
+        
+        if (charge!=0) SP_POI[icentr]->SetCharge(charge);
+        //SP_POI->SetAllowTOFmismatch(kFALSE);
+        SP_POI[icentr]->SetRequireStrictTOFTPCagreement(kTRUE);
+        SP_POI[icentr]->SetMinimalTPCdedx(MinTPCdedx);
+        if(isAOD) SP_POI[icentr]->SetAODfilterBit(AODfilterBit);
+        SP_POI[icentr]->SetQA(doQA);
+        SP_POI[icentr]->SetPriors((centrMin[icentr]+centrMax[icentr])*0.5);
         
         
+        
+        
+        //=====================================================================
+        
+        if(!VZERO && Qvector=="Qa") suffixName[icentr] = "Qa";
+        if(!VZERO && Qvector=="Qb") suffixName[icentr] = "Qb";
+        if(VZERO) suffixName[icentr] = "vzero";
+        suffixName[icentr] += "-highharmflow";
+        suffixName[icentr] += Form("%i_", centrMin[icentr]);
+        suffixName[icentr] += Form("%i_", centrMax[icentr]);
+        suffixName[icentr] += Form("%.f_", EtaGap*10);
+        
         if(isPID){
-            outputSlotName[icentr][harmonic-2]+=AliFlowTrackCuts::PIDsourceName(sourcePID);//sourcePID
-            outputSlotName[icentr][harmonic-2]+="_";
-            outputSlotName[icentr][harmonic-2]+=AliPID::ParticleName(particleType);//particleType
+            suffixName[icentr]+=AliFlowTrackCuts::PIDsourceName(sourcePID);
+            suffixName[icentr]+="_";
+            suffixName[icentr]+=uniqueStr;
+            suffixName[icentr]+="_";
+            //suffixName[icentr]+=AliPID::ParticleName(particleType);//particleType
         }
         else{
-            outputSlotName[icentr][harmonic-2]+="AllCharged";
+            suffixName[icentr]+="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++) {
+        if (charge<0) suffixName[icentr]+="-";
+        if (charge>0) suffixName[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);
+        for(int harmonic=2;harmonic<uptoWhichHarmonics+1;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]+="+";
+        }
+    }//loop over centrality classes
     
-  //  if(taskFE[icentr]->SetVZEROSubEvents(EP3sub)) cout << " --> Setting up VZERO subevents method ... " << endl;
     
-    if(!VZERO) taskFE[icentr]->SetSubeventEtaRange(minA, maxA, minB, maxB);
-    if(VZERO)  taskFE[icentr]->SetSubeventEtaRange(-5,-1.5,+1.5,5);
-    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.);
-    }
+    TString fileName(fileNameBase);
+    fileName.Append(".root");
     
-    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]);
-    //==========================================================
+    //====================================FLOWPACKAGE TASKS=========================//
+    AliAnalysisDataContainer *cinput1[ncentr];
+    AliAnalysisDataContainer *coutputFE[ncentr];
+    AliAnalysisDataContainer* coutputFEQA[ncentr];
+    AliAnalysisTaskFlowEvent *taskFE[ncentr];
+    
+    AliAnalysisDataContainer *flowEvent[ncentr][4];
+    AliAnalysisTaskFilterFE *tskFilter[ncentr][4];
     
-    TString Species = "";
-    if(isPID) Species += AliPID::ParticleName(particleType);
-    else      Species += "Allcharged";
+    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++) {
         
-
-    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);
+        // 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;
+        }
         
-        flowEvent[icentr][harm-2] = mgr->CreateContainer( Form("Filter_%s", myNameSP[icentr][harm-2].Data()),
-                                                                   AliFlowEventSimple::Class(),
-                                                                   AliAnalysisManager::kExchangeContainer );
+        // 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;
+        }
         
-        tskFilter[icentr][harm-2] = new AliAnalysisTaskFilterFE( Form("TaskFilter_%s",myNameSP[icentr][harm-2].Data()),cutsRP[icentr], NULL);
-        if(!VZERO){
-            tskFilter[icentr][harm-2]->SetSubeventEtaRange(etamin, -.5*EtaGap, +.5*EtaGap, etamax);
+        taskFE[icentr] = new AliAnalysisTaskFlowEvent(Form("TaskFlowEvent_%s",suffixName[icentr].Data()),"",doQA);
+        taskFE[icentr]->SelectCollisionCandidates(triggerSelectionString);
+        
+        //  if(taskFE[icentr]->SetVZEROSubEvents(EP3sub)) cout << " --> Setting up VZERO subevents method ... " << endl;
+        
+        if(!VZERO) taskFE[icentr]->SetSubeventEtaRange(minA, maxA, minB, maxB);
+        if(VZERO)  taskFE[icentr]->SetSubeventEtaRange(-5,-1.5,+1.5,5);
+        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.);
         }
-        if(VZERO) tskFilter[icentr][harm-2]->SetSubeventEtaRange(-5,-1.5,+1.5,5);
-        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->ConnectInput(taskSP[icentr][harm-2],0,coutputFE[icentr]);
-        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]);
+        
+        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);
+            if(!VZERO){
+                tskFilter[icentr][harm-2]->SetSubeventEtaRange(etamin, -.5*EtaGap, +.5*EtaGap, etamax);
+            }
+            if(VZERO) tskFilter[icentr][harm-2]->SetSubeventEtaRange(-5,-1.5,+1.5,5);
+            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->ConnectInput(taskSP[icentr][harm-2],0,coutputFE[icentr]);
+            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]);
+        }
+        
+        
     }
-
-
-}
 }
 
 //===========================================================================
@@ -370,6 +373,6 @@ AliFlowTrackCuts* DefinePOIcuts(Int_t    icentr){
     return cutsPOI;
 }
 
-     
+