KaliVeda
Toolkit for HIC analysis
KVReconDataAnalyser.cpp
1 //Created by KVClassFactory on Thu Jul 19 2018
2 //Author: John Frankland
3 
4 #include "KVBase.h"
5 #include "KVReconDataAnalyser.h"
6 #include "KVDBRun.h"
7 #include "KVMultiDetArray.h"
8 #include "KVDataAnalysisTask.h"
9 #include "KVDataSet.h"
10 #include "TChain.h"
11 #include "TObjString.h"
12 #include "TChain.h"
13 #include "KVAvailableRunsFile.h"
14 
15 #include <KVClassFactory.h>
16 #include <KVTriggerConditions.h>
17 
18 using namespace std;
19 
21 
22 
23 
26  : fSelector(nullptr), theChain(nullptr)
27 {
28 }
29 
30 
31 
34 
36 {
37  //Reset task variables
39  theChain = nullptr;
40  fSelector = nullptr;
41  TotalEntriesToRead = 0;
42 }
43 
44 
45 
46 
47 
48 
51 
53 {
54  // Checks the task variables
55 
57 
58  cout << "============> Analysis summary <=============" << endl;
59  cout << "Analysis of runs " << GetRunList().GetList() << " with the class ";
60  cout << "\"" << GetUserClass().name << "\"." << endl;
61  if (GetNbEventToRead()) {
62  cout << GetNbEventToRead() << " events will be processed." << endl;
63  }
64  else {
65  cout << "All events will be processed." << endl;
66  }
67  cout << "=============================================" << endl;
68 
69  return kTRUE;
70 }
71 
72 
73 
74 
79 
81 {
82  //Run the interactive analysis
83 
84  //make the chosen dataset the active dataset ( = gDataSet; note this also opens database
85  //and positions gDataBase & gExpDB).
86  GetDataSet()->cd();
87  fSelector = nullptr;
88 
89  theChain = new TChain("ReconEvents");
90  theChain->SetDirectory(0); // we handle delete
91 
92  // open and add to TChain all required files
93  // we force the opening of the files to avoid problems with xrootd which sometimes
94  // seems to have a little difficulty
95  for (auto& run : GetRunList()) {
96  TString fullPathToRunfile = gDataSet->GetFullPathToRunfile(GetDataType(), run);
97  cout << "Opening file " << fullPathToRunfile << endl;
98  TFile* f = gDataSet->OpenRunfile<TFile>(GetDataType(), run);
99  cout << "Adding file " << fullPathToRunfile;
100  cout << " to the TChain." << endl;
101  dynamic_cast<TChain*>(theChain)->Add(fullPathToRunfile);
102  if (f && !f->IsZombie()) {
103  // update run infos in available runs file if necessary
105  if (ARF->InfosNeedUpdate(run, gSystem->BaseName(fullPathToRunfile))) {
106  if (!((TTree*)f->Get("ReconEvents"))) {
107  KVError::Error(this, "SubmitTask", "No tree named ReconEvents is present in the current file");
108  delete theChain;
109  return;
110  }
111  TEnv* treeInfos = (TEnv*)((TTree*)f->Get("ReconEvents"))->GetUserInfo()->FindObject("TEnv");
112  if (treeInfos) {
113  TString kvversion = treeInfos->GetValue("KVBase::GetKVVersion()", "");
114  TString username = treeInfos->GetValue("gSystem->GetUserInfo()->fUser", "");
115  if (kvversion != "") ARF->UpdateInfos(run, gSystem->BaseName(fullPathToRunfile), kvversion, username);
116  }
117  else {
118  Info("SubmitTask", "No TEnv object associated to the tree");
119  }
120  }
121  }
122  }
123  TotalEntriesToRead = theChain->GetEntries();
124  TString option = Form("EventsReadInterval=%lld,", GetAnalysisTask()->GetStatusUpdateInterval());
125  option += Form("FullRunList=%s", GetFullRunList().GetList().Data());
126 
127  // Add any user-defined options
128  if (GetUserClassOptions() != "") {
129  option += ",";
130  option += GetUserClassOptions();
131  }
132 
133  TObject* new_selector = GetInstanceOfUserClass();
134 
135  if (!new_selector || !new_selector->InheritsFrom("TSelector")) {
136  cout << "The selector \"" << GetUserClassName() << "\" is not valid." << endl;
137  cout << "Process aborted." << endl;
138  SafeDelete(new_selector);
139  }
140  else {
141  SafeDelete(new_selector);
142  Info("SubmitTask", "Beginning TChain::Process...");
143 #ifdef WITH_CPP11
144  if (GetProofMode() != KVDataAnalyser::EProofMode::None) dynamic_cast<TChain*>(theChain)->SetProof(kTRUE);
145 #else
146  if (GetProofMode() != KVDataAnalyser::None) dynamic_cast<TChain*>(theChain)->SetProof(kTRUE);
147 #endif
148  TString analysis_class;
149  if (GetAnalysisTask()->WithUserClass())
150  analysis_class.Form("%s%s", GetUserClass().full_path_imp().Data(), GetACliCMode());
151  else analysis_class = GetUserClassName();
152 
153  if (GetNbEventToRead()) {
154  theChain->Process(analysis_class, option.Data(), GetNbEventToRead());
155  }
156  else {
157  theChain->Process(analysis_class, option.Data());
158  }
159  }
160  delete theChain;
161  fSelector = nullptr; //deleted by TChain/TTreePlayer
162 }
163 
164 
165 
194 
196 {
197  // Called by currently-processed TSelector when a new file in the TChain is opened.
198  //
199  // We call gMultiDetArray->SetParameters() for the current run.
200  //
201  // Whether or not only physics parameters are set, or the full set of calibrations and identifications
202  // for each detector/identification telescope is determined by the environment variable
203  //
204  //~~~
205  // [dataset].ReconAnalysis.WithCalibInfos: [yes/no]
206  //~~~
207  //
208  // This can be overridden for any individual analysis by setting the analysis class option
209  //
210  //~~~~
211  // WithCalibInfos=yes
212  //~~~~
213  //
214  // Infos on currently read file/tree are printed.
215  //
216  // Any data patches (see KVDataPatch and KVDataPatchList) which are defined for the currently analysed
217  // data will be applied, unless the variable
218  //
219  //~~~
220  //[dataset].DataAnalysis.ApplyDataPatches
221  //~~~
222  //
223  // has been set to 'off', 'no', 'false' (see KVDataPatchList::InitializePatchList())
224 
225  Bool_t physics_parameters_only = !gDataSet->GetDataSetEnv("ReconAnalysis.WithCalibInfos", kTRUE);
226  if (fSelector->IsOptGiven("WithCalibInfos"))
227  physics_parameters_only = (fSelector->GetOpt("WithCalibInfos") != "yes");
228 
229  Int_t run = gDataSet->GetRunNumberFromFileName(GetDataType(), theChain->GetCurrentFile()->GetName()).value().run();
231  KVMultiDetArray::MakeMultiDetector(GetDataSet()->GetName(), run);
232 
233  KVDBRun* CurrentRun = gExpDB->GetDBRun(run);
234  SetCurrentRun(CurrentRun);
235  fSelector->SetCurrentRun(CurrentRun);
236 
237  cout << endl << " =================== New Run =================== " <<
238  endl << endl;
239 
240  CurrentRun->Print();
241  if (CurrentRun->GetSystem()) {
242  if (CurrentRun->GetSystem()->GetKinematics())
243  CurrentRun->GetSystem()->GetKinematics()->Print();
244  }
245 
246  cout << endl << " ================================================= " <<
247  endl << endl;
248 
249  PrintTreeInfos();
250  Info("preInitRun", "Data written with series %s, release %d", GetDataSeries().Data(),
251  GetDataReleaseNumber());
252  fRustines.InitializePatchList(GetDataSet()->GetName(), GetDataType(), run, GetDataSeries(),
253  GetDataReleaseNumber(), theChain->GetCurrentFile()->GetStreamerInfoCache());
254  fRustines.Print();
255 }
256 
257 
258 
261 
263 {
264  // apply any required patches to data
265  if (fRustines.HasActivePatches()) fRustines.Apply(fSelector->GetEvent());
266 }
267 
268 
269 
271 
273 {
274  return (TEnv*)theChain->GetTree()->GetUserInfo()->FindObject("TEnv");
275 }
276 
277 
278 
294 
296 {
297  // When called from the InitRun() method of a user's analysis class, this method will ensure that only data
298  // compatible with the experimental trigger will be provided for analysis in the user's Analysis() method.
299  //
300  // This will be done by searching for a KVTriggerConditions plugin class defined for the currently-analysed
301  // dataset, defined like so:
302  //
303  //~~~~
304  //+Plugin.KVTriggerConditions: [dataset] [classname] [libname] "[default constructor]()"
305  //~~~~
306  //
307  // An object of the plugin class will be instantiated, and then its overridden
308  // KVTriggerConditions::SetTriggerConditionsForRun() method will be called with 2 arguments:
309  // - a pointer to the user's analysis class derived from KVReconEventSelector;
310  // - the number of the run currently being analysed
311 
312  TPluginHandler* ph = KVBase::LoadPlugin("KVTriggerConditions", GetDataSet()->GetName());
313  if (!ph) {
314  Info("SetTriggerConditionsForRun",
315  "No definition of trigger conditions available for dataset %s",
316  GetDataSet()->GetName());
317  return;
318  }
319  std::unique_ptr<KVTriggerConditions> trig((KVTriggerConditions*) ph->ExecPlugin(0));
320  trig->SetTriggerConditionsForRun(fSelector, run);
321 }
322 
323 
324 
327 
329 {
330  // Print informations on currently analysed TTree
331  TEnv* treeInfos = GetReconDataTreeInfos();
332  if (!treeInfos) return;
333  cout << endl << "----------------------------------------------------------------------------------------------------" << endl;
334  cout << "INFORMATIONS ON VERSION OF KALIVEDA USED TO GENERATE FILE:" << endl << endl;
335  fDataVersion = treeInfos->GetValue("KVBase::GetKVVersion()", "(unknown)");
336  cout << "version = " << fDataVersion << endl ;
337  cout << "build date = " << treeInfos->GetValue("KVBase::GetKVBuildDate()", "(unknown)") << endl ;
338  cout << "source directory = " << treeInfos->GetValue("KVBase::GetKVSourceDir()", "(unknown)") << endl ;
339  cout << "KVROOT = " << treeInfos->GetValue("KVBase::GetKVRoot()", "(unknown)") << endl ;
340  if (strcmp(treeInfos->GetValue("KVBase::bzrBranchNick()", "(unknown)"), "(unknown)")) {
341  cout << "BZR branch name = " << treeInfos->GetValue("KVBase::bzrBranchNick()", "(unknown)") << endl ;
342  cout << "BZR revision #" << treeInfos->GetValue("KVBase::bzrRevisionNumber()", "(unknown)") << endl ;
343  cout << "BZR revision ID = " << treeInfos->GetValue("KVBase::bzrRevisionId()", "(unknown)") << endl ;
344  cout << "BZR revision date = " << treeInfos->GetValue("KVBase::bzrRevisionDate()", "(unknown)") << endl ;
345  }
346  else if (strcmp(treeInfos->GetValue("KVBase::gitBranch()", "(unknown)"), "(unknown)")) {
347  cout << "git branch = " << treeInfos->GetValue("KVBase::gitBranch()", "(unknown)") << endl;
348  cout << "git commit = " << treeInfos->GetValue("KVBase::gitCommit()", "(unknown)") << endl;
349  }
350  cout << endl << "INFORMATIONS ON GENERATION OF FILE:" << endl << endl;
351  cout << "Generated by : " << treeInfos->GetValue("gSystem->GetUserInfo()->fUser", "(unknown)") << endl ;
352  cout << "Analysis task : " << treeInfos->GetValue("AnalysisTask", "(unknown)") << endl ;
353  cout << "Job name : " << treeInfos->GetValue("BatchSystem.JobName", "(unknown)") << endl ;
354  cout << "Job submitted from : " << treeInfos->GetValue("LaunchDirectory", "(unknown)") << endl ;
355  cout << "Runs : " << treeInfos->GetValue("Runs", "(unknown)") << endl ;
356  cout << "Number of events requested : " << treeInfos->GetValue("NbToRead", "(unknown)") << endl ;
357  cout << endl << "----------------------------------------------------------------------------------------------------" << endl;
358 
359  // if possible, parse fDataVersion into series and release number
360  // e.g. if fDataVersion = "1.8.10":
361  // => fDataSeries = "1.8" fDataReleaseNum = 10
362  // e.g. if fDataVersion = "1.11/00":
363  // => fDataSeries = "1.11" fDataReleaseNum = 0
364  Int_t a, b, c;
365  if (fDataVersion != "(unknown)") {
366  if (fDataVersion.Contains("/")) {
367  if (sscanf(fDataVersion.Data(), "%d.%d/%d", &a, &b, &c) == 3) {
368  fDataSeries.Form("%d.%d", a, b);
369  fDataReleaseNum = c;
370  }
371  }
372  else {
373  if (sscanf(fDataVersion.Data(), "%d.%d.%d", &a, &b, &c) == 3) {
374  fDataSeries.Form("%d.%d", a, b);
375  fDataReleaseNum = c;
376  }
377  }
378  }
379  else {
380  fDataSeries = "";
381  fDataReleaseNum = -1;
382  }
383 }
384 
385 
int Int_t
#define SafeDelete(p)
#define f(i)
#define c(i)
bool Bool_t
constexpr Bool_t kFALSE
constexpr Bool_t kTRUE
Option_t Option_t option
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 b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
void Print(Option_t *opt="") const override
Definition: KV2Body.cpp:874
Handles lists of available runs for different datasets and types of data.
Bool_t InfosNeedUpdate(const run_index_t &run, const KVString &filename)
void UpdateInfos(const run_index_t &run, const KVString &filename, const KVString &kvversion, const KVString &username)
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Definition: KVBase.cpp:795
Description of an experimental run in database ,,.
Definition: KVDBRun.h:41
void Print(Option_t *option="") const override
Definition: KVDBRun.cpp:61
KVDBSystem * GetSystem() const
Definition: KVDBRun.cpp:240
KV2Body * GetKinematics()
Definition: KVDBSystem.cpp:103
virtual Bool_t CheckTaskVariables()
void Reset() override
TString GetFullPathToRunfile(const KVString &type, const run_index_t &run) const
Definition: KVDataSet.cpp:885
KVAvailableRunsFile * GetAvailableRunsFile(const TString &type) const
Definition: KVDataSet.cpp:49
std::optional< run_index_t > GetRunNumberFromFileName(const TString &datatype, const TString &filename)
Definition: KVDataSet.cpp:978
FileType * OpenRunfile(const KVString &type, const run_index_t &run)
Definition: KVDataSet.h:285
ValType GetDataSetEnv(const Char_t *type, const ValType &defval={}) const
Definition: KVDataSet.h:270
KVDBRun * GetDBRun(Int_t number) const
Definition: KVExpDB.h:144
static KVMultiDetArray * MakeMultiDetector(const Char_t *dataset_name, Int_t run=-1, TString classname="KVMultiDetArray", KVExpDB *db=nullptr)
static void SetMakeMultiDetectorPhysicsParametersOnly(Bool_t on=kTRUE)
Manages user analysis of reconstructed experimental data.
void preAnalysis() override
apply any required patches to data
TEnv * GetReconDataTreeInfos() const
void PrintTreeInfos()
Print informations on currently analysed TTree.
Bool_t CheckTaskVariables(void) override
Checks the task variables.
virtual void SetTriggerConditionsForRun(int) override
void SubmitTask() override
void Reset() override
Reset task variables.
Set trigger conditions for analysis of reconstructed data.
virtual void SetProof(Bool_t on=kTRUE, Bool_t refresh=kFALSE, Bool_t gettreeheader=kFALSE)
virtual const char * GetValue(const char *name, const char *dflt) const
virtual TObject * FindObject(const char *name) const
virtual Bool_t InheritsFrom(const char *classname) const
Longptr_t ExecPlugin(int nargs)
void Form(const char *fmt,...)
virtual const char * BaseName(const char *pathname)
void Error(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:116
BinData::ErrorType GetDataType(const TGraph *gr, DataOptions &fitOpt)
void Info(const char *location, const char *fmt,...)
Add
TArc a
ClassImp(TPyArg)