ROOT logo
/**
 * @file   AddTaskForwardFlowQC.C
 * @author Alexander Hansen alexander.hansen@cern.ch 
 * 
 * @brief  
 * 
 * 
 * @ingroup pwglf_forward_scripts_tasks
 */
/** 
 * @defgroup pwglf_forward_flow Flow 
 *
 * Code to deal with flow 
 *
 * @ingroup pwglf_forward_topical
 */
/** 
 * Add Flow task to train 
 * 
 * @param maxMom        Max moment to do 
 * @param useEtaGap     Whehter to use @f$\eta@f$ gaps
 * @param mc            Monte-carlo input
 * @param outlierCutFMD Cut to remove events with outliers 
 * @param outlierCutSPD Cut to remove events with outliers 
 * @param etaGap        Size of @f$\eta@f$ gap
 * @param useTracksForRef  Use TPC tracks for reference flow
 * @param useCent       Whether to use centrality or impact parameter for MC 
 * @param useMCVtx      Whether to use vertex info from MC header
 * @param satVtx        Use satellite interactions 
 * @param addFlow       Afterburn what (MC only)
 * @param addFType      Afterburner parameterization
 * @param addFOrder     Afterburder order 
 *
 * @ingroup pwglf_forward_flow
 */
void AddTaskForwardFlowQC(Int_t    maxMom          = 5,
                          TString  fwdDet          = "FMD",
                          Bool_t   useEtaGap       = kFALSE,
                          Bool_t   use3cor         = kFALSE,
                          Bool_t   mc              = kFALSE,
			  Double_t outlierCutFMD   = 4.0, 
			  Double_t outlierCutSPD   = 4.0,
			  Double_t etaGap          = 2.0,
			  UInt_t   useTracksForRef = 0,
			  Bool_t   useCent         = kFALSE,
			  Bool_t   ispA            = kFALSE,
			  Bool_t   useMCVtx        = kFALSE,
			  Bool_t   satVtx          = kFALSE,
			  Bool_t   addFlow         = kFALSE)
{
  // --- Get analysis manager ----------------------------------------
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) 
    Fatal("","No analysis manager to connect to.");

  // --- Check that we have an AOD input handler ---------------------
  UShort_t aodInput = 0;
  if (!(aodInput = AliForwardUtil::CheckForAOD())) 
    Fatal("","Cannot proceed without and AOD handler");
  if (aodInput == 2 && 
      (!AliForwardUtil::CheckForTask("AliForwardMultiplicityBase") ||
       !AliForwardUtil::CheckForTask("AliCentralMultiplicityTask")))
    Fatal("","The relevant tasks weren't added to the train");

  // --- For the selected flow tasks the input and output is set -----
  fwdDet.ToUpper();
  
  // --- Set flow flags --------------------------------------------
  if (useEtaGap && use3cor) 
    Fatal("", "You're doing it wrong! Cannot do both eta-gap and 3-sub");
  UShort_t flags = AliForwardFlowTaskQC::kStdQC|AliForwardFlowTaskQC::kSymEta;
  if (useEtaGap)              flags = AliForwardFlowTaskQC::kEtaGap;
  if (use3cor)                flags = AliForwardFlowTaskQC::k3Cor;
  if (satVtx)                 flags |= AliForwardFlowTaskQC::kSatVtx;
  if (fwdDet.Contains("FMD")) flags |= AliForwardFlowTaskQC::kNUAcorr;
  if      (fwdDet.Contains("FMD"))   flags |= AliForwardFlowTaskQC::kFMD;
  else if (fwdDet.Contains("VZERO")) flags |= AliForwardFlowTaskQC::kVZERO;
  if (useTracksForRef == 1) flags |= AliForwardFlowTaskQC::kTPC;
  if (useTracksForRef == 2) flags |= AliForwardFlowTaskQC::kHybrid;

  const char* name = Form("ForwardFlowQC%s%s", fwdDet.Data(), AliForwardFlowTaskQC::GetQCType(flags, false));
  AliForwardFlowTaskQC* task = 0;
  // --- Set up adding flow to MC input ----------------------------
  if (mc) {
    AliForwardMCFlowTaskQC* mcTask = new AliForwardMCFlowTaskQC(name);
    mcTask->SetUseImpactParameter(!useCent);
    mcTask->SetUseMCHeaderVertex(useMCVtx);
    if (addFlow) {
      mcTask->SetUseFlowWeights(true);
    }
    task = mcTask;
  }
  // --- Or use normal task ----------------------------------------
  else 
    task = new AliForwardFlowTaskQC(name);
  
  mgr->AddTask(task);
//  mgr->SetSkipTerminate(true);
//  task->SelectCollisionCandidates(AliVEvent::kCentral);
  task->SetFlowFlags(flags);
  
  // --- Set eta gap value -----------------------------------------
  if (useEtaGap) {
    if (useTracksForRef) task->SetEtaGapValue(0.4);
    else              task->SetEtaGapValue(etaGap);
  }
  else if (useTracksForRef && fwdDet.Contains("FMD")) task->SetEtaGapValue(0.0);

  // --- Check which harmonics to calculate --------------------------
  task->SetMaxFlowMoment(maxMom);
  
  // --- Set non-default axis for vertices ---------------------------
  TAxis* a = 0;
  if (satVtx) {
    a = new TAxis(6, 93.75, 318.75);
  }
  else 
    a = new TAxis(20, -10, 10);
//    a = new TAxis(10, -5, 5);
  task->SetVertexAxis(a);

  // --- Set non-default axis for centrality -------------------------
  TAxis* centAxis = 0;
  if (ispA) {
    Double_t cent[] = {0, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100});
    Int_t nBins = sizeof(cent)/sizeof(Double_t) -1;
    centAxis = new TAxis(nBins, cent);
  } else {
    Double_t cent[] = {0, 2.5, 5, 7.5, 10, 12.5, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 95, 100 };
    Int_t nBins = sizeof(cent)/sizeof(Double_t) -1;
    centAxis = new TAxis(nBins, cent);
  }
  task->SetCentralityAxis(centAxis);

  // --- Set sigma cuts for outliers ---------------------------------
  task->SetDetectorCuts(outlierCutFMD, outlierCutSPD);

  // --- Setup track cuts --------------------------------------------
  if (useTracksForRef > 0) {
    AliAnalysisFilter* trackCuts = new AliAnalysisFilter("trackFilter");
    if (!ispA) {
      if (useTracksForRef == 1) { // tpc tracks
	AliESDtrackCuts* tpcTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
	tpcTrackCuts->SetPtRange(0.2, 5.0);
	tpcTrackCuts->SetEtaRange(-0.8, 0.8);
	tpcTrackCuts->SetMinNClustersTPC(70);
	trackCuts->AddCuts(tpcTrackCuts);
	task->SetTrackCuts(trackCuts);
      } else if (useTracksForRef == 2) { // hybrid tracks
	// Basic cuts for global tracks - working for 10h!
	AliESDtrackCuts* baseCuts = new AliESDtrackCuts("base");
	TFormula *f1NClustersTPCLinearPtDep = new TFormula("f1NClustersTPCLinearPtDep","70.+30./20.*x");
	baseCuts->SetMinNClustersTPCPtDep(f1NClustersTPCLinearPtDep,20.);
	baseCuts->SetMinNClustersTPC(70);
	baseCuts->SetMaxChi2PerClusterTPC(4);
	baseCuts->SetRequireTPCStandAlone(kTRUE); //cut on NClustersTPC and chi2TPC Iter1
	baseCuts->SetAcceptKinkDaughters(kFALSE);
	baseCuts->SetRequireTPCRefit(kTRUE);
	baseCuts->SetMaxFractionSharedTPCClusters(0.4);
	// ITS
	baseCuts->SetRequireITSRefit(kTRUE);
	//accept secondaries
	baseCuts->SetMaxDCAToVertexXY(2.4);
	baseCuts->SetMaxDCAToVertexZ(3.2);
	baseCuts->SetDCAToVertex2D(kTRUE);
	//reject fakes
	baseCuts->SetMaxChi2PerClusterITS(36);
	baseCuts->SetMaxChi2TPCConstrainedGlobal(36);
	baseCuts->SetRequireSigmaToVertex(kFALSE);
  //      baseCuts->SetEtaRange(-0.9,0.9);
  //      baseCuts->SetPtRange(0.15, 1E+15.);
	baseCuts->SetEtaRange(-0.8, 0.8);
	baseCuts->SetPtRange(0.2, 5.);
    
	// Good global tracks
	AliESDtrackCuts* globalCuts = baseCuts->Clone("global");
	globalCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
	
	// tracks with vertex constraint
	AliESDtrackCuts* constrainedCuts = baseCuts->Clone("vertexConstrained");
	constrainedCuts->SetRequireITSRefit(kFALSE);

	// Add
	trackCuts->AddCuts(globalCuts);
	trackCuts->AddCuts(constrainedCuts);
	task->SetTrackCuts(trackCuts);
      } // end of hybrid
    } // end of Pb-Pb
    if (ispA) {
      if (useTracksForRef == 1) { // tpc tracks
	AliESDtrackCuts* tpcTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
	tpcTrackCuts->SetPtRange(0.2, 5.0);
	tpcTrackCuts->SetEtaRange(-0.8, 0.8);
	tpcTrackCuts->SetMinNClustersTPC(70);
	trackCuts->AddCuts(tpcTrackCuts);
	task->SetTrackCuts(trackCuts);
      } else if (useTracksForRef == 2) { // hybrid tracks
        AliESDtrackCuts* baseCuts = AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(kFALSE);
	baseCuts->SetMaxDCAToVertexXY(2.4);
	baseCuts->SetMaxDCAToVertexZ(3.2);
	baseCuts->SetDCAToVertex2D(kTRUE);
	baseCuts->SetMaxChi2TPCConstrainedGlobal(36);
	baseCuts->SetMaxFractionSharedTPCClusters(0.4);
	// extra
	baseCuts->SetEtaRange(-0.8, 0.8);
	baseCuts->SetPtRange(0.2, 5.);
        
        // Global good tracks 
	AliESDtrackCuts* globalCuts = baseCuts->Clone("global");

	// tracks with vertex constraint
	AliESDtrackCuts* constrainedCuts = baseCuts->Clone("vertexConstrained");
	constrainedCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kOff);
	constrainedCuts->SetRequireITSRefit(kTRUE);

        // Add
	trackCuts->AddCuts(globalCuts);
	trackCuts->AddCuts(constrainedCuts);
	task->SetTrackCuts(trackCuts);
      } // end of hybrid
    } // end of pA
  } // end of tracks

  // --- Create containers for output --------------------------------
  const char* sumName = Form("FlowQCSums%s%s", fwdDet.Data(), AliForwardFlowTaskQC::GetQCType(flags, false));
  const char* resName = Form("FlowQCResults%s%s", fwdDet.Data(), AliForwardFlowTaskQC::GetQCType(flags, false));
  AliAnalysisDataContainer* sums = 
    mgr->CreateContainer(sumName, TList::Class(), 
			 AliAnalysisManager::kOutputContainer, 
			 AliAnalysisManager::GetCommonFileName());
  AliAnalysisDataContainer* output = 
    mgr->CreateContainer(resName, TList::Class(), 
			 AliAnalysisManager::kParamContainer, 
			 AliAnalysisManager::GetCommonFileName());
  mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(task, 1, sums);
  mgr->ConnectOutput(task, 2, output);
}
/*
 * EOF
 */
 AddTaskForwardFlowQC.C:1
 AddTaskForwardFlowQC.C:2
 AddTaskForwardFlowQC.C:3
 AddTaskForwardFlowQC.C:4
 AddTaskForwardFlowQC.C:5
 AddTaskForwardFlowQC.C:6
 AddTaskForwardFlowQC.C:7
 AddTaskForwardFlowQC.C:8
 AddTaskForwardFlowQC.C:9
 AddTaskForwardFlowQC.C:10
 AddTaskForwardFlowQC.C:11
 AddTaskForwardFlowQC.C:12
 AddTaskForwardFlowQC.C:13
 AddTaskForwardFlowQC.C:14
 AddTaskForwardFlowQC.C:15
 AddTaskForwardFlowQC.C:16
 AddTaskForwardFlowQC.C:17
 AddTaskForwardFlowQC.C:18
 AddTaskForwardFlowQC.C:19
 AddTaskForwardFlowQC.C:20
 AddTaskForwardFlowQC.C:21
 AddTaskForwardFlowQC.C:22
 AddTaskForwardFlowQC.C:23
 AddTaskForwardFlowQC.C:24
 AddTaskForwardFlowQC.C:25
 AddTaskForwardFlowQC.C:26
 AddTaskForwardFlowQC.C:27
 AddTaskForwardFlowQC.C:28
 AddTaskForwardFlowQC.C:29
 AddTaskForwardFlowQC.C:30
 AddTaskForwardFlowQC.C:31
 AddTaskForwardFlowQC.C:32
 AddTaskForwardFlowQC.C:33
 AddTaskForwardFlowQC.C:34
 AddTaskForwardFlowQC.C:35
 AddTaskForwardFlowQC.C:36
 AddTaskForwardFlowQC.C:37
 AddTaskForwardFlowQC.C:38
 AddTaskForwardFlowQC.C:39
 AddTaskForwardFlowQC.C:40
 AddTaskForwardFlowQC.C:41
 AddTaskForwardFlowQC.C:42
 AddTaskForwardFlowQC.C:43
 AddTaskForwardFlowQC.C:44
 AddTaskForwardFlowQC.C:45
 AddTaskForwardFlowQC.C:46
 AddTaskForwardFlowQC.C:47
 AddTaskForwardFlowQC.C:48
 AddTaskForwardFlowQC.C:49
 AddTaskForwardFlowQC.C:50
 AddTaskForwardFlowQC.C:51
 AddTaskForwardFlowQC.C:52
 AddTaskForwardFlowQC.C:53
 AddTaskForwardFlowQC.C:54
 AddTaskForwardFlowQC.C:55
 AddTaskForwardFlowQC.C:56
 AddTaskForwardFlowQC.C:57
 AddTaskForwardFlowQC.C:58
 AddTaskForwardFlowQC.C:59
 AddTaskForwardFlowQC.C:60
 AddTaskForwardFlowQC.C:61
 AddTaskForwardFlowQC.C:62
 AddTaskForwardFlowQC.C:63
 AddTaskForwardFlowQC.C:64
 AddTaskForwardFlowQC.C:65
 AddTaskForwardFlowQC.C:66
 AddTaskForwardFlowQC.C:67
 AddTaskForwardFlowQC.C:68
 AddTaskForwardFlowQC.C:69
 AddTaskForwardFlowQC.C:70
 AddTaskForwardFlowQC.C:71
 AddTaskForwardFlowQC.C:72
 AddTaskForwardFlowQC.C:73
 AddTaskForwardFlowQC.C:74
 AddTaskForwardFlowQC.C:75
 AddTaskForwardFlowQC.C:76
 AddTaskForwardFlowQC.C:77
 AddTaskForwardFlowQC.C:78
 AddTaskForwardFlowQC.C:79
 AddTaskForwardFlowQC.C:80
 AddTaskForwardFlowQC.C:81
 AddTaskForwardFlowQC.C:82
 AddTaskForwardFlowQC.C:83
 AddTaskForwardFlowQC.C:84
 AddTaskForwardFlowQC.C:85
 AddTaskForwardFlowQC.C:86
 AddTaskForwardFlowQC.C:87
 AddTaskForwardFlowQC.C:88
 AddTaskForwardFlowQC.C:89
 AddTaskForwardFlowQC.C:90
 AddTaskForwardFlowQC.C:91
 AddTaskForwardFlowQC.C:92
 AddTaskForwardFlowQC.C:93
 AddTaskForwardFlowQC.C:94
 AddTaskForwardFlowQC.C:95
 AddTaskForwardFlowQC.C:96
 AddTaskForwardFlowQC.C:97
 AddTaskForwardFlowQC.C:98
 AddTaskForwardFlowQC.C:99
 AddTaskForwardFlowQC.C:100
 AddTaskForwardFlowQC.C:101
 AddTaskForwardFlowQC.C:102
 AddTaskForwardFlowQC.C:103
 AddTaskForwardFlowQC.C:104
 AddTaskForwardFlowQC.C:105
 AddTaskForwardFlowQC.C:106
 AddTaskForwardFlowQC.C:107
 AddTaskForwardFlowQC.C:108
 AddTaskForwardFlowQC.C:109
 AddTaskForwardFlowQC.C:110
 AddTaskForwardFlowQC.C:111
 AddTaskForwardFlowQC.C:112
 AddTaskForwardFlowQC.C:113
 AddTaskForwardFlowQC.C:114
 AddTaskForwardFlowQC.C:115
 AddTaskForwardFlowQC.C:116
 AddTaskForwardFlowQC.C:117
 AddTaskForwardFlowQC.C:118
 AddTaskForwardFlowQC.C:119
 AddTaskForwardFlowQC.C:120
 AddTaskForwardFlowQC.C:121
 AddTaskForwardFlowQC.C:122
 AddTaskForwardFlowQC.C:123
 AddTaskForwardFlowQC.C:124
 AddTaskForwardFlowQC.C:125
 AddTaskForwardFlowQC.C:126
 AddTaskForwardFlowQC.C:127
 AddTaskForwardFlowQC.C:128
 AddTaskForwardFlowQC.C:129
 AddTaskForwardFlowQC.C:130
 AddTaskForwardFlowQC.C:131
 AddTaskForwardFlowQC.C:132
 AddTaskForwardFlowQC.C:133
 AddTaskForwardFlowQC.C:134
 AddTaskForwardFlowQC.C:135
 AddTaskForwardFlowQC.C:136
 AddTaskForwardFlowQC.C:137
 AddTaskForwardFlowQC.C:138
 AddTaskForwardFlowQC.C:139
 AddTaskForwardFlowQC.C:140
 AddTaskForwardFlowQC.C:141
 AddTaskForwardFlowQC.C:142
 AddTaskForwardFlowQC.C:143
 AddTaskForwardFlowQC.C:144
 AddTaskForwardFlowQC.C:145
 AddTaskForwardFlowQC.C:146
 AddTaskForwardFlowQC.C:147
 AddTaskForwardFlowQC.C:148
 AddTaskForwardFlowQC.C:149
 AddTaskForwardFlowQC.C:150
 AddTaskForwardFlowQC.C:151
 AddTaskForwardFlowQC.C:152
 AddTaskForwardFlowQC.C:153
 AddTaskForwardFlowQC.C:154
 AddTaskForwardFlowQC.C:155
 AddTaskForwardFlowQC.C:156
 AddTaskForwardFlowQC.C:157
 AddTaskForwardFlowQC.C:158
 AddTaskForwardFlowQC.C:159
 AddTaskForwardFlowQC.C:160
 AddTaskForwardFlowQC.C:161
 AddTaskForwardFlowQC.C:162
 AddTaskForwardFlowQC.C:163
 AddTaskForwardFlowQC.C:164
 AddTaskForwardFlowQC.C:165
 AddTaskForwardFlowQC.C:166
 AddTaskForwardFlowQC.C:167
 AddTaskForwardFlowQC.C:168
 AddTaskForwardFlowQC.C:169
 AddTaskForwardFlowQC.C:170
 AddTaskForwardFlowQC.C:171
 AddTaskForwardFlowQC.C:172
 AddTaskForwardFlowQC.C:173
 AddTaskForwardFlowQC.C:174
 AddTaskForwardFlowQC.C:175
 AddTaskForwardFlowQC.C:176
 AddTaskForwardFlowQC.C:177
 AddTaskForwardFlowQC.C:178
 AddTaskForwardFlowQC.C:179
 AddTaskForwardFlowQC.C:180
 AddTaskForwardFlowQC.C:181
 AddTaskForwardFlowQC.C:182
 AddTaskForwardFlowQC.C:183
 AddTaskForwardFlowQC.C:184
 AddTaskForwardFlowQC.C:185
 AddTaskForwardFlowQC.C:186
 AddTaskForwardFlowQC.C:187
 AddTaskForwardFlowQC.C:188
 AddTaskForwardFlowQC.C:189
 AddTaskForwardFlowQC.C:190
 AddTaskForwardFlowQC.C:191
 AddTaskForwardFlowQC.C:192
 AddTaskForwardFlowQC.C:193
 AddTaskForwardFlowQC.C:194
 AddTaskForwardFlowQC.C:195
 AddTaskForwardFlowQC.C:196
 AddTaskForwardFlowQC.C:197
 AddTaskForwardFlowQC.C:198
 AddTaskForwardFlowQC.C:199
 AddTaskForwardFlowQC.C:200
 AddTaskForwardFlowQC.C:201
 AddTaskForwardFlowQC.C:202
 AddTaskForwardFlowQC.C:203
 AddTaskForwardFlowQC.C:204
 AddTaskForwardFlowQC.C:205
 AddTaskForwardFlowQC.C:206
 AddTaskForwardFlowQC.C:207
 AddTaskForwardFlowQC.C:208
 AddTaskForwardFlowQC.C:209
 AddTaskForwardFlowQC.C:210
 AddTaskForwardFlowQC.C:211
 AddTaskForwardFlowQC.C:212
 AddTaskForwardFlowQC.C:213
 AddTaskForwardFlowQC.C:214
 AddTaskForwardFlowQC.C:215
 AddTaskForwardFlowQC.C:216
 AddTaskForwardFlowQC.C:217
 AddTaskForwardFlowQC.C:218
 AddTaskForwardFlowQC.C:219
 AddTaskForwardFlowQC.C:220
 AddTaskForwardFlowQC.C:221
 AddTaskForwardFlowQC.C:222
 AddTaskForwardFlowQC.C:223
 AddTaskForwardFlowQC.C:224
 AddTaskForwardFlowQC.C:225
 AddTaskForwardFlowQC.C:226
 AddTaskForwardFlowQC.C:227
 AddTaskForwardFlowQC.C:228
 AddTaskForwardFlowQC.C:229
 AddTaskForwardFlowQC.C:230
 AddTaskForwardFlowQC.C:231
 AddTaskForwardFlowQC.C:232
 AddTaskForwardFlowQC.C:233
 AddTaskForwardFlowQC.C:234
 AddTaskForwardFlowQC.C:235
 AddTaskForwardFlowQC.C:236
 AddTaskForwardFlowQC.C:237
 AddTaskForwardFlowQC.C:238
 AddTaskForwardFlowQC.C:239
 AddTaskForwardFlowQC.C:240
 AddTaskForwardFlowQC.C:241
 AddTaskForwardFlowQC.C:242