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(), fAnalysisChain(nullptr), fSimDir(nullptr), fCopyFilesToWorkDir(false)
20 {
21  // Default constructor
22 }
23 
24 
25 
28 
30 {
31  // Set up and run the analysis
32 
33  BuildChain();
34 
35  Bool_t read_all_events = (GetNbEventToRead() == 0);
36  Long64_t nevents = (!read_all_events ? GetNbEventToRead() : fAnalysisChain->GetEntries());
37  Long64_t update_interval = (nevents > 10 ? nevents / 10 : 1);
38  TString results_file_name;
39  KVSimFile* first_file = (KVSimFile*)fListOfSimFiles.First();
40  results_file_name.Form("%s_%s", GetUserClass().name.Data(), first_file->GetName());
41  TString options;
42  options.Form("SimFileName=%s,SimTitle=%s,OutputDir=%s,EventsReadInterval=%lld,BranchName=%s,CombinedOutputFile=%s,SimulationInfos=%s",
43  first_file->GetName(), fAnalysisChain->GetTitle(),
44  (is_filter_job ? (first_file->GetSimDir()->HasAuxDirectory() ? first_file->GetSimDir()->GetAuxDirectory().Data() : ".") : "."),// make sure filtered files are always placed in same directory
45  update_interval, first_file->GetBranchName(),
46  results_file_name.Data(), first_file->GetTitle());
47  if (first_file->IsFiltered()) {
48  options += Form(",DataSet=%s", first_file->GetDataSet());
49  if (first_file->HasRun())
50  options += Form(",Run=%d", first_file->GetRun());
51  if (first_file->HasSystem())
52  options += Form(",System=%s", first_file->GetSystem());
53  }
54  if (!fListOfAuxFiles.IsEmpty()) {
55  // Set up list of auxiliary files
56  KVString auxfiles;
57  TIter ifi(&fListOfAuxFiles);
58  KVSimFile* auxf;
59  while ((auxf = (KVSimFile*)ifi())) {
60  if (auxfiles != "") auxfiles += "|";
61  auxfiles += auxf->GetName();
62  }
63  options += ",AuxFiles=";
64  options += auxfiles;
65  options += ",AuxDir=";
66  KVSimFile* ffaux = (KVSimFile*)fListOfAuxFiles.First();
67  options += ffaux->GetSimDir()->GetDirectory();
68  options += ",AuxTreeName=";
69  options += ffaux->GetTreeName();
70  options += ",AuxBranchName=";
71  options += ffaux->GetBranchName();
72  }
73  // Add any user-defined options - notably, all options for filter are passed here
74  if (GetUserClassOptions() != "") {
75  options += ",";
76  options += GetUserClassOptions();
77  }
78 
79  // Check compilation of user class & run
80  if (CheckIfUserClassIsValid()) {
81  Info("SubmitTask", "Beginning TChain::Process...");
82 #ifdef WITH_PROOF
83 #ifdef WITH_CPP11
84  if (GetProofMode() != KVDataAnalyser::EProofMode::None) fAnalysisChain->SetProof(kTRUE);
85 #else
86  if (GetProofMode() != KVDataAnalyser::None) fAnalysisChain->SetProof(kTRUE);
87 #endif
88 #endif
89  TString analysis_class;
90  if (GetAnalysisTask()->WithUserClass())
91  analysis_class.Form("%s%s", GetUserClass().full_path_imp().Data(), GetACliCMode());
92  else analysis_class = GetUserClassName();
93  if (read_all_events) {
94  fAnalysisChain->Process(analysis_class, options.Data());
95  }
96  else {
97  fAnalysisChain->Process(analysis_class, options.Data(), GetNbEventToRead());
98  }
99  }
100  delete fAnalysisChain;
101  fAnalysisChain = nullptr;
102 }
103 
104 
105 
108 
110 {
111  // Returns path to data to be analysed
112  if (!NeedToChooseWhatToAnalyse()) {
113  KVSimFile* first_file = (KVSimFile*)fListOfSimFiles.First();
114  return first_file->GetSimDir()->GetDirectory();
115  }
116  return "";
117 }
118 
119 
120 
126 
128 {
129  //Save (in the TEnv fBatchEnv) all necessary information on analysis task which can be used to execute it later
130  //(i.e. when batch processing system executes the job).
131  //If save=kTRUE (default), write the information in a file whose name is given by ".jobname"
132  //where 'jobname' is the name of the job as given to the batch system.
133 
135  KVSimFile* simF = (KVSimFile*)fListOfSimFiles.First();
136  KVSimDir* simD = simF->GetSimDir();
137  GetBatchInfoFile()->SetValue("SimDir", simD->GetDirectory());
138  if (simD->HasAuxDirectory())
139  GetBatchInfoFile()->SetValue("AuxDir", simD->GetAuxDirectory());
140  if (simF->IsFiltered()) GetBatchInfoFile()->SetValue("SimFile.Type", "filtered");
141  else GetBatchInfoFile()->SetValue("SimFile.Type", "simulated");
142  GetBatchInfoFile()->SetValue("SimFiles", simF->GetName());
143  if (fListOfSimFiles.GetEntries() > 1) {
144  TIter next(&fListOfSimFiles);
145  next();
146  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+SimFiles", simF->GetName());
147  }
148  if (!fListOfAuxFiles.IsEmpty()) {
149  // auxiliary files for batch job
150  GetBatchInfoFile()->SetValue("AuxFiles", fListOfAuxFiles.First()->GetName());
151  if (fListOfAuxFiles.GetEntries() > 1) {
152  TIter next(&fListOfAuxFiles);
153  next();
154  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+AuxFiles", simF->GetName());
155  }
156  }
157  if (is_filter_job) GetBatchInfoFile()->SetValue("FilterJob", 1);
158  if (sav) GetBatchInfoFile()->SaveLevel(kEnvUser);
159 }
160 
161 
162 
167 
169 {
170  //Read the batch env file "filename" and initialise the analysis task using the
171  //informations in the file
172  //Returns kTRUE if all goes well
173 
174  Bool_t ok = kFALSE;
175 
177 
178  KVString simdir = GetBatchInfoFile()->GetValue("SimDir", "");
179  if (simdir == "") return ok;
180 
181  KVString auxdir = GetBatchInfoFile()->GetValue("AuxDir", "");
182 
183  is_filter_job = (Bool_t)GetBatchInfoFile()->GetValue("FilterJob", 0);
184 
185  fSimDir = new KVSimDir("SIMDIR", simdir);
186  if (!auxdir.IsNull()) fSimDir->SetAuxDirectory(auxdir);
187  fSimDir->AnalyseDirectory();
188 
189  KVString filetype = GetBatchInfoFile()->GetValue("SimFile.Type", "");
190  if (filetype == "") return ok;
191 
192  KVString simfiles = GetBatchInfoFile()->GetValue("SimFiles", "");
193  if (simfiles == "") return ok;
194 
195  fListOfSimFiles.Clear();
196 
197  simfiles.Begin(" ");
198  while (!simfiles.End()) {
199  if (filetype == "simulated") fListOfSimFiles.Add(fSimDir->GetSimDataList()->FindObject(simfiles.Next()));
200  else if (filetype == "filtered") fListOfSimFiles.Add(fSimDir->GetFiltDataList()->FindObject(simfiles.Next()));
201  }
202 
203  KVString auxfiles = GetBatchInfoFile()->GetValue("AuxFiles", "");
204  if (auxfiles == "") return (ok = kTRUE);
205 
206  fListOfAuxFiles.Clear();
207 
208  auxfiles.Begin(" ");
209  while (!auxfiles.End()) {
210  fListOfAuxFiles.Add(fSimDir->GetSimDataList()->FindObject(auxfiles.Next()));
211  }
212 
213  ok = kTRUE;
214 
215  return ok;
216 }
217 
218 
219 
224 
225 void KVSimDirAnalyser::BuildChain()
226 {
227  // Build a TChain with all files/trees to be analysed
228  //
229  // If fCopyFilesToWorkDir==true, files are first copied to working directory
230 
231  TIter next(&fListOfSimFiles);
232  KVSimFile* file;
233  while ((file = (KVSimFile*)next())) {
234  if (!fAnalysisChain) {
235  fAnalysisChain = new TChain(file->GetTreeName());
236  }
237  fAnalysisChain->Add(file->GetFullPathToFile());
238  }
239 }
240 
241 
242 
247 
248 void KVSimDirAnalyser::GetInfosForJobNameFromFiles()
249 {
250  // Use first file in list to analyse to obtain information for generating
251  // automatic batch job names (name of model, eventually info on simulated reaction,
252  // etc.)
253 
254  KVSimFile* sf = dynamic_cast<KVSimFile*>(fListOfSimFiles.First());
255  // name of TTree is (usually) name of model
256  fModel = sf->GetTreeName();
257  if (fModel == "dit_events") fModel = "DIT"; // except for DIT
258 }
259 
260 
261 
262 
265 
266 void KVSimDirAnalyser::Make(const Char_t* kvsname)
267 {
268  // Generate a new simulated analysis selector class
269 
270 #ifndef USING_ROOT6
271  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
272  kTRUE, "SimulatedEventAnalysisTemplate");
273 #else
274  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
275  kTRUE, "ROOT6SimulatedEventAnalysisTemplate");
276 #endif
277  cf.AddImplIncludeFile("KVSimNucleus.h");
278  cf.AddImplIncludeFile("KVBatchSystem.h");
279 
280  cf.GenerateCode();
281 }
282 
283 
284 
287 
289 {
290  // Replace any special symbols in auto-format jobname with current values
291 
293  tmp.ReplaceAll("KVEventFiltering",
294  Form("%s_%s_FILTER_%s", fModel.Data(), fFilterSystem.Data(), fFilterDataSet.Data()));
295  tmp.ReplaceAll(" ", "");
296  tmp.ReplaceAll("@", "_");
297  tmp.ReplaceAll("+", "_");
298  tmp.ReplaceAll("/", "_");
299  tmp.ReplaceAll("(", "_");
300  tmp.ReplaceAll(")", "_");
301  tmp.ReplaceAll("[", "_");
302  tmp.ReplaceAll("]", "_");
303  return tmp;
304 }
305 
306 
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 UserClass & GetUserClass() const
virtual TString ExpandAutoBatchName(const Char_t *format) const
virtual void WriteBatchEnvFile(const TString &, Bool_t sav=kTRUE)
KVString GetUserClassName()
const KVString & GetUserClassOptions() const
EProofMode GetProofMode() const
Long64_t GetNbEventToRead(void) const
virtual Bool_t ReadBatchEnvFile(const TString &)
KVDataAnalysisTask * GetAnalysisTask() const
TObject * First() const override
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
void Clear(Option_t *option="") override
Class piloting analyses of simulated data.
TString ExpandAutoBatchName(const Char_t *format) const override
Replace any special symbols in auto-format jobname with current values.
Bool_t ReadBatchEnvFile(const TString &) override
KVString GetRootDirectoryOfDataToAnalyse() const override
Returns path to data to be analysed.
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:46
const KVList * GetFiltDataList() const
Definition: KVSimDir.h:79
void SetAuxDirectory(const TString &)
Definition: KVSimDir.cpp:114
Bool_t HasAuxDirectory() const
Definition: KVSimDir.cpp:139
const Char_t * GetDirectory() const
Definition: KVSimDir.h:64
const KVList * GetSimDataList() const
Definition: KVSimDir.h:75
void AnalyseDirectory()
Definition: KVSimDir.cpp:167
TString GetAuxDirectory() const
Definition: KVSimDir.cpp:128
Handle file containing simulated and/or filtered simulated data ,.
Definition: KVSimFile.h:20
const Char_t * GetSystem() const
Definition: KVSimFile.h:100
const Char_t * GetBranchName() const
Definition: KVSimFile.h:137
Int_t GetRun() const
Definition: KVSimFile.h:115
Bool_t HasRun() const
Definition: KVSimFile.h:120
const Char_t * GetDataSet() const
Definition: KVSimFile.h:95
KVSimDir * GetSimDir() const
Definition: KVSimFile.h:80
Bool_t HasSystem() const
Definition: KVSimFile.h:105
Bool_t IsFiltered() const
Definition: KVSimFile.h:48
const Char_t * GetTreeName() const
Definition: KVSimFile.h:132
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
virtual Int_t GetEntries() const
virtual Bool_t IsEmpty() const
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)