ROOT logo
/**
 * @file   GridTerminate.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Wed Jan 23 21:22:28 2013
 * 
 * @brief  Worker script to run terminate part for Grid  
 * 
 * 
 * @ingroup pwglf_forward_trains_helper
 */
#ifndef __CINT__
# include <TString.h>
# include <TSystem.h>
# include <TGrid.h>
# include <TFile.h>
# include <TObjArray.h>
# include <TObjString.h>
# include <TError.h>
# include <TEnv.h>
# include <TROOT.h>
# include <AliAnalysisManager.h>
# include <AliAnalysisAlien.h>
# include <fstream>
#else
class TString;
#endif
/** 
 * Load a library 
 * 
 * @param libName Library name 
 * 
 * @return true on success 
 */
Bool_t LoadLib(const char* libName)
{
  if (gSystem->Load(libName) < 0) {
    Error("GridTerminate", "Failed to load library %s",libName);
    return false;
  }
  Info("GridTerminate","Loaded library %s",libName);
  return true;
}
/** 
 * Load a PAR 
 * 
 * @param parName PAR file name 
 * 
 * @return true on success
 */
Bool_t LoadPar(const char* parName)
{
  if (!AliAnalysisAlien::SetupPar(parName)) {
    Error("GridTerminate","Failed to load PAR %s",parName);
    return false;
  }
  Info("GridTerminate","Loaded package %s",parName);
  return true;
}

/** 
 * Load the analysis handler if needed 
 * 
 * @param name 
 * 
 * @return 
 */
Bool_t LoadHandler(const TString& name)
{
  // Load plugin
  TFile* file = TFile::Open(Form("%s_plugin.root",name.Data()),"READ");
  // TFile* plug = TFile::Open("plugin.root","READ");
  if (!file) {
    // Error("GridTerminate","Failed to open %s_plugin.root",name.Data());
    Error("GridTerminate","Failed to open %s_plugin.root",
	  name.Data());
    return false;
  }
  AliAnalysisAlien* handler = 
    static_cast<AliAnalysisAlien*>(file->Get("plugin"));
  if (!handler) {
    Error("GridTerminate","Failed to load plugin");
    return false;
  }
  Info("GridTerminate","Setting grid handler");
  handler->SetRunMode("terminate");
  handler->SetMergeViaJDL(true);
  AliAnalysisManager::GetAnalysisManager()->SetGridHandler(handler);

  return true;
}

/** 
 * Setup our manager et al 
 * 
 * @param name            Name of the job
 * @param libs            Libraries to load (space separated string)
 * @param pars            PARs to load (space separated string)
 * @param srcs            Sources to load (space separated string)
 * @param local           If true, run local terminate job on already 
 *                        merged and downloaded files.
 * @param localLibsNotPar if @a local is true and this is true, then
 *                        we load the corresponding locally compiled 
 *                        library for each specified PAR file.
 * 
 * @return true on success 
 */
Bool_t Setup(const TString& name, 
	     const TString& libs, 
	     const TString& pars, 
	     const TString& srcs,
	     Bool_t         local=false,
	     Bool_t         localLibsNotPar=true)
{
  // Load basic ROOT libraries
  gSystem->AddDynamicPath("/usr/lib");
  if (gSystem->Load("libTree.so")       < 0) return false;
  if (gSystem->Load("libGeom.so")       < 0) return false;
  if (gSystem->Load("libVMC.so")        < 0) return false;
  if (gSystem->Load("libPhysics.so")    < 0) return false;
  if (gSystem->Load("libMinuit.so")     < 0) return false;

  // Load basic AliROOT libraries
  if (gSystem->Load("libSTEERBase")     < 0) return false;
  if (gSystem->Load("libESD")           < 0) return false;
  if (gSystem->Load("libAOD")           < 0) return false;
  if (gSystem->Load("libANALYSIS")      < 0) return false;
  if (gSystem->Load("libOADB")          < 0) return false;
  if (gSystem->Load("libANALYSISalice") < 0) return false;

  // Load libraries
  if (!libs.IsNull()) {
    TObjArray*  libsArray = libs.Tokenize(" ");
    TObjString* lib       = 0;
    TIter       nextLib(libsArray);
    while ((lib = static_cast<TObjString*>(nextLib()))) {
      const TString& libName = lib->String();
      if (libName.Contains("libSTEERBase") ||
	  libName.Contains("libESD")       ||
	  libName.Contains("libAOD")       ||
	  libName.Contains("libANALYSIS")  ||
	  libName.Contains("libOADB")      ||
	  libName.Contains("libANALYSISalice")) continue;
      if (!libName.Contains(".so")) continue;
      if (!LoadLib(libName.Data())) return false;
    }
    libsArray->Delete();
  }
  
  // Load packages
  if (!pars.IsNull()) {
    TObjArray*  parArray = pars.Tokenize(" ");
    TObjString* par      = 0;
    TIter       nextPar(parArray);
    while ((par = static_cast<TObjString*>(nextPar()))) { 
      TString parName(par->String());
      if (parName.EndsWith(".par")) parName.ReplaceAll(".par", "");
      if (parName.Contains("STEERBase") ||
	  parName.Contains("ESD")       ||
	  parName.Contains("AOD")       ||
	  parName.Contains("ANALYSIS")  ||
	  parName.Contains("OADB")      ||
	  parName.Contains("ANALYSISalice")) continue;
      Bool_t ret = true;
      if (local && localLibsNotPar) 
	ret = LoadLib(Form("lib%s.so", parName.Data()));
      else 
	ret = LoadPar(parName.Data());
      if (!ret) return false;
    }
  }

  // Load sources
  if (!srcs.IsNull()) {
    TObjArray*  srcArray = srcs.Tokenize(" ");
    TObjString* src      = 0;
    TIter       nextSrc(srcArray);
    while ((src = static_cast<TObjString*>(nextSrc()))) { 
      const TString& srcName = src->String();
      gROOT->ProcessLine(Form(".L %s+g", srcName.Data()));
    }
  }

  // Connect to the grid
  gEnv->SetValue("XSec.GSI.DelegProxy", "2");
  // TGrid::Connect("alien://");
  // if (!gGrid) {
  //   Error("GridTerminate", "Failed to connect to AliEn");
  //   return false;
  // }

  // Load the analysis manager from file
  TString base(name);
  base.Append(".root");
  if (gSystem->AccessPathName(base.Data())) {
    // Couldn't read from current directory, try sub-dir
    TString sub(gSystem->ConcatFileName(name, base));
    if (gSystem->AccessPathName(sub)) {
      Error("GridTerminate","Couldn't find manager file %s",base.Data());
      return false;
    }
    base = sub;
  }
  AliAnalysisManager* mgr= AliAnalysisAlien::LoadAnalysisManager(base);
  if (!mgr) {
    Error("GridTerminate", "Failed to load manager from %s",base.Data());
    return false;
  }
  if (!name.EqualTo(mgr->GetName())) {
    Error("GridTerminate","Read manager %s is not %s",
	  mgr->GetName(),name.Data());
    return false;
  }
  Info("GridTerminate","Loaded analysis manager");

  // If we do a local merge, do not do any else 
  if (local) return true;

  return LoadHandler(name);
}

/** 
 * Submit the terminate job 
 * 
 * @param name            Name of the job
 * @param libs            Libraries to load (space separated string)
 * @param pars            PARs to load (space separated string)
 * @param srcs            Sources to load (space separated string)
 * @param local           If true, run local terminate job on already 
 *                        merged and downloaded files.
 * @param localLibsNotPar if @a local is true and this is true, then
 *                        we load the corresponding locally compiled 
 *                        library for each specified PAR file.
 * 
 * @return true on success 
 */
Bool_t GridTerminate(const TString& name, 
		     const TString& libs, 
		     const TString& pars, 
		     const TString& srcs,
		     Bool_t         local=false,
		     Bool_t         localLibsNotPar=true)
{
  if (!Setup(name, libs, pars, srcs, local, localLibsNotPar)) return false; 

  // Run the terminate job
  Info("GridTerminate","Starting terminate job - %s", local ? "locally" : "on the grid");

  AliAnalysisManager* mgr = AliAnalysisManager::GetAnalysisManager();
  if (!local) {

    AliAnalysisAlien* handler = static_cast<AliAnalysisAlien*>(mgr->GetGridHandler());
    if (!handler) { 
      Error("GridTerminate", "Manager does now have an AliEn handler");
      return false;
    }
    if (mgr->StartAnalysis("grid") < 0) return false;

    std::ofstream outJobs(Form("%s_merge.jobid", mgr->GetName()));
    outJobs << handler->GetGridJobIDs() << std::endl;
    outJobs.close();
    
    std::ofstream outStages(Form("%s_merge.stage", mgr->GetName()));
    outStages << handler->GetGridStages() << std::endl;
    outStages.close();

    return true;
  }
  
  // mgr->SetDebugLevel(2);
  mgr->SetSkipTerminate(false);
  TTree* dummy = 0;
  if (mgr->StartAnalysis("gridterminate", dummy, -1, 0) < 0) return false;
  
  return true;
}

// 
// EOF
//

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