ROOT logo
/**
 * @file   PluginRailway.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Tue Oct 16 18:57:18 2012
 * 
 * @brief  Base class for helpers using the AliAnalysisAlien plugin
 *
 * @ingroup pwglf_forward_trains_helper
 * 
 */
#ifndef PLUGINHELPER_C
#define PLUGINHELPER_C
#include "Railway.C"
#ifndef __CINT__
# include "AvailableSoftware.C"
# include "ParUtilities.C"
# include "OutputUtilities.C"
# include <TUrl.h>
# include <TString.h>
# include <TEnv.h>
# include <TProof.h>
# include <AliAnalysisManager.h>
# include <AliAnalysisAlien.h>
#else
class TUrl;
class AliAnalysisAlien;
#endif

// ===================================================================
/**
 * Handle analysis on using the AliAnalysisAlien plugin - i.e., AAF or Grid 
 * 
 * This helper is triggered by a URL of the form 
 *
 * @code
 * <protocol>://[<user>@][<host>][:<port>]/[<file>][?<options>][#<anchor>]
 * @endcode 
 * where &lt;options&gt; contains <tt>plugin</tt>
 * <dl>
 *   <dt>&lt;options&gt;</dt>
 *   <dd>List of options separated by an &amp;
 *     <dl>
 *       <dt><tt>storage=&lt;url&gt;</tt></dt>
 *       <dd>Specify a non-default storage location for special output
 *         (e.g., AOD trees).  &lt;url&gt; should be a valid XRootd 
 *         server URI accessible to the slaves - e.g., 
 *         <tt>root://lxplus.cern.ch:10930//tmp</tt>.</dd>
 *       <dt><tt>mode=[default,rec,sim,train,custom]</tt></dt>
 *       <dd>Set the AliROOT mode.  If not specified <tt>default</tt> 
 *         is assumed.  See also CreateAliROOTPar</dd>
 *       <dt><tt>par</tt></dt>
 *       <dd>Use par files</dd>
 *       <dt><tt>aliroot=&lt;version&gt;</tt></dt>
 *       <dd>Set AliROOT version to use </dd>
 *       <dt><tt>root=&lt;version&gt;</tt></dt>
 *       <dd>Set ROOT version to use </dd>
 *     </dl>
 *   </dd>
 * </dl>  
 *
 * @ingroup pwglf_forward_trains_helper
 */
struct PluginRailway : public Railway
{
  /** 
   * Constructor 
   * 
   * @param url  Url 
   * @param verbose Verbosity level 
   */
  PluginRailway(const TUrl& url, Int_t verbose)
    : Railway(url, verbose), fHandler(0), fUsePars(false), 
      fTestBuild(true), fExtraLibs(), fExtraPars(), fExtraSrcs()
  {
    fHandler = new AliAnalysisAlien();

    fOptions.Add("aliroot", "VERSION", "AliROOT version", "last");
    fOptions.Add("root",    "VERSION", "ROOT version", "last");
    fOptions.Add("par", "Use par files");
    fOptions.Add("mode", "default|rec|sim", "AliROOT mode", "default");
    fOptions.Add("storage", "URL", "Location for external storage", "");    
    fOptions.Add("plugin", "Use AliEn handler");
    fOptions.Add("testpar", "Test build PARs");

    fExtraLibs.SetOwner();
    fExtraPars.SetOwner();
    fExtraSrcs.SetOwner();
  }
  /** 
   * Copy constructor 
   * 
   * @param o Object to copy from 
   */
  PluginRailway(const PluginRailway& o) 
    : Railway(o), fHandler(o.fHandler), fUsePars(o.fUsePars), 
      fTestBuild(o.fTestBuild), fExtraLibs(), fExtraPars(), fExtraSrcs()
  {}
  /** 
   * Assignment operator 
   * 
   * @param o Object to assign from 
   * 
   * @return Reference to this 
   */
  PluginRailway& operator=(const PluginRailway& o) 
  {
    if (&o == this) return *this;
    Railway::operator=(o);
    fHandler   = o.fHandler;
    fUsePars   = o.fUsePars;
    fTestBuild = o.fTestBuild;
    return *this;
  }
  /** 
   * Destructor 
   */
  virtual ~PluginRailway() {}
  /** 
   * Load a library/PAR/script 
   * 
   * @param name   Name 
   * @param slaves If true, also load on slaves
   * 
   * @return true on success 
   */
  virtual Bool_t LoadLibrary(const TString& name, 
			     Bool_t slaves=true)
  {
    if (!fUsePars) {
      TString fullName(MakeLibraryName(name));
      Int_t ret = gSystem->Load(fullName);
      if (ret < 0) return false;
      if (slaves) {
	fHandler->AddAdditionalLibrary(fullName);
	fExtraLibs.Add(new TObjString(fullName));
      }
    }
    else { 
      if (!ParUtilities::Find(name)) { 
	Error("PluginRailway::LoadLibrary", "Failed to find PAR file %s", 
	      name.Data());
	return false;
      }
      if (fTestBuild && !ParUtilities::Build(name)) { 
	Error("PluginRailway::LoadLibrary", "Failed to build PAR file %s", 
	      name.Data());
	return false;
      }
      fHandler->EnablePackage(name);
      fExtraPars.Add(new TObjString(name));
    }
    return true;
  }
  /** 
   * Load a source file, and compile it 
   * 
   * @param name Name of the source file 
   * @param copy If true, copy here instead of link
   * 
   * @return true on success
   */
  virtual Bool_t LoadSource(const TString& name, bool copy=false)
  {
    static TString s;
    if (!Railway::LoadSource(name, copy)) return false;
    s.Append(Form(" %s", gSystem->BaseName(name.Data())));
    fHandler->SetAnalysisSource(s);
    fExtraSrcs.Add(new TObjString(name));
    return true;
  }
  
  /** 
   * Set-up to load the AliROOT libraries 
   * 
   * @return true on success
   */
  virtual Bool_t LoadAliROOT()
  {
    if (!gSystem->Getenv("ALICE_ROOT")) { 
      Error("PluginRailway::LoadAliROOT", "Local AliROOT not available");
      return false;
    }
    Bool_t tmp = fUsePars;
    fUsePars   = false;
    
    if (!LoadLibrary("STEERBase"))     return false;
    if (!LoadLibrary("ESD"))           return false;
    if (!LoadLibrary("AOD"))           return false;
    if (!LoadLibrary("ANALYSIS"))      return false;
    if (!LoadLibrary("OADB"))          return false;
    if (!LoadLibrary("ANALYSISalice")) return false;
    fUsePars = tmp;

    return true;
  }
  /** 
   * Set-up done before task set-ups 
   * 
   * @return true on success 
   */
  virtual Bool_t PreSetup() 
  {
    // --- Set prefered GSI method ---------------------------------
    gEnv->SetValue("XSec.GSI.DelegProxy", "2");

    TString aliroot("last");
    TString root("last");
    if (fOptions.Has("aliroot")) aliroot = fOptions.Get("aliroot");
    if (fOptions.Has("root"))    root    = fOptions.Get("root");

    AvailableSoftware::Check(aliroot, root);
    fOptions.Set("aliroot", aliroot);
    fOptions.Set("root", root);

    fUsePars   = fOptions.Has("par");
    fTestBuild = fOptions.Has("testpar");

    fHandler->SetROOTVersion(root);
    fHandler->SetAliROOTVersion(aliroot);
    // Execute through interpreter until patch is applied
    fHandler->SetDropToShell(false);
    if (fOptions.Has("mode"))
      fHandler->SetAliRootMode(fOptions.Get("mode"));
    else 
      fHandler->SetAliRootMode("default");
    
    return true;
  }
  /** 
   * Set-up done after the task set-ups 
   *
   * @return true on success 
   */
  virtual Bool_t PostSetup() 
  {
    AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
    if (!mgr) { 
      Error("PluginRailway::PostSetup", "No analysis manager defined");
      return false;
    }
    mgr->SetGridHandler(fHandler);

    fHandler->SetJobTag(mgr->GetName());
    fHandler->SetAnalysisMacro(Form("%s.C", mgr->GetName()));

    if (fOptions.Has("storage"))
      OutputUtilities::RegisterStorage(fOptions.Get("storage"));

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