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()->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_CPP11
83  if (GetProofMode() != KVDataAnalyser::EProofMode::None) fAnalysisChain->SetProof(kTRUE);
84 #else
85  if (GetProofMode() != KVDataAnalyser::None) fAnalysisChain->SetProof(kTRUE);
86 #endif
87  TString analysis_class;
88  if (GetAnalysisTask()->WithUserClass())
89  analysis_class.Form("%s%s", GetUserClass().full_path_imp().Data(), GetACliCMode());
90  else analysis_class = GetUserClassName();
91  if (read_all_events) {
92  fAnalysisChain->Process(analysis_class, options.Data());
93  }
94  else {
95  fAnalysisChain->Process(analysis_class, options.Data(), GetNbEventToRead());
96  }
97  }
98  delete fAnalysisChain;
99  fAnalysisChain = nullptr;
100 }
101 
102 
103 
106 
108 {
109  // Returns path to data to be analysed
110  if (!NeedToChooseWhatToAnalyse()) {
111  KVSimFile* first_file = (KVSimFile*)fListOfSimFiles.First();
112  return first_file->GetSimDir()->GetDirectory();
113  }
114  return "";
115 }
116 
117 
118 
124 
126 {
127  //Save (in the TEnv fBatchEnv) all necessary information on analysis task which can be used to execute it later
128  //(i.e. when batch processing system executes the job).
129  //If save=kTRUE (default), write the information in a file whose name is given by ".jobname"
130  //where 'jobname' is the name of the job as given to the batch system.
131 
133  KVSimFile* simF = (KVSimFile*)fListOfSimFiles.First();
134  KVSimDir* simD = simF->GetSimDir();
135  GetBatchInfoFile()->SetValue("SimDir", simD->GetDirectory());
136  if (simD->HasAuxDirectory())
137  GetBatchInfoFile()->SetValue("AuxDir", simD->GetAuxDirectory());
138  if (simF->IsFiltered()) GetBatchInfoFile()->SetValue("SimFile.Type", "filtered");
139  else GetBatchInfoFile()->SetValue("SimFile.Type", "simulated");
140  GetBatchInfoFile()->SetValue("SimFiles", simF->GetName());
141  if (fListOfSimFiles.GetEntries() > 1) {
142  TIter next(&fListOfSimFiles);
143  next();
144  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+SimFiles", simF->GetName());
145  }
146  if (!fListOfAuxFiles.IsEmpty()) {
147  // auxiliary files for batch job
148  GetBatchInfoFile()->SetValue("AuxFiles", fListOfAuxFiles.First()->GetName());
149  if (fListOfAuxFiles.GetEntries() > 1) {
150  TIter next(&fListOfAuxFiles);
151  next();
152  while ((simF = (KVSimFile*)next())) GetBatchInfoFile()->SetValue("+AuxFiles", simF->GetName());
153  }
154  }
155  if (is_filter_job) GetBatchInfoFile()->SetValue("FilterJob", 1);
156  if (sav) GetBatchInfoFile()->SaveLevel(kEnvUser);
157 }
158 
159 
160 
165 
167 {
168  //Read the batch env file "filename" and initialise the analysis task using the
169  //informations in the file
170  //Returns kTRUE if all goes well
171 
172  Bool_t ok = kFALSE;
173 
175 
176  KVString simdir = GetBatchInfoFile()->GetValue("SimDir", "");
177  if (simdir == "") return ok;
178 
179  KVString auxdir = GetBatchInfoFile()->GetValue("AuxDir", "");
180 
181  is_filter_job = (Bool_t)GetBatchInfoFile()->GetValue("FilterJob", 0);
182 
183  fSimDir = new KVSimDir("SIMDIR", simdir);
184  if (!auxdir.IsNull()) fSimDir->SetAuxDirectory(auxdir);
185  fSimDir->AnalyseDirectory();
186 
187  KVString filetype = GetBatchInfoFile()->GetValue("SimFile.Type", "");
188  if (filetype == "") return ok;
189 
190  KVString simfiles = GetBatchInfoFile()->GetValue("SimFiles", "");
191  if (simfiles == "") return ok;
192 
193  fListOfSimFiles.Clear();
194 
195  simfiles.Begin(" ");
196  while (!simfiles.End()) {
197  if (filetype == "simulated") fListOfSimFiles.Add(fSimDir->GetSimDataList()->FindObject(simfiles.Next()));
198  else if (filetype == "filtered") fListOfSimFiles.Add(fSimDir->GetFiltDataList()->FindObject(simfiles.Next()));
199  }
200 
201  KVString auxfiles = GetBatchInfoFile()->GetValue("AuxFiles", "");
202  if (auxfiles == "") return (ok = kTRUE);
203 
204  fListOfAuxFiles.Clear();
205 
206  auxfiles.Begin(" ");
207  while (!auxfiles.End()) {
208  fListOfAuxFiles.Add(fSimDir->GetSimDataList()->FindObject(auxfiles.Next()));
209  }
210 
211  ok = kTRUE;
212 
213  return ok;
214 }
215 
216 
217 
222 
223 void KVSimDirAnalyser::BuildChain()
224 {
225  // Build a TChain with all files/trees to be analysed
226  //
227  // If fCopyFilesToWorkDir==true, files are first copied to working directory
228 
229  TIter next(&fListOfSimFiles);
230  KVSimFile* file;
231  while ((file = (KVSimFile*)next())) {
232  if (!fAnalysisChain) {
233  fAnalysisChain = new TChain(file->GetTreeName());
234  }
235  fAnalysisChain->Add(file->GetFullPathToFile());
236  }
237 }
238 
239 
240 
245 
246 void KVSimDirAnalyser::GetInfosForJobNameFromFiles()
247 {
248  // Use first file in list to analyse to obtain information for generating
249  // automatic batch job names (name of model, eventually info on simulated reaction,
250  // etc.)
251 
252  KVSimFile* sf = dynamic_cast<KVSimFile*>(fListOfSimFiles.First());
253  // name of TTree is (usually) name of model
254  fModel = sf->GetTreeName();
255  if (fModel == "dit_events") fModel = "DIT"; // except for DIT
256 }
257 
258 
259 
260 
263 
264 void KVSimDirAnalyser::Make(const Char_t* kvsname)
265 {
266  // Generate a new simulated analysis selector class
267 
268 #ifndef USING_ROOT6
269  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
270  kTRUE, "SimulatedEventAnalysisTemplate");
271 #else
272  KVClassFactory cf(kvsname, "Analysis of simulated events", "",
273  kTRUE, "ROOT6SimulatedEventAnalysisTemplate");
274 #endif
275  cf.AddImplIncludeFile("KVSimNucleus.h");
276  cf.AddImplIncludeFile("KVBatchSystem.h");
277 
278  cf.GenerateCode();
279 }
280 
281 
282 
285 
287 {
288  // Replace any special symbols in auto-format jobname with current values
289 
291  tmp.ReplaceAll("KVEventFiltering",
292  Form("%s_%s_FILTER_%s", fModel.Data(), fFilterSystem.Data(), fFilterDataSet.Data()));
293  tmp.ReplaceAll(" ", "");
294  tmp.ReplaceAll("@", "_");
295  tmp.ReplaceAll("+", "_");
296  tmp.ReplaceAll("/", "_");
297  tmp.ReplaceAll("(", "_");
298  tmp.ReplaceAll(")", "_");
299  tmp.ReplaceAll("[", "_");
300  tmp.ReplaceAll("]", "_");
301  return tmp;
302 }
303 
304 
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)