KaliVeda
Toolkit for HIC analysis
KVSimDirAnalyser.cpp
1 //Created by KVClassFactory on Tue Feb 14 11:13:53 2017
2 //Author: John Frankland,,,
3 
4 #include "KVSimDirAnalyser.h"
5 #include "KVDataAnalysisTask.h"
6 #include <KVSimFile.h>
7 #include <KVSimDir.h>
8 #include <KVClassFactory.h>
9 #include <TStopwatch.h>
10 #include "TSystem.h"
11 
13 
14 
15 
19  : KVDataAnalyser(), fListOfSimFiles(nullptr), fListOfAuxFiles(nullptr), fAnalysisChain(nullptr), fSimDir(nullptr), fCopyFilesToWorkDir(false)
20 {
21  // Default constructor
22 }
23 
24 
25 
26 
28 
30 {
31  if (fListOfSimFiles && TString(fListOfSimFiles->GetName()) == "toDelete")
33 }
34 
35 
36 
38 
40 {
41  if (fListOfAuxFiles && TString(fListOfAuxFiles->GetName()) == "toDelete")
43 }
44 
45 
46 
47 
48 
51 
53 {
54  // Set up and run the analysis
55 
56  BuildChain();
57 
58  Bool_t read_all_events = (GetNbEventToRead() == 0);
59  Long64_t nevents = (!read_all_events ? GetNbEventToRead() : fAnalysisChain->GetEntries());
60  Long64_t update_interval = (nevents > 10 ? nevents / 10 : 1);
61  TString results_file_name;
62  KVSimFile* first_file = (KVSimFile*)fListOfSimFiles->First();
63  results_file_name.Form("%s_%s", GetUserClass().name.Data(), first_file->GetName());
64  TString options;
65  options.Form("SimFileName=%s,SimTitle=%s,OutputDir=%s,EventsReadInterval=%lld,BranchName=%s,CombinedOutputFile=%s,SimulationInfos=%s",
66  first_file->GetName(), fAnalysisChain->GetTitle(),
67  (is_filter_job ? first_file->GetSimDir()->GetAuxDirectory().Data() : "."),// make sure filtered files are always placed in same directory
68  update_interval, first_file->GetBranchName(),
69  results_file_name.Data(), first_file->GetTitle());
70  if (first_file->IsFiltered()) {
71  options += Form(",DataSet=%s", first_file->GetDataSet());
72  if (first_file->HasRun())
73  options += Form(",Run=%d", first_file->GetRun());
74  if (first_file->HasSystem())
75  options += Form(",System=%s", first_file->GetSystem());
76  }
77  if (fListOfAuxFiles) {
78  // Set up list of auxiliary files
79  KVString auxfiles;
81  KVSimFile* auxf;
82  while ((auxf = (KVSimFile*)ifi())) {
83  if (auxfiles != "") auxfiles += "|";
84  auxfiles += auxf->GetName();
85  }
86  options += ",AuxFiles=";
87  options += auxfiles;
88  options += ",AuxDir=";
90  options += ffaux->GetSimDir()->GetDirectory();
91  options += ",AuxTreeName=";
92  options += ffaux->GetTreeName();
93  options += ",AuxBranchName=";
94  options += ffaux->GetBranchName();
95  }
96  // Add any user-defined options - notably, all options for filter are passed here
97  if (GetUserClassOptions() != "") {
98  options += ",";
99  options += GetUserClassOptions();
100  }
101 
102  // Check compilation of user class & run
103  if (CheckIfUserClassIsValid()) {
104  Info("SubmitTask", "Beginning TChain::Process...");
105 #ifdef WITH_CPP11
106  if (GetProofMode() != KVDataAnalyser::EProofMode::None) fAnalysisChain->SetProof(kTRUE);
107 #else
109 #endif
110  TString analysis_class;
111  if (GetAnalysisTask()->WithUserClass())
112  analysis_class.Form("%s%s", GetUserClass().full_path_imp().Data(), GetACliCMode());
113  else analysis_class = GetUserClassName();
114  if (read_all_events) {
115  fAnalysisChain->Process(analysis_class, options.Data());
116  }
117  else {
118  fAnalysisChain->Process(analysis_class, options.Data(), GetNbEventToRead());
119  }
120  }
121  delete fAnalysisChain;
122  fAnalysisChain = nullptr;
123 }
124 
125 
126 
129 
131 {
132  // Returns path to data to be analysed
133  if (!NeedToChooseWhatToAnalyse()) {
134  KVSimFile* first_file = (KVSimFile*)fListOfSimFiles->First();
135  return first_file->GetSimDir()->GetDirectory();
136  }
137  return "";
138 }
139 
140 
141 
147 
149 {
150  //Save (in the TEnv fBatchEnv) all necessary information on analysis task which can be used to execute it later
151  //(i.e. when batch processing system executes the job).
152  //If save=kTRUE (default), write the information in a file whose name is given by ".jobname"
153  //where 'jobname' is the name of the job as given to the batch system.
154 
157  KVSimDir* simD = simF->GetSimDir();
158  GetBatchInfoFile()->SetValue("SimDir", simD->GetDirectory());
159  if(simD->HasAuxDirectory())
160  GetBatchInfoFile()->SetValue("AuxDir", simD->GetAuxDirectory());
161  if (simF->IsFiltered()) GetBatchInfoFile()->SetValue("SimFile.Type", "filtered");
162  else GetBatchInfoFile()->SetValue("SimFile.Type", "simulated");
163  GetBatchInfoFile()->SetValue("SimFiles", simF->GetName());
164  if (fListOfSimFiles->GetEntries() > 1) {
165  TIter next(fListOfSimFiles);
166  next();
167  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+SimFiles", simF->GetName());
168  }
169  if (fListOfAuxFiles) {
170  // auxiliary files for batch job
171  GetBatchInfoFile()->SetValue("AuxFiles", fListOfAuxFiles->First()->GetName());
172  if (fListOfAuxFiles->GetEntries() > 1) {
173  TIter next(fListOfAuxFiles);
174  next();
175  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+AuxFiles", simF->GetName());
176  }
177  }
178  if(is_filter_job) GetBatchInfoFile()->SetValue("FilterJob",1);
179  if (sav) GetBatchInfoFile()->SaveLevel(kEnvUser);
180 }
181 
182 
183 
188 
190 {
191  //Read the batch env file "filename" and initialise the analysis task using the
192  //informations in the file
193  //Returns kTRUE if all goes well
194 
195  Bool_t ok = kFALSE;
196 
198 
199  KVString simdir = GetBatchInfoFile()->GetValue("SimDir", "");
200  if (simdir == "") return ok;
201 
202  KVString auxdir = GetBatchInfoFile()->GetValue("AuxDir", "");
203 
204  is_filter_job = (Bool_t)GetBatchInfoFile()->GetValue("FilterJob",0);
205 
206  fSimDir = new KVSimDir("SIMDIR", simdir);
207  if(!auxdir.IsNull()) fSimDir->SetAuxDirectory(auxdir);
209 
210  KVString filetype = GetBatchInfoFile()->GetValue("SimFile.Type", "");
211  if (filetype == "") return ok;
212 
213  KVString simfiles = GetBatchInfoFile()->GetValue("SimFiles", "");
214  if (simfiles == "") return ok;
215 
217  fListOfSimFiles = new TList;
218  fListOfSimFiles->SetName("toDelete");
219 
220  simfiles.Begin(" ");
221  while (!simfiles.End()) {
222  if (filetype == "simulated") fListOfSimFiles->Add(fSimDir->GetSimDataList()->FindObject(simfiles.Next()));
223  else if (filetype == "filtered") fListOfSimFiles->Add(fSimDir->GetFiltDataList()->FindObject(simfiles.Next()));
224  }
225 
226  KVString auxfiles = GetBatchInfoFile()->GetValue("AuxFiles", "");
227  if (auxfiles == "") return (ok = kTRUE);
228 
230  fListOfAuxFiles = new TList;
231  fListOfAuxFiles->SetName("toDelete");
232 
233  auxfiles.Begin(" ");
234  while (!auxfiles.End()) {
236  }
237 
238  ok = kTRUE;
239 
240  return ok;
241 }
242 
243 
244 
249 
251 {
252  // Build a TChain with all files/trees to be analysed
253  //
254  // If fCopyFilesToWorkDir==true, files are first copied to working directory
255 
256  TIter next(fListOfSimFiles);
257  KVSimFile* file;
258  while ((file = (KVSimFile*)next())) {
259  if (!fAnalysisChain) {
260  fAnalysisChain = new TChain(file->GetTreeName());
261  }
262  fAnalysisChain->Add(file->GetFullPathToFile());
263  }
264 }
265 
266 
267 
272 
274 {
275  // Use first file in list to analyse to obtain information for generating
276  // automatic batch job names (name of model, eventually info on simulated reaction,
277  // etc.)
278 
279  KVSimFile* sf = dynamic_cast<KVSimFile*>(fListOfSimFiles->First());
280  // name of TTree is (usually) name of model
281  fModel = sf->GetTreeName();
282  if (fModel == "dit_events") fModel = "DIT"; // except for DIT
283 }
284 
285 
286 
287 
290 
291 void KVSimDirAnalyser::Make(const Char_t* kvsname)
292 {
293  // Generate a new simulated analysis selector class
294 
295 #ifndef USING_ROOT6
296  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
297  kTRUE, "SimulatedEventAnalysisTemplate");
298 #else
299  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
300  kTRUE, "ROOT6SimulatedEventAnalysisTemplate");
301 #endif
302  cf.AddImplIncludeFile("KVSimNucleus.h");
303  cf.AddImplIncludeFile("KVBatchSystem.h");
304 
305  cf.GenerateCode();
306 }
307 
308 
309 
312 
314 {
315  // Replace any special symbols in auto-format jobname with current values
316 
318  tmp.ReplaceAll("KVEventFiltering",
319  Form("%s_%s_FILTER_%s", fModel.Data(), fFilterSystem.Data(), fFilterDataSet.Data()));
320  tmp.ReplaceAll(" ", "");
321  tmp.ReplaceAll("@", "_");
322  tmp.ReplaceAll("+", "_");
323  tmp.ReplaceAll("/", "_");
324  return tmp;
325 }
326 
327 
#define SafeDelete(p)
bool Bool_t
char Char_t
constexpr Bool_t kFALSE
constexpr Bool_t kTRUE
kEnvUser
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
char * Form(const char *fmt,...)
Factory class for generating skeleton files for new classes.
void GenerateCode()
Generate header and implementation file for currently-defined class.
void AddImplIncludeFile(const Char_t *filename)
Manager class which sets up and runs data analysis tasks.
const Char_t * GetACliCMode()
const UserClass & GetUserClass() const
virtual TString ExpandAutoBatchName(const Char_t *format) const
virtual void WriteBatchEnvFile(const TString &, Bool_t sav=kTRUE)
virtual Bool_t CheckIfUserClassIsValid(const KVString &alternative_base_class="")
KVString GetUserClassName()
const KVString & GetUserClassOptions() const
EProofMode GetProofMode() const
Long64_t GetNbEventToRead(void) const
virtual Bool_t ReadBatchEnvFile(const TString &)
KVDataAnalysisTask * GetAnalysisTask() const
TEnv * GetBatchInfoFile() const
TObject * FindObject(const char *name) const override
Class piloting analyses of simulated data.
TList * fListOfAuxFiles
[optional] list of original simulated data to be used during filtered data analysis
TString ExpandAutoBatchName(const Char_t *format) const override
Replace any special symbols in auto-format jobname with current values.
Bool_t NeedToChooseWhatToAnalyse() const override
KVSimDir * fSimDir
used for batch analysis
TList * fListOfSimFiles
list of files/trees to analyse
TChain * fAnalysisChain
TChain for analysis.
Bool_t ReadBatchEnvFile(const TString &) override
void GetInfosForJobNameFromFiles()
KVString GetRootDirectoryOfDataToAnalyse() const override
Returns path to data to be analysed.
TString fFilterDataSet
name of dataset to be used for filtering the simulation
TString fFilterSystem
name of system to be used for filtering the simulation
TString fModel
name of model used for simulation
void SubmitTask() override
Set up and run the analysis.
static void Make(const Char_t *kvsname="MySimulatedAnalysis")
Generate a new simulated analysis selector class.
void WriteBatchEnvFile(const TString &, Bool_t sav=kTRUE) override
Handle directory containing simulated and/or filtered simulated data ,.
Definition: KVSimDir.h:43
const KVList * GetFiltDataList() const
Definition: KVSimDir.h:76
void SetAuxDirectory(const TString &)
Definition: KVSimDir.cpp:118
Bool_t HasAuxDirectory() const
Definition: KVSimDir.cpp:143
const Char_t * GetDirectory() const
Definition: KVSimDir.h:61
const KVList * GetSimDataList() const
Definition: KVSimDir.h:72
void AnalyseDirectory()
Definition: KVSimDir.cpp:171
TString GetAuxDirectory() const
Definition: KVSimDir.cpp:132
Handle file containing simulated and/or filtered simulated data ,.
Definition: KVSimFile.h:20
const Char_t * GetSystem() const
Definition: KVSimFile.h:88
const Char_t * GetBranchName() const
Definition: KVSimFile.h:125
Int_t GetRun() const
Definition: KVSimFile.h:103
Bool_t HasRun() const
Definition: KVSimFile.h:108
const Char_t * GetDataSet() const
Definition: KVSimFile.h:83
KVSimDir * GetSimDir() const
Definition: KVSimFile.h:68
Bool_t HasSystem() const
Definition: KVSimFile.h:93
Bool_t IsFiltered() const
Definition: KVSimFile.h:46
const Char_t * GetTreeName() const
Definition: KVSimFile.h:120
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
void Begin(TString delim) const
Definition: KVString.cpp:565
Bool_t End() const
Definition: KVString.cpp:634
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:695
virtual Int_t Add(const char *name, Long64_t nentries=TTree::kMaxEntries)
Long64_t Process(const char *filename, Option_t *option="", Long64_t nentries=kMaxEntries, Long64_t firstentry=0) override
virtual void SetProof(Bool_t on=kTRUE, Bool_t refresh=kFALSE, Bool_t gettreeheader=kFALSE)
Long64_t GetEntries() const override
void SetName(const char *name)
const char * GetName() const override
virtual Int_t GetEntries() const
virtual const char * GetValue(const char *name, const char *dflt) const
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
virtual void SaveLevel(EEnvLevel level)
void Add(TObject *obj) override
TObject * First() const override
const char * GetName() const override
const char * GetTitle() const override
virtual const char * GetName() const
virtual void Info(const char *method, const char *msgfmt,...) const
const char * Data() const
Bool_t IsNull() const
void Form(const char *fmt,...)
TString & ReplaceAll(const char *s1, const char *s2)
long long Long64_t
ClassImp(TPyArg)