ROOT logo
/**
 * @file   LocalHelper.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 "Helper.C"
# include "ChainBuilder.C"
# include <TUrl.h>
# include <TString.h>
# include <TSystem.h>
# include <AliAnalysisManager.h>
#else
class TChain;
class Helper;
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 LocalHelper : public Helper
{
  /** 
   * Constructor 
   * 
   * @param url   Url 
   * @param verbose Verbosity level 
   */
  LocalHelper(const TUrl& url, Int_t verbose)
    : Helper(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 
   */
  LocalHelper(const LocalHelper& o) 
    : Helper(o), fChain(o.fChain)
  {}
  /** 
   * Assignment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  LocalHelper& operator=(const LocalHelper& o) 
  {
    if (&o == this) return *this;
    Helper::operator=(o);
    fChain = o.fChain;
    return *this;
  }
  /** 
   * Destructor 
   */
  virtual ~LocalHelper() {}
  /** 
   * 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
//
 LocalHelper.C:1
 LocalHelper.C:2
 LocalHelper.C:3
 LocalHelper.C:4
 LocalHelper.C:5
 LocalHelper.C:6
 LocalHelper.C:7
 LocalHelper.C:8
 LocalHelper.C:9
 LocalHelper.C:10
 LocalHelper.C:11
 LocalHelper.C:12
 LocalHelper.C:13
 LocalHelper.C:14
 LocalHelper.C:15
 LocalHelper.C:16
 LocalHelper.C:17
 LocalHelper.C:18
 LocalHelper.C:19
 LocalHelper.C:20
 LocalHelper.C:21
 LocalHelper.C:22
 LocalHelper.C:23
 LocalHelper.C:24
 LocalHelper.C:25
 LocalHelper.C:26
 LocalHelper.C:27
 LocalHelper.C:28
 LocalHelper.C:29
 LocalHelper.C:30
 LocalHelper.C:31
 LocalHelper.C:32
 LocalHelper.C:33
 LocalHelper.C:34
 LocalHelper.C:35
 LocalHelper.C:36
 LocalHelper.C:37
 LocalHelper.C:38
 LocalHelper.C:39
 LocalHelper.C:40
 LocalHelper.C:41
 LocalHelper.C:42
 LocalHelper.C:43
 LocalHelper.C:44
 LocalHelper.C:45
 LocalHelper.C:46
 LocalHelper.C:47
 LocalHelper.C:48
 LocalHelper.C:49
 LocalHelper.C:50
 LocalHelper.C:51
 LocalHelper.C:52
 LocalHelper.C:53
 LocalHelper.C:54
 LocalHelper.C:55
 LocalHelper.C:56
 LocalHelper.C:57
 LocalHelper.C:58
 LocalHelper.C:59
 LocalHelper.C:60
 LocalHelper.C:61
 LocalHelper.C:62
 LocalHelper.C:63
 LocalHelper.C:64
 LocalHelper.C:65
 LocalHelper.C:66
 LocalHelper.C:67
 LocalHelper.C:68
 LocalHelper.C:69
 LocalHelper.C:70
 LocalHelper.C:71
 LocalHelper.C:72
 LocalHelper.C:73
 LocalHelper.C:74
 LocalHelper.C:75
 LocalHelper.C:76
 LocalHelper.C:77
 LocalHelper.C:78
 LocalHelper.C:79
 LocalHelper.C:80
 LocalHelper.C:81
 LocalHelper.C:82
 LocalHelper.C:83
 LocalHelper.C:84
 LocalHelper.C:85
 LocalHelper.C:86
 LocalHelper.C:87
 LocalHelper.C:88
 LocalHelper.C:89
 LocalHelper.C:90
 LocalHelper.C:91
 LocalHelper.C:92
 LocalHelper.C:93
 LocalHelper.C:94
 LocalHelper.C:95
 LocalHelper.C:96
 LocalHelper.C:97
 LocalHelper.C:98
 LocalHelper.C:99
 LocalHelper.C:100
 LocalHelper.C:101
 LocalHelper.C:102
 LocalHelper.C:103
 LocalHelper.C:104
 LocalHelper.C:105
 LocalHelper.C:106
 LocalHelper.C:107
 LocalHelper.C:108
 LocalHelper.C:109
 LocalHelper.C:110
 LocalHelper.C:111
 LocalHelper.C:112
 LocalHelper.C:113
 LocalHelper.C:114
 LocalHelper.C:115
 LocalHelper.C:116
 LocalHelper.C:117
 LocalHelper.C:118
 LocalHelper.C:119
 LocalHelper.C:120
 LocalHelper.C:121
 LocalHelper.C:122
 LocalHelper.C:123
 LocalHelper.C:124
 LocalHelper.C:125
 LocalHelper.C:126
 LocalHelper.C:127
 LocalHelper.C:128
 LocalHelper.C:129
 LocalHelper.C:130
 LocalHelper.C:131
 LocalHelper.C:132
 LocalHelper.C:133
 LocalHelper.C:134
 LocalHelper.C:135
 LocalHelper.C:136
 LocalHelper.C:137
 LocalHelper.C:138
 LocalHelper.C:139
 LocalHelper.C:140
 LocalHelper.C:141
 LocalHelper.C:142
 LocalHelper.C:143
 LocalHelper.C:144
 LocalHelper.C:145
 LocalHelper.C:146
 LocalHelper.C:147
 LocalHelper.C:148
 LocalHelper.C:149
 LocalHelper.C:150
 LocalHelper.C:151
 LocalHelper.C:152
 LocalHelper.C:153
 LocalHelper.C:154
 LocalHelper.C:155
 LocalHelper.C:156
 LocalHelper.C:157
 LocalHelper.C:158
 LocalHelper.C:159
 LocalHelper.C:160
 LocalHelper.C:161
 LocalHelper.C:162
 LocalHelper.C:163
 LocalHelper.C:164
 LocalHelper.C:165
 LocalHelper.C:166
 LocalHelper.C:167
 LocalHelper.C:168
 LocalHelper.C:169
 LocalHelper.C:170
 LocalHelper.C:171
 LocalHelper.C:172
 LocalHelper.C:173
 LocalHelper.C:174
 LocalHelper.C:175
 LocalHelper.C:176
 LocalHelper.C:177
 LocalHelper.C:178
 LocalHelper.C:179
 LocalHelper.C:180
 LocalHelper.C:181
 LocalHelper.C:182
 LocalHelper.C:183
 LocalHelper.C:184
 LocalHelper.C:185
 LocalHelper.C:186
 LocalHelper.C:187
 LocalHelper.C:188
 LocalHelper.C:189
 LocalHelper.C:190
 LocalHelper.C:191
 LocalHelper.C:192
 LocalHelper.C:193
 LocalHelper.C:194
 LocalHelper.C:195
 LocalHelper.C:196
 LocalHelper.C:197
 LocalHelper.C:198
 LocalHelper.C:199
 LocalHelper.C:200
 LocalHelper.C:201
 LocalHelper.C:202