ROOT logo
/**
 * @file   AODTrain.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Wed Feb  6 23:10:29 2013
 * 
 * @brief  Setup of train like the `official' AODtrain.C script
 * 
 * 
 * @ingroup pwglf_forward_trains_examples
 */
#ifndef __CINT__
# include <AliAnalysisManager.h>
#else 
class AliAnalysisManager;
#endif
#include "TrainSetup.C"

/**
 * Setup of train like the `official' AODtrain.C script
 * 
 * @ingroup pwglf_forward_trains_examples
 */
class AODTrain : public TrainSetup
{
public:
  //------------------------------------------------------------------
  /** 
   * Constructor 
   * 
   * @param name Name of job
   */
  AODTrain(const char* name="myTest") : TrainSetup(name) 
  {
    fOptions.Set("type", "ESD");
    // over all options 
    fOptions.Add("collision", "TYPE", "Collision system", 0);
    fOptions.Add("year", "YEAR", "Year", 2011);
    fOptions.Add("cdb", "Connect to CDB", true);
    fOptions.Add("physics-selection", "Use PhysicsSelection", true);
    fOptions.Add("tender", "Use of Tenders", false);
    fOptions.Add("centrality", "Use centrality", false);
    fOptions.Add("v0-tender", "Use of V0 tender", false);
    fOptions.Add("track-refs", "Also read track references");
    fOptions.Add("kinematics-filter", "Use kinematics fitler");
    fOptions.Add("sys-info", "Use sys info");
    fOptions.Add("run", "RUNNUMBER", "Set initial run number", 0);
    
    // Task options 
    fOptions.Add("esd-filter", "Use ESD fitler", true);
    fOptions.Add("muon-copy", "Make additional MUON specific AOD", true);
    fOptions.Add("jetan", "Use Jet analysis", true);
    fOptions.Add("jetan-delta", "Make Jet analysis delta AOD", true);
    fOptions.Add("vertexing", "Use PWGHF vertexing", true);
    fOptions.Add("jpsi-filter", "Use PWGDQ J/Psi filter", false);
    fOptions.Add("d0-decay", "Use PWGHF D0->h+h", true);
    fOptions.Add("high-pt", "Use high pt", true);
    fOptions.Add("forward-nch", "Forward charged particle", true);
    // Other 
    fOptions.Add("pid-response", "Use PID response", true);
    fOptions.Add("pid-qa", "Do PID QA", true);
  }
  //------------------------------------------------------------------
  /** 
   * Create our tasks 
   * 
   * @param mgr Manager 
   */
  void CreateTasks(AliAnalysisManager* mgr)
  {

    fRailway->LoadLibrary("libCORRFW");

    Bool_t cdb              = fOptions.Has("cdb");
    Bool_t tender           = fOptions.Has("tender");
    Bool_t physicsSelection = fOptions.Has("physics-selection");

    if (cdb || tender) {
      fRailway->LoadLibrary("libCDB");
      fRailway->LoadLibrary("libProof");
      fRailway->LoadLibrary("libRAWDatabase");
      fRailway->LoadLibrary("libSTEER");
      fRailway->LoadLibrary("libSTAT");
      fRailway->LoadLibrary("libTRDbase");
      fRailway->LoadLibrary("libVZERObase");
      fRailway->LoadLibrary("libTPCbase");
      fRailway->LoadLibrary("libITSbase");
      fRailway->LoadLibrary("libHMPIDbase");
      fRailway->LoadLibrary("libTENDER");
      fRailway->LoadLibrary("libTENDERSupplies");
    }

    if (fOptions.Has("sys-info")) mgr->SetNSysInfo(100);
    
    // AliAnalysisTask*   task = 0;
    AliAnalysisTaskSE* seTask = 0;

    AliAnalysisManager::SetCommonFileName("AODQA.root");
    if (tender) 
      CoupleCar("$ALICE_ROOT/ANALYSIS/TenderSupplies/AddTaskTender.C",
	      Form("%d", fOptions.Has("v0-tender")));
    
    if (fOptions.Has("pid-response")) 
      CoupleCar("AddTaskPIDResponse.C");

    if (fOptions.Has("pid-qa")) {
      seTask = CoupleSECar("AddTaskPIDqa.C");
      seTask->SelectCollisionCandidates(AliVEvent::kAny);
    }
    
    if (cdb && !tender) {
      fRailway->LoadLibrary("libRAWDatarec");
      fRailway->LoadLibrary("libTRDrec");
      fRailway->LoadLibrary("libVZEROrec");
      fRailway->LoadLibrary("libTPCrec");
      fRailway->LoadLibrary("libITSrec");
      fRailway->LoadLibrary("libPWGPP");

      // CoupleCar("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
      gROOT->ProcessLine(Form("AddTaskCDBconnect(%d)", fOptions.AsInt("run")));
      gROOT->ProcessLine("AliCDBManager* cdb = AliCDBManager::Instance();"
			 "cdb->SetDefaultStorage(\"raw://\");");
    }
    
    if (fOptions.Has("high-pt"))
      CoupleCar("AddTaskFilteredTree.C");
  
    if (fOptions.Has("esd-filter")) {
      fRailway->LoadLibrary("PWGmuon");
      if (fOptions.Has("muon-copy")) {
	mgr->RegisterExtraFile("AliAOD.Muons.root");
	mgr->RegisterExtraFile("AliAOD.Dimuons.root");
      }
      Int_t runFlag = (fOptions.AsInt("year") % 100) * 100;
      TString args = 
	TString::Format("%d,%d,false,false,false,false,true,false,false,%d",
			fOptions.Has("kinematics-filter"), 
			fOptions.Has("muon-copy"), runFlag);
      CoupleCar("AddTaskESDFilter.C", args);
    }
  
    Bool_t vertexing = fOptions.Has("vertexing");
    Bool_t d0Decay   = fOptions.Has("d0-decay");
    if (vertexing || d0Decay) {
      TString src = "$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF.C";
      if (fOptions.AsInt("collision") == 1) 
	src.ReplaceAll(".C", "highmult.C");
      TFile::Cp(src, "ConfigVertexingHF.C");
      fRailway->LoadAux("ConfigVertexingHF.C");
    }    

    if (vertexing) {
      fRailway->LoadLibrary("PWGflowBase");
      fRailway->LoadLibrary("PWGflowTasks");
      fRailway->LoadLibrary("PWGHFvertexingHF");
      seTask = 
	CoupleSECar("$ALICE_ROOT/PWGHF/vertexingHF/macros/AddTaskVertexingHF.C");
      seTask->SelectCollisionCandidates(0);
      mgr->RegisterExtraFile("AliAOD.VertexingHF.root");
    }

    if (fOptions.Has("jpsi-filtering")) { 
      fRailway->LoadLibrary("PWGDQdielectron");
      seTask = 
	CoupleSECar("$ALICE_ROOT/PWGDQ/dielectron/macros/AddTaskJPSIFilter.C");
      seTask->SelectCollisionCandidates(0);
      mgr->RegisterExtraFile("AliAOD.Dielectron.root");
    }
  
    if (d0Decay) 
      CoupleCar("$ALICE_ROOT/PWGHF/vertexingHF/AddD2HTrain.C",
	      "kFALSE, 1,0,0,0,0,0,0,0,0,0,0");
  
    if (fOptions.Has("jetan")) {
      fRailway->LoadLibrary("JETAN");
      
      Bool_t jetanDelta = fOptions.Has("jetan-delta");      
      if (jetanDelta) {
	fRailway->LoadLibrary("CGAL");
	fRailway->LoadLibrary("fastjet");
	fRailway->LoadLibrary("siscone");
	fRailway->LoadLibrary("SISConePlugin");
	fRailway->LoadLibrary("FASTJETAN");
	// --- For newer fastjet ---
	// fRailway->LoadLibrary("CGAL");
	// fRailway->LoadLibrary("fastjet");
	// fRailway->LoadLibrary("fastjettools");
	// fRailway->LoadLibrary("siscone");
	// fRailway->LoadLibrary("siscone_spherical");
	// fRailway->LoadLibrary("fastjetplugins");
	// fRailway->LoadLibrary("FASTJETAN");
      }
      
      // Write script to do this - avoid useless links against loadable
      // library
      std::ofstream o("AddJets.C");
      o << "void AddJets(AliAnalysisManager*  mgr,\n"
	<< "             UInt_t               highPt,\n"
	<< "             const char*          deltaAOD,\n"
	<< "             Bool_t               useDelta,\n"
	<< "             Bool_t               usePS,\n"
	<< "             Bool_t               pbpb,\n"
	<< "             Float_t              etaCut,\n"
	<< "             Float_t              centLow,\n"
	<< "             Float_t              centHigh)\n"
	<< "{\n"
	<< "  gROOT->SetMacroPath(Form(\"%s:$ALICE_ROOT/PWGJE/macros\",\n"
	<< "                           gROOT->GetMacroPath()));\n"
	<< "  \n"                      
	<< "  gROOT->LoadMacro(\"AddTaskJets.C\");\n"
	<< "  AliAnalysisTaskJets *jTask = 0;\n"
	<< "  jTask = AddTaskJets(\"AOD\",\"UA1\",0.4,highPt,1.,0);\n"
	<< "  jTask->SetNonStdOutputFile(deltaAOD);\n"
	<< "  \n"
	<< "  if (useDelta) {\n"
	<< "    mgr->RegisterExtraFile(deltaAOD);\n"
	<< "    if (pbpb) {\n"
	<< "      jTask = AddTaskJets(\"AOD\",\"UA1\",0.4,highPt,1.,2);\n"
	<< "      jTask->SetNonStdOutputFile(deltaAOD);\n"
	<< "    }\n"
	<< "  }\n"
	<< "  \n";
      o << "  jTask =AddTaskJets(\"AOD\",\"SISCONE\",0.4,highPt,0.15,0);\n"
	<< "  jTask->SetNonStdOutputFile(deltaAOD);\n"
	<< "  TString subBranches = jTask->GetNonStdBranch();\n"
	<< "  \n";
      o << "  gROOT->LoadMacro(\"AddTaskJetCluster.C\");\n"
	<< "  AliAnalysisTaskJetCluster* cTask = 0;\n"
	<< "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
	<< "                          \"KT\",0.4,0,1,deltaAOD,0.15,etaCut,0);\n"
	<< "  cTask->SetBackgroundCalc(kTRUE);\n"
	<< "  cTask->SetNRandomCones(10);\n"
	<< "  cTask->SetCentralityCut(centLow,centHigh);\n"
	<< "  cTask->SetGhostEtamax(etaCut);\n"
	<< "  TString bgBranch = Form(\"%s_%s\",\n"
	<< "    AliAODJetEventBackground::StdBranchName(),\n"
	<< "    cTask->GetJetOutputBranch());\n"
	<< "  \n";
      o << "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
	<< "                          \"ANTIKT\",0.4,2,1,deltaAOD,0.15);\n"
	<< "  cTask->SetNRandomCones(10);\n"
	<< "  cTask->SetCentralityCut(centLow,centHigh);\n"
	<< "  if (pbpb) cTask->SetBackgroundBranch(bgBranch);\n"
	<< "  subBranches += Form(\" %s\",cTask->GetJetOutputBranch());\n"
	<< "  \n";
      o << "  cTask = AddTaskJetCluster(\"AOD\",\"\",highPt,usePS,\n"
	<<                           "\"ANTIKT\",0.2,0,1,deltaAOD,0.15);\n"
	<< "  cTask->SetCentralityCut(centLow,centHigh);\n"
	<< "  if (pbpb) cTask->SetBackgroundBranch(bgBranch);\n"
	<< "  subBranches += Form(\" %s\",cTask->GetJetOutputBranch());\n"
	<< "  \n";
      o	<< "  if (pbpb) {\n"
	<< "    gROOT->LoadMacro(\"AddTaskJetBackgroundSubtract.C\");\n"
	<< "    AliAnalysisTaskJetBackgroundSubtract* sTask = 0;\n"
	<< "    sTask = AddTaskJetBackgroundSubtract(subBranches,1,\"B0\",\n"
	<< "                                         \"B%d\");\n"
	<< "    sTask->SetBackgroundBranch(bgBranch);\n"
	<< "    sTask->SetNonStdOutputFile(deltaAOD);\n"
	<< "  }\n"
	<< "}\n"
	<< std::endl;
      o.close();

      UInt_t  highPtFilterMask = 272;
      TString deltaAODJetName  = "AliAOD.Jets.root";
      Float_t trackEtaWindow   = 0.9;
      Float_t centLow          = 0;
      Float_t centHigh         = 0;
      gROOT->Macro(Form("./AddJets.C((AliAnalysisManager*)%p,"
			"%d,\"%s\",%d,%d,%d,%f,%f,%f);",
			mgr, highPtFilterMask, deltaAODJetName.Data(),
			jetanDelta, physicsSelection,
			fOptions.AsInt("collision") == 1, // pbpb
			trackEtaWindow, centLow, centHigh));
    }
    if (fOptions.Has("forward-nch") && physicsSelection) {
      Bool_t fwdMC = (mgr->GetMCtruthEventHandler() != 0 && 
		      fOptions.Has("track-refs"));
    
      CoupleCar("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardMult.C",
	      Form("%d", fwdMC));
    }
  }
  //------------------------------------------------------------------
  /** 
   * Create physics selection, and add to manager
   * 
   * @param mc Whether this is for MC 
   * @param mgr Manager
   */
  virtual void CreatePhysicsSelection(Bool_t mc, AliAnalysisManager* mgr)
  {
    if (fOptions.Has("physics-selection")) 
      TrainSetup::CreatePhysicsSelection(mc, mgr);
  }
  //------------------------------------------------------------------
  /** 
   * Create centrality selection, and add to manager
   * 
   * @param mc Whether this is for MC 
   * @param mgr Manager
   */
  virtual void CreateCentralitySelection(Bool_t mc, AliAnalysisManager* mgr)
  {
    if (fOptions.Has("centrality")) 
      TrainSetup::CreateCentralitySelection(mc, mgr);
  }
  //------------------------------------------------------------------
  /** 
   * Create MC input handler 
   * 
   * @param mc    Assume monte-carlo input 
   * 
   * @return 
   */
  virtual AliVEventHandler* CreateMCHandler(UShort_t /*type*/, bool mc)
  {
    if (!mc) return 0;
    AliMCEventHandler* mcHandler = new AliMCEventHandler();
    mcHandler->SetReadTR(fOptions.Has("track-refs")); 
    return mcHandler;
  }
  //------------------------------------------------------------------
  /** 
   * Get the name of this set-up 
   * 
   * @return Name of this setup 
   */
  const char* ClassName() const { return "AODTrain"; }
};
//
// EOF
//
 AODTrain.C:1
 AODTrain.C:2
 AODTrain.C:3
 AODTrain.C:4
 AODTrain.C:5
 AODTrain.C:6
 AODTrain.C:7
 AODTrain.C:8
 AODTrain.C:9
 AODTrain.C:10
 AODTrain.C:11
 AODTrain.C:12
 AODTrain.C:13
 AODTrain.C:14
 AODTrain.C:15
 AODTrain.C:16
 AODTrain.C:17
 AODTrain.C:18
 AODTrain.C:19
 AODTrain.C:20
 AODTrain.C:21
 AODTrain.C:22
 AODTrain.C:23
 AODTrain.C:24
 AODTrain.C:25
 AODTrain.C:26
 AODTrain.C:27
 AODTrain.C:28
 AODTrain.C:29
 AODTrain.C:30
 AODTrain.C:31
 AODTrain.C:32
 AODTrain.C:33
 AODTrain.C:34
 AODTrain.C:35
 AODTrain.C:36
 AODTrain.C:37
 AODTrain.C:38
 AODTrain.C:39
 AODTrain.C:40
 AODTrain.C:41
 AODTrain.C:42
 AODTrain.C:43
 AODTrain.C:44
 AODTrain.C:45
 AODTrain.C:46
 AODTrain.C:47
 AODTrain.C:48
 AODTrain.C:49
 AODTrain.C:50
 AODTrain.C:51
 AODTrain.C:52
 AODTrain.C:53
 AODTrain.C:54
 AODTrain.C:55
 AODTrain.C:56
 AODTrain.C:57
 AODTrain.C:58
 AODTrain.C:59
 AODTrain.C:60
 AODTrain.C:61
 AODTrain.C:62
 AODTrain.C:63
 AODTrain.C:64
 AODTrain.C:65
 AODTrain.C:66
 AODTrain.C:67
 AODTrain.C:68
 AODTrain.C:69
 AODTrain.C:70
 AODTrain.C:71
 AODTrain.C:72
 AODTrain.C:73
 AODTrain.C:74
 AODTrain.C:75
 AODTrain.C:76
 AODTrain.C:77
 AODTrain.C:78
 AODTrain.C:79
 AODTrain.C:80
 AODTrain.C:81
 AODTrain.C:82
 AODTrain.C:83
 AODTrain.C:84
 AODTrain.C:85
 AODTrain.C:86
 AODTrain.C:87
 AODTrain.C:88
 AODTrain.C:89
 AODTrain.C:90
 AODTrain.C:91
 AODTrain.C:92
 AODTrain.C:93
 AODTrain.C:94
 AODTrain.C:95
 AODTrain.C:96
 AODTrain.C:97
 AODTrain.C:98
 AODTrain.C:99
 AODTrain.C:100
 AODTrain.C:101
 AODTrain.C:102
 AODTrain.C:103
 AODTrain.C:104
 AODTrain.C:105
 AODTrain.C:106
 AODTrain.C:107
 AODTrain.C:108
 AODTrain.C:109
 AODTrain.C:110
 AODTrain.C:111
 AODTrain.C:112
 AODTrain.C:113
 AODTrain.C:114
 AODTrain.C:115
 AODTrain.C:116
 AODTrain.C:117
 AODTrain.C:118
 AODTrain.C:119
 AODTrain.C:120
 AODTrain.C:121
 AODTrain.C:122
 AODTrain.C:123
 AODTrain.C:124
 AODTrain.C:125
 AODTrain.C:126
 AODTrain.C:127
 AODTrain.C:128
 AODTrain.C:129
 AODTrain.C:130
 AODTrain.C:131
 AODTrain.C:132
 AODTrain.C:133
 AODTrain.C:134
 AODTrain.C:135
 AODTrain.C:136
 AODTrain.C:137
 AODTrain.C:138
 AODTrain.C:139
 AODTrain.C:140
 AODTrain.C:141
 AODTrain.C:142
 AODTrain.C:143
 AODTrain.C:144
 AODTrain.C:145
 AODTrain.C:146
 AODTrain.C:147
 AODTrain.C:148
 AODTrain.C:149
 AODTrain.C:150
 AODTrain.C:151
 AODTrain.C:152
 AODTrain.C:153
 AODTrain.C:154
 AODTrain.C:155
 AODTrain.C:156
 AODTrain.C:157
 AODTrain.C:158
 AODTrain.C:159
 AODTrain.C:160
 AODTrain.C:161
 AODTrain.C:162
 AODTrain.C:163
 AODTrain.C:164
 AODTrain.C:165
 AODTrain.C:166
 AODTrain.C:167
 AODTrain.C:168
 AODTrain.C:169
 AODTrain.C:170
 AODTrain.C:171
 AODTrain.C:172
 AODTrain.C:173
 AODTrain.C:174
 AODTrain.C:175
 AODTrain.C:176
 AODTrain.C:177
 AODTrain.C:178
 AODTrain.C:179
 AODTrain.C:180
 AODTrain.C:181
 AODTrain.C:182
 AODTrain.C:183
 AODTrain.C:184
 AODTrain.C:185
 AODTrain.C:186
 AODTrain.C:187
 AODTrain.C:188
 AODTrain.C:189
 AODTrain.C:190
 AODTrain.C:191
 AODTrain.C:192
 AODTrain.C:193
 AODTrain.C:194
 AODTrain.C:195
 AODTrain.C:196
 AODTrain.C:197
 AODTrain.C:198
 AODTrain.C:199
 AODTrain.C:200
 AODTrain.C:201
 AODTrain.C:202
 AODTrain.C:203
 AODTrain.C:204
 AODTrain.C:205
 AODTrain.C:206
 AODTrain.C:207
 AODTrain.C:208
 AODTrain.C:209
 AODTrain.C:210
 AODTrain.C:211
 AODTrain.C:212
 AODTrain.C:213
 AODTrain.C:214
 AODTrain.C:215
 AODTrain.C:216
 AODTrain.C:217
 AODTrain.C:218
 AODTrain.C:219
 AODTrain.C:220
 AODTrain.C:221
 AODTrain.C:222
 AODTrain.C:223
 AODTrain.C:224
 AODTrain.C:225
 AODTrain.C:226
 AODTrain.C:227
 AODTrain.C:228
 AODTrain.C:229
 AODTrain.C:230
 AODTrain.C:231
 AODTrain.C:232
 AODTrain.C:233
 AODTrain.C:234
 AODTrain.C:235
 AODTrain.C:236
 AODTrain.C:237
 AODTrain.C:238
 AODTrain.C:239
 AODTrain.C:240
 AODTrain.C:241
 AODTrain.C:242
 AODTrain.C:243
 AODTrain.C:244
 AODTrain.C:245
 AODTrain.C:246
 AODTrain.C:247
 AODTrain.C:248
 AODTrain.C:249
 AODTrain.C:250
 AODTrain.C:251
 AODTrain.C:252
 AODTrain.C:253
 AODTrain.C:254
 AODTrain.C:255
 AODTrain.C:256
 AODTrain.C:257
 AODTrain.C:258
 AODTrain.C:259
 AODTrain.C:260
 AODTrain.C:261
 AODTrain.C:262
 AODTrain.C:263
 AODTrain.C:264
 AODTrain.C:265
 AODTrain.C:266
 AODTrain.C:267
 AODTrain.C:268
 AODTrain.C:269
 AODTrain.C:270
 AODTrain.C:271
 AODTrain.C:272
 AODTrain.C:273
 AODTrain.C:274
 AODTrain.C:275
 AODTrain.C:276
 AODTrain.C:277
 AODTrain.C:278
 AODTrain.C:279
 AODTrain.C:280
 AODTrain.C:281
 AODTrain.C:282
 AODTrain.C:283
 AODTrain.C:284
 AODTrain.C:285
 AODTrain.C:286
 AODTrain.C:287
 AODTrain.C:288
 AODTrain.C:289
 AODTrain.C:290
 AODTrain.C:291
 AODTrain.C:292
 AODTrain.C:293
 AODTrain.C:294
 AODTrain.C:295
 AODTrain.C:296
 AODTrain.C:297
 AODTrain.C:298
 AODTrain.C:299
 AODTrain.C:300
 AODTrain.C:301
 AODTrain.C:302
 AODTrain.C:303
 AODTrain.C:304
 AODTrain.C:305
 AODTrain.C:306
 AODTrain.C:307
 AODTrain.C:308
 AODTrain.C:309
 AODTrain.C:310
 AODTrain.C:311
 AODTrain.C:312
 AODTrain.C:313
 AODTrain.C:314
 AODTrain.C:315
 AODTrain.C:316
 AODTrain.C:317
 AODTrain.C:318
 AODTrain.C:319
 AODTrain.C:320
 AODTrain.C:321
 AODTrain.C:322
 AODTrain.C:323
 AODTrain.C:324
 AODTrain.C:325
 AODTrain.C:326
 AODTrain.C:327
 AODTrain.C:328
 AODTrain.C:329
 AODTrain.C:330
 AODTrain.C:331
 AODTrain.C:332
 AODTrain.C:333
 AODTrain.C:334