1 #include "KVNucleusEvent.h"
2 #define KVEventSelector_cxx
3 #include "KVEventSelector.h"
4 #include <KVClassMonitor.h>
8 #include "KVDataRepositoryManager.h"
9 #include "KVDataSetRepository.h"
10 #include "KVDataSetManager.h"
14 #include "KVDataSetAnalyser.h"
30 if (IsOptGiven(
"CombinedOutputFile")) {
31 fCombinedOutputFile = GetOpt(
"CombinedOutputFile");
39 fDisableCreateTreeFile =
kTRUE;
46 fDisableCreateTreeFile =
kFALSE;
55 if (IsOptGiven(
"AuxFiles")) {
57 if (GetInputList()) GetInputList()->Add(fAuxChain);
67 if (GetInputList() && GetInputList()->FindObject(
"JobDescriptionList")) {
72 if (!gDataRepositoryManager) {
74 gDataRepositoryManager->
Init();
81 if (!gDataSetManager) {
83 gDataSetManager->
Init();
88 if (gDataSet && gDataAnalyser->
InheritsFrom(
"KVDataSetAnalyser"))
98 if (IsOptGiven(
"CombinedOutputFile")) {
99 fCombinedOutputFile = GetOpt(
"CombinedOutputFile");
100 Info(
"SlaveBegin",
"Output file name = %s", fCombinedOutputFile.Data());
109 fDisableCreateTreeFile =
kFALSE;
113 if (IsOptGiven(
"AuxFiles")) {
115 if (GetInputList()) {
116 fAuxChain = (
TTree*)GetInputList()->FindObject(GetOpt(
"AuxTreeName"));
117 InitFriendTree(fAuxChain, GetOpt(
"AuxBranchName"));
120 Info(
"SlaveBegin",
"fOutput->ls()");
121 GetOutputList()->ls();
132 Abort(
Form(
"Job received KILL signal from batch system after %lld events - batch job probably needs more CPU time (see end of job statistics)", fEventsRead), kAbortFile);
147 if (fPartCond.IsSet()) {
149 part.SetIsOK(fPartCond.Test(part));
155 for (
auto p : fGlobalVariables)
dynamic_cast<KVGVList*
>(
p)->
Init();
158 RecalculateGlobalVariables();
162 if (!fGlobalVariableAbortEventAnalysis) {
165 ok_anal = Analysis();
177 void KVEventSelector::CheckEndOfRun()
180 Info(
"Process",
"End of file reached after %lld events", fEventsRead);
181 if (gDataAnalyser) gDataAnalyser->
preEndRun();
183 if (gDataAnalyser) gDataAnalyser->
postEndRun();
199 if (GetHistoList().GetEntries()) {
200 GetHistoList().R__FOR_EACH(
TH1, Write)();
202 if (GetTreeList().GetEntries()) {
207 if (gDataAnalyser->
GetProofMode() != KVDataAnalyser::EProofMode::None) {
208 fOutput->Add(mergeFile);
222 Info(
"Terminate",
"Analysis ends at %s", now.
AsString());
228 if (GetInputList() && fAuxChain) GetInputList()->Remove(fAuxChain);
240 void KVEventSelector::RecalculateGlobalVariables()
244 fGlobalVariableAbortEventAnalysis =
false;
245 for (
auto p : fGlobalVariables) {
249 if (gvl->AbortEventAnalysis()) {
250 fGlobalVariableAbortEventAnalysis =
true;
263 void KVEventSelector::add_histo(
TH1* histo)
268 if (fDisableCreateTreeFile)
return;
270 GetHistoList().Add(histo);
273 else create_output_file();
282 void KVEventSelector::add_tree(
TTree*
tree)
287 if (fDisableCreateTreeFile)
return;
290 GetTreeList().Add(
tree);
292 if (writeFile)
tree->SetDirectory(writeFile);
293 else create_output_file();
303 void KVEventSelector::create_output_file()
309 if (fCombinedOutputFile ==
"")
return;
312 if (gDataAnalyser->
GetProofMode() == KVDataAnalyser::EProofMode::None) {
314 writeFile =
TFile::Open(fCombinedOutputFile,
"RECREATE");
320 mergeFile->SetOutputFileName(fCombinedOutputFile);
321 writeFile = mergeFile->OpenFile(
"RECREATE");
322 if (writeFile && writeFile->IsZombie())
SafeDelete(writeFile);
329 ClassName(), fCombinedOutputFile.Data());
330 Abort(amsg, kAbortProcess);
334 if (GetHistoList().GetEntries()) {
335 GetHistoList().R__FOR_EACH(
TH1, SetDirectory)(writeFile);
337 if (GetTreeList().GetEntries()) {
338 GetTreeList().R__FOR_EACH(
TTree, SetDirectory)(writeFile);
354 void KVEventSelector::SetUpAuxEventChain()
365 if (!IsOptGiven(
"AuxDir") || !IsOptGiven(
"AuxTreeName") || !IsOptGiven(
"AuxBranchName")) {
366 KVError::Error(
this,
"SetUpAuxEventChain",
"if AuxFiles option given, you must define AuxDir, AuxTreeName and AuxBranchName");
369 KVString filelist = GetOpt(
"AuxFiles");
370 KVString filedir = GetOpt(
"AuxDir");
371 if (!filedir.
EndsWith(
"/")) filedir +=
"/";
374 while (!filelist.
End()) {
378 InitFriendTree(auxchain, GetOpt(
"AuxBranchName"));
394 void KVEventSelector::ParseOptions()
406 fOptionList.ParseOptions(GetOption());
409 if (IsOptGiven(
"BranchName")) SetBranchName(GetOpt(
"BranchName"));
411 if (IsOptGiven(
"EventsReadInterval")) SetEventsReadInterval(GetOpt(
"EventsReadInterval").Atoi());
424 fChain->SetMakeClass(1);
426 if (gDataAnalyser->
GetProofMode() != KVDataAnalyser::EProofMode::None) {
430 if (strcmp(GetBranchName(),
"") && fChain->GetBranch(GetBranchName())) {
431 Info(
"Init",
"Analysing data in branch : %s", GetBranchName());
432 fChain->SetBranchAddress(GetBranchName(), &
Event, &b_Event);
435 KVError::Error(
this,
"Init",
"Failed to link KVEvent object with a branch. Expected branch name=%s",
439 SetAdditionalBranchAddress();
462 void KVEventSelector::InitFriendTree(
TTree*
tree,
const TString& branchname)
481 fAuxChain->SetBranchAddress(branchname, &AuxEvent);
483 fAuxChain->GetEntry(0);
484 fAuxChain->GetTree()->GetEntry(0);
493 if (fNotifyCalled)
return kTRUE;
494 fNotifyCalled =
kTRUE;
496 Info(
"Notify",
"Beginning analysis of file %s (%lld events)", fChain->GetCurrentFile()->GetName(), fChain->GetTree()->GetEntries());
498 if (gDataAnalyser) gDataAnalyser->
preInitRun();
winID h TVirtualViewer3D TVirtualGLPainter p
R__EXTERN TProof * gProof
char * Form(const char *fmt,...)
Class for iterating over "OK" nuclei in events accessed through base pointer/reference.
static KVClassMonitor * GetInstance()
Return pointer to unique instance of class monitor class.
virtual void SetAnalysedTree(TTree *)
virtual void postEndRun()
void DoStatusUpdate(Long64_t nevents) const
Print infos on events treated, disk usage, memory usage.
virtual void AddJobDescriptionList(TList *)
virtual void preInitAnalysis()
virtual void postAnalysis()
void SetAnalysisTask(KVDataAnalysisTask *at)
void SetProofMode(EProofMode e)
virtual Bool_t CheckStatusUpdateInterval(Long64_t nevents) const
virtual void preAnalysis()
static KVDataAnalyser * GetAnalyser(const Char_t *plugin)
EProofMode GetProofMode() const
virtual void postInitRun()
static Bool_t AbortProcessingLoop()
virtual void postEndAnalysis()
virtual void preEndAnalysis()
virtual void preInitRun()
virtual void RegisterUserClass(TObject *)
virtual void postInitAnalysis()
Define and manage data analysis tasks.
virtual const Char_t * GetDataAnalyser() const
Manages access to one or more data repositories.
KVDataSetRepository * GetRepository(const TString &name) const
Pilots user analysis of experimental data.
Manage all datasets contained in a given data repository.
Bool_t Init(KVDataSetRepository *=0)
KVDataAnalysisTask * GetAnalysisTaskAny(const Char_t *keywords) const
KVDataSet * GetDataSet(Int_t) const
Return pointer to DataSet using index in list of all datasets, index>=0.
KVDataAnalysisTask * GetAnalysisTask(Int_t) const
General purpose analysis base class for TTree containing KVEvent objects.
Bool_t Process(Long64_t entry) override
void Init(TTree *tree) override
void SlaveTerminate() override
void SlaveBegin(TTree *tree) override
void Terminate() override
Manage a list of global variables.
void CalculateGlobalVariables(KVEvent *e)
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Int_t GetIntValue(const Char_t *name) const
const Char_t * GetStringValue(const Char_t *name) const
Bool_t HasParameter(const Char_t *name) const
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
virtual Int_t Add(const char *name, Long64_t nentries=TTree::kMaxEntries)
const char * AsString() const
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
virtual void SetDirectory(TDirectory *dir)
virtual Bool_t InheritsFrom(const char *classname) const
Bool_t EndsWith(const char *pat, ECaseCompare cmp=kExact) const
static TString Format(const char *fmt,...)
RooCmdArg ClassName(const char *name)
void Error(UserClass p, const char *location, const char *va_(fmt),...)