ROOT logo
void AddTaskFlowCascade(int trigger, int centrMin, int centrMax, int cut=1, int harmonic=2) {
  AddTaskFlowCascade(trigger, centrMin, centrMax, "Xi", 
		     Form("Xi%d%dcut%d", centrMin, centrMax, cut), 0, cut, "V0M", "VZESP", harmonic);

  AddTaskFlowCascade(trigger, centrMin, centrMax, "Omega", 
		     Form("Omega%d%dcut%d", centrMin,centrMax, cut), 1, cut, "V0M", "VZESP", harmonic);
}

void AddTaskFlowCascade(int trigger, float centrMin, float centrMax, 
			TString folderName="myFolder", TString suffixName="mySuffix", 
			int specie=0, int cuts=1, char* MULT="V0M", 
			TString method="VZESP QC TPCSP", int harmonic=2) {
  TString fileName = AliAnalysisManager::GetCommonFileName();
  //  fileName.ReplaceAll(".root","");

  //-E-V-E-N-T- -c-u-t-s--------------------------------------------------------
  AliFlowEventCuts* cutsEvent = new AliFlowEventCuts(Form("event_cuts_%s",suffixName.Data()));
  cutsEvent->SetCentralityPercentileRange(centrMin,centrMax);
  if(MULT=="V0M")
    cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kV0);
  else
    cutsEvent->SetCentralityPercentileMethod(AliFlowEventCuts::kTPConly);
  cutsEvent->SetRefMultMethod(AliFlowEventCuts::kSPDtracklets);
  cutsEvent->SetNContributorsRange(2);
  cutsEvent->SetPrimaryVertexZrange(-10.,+10.);

  //-R-P---c-u-t-s--------------------------------------------------------------
  AliFlowTrackCuts *cutsRPTPC 
    = AliFlowTrackCuts::GetStandardTPCStandaloneTrackCuts();
  cutsRPTPC->SetParamType( AliFlowTrackCuts::kGlobal );
  cutsRPTPC->SetAODfilterBit(1); // for AOD compatibility
  
  AliFlowTrackCuts *cutsRPVZE = AliFlowTrackCuts::GetStandardVZEROOnlyTrackCuts();
  //  AliFlowTrackCuts* trkCuts = new AliFlowTrackCuts();
  //AliFlowTrackCuts *cutsRPVZE = trkCuts->GetStandardVZEROOnlyTrackCuts();
  cutsRPVZE->SetApplyRecentering(kTRUE);
  
  //-D-A-U-G-H-T-E-R-S---c-u-t-s------------------------------------------------
  //  AliESDtrackCuts* cutsDaughter 
  //  = new AliESDtrackCuts(Form("daughter_cuts_%s",suffixName.Data()) );
  AliFlowTrackCuts * cutsDaughter 
    = new AliFlowTrackCuts(Form("daughter_cuts_%s",suffixName.Data()));
  cutsDaughter->SetPtRange(0.15,10.0);
  cutsDaughter->SetEtaRange(-0.8, 0.8 );
  cutsDaughter->SetMinNClustersTPC(70);
  cutsDaughter->SetMaxChi2PerClusterTPC(4.0);
  cutsDaughter->SetRequireTPCRefit(kTRUE);
  cutsDaughter->SetAcceptKinkDaughters(kFALSE);

  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();

  //-----------------Cascade TASK----------------------------
  AliAnalysisTaskFlowCascade *taskSel 
    = new AliAnalysisTaskFlowCascade(Form("Cascade_%s",suffixName.Data()),
				     cutsEvent, cutsRPTPC, cutsRPVZE,
				     cutsDaughter );
  taskSel->SelectCollisionCandidates(trigger);
  //taskSel->SetDebug();
  taskSel->SetCuts2010(cuts);
  taskSel->SetSpecie(specie);
  //printf( "CMM %d %f %f\n", MassBins(specie), MinMass(specie), MSFT_MaxMass(specie) );
  taskSel->SetCommonConstants( MSFT_MassBins(specie), MSFT_MinMass(specie), MSFT_MaxMass(specie) );
  AliAnalysisDataContainer *cOutHist 
    = mgr->CreateContainer(Form("OutHistos_%s",suffixName.Data()),
			   TList::Class(),
			   AliAnalysisManager::kOutputContainer,
			   Form("%s:Selector_%s",fileName.Data(),
				folderName.Data()));
  AliAnalysisDataContainer *exc_TPC 
    = mgr->CreateContainer( Form("TPCEventWithCandidates_%s",suffixName.Data()),
			    AliFlowEventSimple::Class(),
			    AliAnalysisManager::kExchangeContainer );
  AliAnalysisDataContainer *exc_VZE 
    = mgr->CreateContainer( Form("VZEEventWithCandidates_%s",suffixName.Data()),
			    AliFlowEventSimple::Class(),
			    AliAnalysisManager::kExchangeContainer );
  mgr->AddTask(taskSel);
  mgr->ConnectInput (taskSel, 0, cinput1);
  mgr->ConnectOutput(taskSel, 1, exc_TPC);
  mgr->ConnectOutput(taskSel, 2, exc_VZE);
  mgr->ConnectOutput(taskSel, 3, cOutHist);

  //-------------------FLOW TASKS----------------------------
  AliFlowTrackSimpleCuts *filter[15], *filterhf[15][2]; // MASS BANDS
  for(int mb=0; mb!=MSFT_MassBands(0); ++mb) {
    filter[mb] = new AliFlowTrackSimpleCuts( Form("Filter_MB%d",mb) );
    filter[mb]->SetEtaMin( -0.8 ); 
    filter[mb]->SetEtaMax( +0.8 );
    filter[mb]->SetMassMin( MSFT_MassBandLowEdge(specie, mb) ); 
    filter[mb]->SetMassMax( MSFT_MassBandLowEdge(specie, mb+1) );

    filterhf[mb][0] = new AliFlowTrackSimpleCuts( Form("Filterhf0_MB%d",mb) );
    filterhf[mb][0]->SetEtaMin( 0.0 ); 
    filterhf[mb][0]->SetEtaMax( +0.8 );
    filterhf[mb][0]->SetMassMin( MSFT_MassBandLowEdge(specie, mb) ); 
    filterhf[mb][0]->SetMassMax( MSFT_MassBandLowEdge(specie, mb+1) );

    filterhf[mb][1] = new AliFlowTrackSimpleCuts( Form("Filterhf1_MB%d",mb) );
    filterhf[mb][1]->SetEtaMin( -0.8 ); 
    filterhf[mb][1]->SetEtaMax( 0.0 );
    filterhf[mb][1]->SetMassMin( MSFT_MassBandLowEdge(specie, mb) ); 
    filterhf[mb][1]->SetMassMax( MSFT_MassBandLowEdge(specie, mb+1) );

    if(method.Contains("QC"))
      MSFT_AddQCmethod( Form("QCTPCMB%d", mb), folderName.Data(), suffixName.Data(), harmonic, 
		   exc_TPC, filter[mb]); // QC TPC
    if(method.Contains("TPCSP")){
      MSFT_AddSPmethod( Form("SPTPCMB%d", mb), folderName.Data(), suffixName.Data(), harmonic, 
		   exc_TPC, filterhf[mb][0], "Qa" ); // SP TPC Qa
      MSFT_AddSPmethod( Form("SPTPCMB%d", mb), folderName.Data(), suffixName.Data(), harmonic, 
		 exc_TPC, filterhf[mb][1], "Qb" ); // SP TPC Qb
    }
    if(method.Contains("VZESP")){
      MSFT_AddSPmethod( Form("SPVZEMB%d", mb), folderName.Data(), suffixName.Data(), harmonic, 
		   exc_VZE, filter[mb], "Qa" ); // SP VZE Qa
      MSFT_AddSPmethod( Form("SPVZEMB%d",mb), folderName.Data(), suffixName.Data(), harmonic, 
		   exc_VZE, filter[mb], "Qb" ); // SP VZE Qa
      MSFT_AddSPmethod( Form("SPVZEMB%d",mb), folderName.Data(), suffixName.Data(), harmonic,
		   exc_VZE, filter[mb], "QaQb" ); // SP VZE QaQb
    }
  }
}

void MSFT_AddQCmethod(char *name, TString myFolder, char *thecuts, int harmonic, 
		      AliAnalysisDataContainer *flowEvent, 
		      AliFlowTrackSimpleCuts *cutsPOI=NULL) {
  TString fileName = AliAnalysisManager::GetCommonFileName();
  myFolder.Append( Form("v%d",harmonic) );
  TString myName = Form("%sv%d_%s", name, harmonic, thecuts);
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  AliAnalysisDataContainer *flowEvent2 
    = mgr->CreateContainer( Form("Filter_%s", myName.Data()),
			    AliFlowEventSimple::Class(),
			    AliAnalysisManager::kExchangeContainer );
  AliAnalysisTaskFilterFE *tskFilter 
    = new AliAnalysisTaskFilterFE( Form("TaskFilter_%s",myName.Data()),
				   NULL, cutsPOI);
  mgr->AddTask(tskFilter);
  mgr->ConnectInput( tskFilter, 0, flowEvent);
  mgr->ConnectOutput(tskFilter, 1, flowEvent2);

  AliAnalysisDataContainer *outQC 
    = mgr->CreateContainer( myName.Data(), TList::Class(), AliAnalysisManager::kOutputContainer,
			    Form("%s:FlowCascade_QC_%s", fileName.Data(), myFolder.Data()) );
  AliAnalysisTaskQCumulants *tskQC 
    = new AliAnalysisTaskQCumulants( Form("TaskQCumulants_%s",myName.Data()),kFALSE );
  tskQC->SetApplyCorrectionForNUA(kTRUE);
  tskQC->SetHarmonic(harmonic);
  tskQC->SetBookOnlyBasicCCH(kTRUE);
  mgr->AddTask(tskQC);
  mgr->ConnectInput( tskQC, 0, flowEvent2);
  mgr->ConnectOutput(tskQC, 1, outQC);
}


void MSFT_AddSPmethod(char *name, TString myFolder, char *thecuts, int harmonic,
		      AliAnalysisDataContainer *flowEvent, AliFlowTrackSimpleCuts *cutsPOI=NULL,
		      char *Qvector) {
  TString fileName = AliAnalysisManager::GetCommonFileName();
  myFolder.Append( Form("v%d",harmonic) );
  TString myNameSP = Form("%sv%d%s_%s", name, harmonic, Qvector, thecuts);
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  AliAnalysisDataContainer *flowEvent2 
    = mgr->CreateContainer( Form("Filter_%s", myNameSP.Data()),
			    AliFlowEventSimple::Class(),
			    AliAnalysisManager::kExchangeContainer );
  AliAnalysisTaskFilterFE *tskFilter 
    = new AliAnalysisTaskFilterFE( Form("TaskFilter_%s",myNameSP.Data()),
				   NULL, cutsPOI);
  tskFilter->SetSubeventEtaRange( -5.0, -1.0, 1.0, +5.0 );
  mgr->AddTask(tskFilter);
  mgr->ConnectInput( tskFilter, 0, flowEvent);
  mgr->ConnectOutput(tskFilter, 1, flowEvent2);
  AliAnalysisDataContainer *outSP 
    = mgr->CreateContainer( myNameSP.Data(),TList::Class(),AliAnalysisManager::kOutputContainer,
			    Form("%s:FlowCascade_SP_%s",fileName.Data(),myFolder.Data()) );
  AliAnalysisTaskScalarProduct *tskSP 
    = new AliAnalysisTaskScalarProduct( Form("TaskScalarProduct_%s",myNameSP.Data()),kFALSE);
  tskSP->SetApplyCorrectionForNUA(kTRUE);
  tskSP->SetHarmonic(harmonic);
  tskSP->SetTotalQvector(Qvector);
  tskSP->SetBookOnlyBasicCCH(kTRUE);
  mgr->AddTask(tskSP);
  mgr->ConnectInput( tskSP,0,flowEvent2);
  mgr->ConnectOutput(tskSP,1,outSP);
}

double MSFT_MassBandLowEdge( int nv0, int mb ) {
  if(nv0==0) {
    double lowEdge[15+1]={ 1.282, 1.292, 1.302, 1.312, 1.317, 1.319, 1.321, 1.322, 
			   1.323, 1.325, 1.327, 1.332, 1.342, 1.352, 1.362, 1.372};
  } if(nv0==1) {
    double lowEdge[15+1]={ 1.632, 1.642, 1.652, 1.662, 1.667, 1.669, 1.671, 1.672, 
			   1.673, 1.675, 1.677, 1.682, 1.692, 1.702, 1.712, 1.722 };
  }
  return lowEdge[mb];
}

int MSFT_MassBands( int nv0 ) {
  if(nv0==0) {
    return 15;
  } else if(nv0==1) {
    return 15;
  }
}

int MSFT_MassBins( int nv0 ) {
  if(nv0==0) {
    return 90;
  } else if(nv0==1) {
    return 90;
  }
}

double MSFT_MinMass( int nv0 ) {
  return MSFT_MassBandLowEdge( nv0, 0 );
}

double MSFT_MaxMass( int nv0 ) {
  return MSFT_MassBandLowEdge( nv0, MSFT_MassBands(nv0) );
}
 AddTaskFlowCascade.C:1
 AddTaskFlowCascade.C:2
 AddTaskFlowCascade.C:3
 AddTaskFlowCascade.C:4
 AddTaskFlowCascade.C:5
 AddTaskFlowCascade.C:6
 AddTaskFlowCascade.C:7
 AddTaskFlowCascade.C:8
 AddTaskFlowCascade.C:9
 AddTaskFlowCascade.C:10
 AddTaskFlowCascade.C:11
 AddTaskFlowCascade.C:12
 AddTaskFlowCascade.C:13
 AddTaskFlowCascade.C:14
 AddTaskFlowCascade.C:15
 AddTaskFlowCascade.C:16
 AddTaskFlowCascade.C:17
 AddTaskFlowCascade.C:18
 AddTaskFlowCascade.C:19
 AddTaskFlowCascade.C:20
 AddTaskFlowCascade.C:21
 AddTaskFlowCascade.C:22
 AddTaskFlowCascade.C:23
 AddTaskFlowCascade.C:24
 AddTaskFlowCascade.C:25
 AddTaskFlowCascade.C:26
 AddTaskFlowCascade.C:27
 AddTaskFlowCascade.C:28
 AddTaskFlowCascade.C:29
 AddTaskFlowCascade.C:30
 AddTaskFlowCascade.C:31
 AddTaskFlowCascade.C:32
 AddTaskFlowCascade.C:33
 AddTaskFlowCascade.C:34
 AddTaskFlowCascade.C:35
 AddTaskFlowCascade.C:36
 AddTaskFlowCascade.C:37
 AddTaskFlowCascade.C:38
 AddTaskFlowCascade.C:39
 AddTaskFlowCascade.C:40
 AddTaskFlowCascade.C:41
 AddTaskFlowCascade.C:42
 AddTaskFlowCascade.C:43
 AddTaskFlowCascade.C:44
 AddTaskFlowCascade.C:45
 AddTaskFlowCascade.C:46
 AddTaskFlowCascade.C:47
 AddTaskFlowCascade.C:48
 AddTaskFlowCascade.C:49
 AddTaskFlowCascade.C:50
 AddTaskFlowCascade.C:51
 AddTaskFlowCascade.C:52
 AddTaskFlowCascade.C:53
 AddTaskFlowCascade.C:54
 AddTaskFlowCascade.C:55
 AddTaskFlowCascade.C:56
 AddTaskFlowCascade.C:57
 AddTaskFlowCascade.C:58
 AddTaskFlowCascade.C:59
 AddTaskFlowCascade.C:60
 AddTaskFlowCascade.C:61
 AddTaskFlowCascade.C:62
 AddTaskFlowCascade.C:63
 AddTaskFlowCascade.C:64
 AddTaskFlowCascade.C:65
 AddTaskFlowCascade.C:66
 AddTaskFlowCascade.C:67
 AddTaskFlowCascade.C:68
 AddTaskFlowCascade.C:69
 AddTaskFlowCascade.C:70
 AddTaskFlowCascade.C:71
 AddTaskFlowCascade.C:72
 AddTaskFlowCascade.C:73
 AddTaskFlowCascade.C:74
 AddTaskFlowCascade.C:75
 AddTaskFlowCascade.C:76
 AddTaskFlowCascade.C:77
 AddTaskFlowCascade.C:78
 AddTaskFlowCascade.C:79
 AddTaskFlowCascade.C:80
 AddTaskFlowCascade.C:81
 AddTaskFlowCascade.C:82
 AddTaskFlowCascade.C:83
 AddTaskFlowCascade.C:84
 AddTaskFlowCascade.C:85
 AddTaskFlowCascade.C:86
 AddTaskFlowCascade.C:87
 AddTaskFlowCascade.C:88
 AddTaskFlowCascade.C:89
 AddTaskFlowCascade.C:90
 AddTaskFlowCascade.C:91
 AddTaskFlowCascade.C:92
 AddTaskFlowCascade.C:93
 AddTaskFlowCascade.C:94
 AddTaskFlowCascade.C:95
 AddTaskFlowCascade.C:96
 AddTaskFlowCascade.C:97
 AddTaskFlowCascade.C:98
 AddTaskFlowCascade.C:99
 AddTaskFlowCascade.C:100
 AddTaskFlowCascade.C:101
 AddTaskFlowCascade.C:102
 AddTaskFlowCascade.C:103
 AddTaskFlowCascade.C:104
 AddTaskFlowCascade.C:105
 AddTaskFlowCascade.C:106
 AddTaskFlowCascade.C:107
 AddTaskFlowCascade.C:108
 AddTaskFlowCascade.C:109
 AddTaskFlowCascade.C:110
 AddTaskFlowCascade.C:111
 AddTaskFlowCascade.C:112
 AddTaskFlowCascade.C:113
 AddTaskFlowCascade.C:114
 AddTaskFlowCascade.C:115
 AddTaskFlowCascade.C:116
 AddTaskFlowCascade.C:117
 AddTaskFlowCascade.C:118
 AddTaskFlowCascade.C:119
 AddTaskFlowCascade.C:120
 AddTaskFlowCascade.C:121
 AddTaskFlowCascade.C:122
 AddTaskFlowCascade.C:123
 AddTaskFlowCascade.C:124
 AddTaskFlowCascade.C:125
 AddTaskFlowCascade.C:126
 AddTaskFlowCascade.C:127
 AddTaskFlowCascade.C:128
 AddTaskFlowCascade.C:129
 AddTaskFlowCascade.C:130
 AddTaskFlowCascade.C:131
 AddTaskFlowCascade.C:132
 AddTaskFlowCascade.C:133
 AddTaskFlowCascade.C:134
 AddTaskFlowCascade.C:135
 AddTaskFlowCascade.C:136
 AddTaskFlowCascade.C:137
 AddTaskFlowCascade.C:138
 AddTaskFlowCascade.C:139
 AddTaskFlowCascade.C:140
 AddTaskFlowCascade.C:141
 AddTaskFlowCascade.C:142
 AddTaskFlowCascade.C:143
 AddTaskFlowCascade.C:144
 AddTaskFlowCascade.C:145
 AddTaskFlowCascade.C:146
 AddTaskFlowCascade.C:147
 AddTaskFlowCascade.C:148
 AddTaskFlowCascade.C:149
 AddTaskFlowCascade.C:150
 AddTaskFlowCascade.C:151
 AddTaskFlowCascade.C:152
 AddTaskFlowCascade.C:153
 AddTaskFlowCascade.C:154
 AddTaskFlowCascade.C:155
 AddTaskFlowCascade.C:156
 AddTaskFlowCascade.C:157
 AddTaskFlowCascade.C:158
 AddTaskFlowCascade.C:159
 AddTaskFlowCascade.C:160
 AddTaskFlowCascade.C:161
 AddTaskFlowCascade.C:162
 AddTaskFlowCascade.C:163
 AddTaskFlowCascade.C:164
 AddTaskFlowCascade.C:165
 AddTaskFlowCascade.C:166
 AddTaskFlowCascade.C:167
 AddTaskFlowCascade.C:168
 AddTaskFlowCascade.C:169
 AddTaskFlowCascade.C:170
 AddTaskFlowCascade.C:171
 AddTaskFlowCascade.C:172
 AddTaskFlowCascade.C:173
 AddTaskFlowCascade.C:174
 AddTaskFlowCascade.C:175
 AddTaskFlowCascade.C:176
 AddTaskFlowCascade.C:177
 AddTaskFlowCascade.C:178
 AddTaskFlowCascade.C:179
 AddTaskFlowCascade.C:180
 AddTaskFlowCascade.C:181
 AddTaskFlowCascade.C:182
 AddTaskFlowCascade.C:183
 AddTaskFlowCascade.C:184
 AddTaskFlowCascade.C:185
 AddTaskFlowCascade.C:186
 AddTaskFlowCascade.C:187
 AddTaskFlowCascade.C:188
 AddTaskFlowCascade.C:189
 AddTaskFlowCascade.C:190
 AddTaskFlowCascade.C:191
 AddTaskFlowCascade.C:192
 AddTaskFlowCascade.C:193
 AddTaskFlowCascade.C:194
 AddTaskFlowCascade.C:195
 AddTaskFlowCascade.C:196
 AddTaskFlowCascade.C:197
 AddTaskFlowCascade.C:198
 AddTaskFlowCascade.C:199
 AddTaskFlowCascade.C:200
 AddTaskFlowCascade.C:201
 AddTaskFlowCascade.C:202
 AddTaskFlowCascade.C:203
 AddTaskFlowCascade.C:204
 AddTaskFlowCascade.C:205
 AddTaskFlowCascade.C:206
 AddTaskFlowCascade.C:207
 AddTaskFlowCascade.C:208
 AddTaskFlowCascade.C:209
 AddTaskFlowCascade.C:210
 AddTaskFlowCascade.C:211
 AddTaskFlowCascade.C:212
 AddTaskFlowCascade.C:213
 AddTaskFlowCascade.C:214
 AddTaskFlowCascade.C:215
 AddTaskFlowCascade.C:216
 AddTaskFlowCascade.C:217
 AddTaskFlowCascade.C:218
 AddTaskFlowCascade.C:219
 AddTaskFlowCascade.C:220
 AddTaskFlowCascade.C:221
 AddTaskFlowCascade.C:222
 AddTaskFlowCascade.C:223