ROOT logo
/**
 * @file   MakeFMDMCTrackTrain.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Fri Jun  1 13:54:47 2012
 * 
 * @brief  
 * 
 * @ingroup pwglf_forward_trains_specific
 */
#include "TrainSetup.C"
// #include "ParUtilities.C"

//====================================================================
/**
 * Analysis train to make Forward and Central MC corrections
 * 
 *
 * @ingroup pwglf_forward_mc
 * @ingroup pwglf_forward_trains_specific
 */
class MakeFMDMCTrackTrain : public TrainSetup
{
public:
  /** 
   * Constructor.  Date and time must be specified when running this
   * in Termiante mode on Grid
   * 
   * @param name     Name of train (free form)
   */
  MakeFMDMCTrackTrain(const  char* name) 
    : TrainSetup(name)
  {
    fOptions.Add("use-tuple", "Whether to make an NTuple of hits");
    fOptions.Add("max-strips", "NUMBER", "Max strips/cluster", 2);
    fOptions.Set("type", "ESD");
  }
protected:
  /** 
   * Create the tasks 
   * 
   * @param mgr  Analysis manager 
   */
  void CreateTasks(AliAnalysisManager* mgr)
  {
    // --- Output file name ------------------------------------------
    AliAnalysisManager::SetCommonFileName("forward_mctracks.root");


    // --- Load libraries/pars ---------------------------------------
    fRailway->LoadLibrary("PWGLFforward2");
    // fRailway->LoadLibrary("Proof");
    // fRailway->LoadLibrary("Gui"); // Sigh! CDB depends on GUI!
    // fRailway->LoadLibrary("CDB");
    // fRailway->LoadLibrary("RAWDatabase");
    // fRailway->LoadLibrary("STEER");
    // fRailway->LoadLibrary("FMDbase");
    // fRailway->LoadLibrary("FMDsim");
    // fRailway->LoadLibrary("PWGLFforwardhit");
    
    // --- Set load path ---------------------------------------------
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2",
			     gROOT->GetMacroPath()));

    // --- Check if this is MC ---------------------------------------
    if (!mgr->GetMCtruthEventHandler()) 
      Fatal("CreateTasks", "No MC truth handler");
    
    Bool_t   useTuple  = fOptions.AsBool("use-tuple");
    UShort_t maxStrips = fOptions.AsInt("max-strips");
    Int_t    verbose   = fOptions.AsInt("verbose");

    TString args = TString::Format("%d,%d,%d", 
				   useTuple,
				   maxStrips, 
				   verbose);
    if (!CoupleCar("AddTaskFMDMCTracks.C", args))
      Fatal("CreateTasks", "Couldn't add our task");
  }
  //__________________________________________________________________
  /** 
   * Create physics selection , and add to manager
   * 
   * @param mc Whether this is for MC 
   * @param mgr Manager 
   */
  void CreatePhysicsSelection(Bool_t mc,
			      AliAnalysisManager* mgr)
  {
    TrainSetup::CreatePhysicsSelection(mc, mgr);

    // --- Get input event handler -----------------------------------
    AliInputEventHandler* ih =
      dynamic_cast<AliInputEventHandler*>(mgr->GetInputEventHandler());
    if (!ih) 
      Fatal("CreatePhysicsSelection", "Couldn't get input handler (%p)", ih);
    
    // --- Get Physics selection -------------------------------------
    AliPhysicsSelection* ps = 
      dynamic_cast<AliPhysicsSelection*>(ih->GetEventSelection());
    if (!ps) 
      Fatal("CreatePhysicsSelection", "Couldn't get PhysicsSelection (%p)", ps);

    // --- Ignore trigger class when selecting events.  This means ---
    // --- that we get offline+(A,C,E) events too --------------------
    // ps->SetSkipTriggerClassSelection(true);
  }
  //__________________________________________________________________
  /** 
   * @return 0 - AOD disabled 
   */
  virtual AliVEventHandler* CreateOutputHandler(UShort_t) { return 0; }
  /** 
   * Do not the centrality selection
   */
  // void CreateCentralitySelection(Bool_t) {}
  //__________________________________________________________________
  const char* ClassName() const { return "MakeFMDMCTrackTrain"; }

  /** 
   * Overloaded to create new dNdeta.C and dndeta.sh in the output 
   * directory
   * 
   * @param asShellScript 
   */
  void SaveSetup(Bool_t asShellScript)
  {
    TrainSetup::SaveSetup(asShellScript);
    SaveSummarize();
    SaveAnalyseNTuple();
    SaveReFit();


    if (!fRailway || fRailway->Mode() != Railway::kGrid) return;

    SaveDownloadTrees();

  }
  /** 
   * Write a ROOT script to draw summary 
   * 
   */
  void SaveSummarize()
  {
    std::ofstream f("Summarize.C");
    if (!f) { 
      Error("SaveSummarize", "Failed to open Summarize.C script");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "// WHAT is a bit mask of\n"
      << "//   0x001     Event inspector\n"
      << "//   0x002     Track inspector\n"
      << "//   0x004     Energy loss fits\n"
      << "//   0x100     Landscape\n"
      << "//   0x200     Pause\n"
      << "//\n"
      << "void Summarize(const char* filename=\"forward_mctracks.root\",\n"
      << "               UShort_t what=0x10F)\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/scripts/SummaryMCTrackDrawer.C+g\",fwd));\n"
      << "  SummaryMCTrackDrawer smd;\n"
      << "  smd.Run(filename,what);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  /** 
   * Make a ROOT Script to download the generated AODs
   * 
   */
  void SaveDownloadTrees()
  {
    std::ofstream f("DownloadTrees.C");
    if (!f) { 
      Error("SaveDownloadTrees", "Failed to open DownloadTrees.C");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "void DownloadTrees(Bool_t force=false)\n"
      << "{\n"
      << "  if (!TGrid::Connect(\"alien://\")) {\n"
      << "    Error(\"DownloadTrees\",\"Failed to connect to AliEn\");\n"
      << "    return;\n"
      << "  }\n\n"
      << "  TString dir(\"" << fRailway->OutputPath() << "\");\n"
      << "  TString pat(\"*/forward_tuple.root\");\n"
      << "  TGridResult* r = gGrid->Query(dir,pat);\n"
      << "  if (!r) {\n"
      << "    Error(\"DownloadTrees\",\"No result from query\");\n"
      << "    return;\n"
      << "  }\n\n"
      << "  Int_t n = r->GetEntries();\n"
      << "  Printf(\"=== Got a total of %d AOD files\",n);\n"
      << "  for (Int_t i = 0; i < n; i++) {\n"
      << "     TString path(r->GetKey(i, \"turl\"));\n"
      << "     TString dir(gSystem->DirName(path));\n"
      << "     TString sub(gSystem->BaseName(dir));\n"
      << "     TString subsub(gSystem->BaseName(gSystem->DirName(dir)));\n"
      << "     TString out = TString::Format(\"forward_tree_%s_%s.root\",\n"
      << "                                   subsub.Data(),sub.Data());\n"
      << "     if (!gSystem->AccessPathName(out.Data()) && !force) {\n"
      << "       Printf(\"=== Already have %s\",out.Data());\n"
      << "       continue;\n"
      << "     }\n"
      << "     Printf(\"=== Getting %s %s (%3d/%3d)\",\n"
      << "            subsub.Data(),sub.Data(),i,n);\n"
      << "     if (!TFile::Cp(path, out)) {\n"
      << "       Warning(\"DownloadTrees\",\"Failed to copy %s -> %s\",\n"
      << "               path.Data(), out.Data());\n"
      << "       continue;\n"
      << "     }\n"
      << "   }\n"
      << "}\n"
      << "// EOF\n"
      << std::endl;
    f.close();
  }   
  /** 
   * Make a ROOT Script to download the generated AODs
   * 
   */
  void SaveAnalyseNTuple()
  {
    std::ofstream f("AnalyseNTuple.C");
    if (!f) { 
      Error("SaveAnalyseNTuple", "Failed to open AnalyseNTuple.C");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "// Process with bare ROOT in ProofLite\n"
      << "void AnalyseNTuple(Bool_t proof=true,\n"
      << "                   Long64_t max=-1,\n"
      << "                   const char* opt=\"\")\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gSystem->AddIncludePath(\"-I${ALICE_ROOT}/include\");\n"
      << "  gROOT->Macro(Form(\"%s/scripts/LoadLibs.C\",fwd));\n"
      << "  gROOT->LoadMacro(Form(\"%s/scripts/TupleSelector.C+%s\",\n"
      << "                        fwd, opt));\n"
      << "  if (proof) TupleSelector::Proof(maxEvents, opt);\n"
      << "  else       TupleSelector::Run(maxEvents);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  void SaveReFit()
  {
    std::ofstream f("ReFit.C");
    if (!f) { 
      Error("SaveRerun", "Failed to open ReFit.C script");
      return;
    }
    f << std::boolalpha 
      << "// Generated by " << ClassName() << "\n"
      << "// If force=true, then force set parameters\n"
      << "//\n"
      << "void ReFit(Bool_t      force=false,\n"
      << "           const char* filename=\"forward_mctracks.root\")\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/corrs/RerunTrackELoss.C\",fwd));\n"
      << "  RerunTrackELoss(force,filename);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }

  void PostShellCode(std::ostream& f)
  {
    f << "  echo \"=== Summarizing results ...\"\n"
      << "  aliroot -l -b -q ${prefix}Summarize.C\n"
      << std::endl;
  }

};

//
// EOF
//
 MakeFMDMCTrackTrain.C:1
 MakeFMDMCTrackTrain.C:2
 MakeFMDMCTrackTrain.C:3
 MakeFMDMCTrackTrain.C:4
 MakeFMDMCTrackTrain.C:5
 MakeFMDMCTrackTrain.C:6
 MakeFMDMCTrackTrain.C:7
 MakeFMDMCTrackTrain.C:8
 MakeFMDMCTrackTrain.C:9
 MakeFMDMCTrackTrain.C:10
 MakeFMDMCTrackTrain.C:11
 MakeFMDMCTrackTrain.C:12
 MakeFMDMCTrackTrain.C:13
 MakeFMDMCTrackTrain.C:14
 MakeFMDMCTrackTrain.C:15
 MakeFMDMCTrackTrain.C:16
 MakeFMDMCTrackTrain.C:17
 MakeFMDMCTrackTrain.C:18
 MakeFMDMCTrackTrain.C:19
 MakeFMDMCTrackTrain.C:20
 MakeFMDMCTrackTrain.C:21
 MakeFMDMCTrackTrain.C:22
 MakeFMDMCTrackTrain.C:23
 MakeFMDMCTrackTrain.C:24
 MakeFMDMCTrackTrain.C:25
 MakeFMDMCTrackTrain.C:26
 MakeFMDMCTrackTrain.C:27
 MakeFMDMCTrackTrain.C:28
 MakeFMDMCTrackTrain.C:29
 MakeFMDMCTrackTrain.C:30
 MakeFMDMCTrackTrain.C:31
 MakeFMDMCTrackTrain.C:32
 MakeFMDMCTrackTrain.C:33
 MakeFMDMCTrackTrain.C:34
 MakeFMDMCTrackTrain.C:35
 MakeFMDMCTrackTrain.C:36
 MakeFMDMCTrackTrain.C:37
 MakeFMDMCTrackTrain.C:38
 MakeFMDMCTrackTrain.C:39
 MakeFMDMCTrackTrain.C:40
 MakeFMDMCTrackTrain.C:41
 MakeFMDMCTrackTrain.C:42
 MakeFMDMCTrackTrain.C:43
 MakeFMDMCTrackTrain.C:44
 MakeFMDMCTrackTrain.C:45
 MakeFMDMCTrackTrain.C:46
 MakeFMDMCTrackTrain.C:47
 MakeFMDMCTrackTrain.C:48
 MakeFMDMCTrackTrain.C:49
 MakeFMDMCTrackTrain.C:50
 MakeFMDMCTrackTrain.C:51
 MakeFMDMCTrackTrain.C:52
 MakeFMDMCTrackTrain.C:53
 MakeFMDMCTrackTrain.C:54
 MakeFMDMCTrackTrain.C:55
 MakeFMDMCTrackTrain.C:56
 MakeFMDMCTrackTrain.C:57
 MakeFMDMCTrackTrain.C:58
 MakeFMDMCTrackTrain.C:59
 MakeFMDMCTrackTrain.C:60
 MakeFMDMCTrackTrain.C:61
 MakeFMDMCTrackTrain.C:62
 MakeFMDMCTrackTrain.C:63
 MakeFMDMCTrackTrain.C:64
 MakeFMDMCTrackTrain.C:65
 MakeFMDMCTrackTrain.C:66
 MakeFMDMCTrackTrain.C:67
 MakeFMDMCTrackTrain.C:68
 MakeFMDMCTrackTrain.C:69
 MakeFMDMCTrackTrain.C:70
 MakeFMDMCTrackTrain.C:71
 MakeFMDMCTrackTrain.C:72
 MakeFMDMCTrackTrain.C:73
 MakeFMDMCTrackTrain.C:74
 MakeFMDMCTrackTrain.C:75
 MakeFMDMCTrackTrain.C:76
 MakeFMDMCTrackTrain.C:77
 MakeFMDMCTrackTrain.C:78
 MakeFMDMCTrackTrain.C:79
 MakeFMDMCTrackTrain.C:80
 MakeFMDMCTrackTrain.C:81
 MakeFMDMCTrackTrain.C:82
 MakeFMDMCTrackTrain.C:83
 MakeFMDMCTrackTrain.C:84
 MakeFMDMCTrackTrain.C:85
 MakeFMDMCTrackTrain.C:86
 MakeFMDMCTrackTrain.C:87
 MakeFMDMCTrackTrain.C:88
 MakeFMDMCTrackTrain.C:89
 MakeFMDMCTrackTrain.C:90
 MakeFMDMCTrackTrain.C:91
 MakeFMDMCTrackTrain.C:92
 MakeFMDMCTrackTrain.C:93
 MakeFMDMCTrackTrain.C:94
 MakeFMDMCTrackTrain.C:95
 MakeFMDMCTrackTrain.C:96
 MakeFMDMCTrackTrain.C:97
 MakeFMDMCTrackTrain.C:98
 MakeFMDMCTrackTrain.C:99
 MakeFMDMCTrackTrain.C:100
 MakeFMDMCTrackTrain.C:101
 MakeFMDMCTrackTrain.C:102
 MakeFMDMCTrackTrain.C:103
 MakeFMDMCTrackTrain.C:104
 MakeFMDMCTrackTrain.C:105
 MakeFMDMCTrackTrain.C:106
 MakeFMDMCTrackTrain.C:107
 MakeFMDMCTrackTrain.C:108
 MakeFMDMCTrackTrain.C:109
 MakeFMDMCTrackTrain.C:110
 MakeFMDMCTrackTrain.C:111
 MakeFMDMCTrackTrain.C:112
 MakeFMDMCTrackTrain.C:113
 MakeFMDMCTrackTrain.C:114
 MakeFMDMCTrackTrain.C:115
 MakeFMDMCTrackTrain.C:116
 MakeFMDMCTrackTrain.C:117
 MakeFMDMCTrackTrain.C:118
 MakeFMDMCTrackTrain.C:119
 MakeFMDMCTrackTrain.C:120
 MakeFMDMCTrackTrain.C:121
 MakeFMDMCTrackTrain.C:122
 MakeFMDMCTrackTrain.C:123
 MakeFMDMCTrackTrain.C:124
 MakeFMDMCTrackTrain.C:125
 MakeFMDMCTrackTrain.C:126
 MakeFMDMCTrackTrain.C:127
 MakeFMDMCTrackTrain.C:128
 MakeFMDMCTrackTrain.C:129
 MakeFMDMCTrackTrain.C:130
 MakeFMDMCTrackTrain.C:131
 MakeFMDMCTrackTrain.C:132
 MakeFMDMCTrackTrain.C:133
 MakeFMDMCTrackTrain.C:134
 MakeFMDMCTrackTrain.C:135
 MakeFMDMCTrackTrain.C:136
 MakeFMDMCTrackTrain.C:137
 MakeFMDMCTrackTrain.C:138
 MakeFMDMCTrackTrain.C:139
 MakeFMDMCTrackTrain.C:140
 MakeFMDMCTrackTrain.C:141
 MakeFMDMCTrackTrain.C:142
 MakeFMDMCTrackTrain.C:143
 MakeFMDMCTrackTrain.C:144
 MakeFMDMCTrackTrain.C:145
 MakeFMDMCTrackTrain.C:146
 MakeFMDMCTrackTrain.C:147
 MakeFMDMCTrackTrain.C:148
 MakeFMDMCTrackTrain.C:149
 MakeFMDMCTrackTrain.C:150
 MakeFMDMCTrackTrain.C:151
 MakeFMDMCTrackTrain.C:152
 MakeFMDMCTrackTrain.C:153
 MakeFMDMCTrackTrain.C:154
 MakeFMDMCTrackTrain.C:155
 MakeFMDMCTrackTrain.C:156
 MakeFMDMCTrackTrain.C:157
 MakeFMDMCTrackTrain.C:158
 MakeFMDMCTrackTrain.C:159
 MakeFMDMCTrackTrain.C:160
 MakeFMDMCTrackTrain.C:161
 MakeFMDMCTrackTrain.C:162
 MakeFMDMCTrackTrain.C:163
 MakeFMDMCTrackTrain.C:164
 MakeFMDMCTrackTrain.C:165
 MakeFMDMCTrackTrain.C:166
 MakeFMDMCTrackTrain.C:167
 MakeFMDMCTrackTrain.C:168
 MakeFMDMCTrackTrain.C:169
 MakeFMDMCTrackTrain.C:170
 MakeFMDMCTrackTrain.C:171
 MakeFMDMCTrackTrain.C:172
 MakeFMDMCTrackTrain.C:173
 MakeFMDMCTrackTrain.C:174
 MakeFMDMCTrackTrain.C:175
 MakeFMDMCTrackTrain.C:176
 MakeFMDMCTrackTrain.C:177
 MakeFMDMCTrackTrain.C:178
 MakeFMDMCTrackTrain.C:179
 MakeFMDMCTrackTrain.C:180
 MakeFMDMCTrackTrain.C:181
 MakeFMDMCTrackTrain.C:182
 MakeFMDMCTrackTrain.C:183
 MakeFMDMCTrackTrain.C:184
 MakeFMDMCTrackTrain.C:185
 MakeFMDMCTrackTrain.C:186
 MakeFMDMCTrackTrain.C:187
 MakeFMDMCTrackTrain.C:188
 MakeFMDMCTrackTrain.C:189
 MakeFMDMCTrackTrain.C:190
 MakeFMDMCTrackTrain.C:191
 MakeFMDMCTrackTrain.C:192
 MakeFMDMCTrackTrain.C:193
 MakeFMDMCTrackTrain.C:194
 MakeFMDMCTrackTrain.C:195
 MakeFMDMCTrackTrain.C:196
 MakeFMDMCTrackTrain.C:197
 MakeFMDMCTrackTrain.C:198
 MakeFMDMCTrackTrain.C:199
 MakeFMDMCTrackTrain.C:200
 MakeFMDMCTrackTrain.C:201
 MakeFMDMCTrackTrain.C:202
 MakeFMDMCTrackTrain.C:203
 MakeFMDMCTrackTrain.C:204
 MakeFMDMCTrackTrain.C:205
 MakeFMDMCTrackTrain.C:206
 MakeFMDMCTrackTrain.C:207
 MakeFMDMCTrackTrain.C:208
 MakeFMDMCTrackTrain.C:209
 MakeFMDMCTrackTrain.C:210
 MakeFMDMCTrackTrain.C:211
 MakeFMDMCTrackTrain.C:212
 MakeFMDMCTrackTrain.C:213
 MakeFMDMCTrackTrain.C:214
 MakeFMDMCTrackTrain.C:215
 MakeFMDMCTrackTrain.C:216
 MakeFMDMCTrackTrain.C:217
 MakeFMDMCTrackTrain.C:218
 MakeFMDMCTrackTrain.C:219
 MakeFMDMCTrackTrain.C:220
 MakeFMDMCTrackTrain.C:221
 MakeFMDMCTrackTrain.C:222
 MakeFMDMCTrackTrain.C:223
 MakeFMDMCTrackTrain.C:224
 MakeFMDMCTrackTrain.C:225
 MakeFMDMCTrackTrain.C:226
 MakeFMDMCTrackTrain.C:227
 MakeFMDMCTrackTrain.C:228
 MakeFMDMCTrackTrain.C:229
 MakeFMDMCTrackTrain.C:230
 MakeFMDMCTrackTrain.C:231
 MakeFMDMCTrackTrain.C:232
 MakeFMDMCTrackTrain.C:233
 MakeFMDMCTrackTrain.C:234
 MakeFMDMCTrackTrain.C:235
 MakeFMDMCTrackTrain.C:236
 MakeFMDMCTrackTrain.C:237
 MakeFMDMCTrackTrain.C:238
 MakeFMDMCTrackTrain.C:239
 MakeFMDMCTrackTrain.C:240
 MakeFMDMCTrackTrain.C:241
 MakeFMDMCTrackTrain.C:242
 MakeFMDMCTrackTrain.C:243
 MakeFMDMCTrackTrain.C:244
 MakeFMDMCTrackTrain.C:245
 MakeFMDMCTrackTrain.C:246
 MakeFMDMCTrackTrain.C:247
 MakeFMDMCTrackTrain.C:248
 MakeFMDMCTrackTrain.C:249
 MakeFMDMCTrackTrain.C:250
 MakeFMDMCTrackTrain.C:251
 MakeFMDMCTrackTrain.C:252
 MakeFMDMCTrackTrain.C:253
 MakeFMDMCTrackTrain.C:254
 MakeFMDMCTrackTrain.C:255
 MakeFMDMCTrackTrain.C:256
 MakeFMDMCTrackTrain.C:257
 MakeFMDMCTrackTrain.C:258
 MakeFMDMCTrackTrain.C:259
 MakeFMDMCTrackTrain.C:260
 MakeFMDMCTrackTrain.C:261
 MakeFMDMCTrackTrain.C:262
 MakeFMDMCTrackTrain.C:263
 MakeFMDMCTrackTrain.C:264
 MakeFMDMCTrackTrain.C:265
 MakeFMDMCTrackTrain.C:266
 MakeFMDMCTrackTrain.C:267
 MakeFMDMCTrackTrain.C:268
 MakeFMDMCTrackTrain.C:269
 MakeFMDMCTrackTrain.C:270
 MakeFMDMCTrackTrain.C:271
 MakeFMDMCTrackTrain.C:272
 MakeFMDMCTrackTrain.C:273
 MakeFMDMCTrackTrain.C:274
 MakeFMDMCTrackTrain.C:275
 MakeFMDMCTrackTrain.C:276
 MakeFMDMCTrackTrain.C:277
 MakeFMDMCTrackTrain.C:278
 MakeFMDMCTrackTrain.C:279
 MakeFMDMCTrackTrain.C:280
 MakeFMDMCTrackTrain.C:281