ROOT logo
#ifndef ALIMUONGRIDSUBMITTER_H
#define ALIMUONGRIDSUBMITTER_H

//
// AliMuonGridSubmitter : a base class to help submit some
// mini-productions for muon studies (e.g. Acc x Eff, qa merging, etc...)
//
// author: Laurent Aphecetche (Subatech)
//

#include "TObject.h"
#include "TString.h"
#include "Riostream.h"
#include <vector>

class TMap;

class AliMuonGridSubmitter : public TObject
{
public:
  
  enum EJobType
  {
    kAccEff=0,
    kQAMerge=1
  };
  
  AliMuonGridSubmitter(AliMuonGridSubmitter::EJobType jobType, Bool_t localOnly=kFALSE);
  virtual ~AliMuonGridSubmitter();

  virtual Bool_t Generate(const char* jdlname) const = 0;
  virtual Bool_t Run(const char* mode) = 0;
  
  TString JobTypeName(AliMuonGridSubmitter::EJobType jobType) const;
    
  Bool_t SetLocalDir(const char* localdir) { return SetLocalDirectory("Local",localdir); }
  Bool_t SetMergedDir(const char* dir) { return SetRemoteDirectory("Merged",dir); }
  Bool_t SetRemoteDir(const char* dir) { return SetRemoteDirectory("Remote",dir); }
  Bool_t SetTemplateDir(const char* templatedir) { return SetLocalDirectory("Template",templatedir); }
  
  Bool_t CheckLocal() const;
  Bool_t CheckRemote() const;
  
  void CleanLocal(const char* excludeList="") const;
  
  void Invalidate() { fIsValid = kFALSE; }

  void Validate() { fIsValid = kTRUE; }

  TString MergedDir() const { return GetMapValue("Merged"); }
  TString RemoteDir() const { return GetMapValue("Remote"); }
  TString LocalDir() const { return GetMapValue("Local"); }
  TString TemplateDir() const { return GetMapValue("Template"); }
  
  TString FilePath(const char* what) const;
  
  UInt_t NofRuns() const;
  
  const std::vector<Int_t>& RunList() const;
  
  void SetRunList(const char* runlist);
  void SetRunList(int runNumber);
  
  virtual void Print(Option_t* opt="") const;

  Bool_t CopyLocalFilesToRemote();

  Bool_t CopyTemplateFilesToLocal();

  void SetPackages(const char* aliroot, const char* root="", const char* geant3="",
                   const char* api="VO_ALICE@APISCONFIG::V1.1x");
  
  Bool_t ShouldOverwriteFiles() const { return fShouldOverwriteFiles; }

  void ShouldOverwriteFiles(Bool_t flag) { fShouldOverwriteFiles = flag; }

  Bool_t IsValid() const { return fIsValid; }
  
  void OutputToJDL(std::ostream& out, const char* key, const char* v1,
              const char* v2="", const char* v3="", const char* v4="", const char* v5="",
              const char* v6="", const char* v7="", const char* v8="", const char* v9="") const;
  
  void OutputToJDL(std::ostream& out, const char* key, const TObjArray& values) const;
  
  TString GetRemoteDir(const char* dir, Bool_t create=kTRUE);
  
  Bool_t RemoteDirectoryExists(const char *dirname) const;
  Bool_t RemoteFileExists(const char *lfn);
  
  Bool_t CopyLocalFilesToRemote(const TObjArray& localFiles);

  Bool_t CopyFile(const char* localFile);
  
  Int_t GetLastStage(const char* remoteDir);
  
  std::ostream* CreateJDLFile(const char* name) const;

  Bool_t CheckRemoteDir() const;

  Bool_t ReplaceVars(const char* file) const;
  
  Bool_t HasVars(const char* localFile) const;

  Bool_t SetVar(const char* varname, const char* value);
  
  TObjArray* GetVariables(const char* file) const;
  
  Bool_t CheckCompilation(const char* file) const;

  TObjArray* LocalFileList() const;
  
  TObjArray* TemplateFileList() const;
  
  void AddToTemplateFileList(const char* filename);

  void AddToLocalFileList(const char* filename);

  void AddIncludePath(const char* pathList) const;

  TString GetVar(const char* key) const;

protected:
  
  TObjArray* OrderKeys(const TMap& map) const;

  std::ostream* CreateJDLFile(const char* name);

  TString GetMapValue(const char* key) const;
  
  TMap* InternalMap() const;
  TMap* Vars() const;
  
  void SetMapKeyValue(const char* key, const char* value);
  
  Bool_t SetLocalDirectory(const char* type, const char* path);

  Bool_t SetRemoteDirectory(const char* type, const char* path);

  void UpdateLocalFileList();
  
private:
  AliMuonGridSubmitter(const AliMuonGridSubmitter& rhs);
  AliMuonGridSubmitter& operator=(const AliMuonGridSubmitter& rhs);
  
private:
  mutable TMap* fInternalMap; // map of directory paths and packages versions
  mutable TMap* fVars; // map of the variables we can replace in template files
  Bool_t fIsValid; // whether this object is valid (i.e. properly configured)
  Bool_t fShouldOverwriteFiles; // whether or not to overwrite the local files each time we run
  mutable TObjArray* fTemplateFileList; // list of template files
  mutable TObjArray* fLocalFileList; // list of local files
  std::vector<Int_t> fRunList; // run list to process

  ClassDef(AliMuonGridSubmitter,0) // Helper class to submit some muon jobs
};

#endif

 AliMuonGridSubmitter.h:1
 AliMuonGridSubmitter.h:2
 AliMuonGridSubmitter.h:3
 AliMuonGridSubmitter.h:4
 AliMuonGridSubmitter.h:5
 AliMuonGridSubmitter.h:6
 AliMuonGridSubmitter.h:7
 AliMuonGridSubmitter.h:8
 AliMuonGridSubmitter.h:9
 AliMuonGridSubmitter.h:10
 AliMuonGridSubmitter.h:11
 AliMuonGridSubmitter.h:12
 AliMuonGridSubmitter.h:13
 AliMuonGridSubmitter.h:14
 AliMuonGridSubmitter.h:15
 AliMuonGridSubmitter.h:16
 AliMuonGridSubmitter.h:17
 AliMuonGridSubmitter.h:18
 AliMuonGridSubmitter.h:19
 AliMuonGridSubmitter.h:20
 AliMuonGridSubmitter.h:21
 AliMuonGridSubmitter.h:22
 AliMuonGridSubmitter.h:23
 AliMuonGridSubmitter.h:24
 AliMuonGridSubmitter.h:25
 AliMuonGridSubmitter.h:26
 AliMuonGridSubmitter.h:27
 AliMuonGridSubmitter.h:28
 AliMuonGridSubmitter.h:29
 AliMuonGridSubmitter.h:30
 AliMuonGridSubmitter.h:31
 AliMuonGridSubmitter.h:32
 AliMuonGridSubmitter.h:33
 AliMuonGridSubmitter.h:34
 AliMuonGridSubmitter.h:35
 AliMuonGridSubmitter.h:36
 AliMuonGridSubmitter.h:37
 AliMuonGridSubmitter.h:38
 AliMuonGridSubmitter.h:39
 AliMuonGridSubmitter.h:40
 AliMuonGridSubmitter.h:41
 AliMuonGridSubmitter.h:42
 AliMuonGridSubmitter.h:43
 AliMuonGridSubmitter.h:44
 AliMuonGridSubmitter.h:45
 AliMuonGridSubmitter.h:46
 AliMuonGridSubmitter.h:47
 AliMuonGridSubmitter.h:48
 AliMuonGridSubmitter.h:49
 AliMuonGridSubmitter.h:50
 AliMuonGridSubmitter.h:51
 AliMuonGridSubmitter.h:52
 AliMuonGridSubmitter.h:53
 AliMuonGridSubmitter.h:54
 AliMuonGridSubmitter.h:55
 AliMuonGridSubmitter.h:56
 AliMuonGridSubmitter.h:57
 AliMuonGridSubmitter.h:58
 AliMuonGridSubmitter.h:59
 AliMuonGridSubmitter.h:60
 AliMuonGridSubmitter.h:61
 AliMuonGridSubmitter.h:62
 AliMuonGridSubmitter.h:63
 AliMuonGridSubmitter.h:64
 AliMuonGridSubmitter.h:65
 AliMuonGridSubmitter.h:66
 AliMuonGridSubmitter.h:67
 AliMuonGridSubmitter.h:68
 AliMuonGridSubmitter.h:69
 AliMuonGridSubmitter.h:70
 AliMuonGridSubmitter.h:71
 AliMuonGridSubmitter.h:72
 AliMuonGridSubmitter.h:73
 AliMuonGridSubmitter.h:74
 AliMuonGridSubmitter.h:75
 AliMuonGridSubmitter.h:76
 AliMuonGridSubmitter.h:77
 AliMuonGridSubmitter.h:78
 AliMuonGridSubmitter.h:79
 AliMuonGridSubmitter.h:80
 AliMuonGridSubmitter.h:81
 AliMuonGridSubmitter.h:82
 AliMuonGridSubmitter.h:83
 AliMuonGridSubmitter.h:84
 AliMuonGridSubmitter.h:85
 AliMuonGridSubmitter.h:86
 AliMuonGridSubmitter.h:87
 AliMuonGridSubmitter.h:88
 AliMuonGridSubmitter.h:89
 AliMuonGridSubmitter.h:90
 AliMuonGridSubmitter.h:91
 AliMuonGridSubmitter.h:92
 AliMuonGridSubmitter.h:93
 AliMuonGridSubmitter.h:94
 AliMuonGridSubmitter.h:95
 AliMuonGridSubmitter.h:96
 AliMuonGridSubmitter.h:97
 AliMuonGridSubmitter.h:98
 AliMuonGridSubmitter.h:99
 AliMuonGridSubmitter.h:100
 AliMuonGridSubmitter.h:101
 AliMuonGridSubmitter.h:102
 AliMuonGridSubmitter.h:103
 AliMuonGridSubmitter.h:104
 AliMuonGridSubmitter.h:105
 AliMuonGridSubmitter.h:106
 AliMuonGridSubmitter.h:107
 AliMuonGridSubmitter.h:108
 AliMuonGridSubmitter.h:109
 AliMuonGridSubmitter.h:110
 AliMuonGridSubmitter.h:111
 AliMuonGridSubmitter.h:112
 AliMuonGridSubmitter.h:113
 AliMuonGridSubmitter.h:114
 AliMuonGridSubmitter.h:115
 AliMuonGridSubmitter.h:116
 AliMuonGridSubmitter.h:117
 AliMuonGridSubmitter.h:118
 AliMuonGridSubmitter.h:119
 AliMuonGridSubmitter.h:120
 AliMuonGridSubmitter.h:121
 AliMuonGridSubmitter.h:122
 AliMuonGridSubmitter.h:123
 AliMuonGridSubmitter.h:124
 AliMuonGridSubmitter.h:125
 AliMuonGridSubmitter.h:126
 AliMuonGridSubmitter.h:127
 AliMuonGridSubmitter.h:128
 AliMuonGridSubmitter.h:129
 AliMuonGridSubmitter.h:130
 AliMuonGridSubmitter.h:131
 AliMuonGridSubmitter.h:132
 AliMuonGridSubmitter.h:133
 AliMuonGridSubmitter.h:134
 AliMuonGridSubmitter.h:135
 AliMuonGridSubmitter.h:136
 AliMuonGridSubmitter.h:137
 AliMuonGridSubmitter.h:138
 AliMuonGridSubmitter.h:139
 AliMuonGridSubmitter.h:140
 AliMuonGridSubmitter.h:141
 AliMuonGridSubmitter.h:142
 AliMuonGridSubmitter.h:143
 AliMuonGridSubmitter.h:144
 AliMuonGridSubmitter.h:145
 AliMuonGridSubmitter.h:146
 AliMuonGridSubmitter.h:147
 AliMuonGridSubmitter.h:148
 AliMuonGridSubmitter.h:149
 AliMuonGridSubmitter.h:150
 AliMuonGridSubmitter.h:151
 AliMuonGridSubmitter.h:152
 AliMuonGridSubmitter.h:153
 AliMuonGridSubmitter.h:154
 AliMuonGridSubmitter.h:155
 AliMuonGridSubmitter.h:156
 AliMuonGridSubmitter.h:157
 AliMuonGridSubmitter.h:158