ROOT logo
/**
 * @file   MakeFlowTrain.C
 * @author Alexander Hansen                                      
 * 
 * @brief  
 * 
 * @ingroup pwglf_forward_trains
 * 
 */
#include "TrainSetup.C"

//====================================================================
/**
 * Analysis train to make flow@
 * 
 *
 * @ingroup pwglf_forward_flow
 * @ingroup pwglf_forward_trains
 */
class MakeFlowTrain : public TrainSetup
{
public:
  /** 
   * Constructor.  
   * 
   * @param name     Name of train (free form)
   */
  MakeFlowTrain(const char* name)
  : TrainSetup(name)
  {
    // General options
    fOptions.Add("sys",   "SYSTEM",  "1:pp, 2:PbPb, 3:pPb", "");
    fOptions.Add("mc", "Do MC analysis");
    fOptions.Add("max-mom", "2|3|4|5", "Max flow moment to analyse", "5");
    fOptions.Add("use-cent", "Whether to use the impact parameter "
		 "for centrality");
    fOptions.Add("mc-vtx", "Whether to get the vertex from the MC header");
    fOptions.Add("fwd-dets", "[fmd,vzero]", "Forward detectors", "fmd+vzero");
    fOptions.Add("afterburner", "Whether to afterburn");
    fOptions.Set("type", "AOD");
    fOptions.Show(std::cout);
    // QC specific options
    fOptions.Add("QC", "Add QC tasks (requires AODs with FMD and SPD objects)");
    fOptions.Add("qc-type", "[std,eta-gap,3cor,all]", 
		 "Which types of QC's to do", "all");
    fOptions.Add("eg-value", "EGVALUE", 
		 "Set value in |eta| of the eta gap", "2.0");
    fOptions.Add("tracks", "[tpc,hybrid,only]", 
		 "Whether or only to use tracks for reference flow", 
		 "tpc+hybrid");
    fOptions.Add("sat-vtx", "Whether to use satellite interactions");
    fOptions.Add("outlier-fmd", "NSIGMA", "Outlier cut for FMD", "4.0");
    fOptions.Add("outlier-spd", "NSIGMA", "Outlier cut for SPD", "4.0");
    // EP specific options
    fOptions.Add("EP", "Add EP tasks (requires VZERO AOD objects)");
  }
protected:
  //__________________________________________________________________
  /** 
   * Create the tasks 
   * 
   * @param mgr Manager 
   */
  void CreateTasks(AliAnalysisManager*)
  {
    // --- Output file name ------------------------------------------
    AliAnalysisManager::SetCommonFileName("forward_flow.root");

    // --- Load libraries/pars ---------------------------------------
    fRailway->LoadLibrary("PWGLFforward2");
    
    // --- Set load path ---------------------------------------------
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2",
			     gROOT->GetMacroPath()));
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/ANALYSIS/macros",
                             gROOT->GetMacroPath()));

    // --- Add the tasks ---------------------------------------------
    Bool_t doQC = fOptions.AsBool("QC");
    Bool_t doEP = fOptions.AsBool("EP");
    if (doQC) AddQCTasks();
    if (doEP) AddEPTasks();
    if (!doQC && !doEP) Fatal("CreateTasks", "No flow tasks were added");

  }
  //__________________________________________________________________
  /**
   * Add the QC task(s)
   */
  void AddQCTasks()
  {
    // --- Get the parameters ----------------------------------------
    UShort_t sys      = fOptions.AsInt("sys", 0);
    Int_t    moment   = fOptions.AsInt("max-mom");
    TString  fwdDets  = fOptions.Get("fwd-dets");
    TString  types    = fOptions.Get("qc-type");
    Double_t egValue  = fOptions.AsDouble("eg-value");
    TString  tracks   = fOptions.Get("tracks");
    Bool_t   useCent  = fOptions.AsBool("use-cent");
    Bool_t   useMCVtx = fOptions.AsBool("mc-vtx");
    Bool_t   addFlow  = fOptions.AsBool("afterburner");
    Bool_t   satVtx   = fOptions.AsBool("sat-vtx");
    Double_t fmdCut   = fOptions.AsDouble("outlier-fmd");
    Double_t spdCut   = fOptions.AsDouble("outlier-spd");
    Bool_t   mc       = fOptions.AsBool("mc"); 

    types.ToLower();
    fwdDets.ToUpper();
    Bool_t doFMD      = fwdDets.Contains("FMD");
    Bool_t doVZERO    = fwdDets.Contains("VZERO");
    tracks.ToLower();
    Bool_t onlyTr     = tracks.Contains("only");
    Bool_t tpcTr      = tracks.Contains("tpc");
    Bool_t hybridTr   = tracks.Contains("hybrid");
    Bool_t ispA = (sys == 3 ? kTRUE : kFALSE);

    // Notice the place holders at arg=2,3,4, and 9, These are
    // 
    //   2: Detector to use (FMD/VZERO)
    //   3: Whether to use eta gap (true/false)
    //   4: Do 3-particle correlations (true/false)
    //   9: Use tracks for referernce flow (true/false)
    TString args;
    args = TString::Format("%d,\"%%s\",%%d,%%d,%d,%f,%f,%f,%%d,%d,%d,%d,%d,%d",
			   moment,
			   mc, 
			   fmdCut, 
			   spdCut,
			   egValue,
			   useCent,
			   ispA,
			   useMCVtx,
			   satVtx, 
			   addFlow);
    
    // --- Add the task ----------------------------------------------
    const char* mac = "AddTaskForwardFlowQC.C";
    if (doFMD) {
      if (types.Contains("std") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "FMD", false, false, 0));
      	if (tpcTr)
	  CoupleCar(mac, Form(args.Data(), "FMD", false, false, 1));
      	if (hybridTr)
	  CoupleCar(mac, Form(args.Data(), "FMD", false, false, 2));
      }
      if (types.Contains("eta-gap") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "FMD", true, false, 0));
      	if (tpcTr)
      	  CoupleCar(mac, Form(args.Data(), "FMD", true, false, 1));
      	if (hybridTr)
      	  CoupleCar(mac, Form(args.Data(), "FMD", true, false, 2));
      }
      if (types.Contains("3cor") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "FMD", false, true, 0));
      }
    }
    if (doVZERO) {
      if (types.Contains("std") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "VZERO", false, false, 0));
      	if (tpcTr)
	  CoupleCar(mac, Form(args.Data(), "VZERO", false, false, 1));
      	if (hybridTr)
	  CoupleCar(mac, Form(args.Data(), "VZERO", false, false, 2));
      }
      if (types.Contains("eta-gap") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "VZERO", true, false, 0));
      	if (tpcTr)
      	  CoupleCar(mac, Form(args.Data(), "VZERO", true, false, 1));
      	if (hybridTr)
      	  CoupleCar(mac, Form(args.Data(), "VZERO", true, false, 2));
      }
      if (types.Contains("3cor") || types.Contains("all")) {
        if (!onlyTr)
	  CoupleCar(mac, Form(args.Data(), "VZERO", false, true, 0));
      }
    }
  }
  //__________________________________________________________________
  /**
   * Add the EP task(s)
   */
  void AddEPTasks()
  {
    // --- Get the parameters ----------------------------------------
    Int_t    moment   = fOptions.AsInt("max-mom");
    TString  etaGap   = fOptions.Get("eta-gap");
    TString  addFlow  = fOptions.Get("afterburner");
    Bool_t   mc       = fOptions.AsBool("mc"); 
    TString  fwdDets  = fOptions.Get("fwd-dets");

    // --- Add the task ----------------------------------------------
    CoupleCar("AddTaskEventplane.C","");
    CoupleCar("AddTaskForwardFlowEP.C", 
	      Form("%d, %d, \"%s\"", mc, moment, fwdDets.Data()));
  }
  //__________________________________________________________________
  /** 
   * Do not the centrality selection
   */
  void CreateCentralitySelection(Bool_t) {}
  //__________________________________________________________________
  /** 
   * Crete output handler - we don't want one here. 
   * 
   * @return 0
   */
  AliVEventHandler* CreateOutputHandler(UShort_t) { return 0; }
  //__________________________________________________________________
  /** 
   * Create MC input handler.  Since this train does not use the MC
   * information from @c galice.root, @c Kinematics.root, and @c
   * TrackRefs.root directly, we define this member function to return
   * null even when doing MC analysis.  This train _only_ looks at the
   * AOD object of the _processed_ MC data.
   * 
   * @return Always 0
   */
  AliVEventHandler* CreateMCHandler(UShort_t, bool)
  { 
    return 0;
  }
  //__________________________________________________________________
  /** 
   * Get the class name of the train setup 
   * 
   * @return Class name 
   */
  const char* ClassName() const { return "MakeFlowTrain"; }
  //__________________________________________________________________
};
//
// EOF
//
 MakeFlowTrain.C:1
 MakeFlowTrain.C:2
 MakeFlowTrain.C:3
 MakeFlowTrain.C:4
 MakeFlowTrain.C:5
 MakeFlowTrain.C:6
 MakeFlowTrain.C:7
 MakeFlowTrain.C:8
 MakeFlowTrain.C:9
 MakeFlowTrain.C:10
 MakeFlowTrain.C:11
 MakeFlowTrain.C:12
 MakeFlowTrain.C:13
 MakeFlowTrain.C:14
 MakeFlowTrain.C:15
 MakeFlowTrain.C:16
 MakeFlowTrain.C:17
 MakeFlowTrain.C:18
 MakeFlowTrain.C:19
 MakeFlowTrain.C:20
 MakeFlowTrain.C:21
 MakeFlowTrain.C:22
 MakeFlowTrain.C:23
 MakeFlowTrain.C:24
 MakeFlowTrain.C:25
 MakeFlowTrain.C:26
 MakeFlowTrain.C:27
 MakeFlowTrain.C:28
 MakeFlowTrain.C:29
 MakeFlowTrain.C:30
 MakeFlowTrain.C:31
 MakeFlowTrain.C:32
 MakeFlowTrain.C:33
 MakeFlowTrain.C:34
 MakeFlowTrain.C:35
 MakeFlowTrain.C:36
 MakeFlowTrain.C:37
 MakeFlowTrain.C:38
 MakeFlowTrain.C:39
 MakeFlowTrain.C:40
 MakeFlowTrain.C:41
 MakeFlowTrain.C:42
 MakeFlowTrain.C:43
 MakeFlowTrain.C:44
 MakeFlowTrain.C:45
 MakeFlowTrain.C:46
 MakeFlowTrain.C:47
 MakeFlowTrain.C:48
 MakeFlowTrain.C:49
 MakeFlowTrain.C:50
 MakeFlowTrain.C:51
 MakeFlowTrain.C:52
 MakeFlowTrain.C:53
 MakeFlowTrain.C:54
 MakeFlowTrain.C:55
 MakeFlowTrain.C:56
 MakeFlowTrain.C:57
 MakeFlowTrain.C:58
 MakeFlowTrain.C:59
 MakeFlowTrain.C:60
 MakeFlowTrain.C:61
 MakeFlowTrain.C:62
 MakeFlowTrain.C:63
 MakeFlowTrain.C:64
 MakeFlowTrain.C:65
 MakeFlowTrain.C:66
 MakeFlowTrain.C:67
 MakeFlowTrain.C:68
 MakeFlowTrain.C:69
 MakeFlowTrain.C:70
 MakeFlowTrain.C:71
 MakeFlowTrain.C:72
 MakeFlowTrain.C:73
 MakeFlowTrain.C:74
 MakeFlowTrain.C:75
 MakeFlowTrain.C:76
 MakeFlowTrain.C:77
 MakeFlowTrain.C:78
 MakeFlowTrain.C:79
 MakeFlowTrain.C:80
 MakeFlowTrain.C:81
 MakeFlowTrain.C:82
 MakeFlowTrain.C:83
 MakeFlowTrain.C:84
 MakeFlowTrain.C:85
 MakeFlowTrain.C:86
 MakeFlowTrain.C:87
 MakeFlowTrain.C:88
 MakeFlowTrain.C:89
 MakeFlowTrain.C:90
 MakeFlowTrain.C:91
 MakeFlowTrain.C:92
 MakeFlowTrain.C:93
 MakeFlowTrain.C:94
 MakeFlowTrain.C:95
 MakeFlowTrain.C:96
 MakeFlowTrain.C:97
 MakeFlowTrain.C:98
 MakeFlowTrain.C:99
 MakeFlowTrain.C:100
 MakeFlowTrain.C:101
 MakeFlowTrain.C:102
 MakeFlowTrain.C:103
 MakeFlowTrain.C:104
 MakeFlowTrain.C:105
 MakeFlowTrain.C:106
 MakeFlowTrain.C:107
 MakeFlowTrain.C:108
 MakeFlowTrain.C:109
 MakeFlowTrain.C:110
 MakeFlowTrain.C:111
 MakeFlowTrain.C:112
 MakeFlowTrain.C:113
 MakeFlowTrain.C:114
 MakeFlowTrain.C:115
 MakeFlowTrain.C:116
 MakeFlowTrain.C:117
 MakeFlowTrain.C:118
 MakeFlowTrain.C:119
 MakeFlowTrain.C:120
 MakeFlowTrain.C:121
 MakeFlowTrain.C:122
 MakeFlowTrain.C:123
 MakeFlowTrain.C:124
 MakeFlowTrain.C:125
 MakeFlowTrain.C:126
 MakeFlowTrain.C:127
 MakeFlowTrain.C:128
 MakeFlowTrain.C:129
 MakeFlowTrain.C:130
 MakeFlowTrain.C:131
 MakeFlowTrain.C:132
 MakeFlowTrain.C:133
 MakeFlowTrain.C:134
 MakeFlowTrain.C:135
 MakeFlowTrain.C:136
 MakeFlowTrain.C:137
 MakeFlowTrain.C:138
 MakeFlowTrain.C:139
 MakeFlowTrain.C:140
 MakeFlowTrain.C:141
 MakeFlowTrain.C:142
 MakeFlowTrain.C:143
 MakeFlowTrain.C:144
 MakeFlowTrain.C:145
 MakeFlowTrain.C:146
 MakeFlowTrain.C:147
 MakeFlowTrain.C:148
 MakeFlowTrain.C:149
 MakeFlowTrain.C:150
 MakeFlowTrain.C:151
 MakeFlowTrain.C:152
 MakeFlowTrain.C:153
 MakeFlowTrain.C:154
 MakeFlowTrain.C:155
 MakeFlowTrain.C:156
 MakeFlowTrain.C:157
 MakeFlowTrain.C:158
 MakeFlowTrain.C:159
 MakeFlowTrain.C:160
 MakeFlowTrain.C:161
 MakeFlowTrain.C:162
 MakeFlowTrain.C:163
 MakeFlowTrain.C:164
 MakeFlowTrain.C:165
 MakeFlowTrain.C:166
 MakeFlowTrain.C:167
 MakeFlowTrain.C:168
 MakeFlowTrain.C:169
 MakeFlowTrain.C:170
 MakeFlowTrain.C:171
 MakeFlowTrain.C:172
 MakeFlowTrain.C:173
 MakeFlowTrain.C:174
 MakeFlowTrain.C:175
 MakeFlowTrain.C:176
 MakeFlowTrain.C:177
 MakeFlowTrain.C:178
 MakeFlowTrain.C:179
 MakeFlowTrain.C:180
 MakeFlowTrain.C:181
 MakeFlowTrain.C:182
 MakeFlowTrain.C:183
 MakeFlowTrain.C:184
 MakeFlowTrain.C:185
 MakeFlowTrain.C:186
 MakeFlowTrain.C:187
 MakeFlowTrain.C:188
 MakeFlowTrain.C:189
 MakeFlowTrain.C:190
 MakeFlowTrain.C:191
 MakeFlowTrain.C:192
 MakeFlowTrain.C:193
 MakeFlowTrain.C:194
 MakeFlowTrain.C:195
 MakeFlowTrain.C:196
 MakeFlowTrain.C:197
 MakeFlowTrain.C:198
 MakeFlowTrain.C:199
 MakeFlowTrain.C:200
 MakeFlowTrain.C:201
 MakeFlowTrain.C:202
 MakeFlowTrain.C:203
 MakeFlowTrain.C:204
 MakeFlowTrain.C:205
 MakeFlowTrain.C:206
 MakeFlowTrain.C:207
 MakeFlowTrain.C:208
 MakeFlowTrain.C:209
 MakeFlowTrain.C:210
 MakeFlowTrain.C:211
 MakeFlowTrain.C:212
 MakeFlowTrain.C:213
 MakeFlowTrain.C:214
 MakeFlowTrain.C:215
 MakeFlowTrain.C:216
 MakeFlowTrain.C:217
 MakeFlowTrain.C:218
 MakeFlowTrain.C:219
 MakeFlowTrain.C:220
 MakeFlowTrain.C:221
 MakeFlowTrain.C:222
 MakeFlowTrain.C:223
 MakeFlowTrain.C:224
 MakeFlowTrain.C:225
 MakeFlowTrain.C:226
 MakeFlowTrain.C:227
 MakeFlowTrain.C:228
 MakeFlowTrain.C:229
 MakeFlowTrain.C:230
 MakeFlowTrain.C:231
 MakeFlowTrain.C:232
 MakeFlowTrain.C:233
 MakeFlowTrain.C:234
 MakeFlowTrain.C:235
 MakeFlowTrain.C:236
 MakeFlowTrain.C:237
 MakeFlowTrain.C:238
 MakeFlowTrain.C:239