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