ROOT logo
/**
 * @file   MakeAODTrain.C
 * @author Christian Holm Christensen <cholm@dalsgaard.hehi.nbi.dk>
 * @date   Tue Jul 12 10:05:30 2011
 * 
 * @brief  Run first pass analysis - make AOD tree
 * 
 * @ingroup pwglf_forward_trains_specific
 */
#include "TrainSetup.C"
#include <sstream>

//====================================================================
/**
 * Analysis train to make Forward and Central multiplicity
 * 
 *
 * @ingroup pwglf_forward_aod
 * @ingroup pwglf_forward_trains_specific
 */
class MakeAODTrain : public TrainSetup
{
public:
  /** 
   * Constructor. 
   * 
   * @param name     Name of train (free form)
   */
  MakeAODTrain(const  TString& name) 
    : TrainSetup(name)
  {
    fOptions.Add("run",   "NUMBER",  "Run number for corrs", 0);
    fOptions.Add("sys",   "SYSTEM",  "1:pp, 2:PbPb, 3:pPb", 0);
    fOptions.Add("snn",   "ENERGY",  "Center of mass energy in GeV", 0);
    fOptions.Add("field", "STRENGTH","L3 field strength in kG", 0);
    fOptions.Add("forward-config", "FILE", "Forward configuration", 
		 "ForwardAODConfig.C");
    fOptions.Add("central-config", "FILE", "Central configuration", 
		 "CentralAODConfig.C");
    fOptions.Add("cent",  "Use centrality");
    fOptions.Add("tpc-ep", "Use TPC event plane");
    fOptions.Add("satelitte", "Use satelitte interactions");
    fOptions.Add("corr", "DIR", "Corrections dir", "");
    fOptions.Add("secmap", "Use secondary maps to correct", false);
    fOptions.Add("mc-tracks", "Enable MC track filter", false);
    fOptions.Add("max-strips", "NUMBER", 
                 "Maximum consequtive strips (MC)", 2); 
    fOptions.Set("type", "ESD");
  }
protected:
  /** 
   * Create the tasks 
   * 
   * @param mgr  Analysis manager 
   */
  void CreateTasks(AliAnalysisManager* mgr)
  {
    // --- Output file name ------------------------------------------
    AliAnalysisManager::SetCommonFileName("forward.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()));

    // --- Check if this is MC ---------------------------------------
    Bool_t mc = mgr->GetMCtruthEventHandler() != 0;
    
    // --- Add TPC eventplane task
    if (fOptions.Has("tpc-ep")) CoupleCar("AddTaskEventplane.C","");

    // --- Task to copy header information ---------------------------
    CoupleCar("AddTaskCopyHeader.C", "");

    // --- Get options -----------------------------------------------
    ULong_t  run  = fOptions.AsInt("run", 0);
    UShort_t sys  = fOptions.AsInt("sys", 0);
    UShort_t sNN  = fOptions.AsInt("snn", 0);
    UShort_t fld  = fOptions.AsInt("field", 0);
    UShort_t mSt  = fOptions.AsInt("max-strips", 2);
    Bool_t   sec  = fOptions.Has("secmap");
    TString  cor  = "";
    if (fOptions.Has("corr")) cor = fOptions.Get("corr"); 
    
    // --- Add the task ----------------------------------------------
    TString fwdConfig = fOptions.Get("forward-config");
    AliAnalysisTask* fwd = CoupleCar("AddTaskForwardMult.C",
				   Form("%d,%ld,%d,%d,%d,\"%s\",\"%s\"", 
					mc, run, sys, sNN, fld, 
					fwdConfig.Data(), cor.Data()));
    if (!fwd)
      Fatal("CoupleCars", "Failed to add forward task");

    gROOT->ProcessLine(Form("((AliForwardMultiplicityBase*)%p)"
			    "->GetCorrections().SetUseSecondaryMap(%d)",
			    fwd, sec));
    if (mc) { 
      gROOT->ProcessLine(Form("((AliForwardMCMultiplicityTask*)%p)"
			      "->GetTrackDensity()"
			      ".SetMaxConsequtiveStrips(%d)", 
			      fwd, mSt));
    }
    fRailway->LoadAux(gSystem->Which(gROOT->GetMacroPath(), fwdConfig), true);

    // --- Add the task ----------------------------------------------
    TString cenConfig = fOptions.Get("central-config");
    AliAnalysisTask* cen = CoupleCar("AddTaskCentralMult.C",
				   Form("%d,%ld,%d,%d,%d,\"%s\",\"%s\"", 
					  mc, run, sys, sNN, fld, 
					  cenConfig.Data(), cor.Data()));
    if (cen)
      fRailway->LoadAux(gSystem->Which(gROOT->GetMacroPath(), cenConfig), true);

    // --- Add MC particle task --------------------------------------
    if (mc && fOptions.Has("mc-tracks")) 
      CoupleCar("AddTaskMCParticleFilter.C","");

    if (!cor.IsNull()) {
      if (fwd) 
	fRailway->LoadAux(Form("%s/fmd_corrections.root",cor.Data()), true);
      if (cen) 
	fRailway->LoadAux(Form("%s/spd_corrections.root",cor.Data()), true);
    }
  }
  //__________________________________________________________________
  /** 
   * 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);
  }
  //__________________________________________________________________
  /** 
   * Create the centrality selection only if requested
   * 
   * @param mc  Monte-Carlo truth flag 
   * @param mgr Manager
   */
  void CreateCentralitySelection(Bool_t mc)
  {
    if (!fOptions.Has("cent")) return;
    TrainSetup::CreateCentralitySelection(mc);
  }
  //__________________________________________________________________
  const char* ClassName() const { return "MakeAODTrain"; }
  //__________________________________________________________________
  /** 
   * Overloaded to create new dNdeta.C and dndeta.sh in the output 
   * directory
   * 
   * @param asShellScript 
   */
  void SaveSetup(Bool_t asShellScript)
  {
    TrainSetup::SaveSetup(asShellScript);
    SaveSummarize();
    SavedNdeta(asShellScript);

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

    SaveDownloadAODs();
  }
  void SavedNdeta(Bool_t asShellScript)
  {
    if (!fRailway) { 
      Warning("MakeAODTrain::SaveSetup", 
	      "Cannot make dNdeta.C script without helper");
      return;
    }
    
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    Bool_t              mc  = mgr && (mgr->GetMCtruthEventHandler() != 0);
    OptionList          uopts(fRailway->Options());
    OptionList          opts(fOptions);
    TString             cls("MakedNdetaTrain");
    TString             name(fName);
    Int_t               sys = fOptions.AsInt("sys", 0);
    if (name.Contains("aod")) name.ReplaceAll("aod", "dndeta");
    else                      name.Append("_dndeta");
    opts.Remove("run");
    opts.Remove("sys");
    opts.Remove("snn");
    opts.Remove("field");
    opts.Remove("bare-ps");
    opts.Remove("tpc-ep");
    opts.Remove("corr");
    opts.Add("satellite", "Restrict analysis to satellite events", false);
    opts.Add("trig", "TRIGGER", "Trigger type", "INEL");
    opts.Add("vzMin", "CENTIMETER", "Lower bound on Ip Z", -10.);
    opts.Add("vzMax", "CENTIMETER", "Upper bound on Ip Z", +10.);
    opts.Add("scheme", "FLAGS", "Normalization scheme", "TRIGGER,EVENT");
    opts.Add("trigEff", "EFFICIENCY", "Trigger efficiency", 1.);
    opts.Add("trigEff0", "EFFICIENCY", "0-bin trigger efficiency", 1.);
    opts.Add("mc", "Also analyse MC truth", fRailway->IsMC());
    opts.Add("truth-config", "FILE", "MC-Truth configuration", "");
    
    // Rewrite our URL 
    TString outString = fRailway->OutputLocation();
    if (outString.IsNull()) outString = fEscapedName;
    TUrl    outUrl(outString);
    
    if (uopts.Find("pattern")) // && outString.EndsWith("AliAOD.root")) 
      uopts.Set("pattern", "*/AliAOD.root");
    if (uopts.Find("concat")) uopts.Set("concat", true);

    std::stringstream s;
    uopts.Store(s, "", "&", false, true);
    outUrl.SetOptions(s.str().c_str());
      
    const char* defConfig="$ALICE_ROOT/PWGLF/FORWARD/analysis2/dNdetaConfig.C";
    opts.Set("url", outUrl.GetUrl());
    opts.Set("type", "AOD");
    opts.Set("forward-config",defConfig);
    opts.Set("central-config",defConfig);
    opts.Set("truth-config",defConfig);
    if (!fDatimeString.IsNull()) opts.Set("date", fDatimeString);

    if (sys != 1) {
      opts.Set("cent", "default");
      opts.Set("trig", "INEL");
      opts.Set("scheme", "default");
      SaveSetupROOT("dNdeta", cls, name, opts, &uopts);
      if (asShellScript) 
	SaveSetupShell("dndeta", cls, name, opts, &uopts);
    }
    else {
      name.ReplaceAll("dndeta", "dndeta_inel");
      SaveSetupROOT("dNdetaINEL", cls, name, opts, &uopts);
      if (asShellScript) 
	SaveSetupShell("dndeta_inel", cls, name, opts, &uopts);
      
      name.ReplaceAll("inel", "nsd");
      opts.Set("trig", "V0AND");
      SaveSetupROOT("dNdetaNSD", cls, name, opts, &uopts);
      if (asShellScript) 
	SaveSetupShell("dndeta_nsd", cls, name, opts, &uopts);
      
      name.ReplaceAll("nsd", "inelgt0");
      opts.Set("trig", "INELGT0");
      SaveSetupROOT("dNdetaINELGt0", cls, name, opts, &uopts);
      if (asShellScript) 
	SaveSetupShell("dndeta_inelgt0", cls, name, opts, &uopts);
    }
  }
  /** 
   * 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     Sharing filter\n"
      << "//   0x004     Density calculator\n"
      << "//   0x008     Corrector\n"
      << "//   0x010     Histogram collector\n"
      << "//   0x020     Analysis step cartoon\n"
      << "//   0x040     Results\n"
      << "//   0x080     Central\n"
      << "//   0x100     Landscape\n"
      << "//   0x200     Pause\n"
      << "//\n"
      << "void Summarize(const char* filename=\"forward.root\",\n"
      << "               UShort_t what=0x1FF)\n"
      << "{\n"
      << "  const char* fwd=\"$ALICE_ROOT/PWGLF/FORWARD/analysis2\";\n"
      << "  gROOT->LoadMacro(Form(\"%s/DrawAODSummary.C\",fwd));\n"
      << "  DrawAODSummary(filename,what);\n"
      << "}\n"
      << "// EOF" << std::endl;
    f.close();
  }
  /** 
   * Make a ROOT Script to download the generated AODs
   * 
   */
  void SaveDownloadAODs()
  {
    std::ofstream f("DownloadAODs.C");
    if (!f) { 
      Error("SaveDownloadAODs", "Failed to open DownloadAODs.C");
      return;
    }
    f << "// Generated by " << ClassName() << "\n"
      << "void DownloadAODs(Bool_t force=false)\n"
      << "{\n"
      << "  if (!TGrid::Connect(\"alien://\")) {\n"
      << "    Error(\"DownloadAODs\",\"Failed to connect to AliEn\");\n"
      << "    return;\n"
      << "  }\n\n"
      << "  TString dir(\"" << fRailway->OutputPath() << "\");\n"
      << "  TString pat(\"*/AliAOD.root\");\n"
      << "  TGridResult* r = gGrid->Query(dir,pat);\n"
      << "  if (!r) {\n"
      << "    Error(\"DownloadAODs\",\"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(\"AliAOD_%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(\"DownloadAODs\",\"Failed to copy %s -> %s\",\n"
      << "               path.Data(), out.Data());\n"
      << "       continue;\n"
      << "     }\n"
      << "   }\n"
      << "}\n"
      << "// EOF\n"
      << 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
//
 MakeAODTrain.C:1
 MakeAODTrain.C:2
 MakeAODTrain.C:3
 MakeAODTrain.C:4
 MakeAODTrain.C:5
 MakeAODTrain.C:6
 MakeAODTrain.C:7
 MakeAODTrain.C:8
 MakeAODTrain.C:9
 MakeAODTrain.C:10
 MakeAODTrain.C:11
 MakeAODTrain.C:12
 MakeAODTrain.C:13
 MakeAODTrain.C:14
 MakeAODTrain.C:15
 MakeAODTrain.C:16
 MakeAODTrain.C:17
 MakeAODTrain.C:18
 MakeAODTrain.C:19
 MakeAODTrain.C:20
 MakeAODTrain.C:21
 MakeAODTrain.C:22
 MakeAODTrain.C:23
 MakeAODTrain.C:24
 MakeAODTrain.C:25
 MakeAODTrain.C:26
 MakeAODTrain.C:27
 MakeAODTrain.C:28
 MakeAODTrain.C:29
 MakeAODTrain.C:30
 MakeAODTrain.C:31
 MakeAODTrain.C:32
 MakeAODTrain.C:33
 MakeAODTrain.C:34
 MakeAODTrain.C:35
 MakeAODTrain.C:36
 MakeAODTrain.C:37
 MakeAODTrain.C:38
 MakeAODTrain.C:39
 MakeAODTrain.C:40
 MakeAODTrain.C:41
 MakeAODTrain.C:42
 MakeAODTrain.C:43
 MakeAODTrain.C:44
 MakeAODTrain.C:45
 MakeAODTrain.C:46
 MakeAODTrain.C:47
 MakeAODTrain.C:48
 MakeAODTrain.C:49
 MakeAODTrain.C:50
 MakeAODTrain.C:51
 MakeAODTrain.C:52
 MakeAODTrain.C:53
 MakeAODTrain.C:54
 MakeAODTrain.C:55
 MakeAODTrain.C:56
 MakeAODTrain.C:57
 MakeAODTrain.C:58
 MakeAODTrain.C:59
 MakeAODTrain.C:60
 MakeAODTrain.C:61
 MakeAODTrain.C:62
 MakeAODTrain.C:63
 MakeAODTrain.C:64
 MakeAODTrain.C:65
 MakeAODTrain.C:66
 MakeAODTrain.C:67
 MakeAODTrain.C:68
 MakeAODTrain.C:69
 MakeAODTrain.C:70
 MakeAODTrain.C:71
 MakeAODTrain.C:72
 MakeAODTrain.C:73
 MakeAODTrain.C:74
 MakeAODTrain.C:75
 MakeAODTrain.C:76
 MakeAODTrain.C:77
 MakeAODTrain.C:78
 MakeAODTrain.C:79
 MakeAODTrain.C:80
 MakeAODTrain.C:81
 MakeAODTrain.C:82
 MakeAODTrain.C:83
 MakeAODTrain.C:84
 MakeAODTrain.C:85
 MakeAODTrain.C:86
 MakeAODTrain.C:87
 MakeAODTrain.C:88
 MakeAODTrain.C:89
 MakeAODTrain.C:90
 MakeAODTrain.C:91
 MakeAODTrain.C:92
 MakeAODTrain.C:93
 MakeAODTrain.C:94
 MakeAODTrain.C:95
 MakeAODTrain.C:96
 MakeAODTrain.C:97
 MakeAODTrain.C:98
 MakeAODTrain.C:99
 MakeAODTrain.C:100
 MakeAODTrain.C:101
 MakeAODTrain.C:102
 MakeAODTrain.C:103
 MakeAODTrain.C:104
 MakeAODTrain.C:105
 MakeAODTrain.C:106
 MakeAODTrain.C:107
 MakeAODTrain.C:108
 MakeAODTrain.C:109
 MakeAODTrain.C:110
 MakeAODTrain.C:111
 MakeAODTrain.C:112
 MakeAODTrain.C:113
 MakeAODTrain.C:114
 MakeAODTrain.C:115
 MakeAODTrain.C:116
 MakeAODTrain.C:117
 MakeAODTrain.C:118
 MakeAODTrain.C:119
 MakeAODTrain.C:120
 MakeAODTrain.C:121
 MakeAODTrain.C:122
 MakeAODTrain.C:123
 MakeAODTrain.C:124
 MakeAODTrain.C:125
 MakeAODTrain.C:126
 MakeAODTrain.C:127
 MakeAODTrain.C:128
 MakeAODTrain.C:129
 MakeAODTrain.C:130
 MakeAODTrain.C:131
 MakeAODTrain.C:132
 MakeAODTrain.C:133
 MakeAODTrain.C:134
 MakeAODTrain.C:135
 MakeAODTrain.C:136
 MakeAODTrain.C:137
 MakeAODTrain.C:138
 MakeAODTrain.C:139
 MakeAODTrain.C:140
 MakeAODTrain.C:141
 MakeAODTrain.C:142
 MakeAODTrain.C:143
 MakeAODTrain.C:144
 MakeAODTrain.C:145
 MakeAODTrain.C:146
 MakeAODTrain.C:147
 MakeAODTrain.C:148
 MakeAODTrain.C:149
 MakeAODTrain.C:150
 MakeAODTrain.C:151
 MakeAODTrain.C:152
 MakeAODTrain.C:153
 MakeAODTrain.C:154
 MakeAODTrain.C:155
 MakeAODTrain.C:156
 MakeAODTrain.C:157
 MakeAODTrain.C:158
 MakeAODTrain.C:159
 MakeAODTrain.C:160
 MakeAODTrain.C:161
 MakeAODTrain.C:162
 MakeAODTrain.C:163
 MakeAODTrain.C:164
 MakeAODTrain.C:165
 MakeAODTrain.C:166
 MakeAODTrain.C:167
 MakeAODTrain.C:168
 MakeAODTrain.C:169
 MakeAODTrain.C:170
 MakeAODTrain.C:171
 MakeAODTrain.C:172
 MakeAODTrain.C:173
 MakeAODTrain.C:174
 MakeAODTrain.C:175
 MakeAODTrain.C:176
 MakeAODTrain.C:177
 MakeAODTrain.C:178
 MakeAODTrain.C:179
 MakeAODTrain.C:180
 MakeAODTrain.C:181
 MakeAODTrain.C:182
 MakeAODTrain.C:183
 MakeAODTrain.C:184
 MakeAODTrain.C:185
 MakeAODTrain.C:186
 MakeAODTrain.C:187
 MakeAODTrain.C:188
 MakeAODTrain.C:189
 MakeAODTrain.C:190
 MakeAODTrain.C:191
 MakeAODTrain.C:192
 MakeAODTrain.C:193
 MakeAODTrain.C:194
 MakeAODTrain.C:195
 MakeAODTrain.C:196
 MakeAODTrain.C:197
 MakeAODTrain.C:198
 MakeAODTrain.C:199
 MakeAODTrain.C:200
 MakeAODTrain.C:201
 MakeAODTrain.C:202
 MakeAODTrain.C:203
 MakeAODTrain.C:204
 MakeAODTrain.C:205
 MakeAODTrain.C:206
 MakeAODTrain.C:207
 MakeAODTrain.C:208
 MakeAODTrain.C:209
 MakeAODTrain.C:210
 MakeAODTrain.C:211
 MakeAODTrain.C:212
 MakeAODTrain.C:213
 MakeAODTrain.C:214
 MakeAODTrain.C:215
 MakeAODTrain.C:216
 MakeAODTrain.C:217
 MakeAODTrain.C:218
 MakeAODTrain.C:219
 MakeAODTrain.C:220
 MakeAODTrain.C:221
 MakeAODTrain.C:222
 MakeAODTrain.C:223
 MakeAODTrain.C:224
 MakeAODTrain.C:225
 MakeAODTrain.C:226
 MakeAODTrain.C:227
 MakeAODTrain.C:228
 MakeAODTrain.C:229
 MakeAODTrain.C:230
 MakeAODTrain.C:231
 MakeAODTrain.C:232
 MakeAODTrain.C:233
 MakeAODTrain.C:234
 MakeAODTrain.C:235
 MakeAODTrain.C:236
 MakeAODTrain.C:237
 MakeAODTrain.C:238
 MakeAODTrain.C:239
 MakeAODTrain.C:240
 MakeAODTrain.C:241
 MakeAODTrain.C:242
 MakeAODTrain.C:243
 MakeAODTrain.C:244
 MakeAODTrain.C:245
 MakeAODTrain.C:246
 MakeAODTrain.C:247
 MakeAODTrain.C:248
 MakeAODTrain.C:249
 MakeAODTrain.C:250
 MakeAODTrain.C:251
 MakeAODTrain.C:252
 MakeAODTrain.C:253
 MakeAODTrain.C:254
 MakeAODTrain.C:255
 MakeAODTrain.C:256
 MakeAODTrain.C:257
 MakeAODTrain.C:258
 MakeAODTrain.C:259
 MakeAODTrain.C:260
 MakeAODTrain.C:261
 MakeAODTrain.C:262
 MakeAODTrain.C:263
 MakeAODTrain.C:264
 MakeAODTrain.C:265
 MakeAODTrain.C:266
 MakeAODTrain.C:267
 MakeAODTrain.C:268
 MakeAODTrain.C:269
 MakeAODTrain.C:270
 MakeAODTrain.C:271
 MakeAODTrain.C:272
 MakeAODTrain.C:273
 MakeAODTrain.C:274
 MakeAODTrain.C:275
 MakeAODTrain.C:276
 MakeAODTrain.C:277
 MakeAODTrain.C:278
 MakeAODTrain.C:279
 MakeAODTrain.C:280
 MakeAODTrain.C:281
 MakeAODTrain.C:282
 MakeAODTrain.C:283
 MakeAODTrain.C:284
 MakeAODTrain.C:285
 MakeAODTrain.C:286
 MakeAODTrain.C:287
 MakeAODTrain.C:288
 MakeAODTrain.C:289
 MakeAODTrain.C:290
 MakeAODTrain.C:291
 MakeAODTrain.C:292
 MakeAODTrain.C:293
 MakeAODTrain.C:294
 MakeAODTrain.C:295
 MakeAODTrain.C:296
 MakeAODTrain.C:297
 MakeAODTrain.C:298
 MakeAODTrain.C:299
 MakeAODTrain.C:300
 MakeAODTrain.C:301
 MakeAODTrain.C:302
 MakeAODTrain.C:303
 MakeAODTrain.C:304
 MakeAODTrain.C:305
 MakeAODTrain.C:306
 MakeAODTrain.C:307
 MakeAODTrain.C:308
 MakeAODTrain.C:309
 MakeAODTrain.C:310
 MakeAODTrain.C:311
 MakeAODTrain.C:312
 MakeAODTrain.C:313
 MakeAODTrain.C:314
 MakeAODTrain.C:315
 MakeAODTrain.C:316
 MakeAODTrain.C:317
 MakeAODTrain.C:318
 MakeAODTrain.C:319
 MakeAODTrain.C:320
 MakeAODTrain.C:321
 MakeAODTrain.C:322
 MakeAODTrain.C:323
 MakeAODTrain.C:324
 MakeAODTrain.C:325
 MakeAODTrain.C:326
 MakeAODTrain.C:327
 MakeAODTrain.C:328
 MakeAODTrain.C:329
 MakeAODTrain.C:330
 MakeAODTrain.C:331
 MakeAODTrain.C:332
 MakeAODTrain.C:333
 MakeAODTrain.C:334
 MakeAODTrain.C:335
 MakeAODTrain.C:336
 MakeAODTrain.C:337
 MakeAODTrain.C:338
 MakeAODTrain.C:339
 MakeAODTrain.C:340
 MakeAODTrain.C:341
 MakeAODTrain.C:342
 MakeAODTrain.C:343
 MakeAODTrain.C:344
 MakeAODTrain.C:345
 MakeAODTrain.C:346
 MakeAODTrain.C:347
 MakeAODTrain.C:348
 MakeAODTrain.C:349
 MakeAODTrain.C:350
 MakeAODTrain.C:351
 MakeAODTrain.C:352
 MakeAODTrain.C:353
 MakeAODTrain.C:354
 MakeAODTrain.C:355
 MakeAODTrain.C:356
 MakeAODTrain.C:357
 MakeAODTrain.C:358
 MakeAODTrain.C:359
 MakeAODTrain.C:360
 MakeAODTrain.C:361
 MakeAODTrain.C:362
 MakeAODTrain.C:363
 MakeAODTrain.C:364