ROOT logo
/**
 * @file   LocalRailway.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 18:59:42 2012
 * 
 * @brief  Local analysis helper
 * 
 * @ingroup pwglf_forward_trains_helper
 * 
 */
#ifndef LOCALHELPER_C
#define LOCALHELPER_C
#ifndef __CINT__
# include "Railway.C"
# include "ChainBuilder.C"
# include <TUrl.h>
# include <TString.h>
# include <TSystem.h>
# include <AliAnalysisManager.h>
#else
class TChain;
class Railway;
class TUrl;
#endif

// ===================================================================
/** 
 * Handle local analysis jobs 
 *
 * This is triggered by URIs of the form 
 *
 * @code 
 * local:///<datadir>[?<options>][#treeName]
 * local:///<collection>[?<options>][#treeName]
 * local:///<file>[?<options>][#treeName]
 * @endcode 
 *
 * where 
 *
 * <dl>
 *   <dt><tt>&lt;datadir&gt;</tt></dt>
 *   <dd>is the base directory holding data files </dd>
 *   <dt><tt>&lt;collection&gt;</tt></dt>
 *   <dd>is an ASCII or XML list of input sources</dd>
 *   <dt><tt>&lt;file&gt;</tt></dt>
 *   <dd>is a single ROOT file</dd>
 *   <dt><tt>&lt;options&gt;</tt></dt>
 *   <dd>A &amp; separated list of options
 *     <dl>
 *       <dt><tt>recursive</tt></dt>
 *       <dd>Scan &lt;datadir&gt; recursively</dd>
 *       <dt><tt>mc</tt></dt>
 *       <dd>Scan also for MC files (<tt>galice.root</tt>, 
 *          <tt>Kinematics.root</tt>, and <tt>TrackRefs.root</tt>) when 
 *          scanning &lt;datadir&gt;</dd>
 *       <dt><tt>pattern=&lt;GLOB&gt;</tt></dt>
 *       <dd>Shell glob pattern that files must check when scanning 
 *         &lt;datadir&gt;</dd>
 *      </dl>
 *   </dd>
 * </dl>
 *       
 * @ingroup pwglf_forward_trains_helper
 */
struct LocalRailway : public Railway
{
  /** 
   * Constructor 
   * 
   * @param url   Url 
   * @param verbose Verbosity level 
   */
  LocalRailway(const TUrl& url, Int_t verbose)
    : Railway(url, verbose), fChain(0)
  {
    fOptions.Add("recursive","Scan recursive");
    fOptions.Add("pattern",  "GLOB", "File name pattern", "*.root");
  }
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  LocalRailway(const LocalRailway& o) 
    : Railway(o), fChain(o.fChain)
  {}
  /** 
   * Assignment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  LocalRailway& operator=(const LocalRailway& o) 
  {
    if (&o == this) return *this;
    Railway::operator=(o);
    fChain = o.fChain;
    return *this;
  }
  /** 
   * Destructor 
   */
  virtual ~LocalRailway() {}
  /** 
   * Load a library 
   * 
   * @param name    Name of library 
   * 
   * @return true on success
   */
  virtual Bool_t LoadLibrary(const TString& name, Bool_t)
  {
    Int_t ret = gSystem->Load(MakeLibraryName(name));
    return ret >= 0;
  }
  /** 
   * Get the execution mode 
   *
   * @return Always kLocal
   */
  virtual UShort_t Mode() const { return kLocal; }
  /**
   * Get the mode string used for AliAnalysisManager::StartAnalysis
   */
  virtual const char* ModeString() const { return "local"; }
  /** 
   * Set-up done before task set-ups 
   * 
   * @return true on success 
   */
  virtual Bool_t PreSetup() 
  {
    return true;
  }
  /** 
   * Set-up done after the task set-ups 
   *
   * @return true on success 
   */
  virtual Bool_t PostSetup() 
  {
    TString treeName(fUrl.GetAnchor());
    TString pattern(fOptions.Has("pattern") ? fOptions.Get("pattern") : "");
    Bool_t  recursive = fOptions.Has("recursive");
    Bool_t  mc        = fOptions.Has("mc");
    TString file      = fUrl.GetFile();
    if (file.IsNull()) {
      Error("PostSetup", "No input source specified");
      return false;
    }

    pattern.ReplaceAll("@", "#");
    fChain = ChainBuilder::Create(file, treeName, pattern, mc, recursive,
				  fVerbose);
    if (!fChain) { 
      Error("PostSetup", "No chain defined "
	    "(src=%s, treeName=%s, pattern=%s, mc=%s, recursive=%s)", 
	    file.Data(), treeName.Data(), pattern.Data(), 
	    (mc ? "true" : "false"), (recursive ? "true" : "false"));
      return false;
    }

    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    if (!mgr) { 
      Error("PostSetup", "No analysis manager defined");
      return false;
    }
    return true;
  };
  /** 
   * Start the analysis 
   * 
   * @param nEvents Number of events to analyse 
   * 
   * @return The return value of AliAnalysisManager::StartAnalysis
   */
  virtual Long64_t Run(Long64_t nEvents=-1) 
  {
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    
    if (nEvents < 0) nEvents = fChain->GetEntries();
    return mgr->StartAnalysis(fUrl.GetProtocol(), fChain, nEvents);
  }
  /** 
   * @return URL help string
   */
  virtual const Char_t* UrlHelp() const 
  {
    return "local://<datadir or list>[?<options>][#<treeName>]";
  }
  /** 
   * @return Short description 
   */
  virtual const char* Desc() const { return "Local"; }
  TChain* fChain; // Our chain
};
#endif
//
// EOF
//
 LocalRailway.C:1
 LocalRailway.C:2
 LocalRailway.C:3
 LocalRailway.C:4
 LocalRailway.C:5
 LocalRailway.C:6
 LocalRailway.C:7
 LocalRailway.C:8
 LocalRailway.C:9
 LocalRailway.C:10
 LocalRailway.C:11
 LocalRailway.C:12
 LocalRailway.C:13
 LocalRailway.C:14
 LocalRailway.C:15
 LocalRailway.C:16
 LocalRailway.C:17
 LocalRailway.C:18
 LocalRailway.C:19
 LocalRailway.C:20
 LocalRailway.C:21
 LocalRailway.C:22
 LocalRailway.C:23
 LocalRailway.C:24
 LocalRailway.C:25
 LocalRailway.C:26
 LocalRailway.C:27
 LocalRailway.C:28
 LocalRailway.C:29
 LocalRailway.C:30
 LocalRailway.C:31
 LocalRailway.C:32
 LocalRailway.C:33
 LocalRailway.C:34
 LocalRailway.C:35
 LocalRailway.C:36
 LocalRailway.C:37
 LocalRailway.C:38
 LocalRailway.C:39
 LocalRailway.C:40
 LocalRailway.C:41
 LocalRailway.C:42
 LocalRailway.C:43
 LocalRailway.C:44
 LocalRailway.C:45
 LocalRailway.C:46
 LocalRailway.C:47
 LocalRailway.C:48
 LocalRailway.C:49
 LocalRailway.C:50
 LocalRailway.C:51
 LocalRailway.C:52
 LocalRailway.C:53
 LocalRailway.C:54
 LocalRailway.C:55
 LocalRailway.C:56
 LocalRailway.C:57
 LocalRailway.C:58
 LocalRailway.C:59
 LocalRailway.C:60
 LocalRailway.C:61
 LocalRailway.C:62
 LocalRailway.C:63
 LocalRailway.C:64
 LocalRailway.C:65
 LocalRailway.C:66
 LocalRailway.C:67
 LocalRailway.C:68
 LocalRailway.C:69
 LocalRailway.C:70
 LocalRailway.C:71
 LocalRailway.C:72
 LocalRailway.C:73
 LocalRailway.C:74
 LocalRailway.C:75
 LocalRailway.C:76
 LocalRailway.C:77
 LocalRailway.C:78
 LocalRailway.C:79
 LocalRailway.C:80
 LocalRailway.C:81
 LocalRailway.C:82
 LocalRailway.C:83
 LocalRailway.C:84
 LocalRailway.C:85
 LocalRailway.C:86
 LocalRailway.C:87
 LocalRailway.C:88
 LocalRailway.C:89
 LocalRailway.C:90
 LocalRailway.C:91
 LocalRailway.C:92
 LocalRailway.C:93
 LocalRailway.C:94
 LocalRailway.C:95
 LocalRailway.C:96
 LocalRailway.C:97
 LocalRailway.C:98
 LocalRailway.C:99
 LocalRailway.C:100
 LocalRailway.C:101
 LocalRailway.C:102
 LocalRailway.C:103
 LocalRailway.C:104
 LocalRailway.C:105
 LocalRailway.C:106
 LocalRailway.C:107
 LocalRailway.C:108
 LocalRailway.C:109
 LocalRailway.C:110
 LocalRailway.C:111
 LocalRailway.C:112
 LocalRailway.C:113
 LocalRailway.C:114
 LocalRailway.C:115
 LocalRailway.C:116
 LocalRailway.C:117
 LocalRailway.C:118
 LocalRailway.C:119
 LocalRailway.C:120
 LocalRailway.C:121
 LocalRailway.C:122
 LocalRailway.C:123
 LocalRailway.C:124
 LocalRailway.C:125
 LocalRailway.C:126
 LocalRailway.C:127
 LocalRailway.C:128
 LocalRailway.C:129
 LocalRailway.C:130
 LocalRailway.C:131
 LocalRailway.C:132
 LocalRailway.C:133
 LocalRailway.C:134
 LocalRailway.C:135
 LocalRailway.C:136
 LocalRailway.C:137
 LocalRailway.C:138
 LocalRailway.C:139
 LocalRailway.C:140
 LocalRailway.C:141
 LocalRailway.C:142
 LocalRailway.C:143
 LocalRailway.C:144
 LocalRailway.C:145
 LocalRailway.C:146
 LocalRailway.C:147
 LocalRailway.C:148
 LocalRailway.C:149
 LocalRailway.C:150
 LocalRailway.C:151
 LocalRailway.C:152
 LocalRailway.C:153
 LocalRailway.C:154
 LocalRailway.C:155
 LocalRailway.C:156
 LocalRailway.C:157
 LocalRailway.C:158
 LocalRailway.C:159
 LocalRailway.C:160
 LocalRailway.C:161
 LocalRailway.C:162
 LocalRailway.C:163
 LocalRailway.C:164
 LocalRailway.C:165
 LocalRailway.C:166
 LocalRailway.C:167
 LocalRailway.C:168
 LocalRailway.C:169
 LocalRailway.C:170
 LocalRailway.C:171
 LocalRailway.C:172
 LocalRailway.C:173
 LocalRailway.C:174
 LocalRailway.C:175
 LocalRailway.C:176
 LocalRailway.C:177
 LocalRailway.C:178
 LocalRailway.C:179
 LocalRailway.C:180
 LocalRailway.C:181
 LocalRailway.C:182
 LocalRailway.C:183
 LocalRailway.C:184
 LocalRailway.C:185
 LocalRailway.C:186
 LocalRailway.C:187
 LocalRailway.C:188
 LocalRailway.C:189
 LocalRailway.C:190
 LocalRailway.C:191
 LocalRailway.C:192
 LocalRailway.C:193
 LocalRailway.C:194
 LocalRailway.C:195
 LocalRailway.C:196
 LocalRailway.C:197
 LocalRailway.C:198
 LocalRailway.C:199
 LocalRailway.C:200
 LocalRailway.C:201
 LocalRailway.C:202