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

//====================================================================
/**
 * Analysis train to make Forward and Central MC corrections
 * 
 *
 * @ingroup pwglf_forward_mc
 * @ingroup pwglf_forward_trains_specific
 */
class MakeMCCorrTrain : 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)
   */
  MakeMCCorrTrain(const  char* name) 
    : TrainSetup(name)
  {
    fOptions.Set("type", "ESD");
    fOptions.Add("eff", "Effective SPD correction", false);
    fOptions.Add("max-strips", "NUMBER", 
                 "Maximum consequtive strips", 2); 
  }
protected:
  /** 
   * Create the tasks 
   * 
   * @param mgr  Analysis manager 
   */
  void CreateTasks(AliAnalysisManager* mgr)
  {
    // --- Output file name ------------------------------------------
    AliAnalysisManager::SetCommonFileName("forward_mccorr.root");

    // --- Load libraries/pars ---------------------------------------
    fRailway->LoadLibrary("PWGLFforward2");
    
    // --- Set load path ---------------------------------------------
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGLF/FORWARD/analysis2",
			     gROOT->GetMacroPath()));
  
    // --- Options ---------------------------------------------------
    Bool_t   spdEffective = fOptions.Has("eff");
    UShort_t maxStrips    = fOptions.AsInt("max-strips");

    // --- Check if this is MC ---------------------------------------
    if (!mgr->GetMCtruthEventHandler()) return;
    
    // --- Task to copy header information ---------------------------
    // gROOT->Macro("AddTaskCopyHeader.C");

    // --- Add the task ----------------------------------------------
    CoupleCar("AddTaskForwardMCCorr.C",Form("%d", maxStrips)); 

    // --- Add the task ----------------------------------------------
    CoupleCar("AddTaskCentralMCCorr.C", Form("%d", spdEffective));
  }
  //__________________________________________________________________
  /** 
   * 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 "MakeMCCorrTrain"; }
  //__________________________________________________________________
  /** 
   * Overloaded to create new Extract.C in the output 
   * directory
   * 
   * @param asShellScript 
   */
  void SaveSetup(Bool_t asShellScript)
  {
    TrainSetup::SaveSetup(asShellScript);

    SaveExtract();
    SaveSummarize();
    SaveDraw();
  }
  void SaveExtract()
  {
    std::ofstream f("Extract.C");
    if (!f) { 
      Error("SaveSetup", "Failed to open Extract.C");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "void Extract()\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/corrs/ExtractMCCorr.C\",fwd));\n"
      << "  ExtractMCCorr(\"forward_mccorr.root\");\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  /** 
   * 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 density\n"
      << "//   0x004     Vertex bins\n"
      << "//   0x008     Results\n"
      << "//   0x080     Central\n"
      << "//   0x100     Landscape\n"
      << "//   0x200     Pause\n"
      << "//\n"
      << "void Summarize(const char* filename=\"forward_mccorr.root\",\n"
      << "               UShort_t what=0x11F)\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/DrawMCCorrSummary.C\",fwd));\n"
      << "  DrawMCCorrSummary(filename,what);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  /** 
   * Write a ROOT script to draw overview
   * 
   */
  void SaveDraw()
  {
    std::ofstream f("Draw.C");
    if (!f) { 
      Error("SaveDraw", "Failed to open Draw.C script");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "// WHAT is a bit mask of\n"
      << "//   0x001     Event inspector\n"
      << "//   0x002     Track density\n"
      << "//   0x004     Vertex bins\n"
      << "//   0x008     Results\n"
      << "//   0x080     Central\n"
      << "//   0x100     Landscape\n"
      << "//   0x200     Pause\n"
      << "//\n"
      << "void Draw(bool details=false)\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/corrs/DrawCorrSecMap.C\",fwd));\n"
      << "  DrawCorrSecMap(999,0,0,999,\"fmd_corrections.root\",details);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  void PostShellCode(std::ostream& f)
  {
    f << "  echo \"=== Extracting Corrections ...\"\n"
      << "  aliroot -l -b -q ${prefix}Extract.C\n"
      << "  echo \"=== Summarizing results ...\"\n"
      << "  aliroot -l -b -q ${prefix}Summarize.C\n"
      << "  echo \"=== Draw results ...\"\n"
      << "  aliroot -l -b -q ${prefix}Draw.C\n"
      << "  if test x$dest = x ; then return ; fi\n"
      << "  echo \"=== Uploading to ${dest} ...\"\n"
      << "  aliroot -l -b -q Upload.C\\(\\\"${dest}\\\"\\);"
      << std::endl;
  }
};

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