22 #include "TClassTable.h"
23 #include "TDataType.h"
25 #include "TMethodArg.h"
28 #include "TObjString.h"
29 #include "TInterpreter.h"
48 #define PROCESSLOOPDELAY 20
50 #define TERMCOUNTS 10000
55 std::cerr <<
"Error: " << msg << std::endl;
56 std::cerr <<
"Call 'go4analysis -help' to see list of available arguments" << std::endl;
62 std::cout <<
" -file filename : use file filename (lmd or lml) as MBS event source (short: -f)" << std::endl;
63 std::cout <<
" -transport server : connect to MBS transport server (short: -tr)" << std::endl;
64 std::cout <<
" -stream server : connect to MBS stream server (short: -st)" << std::endl;
65 std::cout <<
" -evserv server : connect to MBS event server (short: -ev)" << std::endl;
66 std::cout <<
" -revserv server [port] : connect to remote event server (short: -rev)" << std::endl;
67 std::cout <<
" -random : use random generator as source (short: -rnd)" << std::endl;
69 std::cout <<
" -hdf5 name : use HDF5 formatted file (h5) as event source" << std::endl;
71 std::cout <<
" -user name : create user-defined event source" << std::endl;
72 std::cout <<
" -timeout tm : specify timeout parameter for event source" << std::endl;
73 std::cout <<
" -skip num : skip num first events in mbs event source" << std::endl;
74 std::cout <<
" -mbs-select first last step : select events interval from mbs source " << std::endl;
75 std::cout <<
" first: sequence number of the first event (starts from 0)" << std::endl;
76 std::cout <<
" last: sequence number of the last event" << std::endl;
77 std::cout <<
" step: step over several events, 1 means all events are used" << std::endl;
81 void usage(
const char* subtopic = 0)
83 std::cout << std::endl;
84 std::cout <<
"GO4 analysis runnable " <<
__GO4RELEASE__ << std::endl;
85 std::cout <<
"S. Linev, GSI, Darmstadt" << std::endl;
87 if ((subtopic!=0) && (strlen(subtopic)>0)) {
88 const char* sub = subtopic;
91 if ((strcmp(subtopic,
"sources")==0) || (strcmp(subtopic,
"src")==0) || (strcmp(subtopic,
"src")==0)) {
92 std::cout <<
"These are arguments of go4analysis which allows to specify event source" << std::endl;
96 if ((strcmp(sub,
"print")==0) || (strcmp(sub,
"pr")==0) ||
97 (strcmp(sub,
"type")==0) || (strcmp(sub,
"ty")==0)) {
98 std::cout <<
"Usage of go4analysis -print command." << std::endl;
99 std::cout << std::endl;
100 std::cout <<
" go4analysis -print|-pr|-type|-ty [PROPT] [SOURCE] [MISC]" << std::endl;
101 std::cout << std::endl;
102 std::cout <<
"PROPT: print options, right after -print command" << std::endl;
103 std::cout <<
" hex : print data in hexadecimal format" << std::endl;
104 std::cout <<
" dec : print data in decimal format" << std::endl;
105 std::cout <<
" long : print data in long (4 bytes) form (default)" << std::endl;
106 std::cout <<
" short : print data in short (2 bytes) form" << std::endl;
107 std::cout <<
" sub=N : select subevent id N (default all subevents are shown)" << std::endl;
108 std::cout <<
" fhead : print current lmd file header" << std::endl;
109 std::cout <<
" bhead : print current buffer header" << std::endl;
110 std::cout <<
"SOURCE: event source print options" << std::endl;
112 std::cout <<
"MISC: other options, which may be relevant for \"print\" command" << std::endl;
113 std::cout <<
" -number M : print M events, default is 1 (short: -num)" << std::endl;
114 std::cout <<
" -lib name : load library, may be required for user-defined sources" << std::endl;
115 std::cout <<
" -v : enable verbose mode to see some debug output (default: -v2)" << std::endl;
116 std::cout << std::endl;
117 std::cout <<
" Print event header from MBS stream server" << std::endl;
118 std::cout <<
" go4analysis -stream r4-4 -print " << std::endl;
119 std::cout << std::endl;
120 std::cout <<
" Print event data in hexadecimal form from MBS event server" << std::endl;
121 std::cout <<
" go4analysis -ev r2-1 -pr hex" << std::endl;
122 std::cout << std::endl;
123 std::cout <<
" Print 5 events with subevent id=1 in decimal form from MBS transport server" << std::endl;
124 std::cout <<
" go4analysis -tr r2-2 -num 5 -ty dec sub=1 " << std::endl;
125 std::cout << std::endl;
128 std::cout <<
"No help for topic: \""<< subtopic <<
"\"" << std::endl;
129 std::cout <<
"Available: print, sources" << std::endl;
134 std::cout <<
"calling: " << std::endl;
135 std::cout <<
"" << std::endl;
136 std::cout <<
" go4analysis [RUN] [ANALYSIS] [STEP1] [STEP2] ... [USER]" << std::endl;
137 std::cout <<
"" << std::endl;
138 std::cout <<
"RUN: configuration, relevant for application run mode" << std::endl;
139 std::cout <<
" -lib name : user library to load (default: libGo4UserLibrary)" << std::endl;
140 std::cout <<
" -server [name] : run analysis in server mode, name - optional analysis name" << std::endl;
141 std::cout <<
" -gui name guihost guiport : run analysis in gui mode, used by GUI launch analysis" << std::endl;
143 std::cout <<
" -http [port] : run analysis with web-server running, " << std::endl;
144 std::cout <<
" optionally port can be specified, default 8080" << std::endl;
145 std::cout <<
" -auth [filename] : use authentication file to restrict access to http server " << std::endl;
146 std::cout <<
" file should contain 'controller' and 'admin' accounts for 'go4' domain" << std::endl;
147 std::cout <<
" Could be generated with htdigets utility, by default '$GO4SYS/etc/.htdigest' filename is used" << std::endl;
148 std::cout <<
" -fastcgi port : run analysis with fastcgi server running, "<< std::endl;
149 std::cout <<
" which can deliver data to normal webserver (see mod_proxy_fcgi for Apache)" << std::endl;
150 std::cout <<
" -jsroot location : use JSROOT from other location like https://root.cern.ch/js/latest/" << std::endl;
152 std::cout <<
" -dabc master_host:port : run analysis with optional connection to dabc application, "<< std::endl;
153 std::cout <<
" which could receive objects from running analysis" << std::endl;
156 std::cout <<
" -run : run analysis in server mode (default only run if source specified)" << std::endl;
157 std::cout <<
" -norun : exclude automatical run" << std::endl;
158 std::cout <<
" -number NUMBER : process NUMBER events in batch mode" << std::endl;
159 std::cout <<
" -hserver [name [passwd]] : start histogram server with optional name and password" << std::endl;
160 std::cout <<
" -log [filename] : enable log output into filename (default:go4logfile.txt)" << std::endl;
161 std::cout <<
" -v -v0 -v1 -v2 -v3 : change log output verbosity (0 - maximum, 1 - info, 2 - warn, 3 - errors)" << std::endl;
162 std::cout <<
" -gdebug [lvl] : set ROOT gDebug value, default 1" << std::endl;
163 std::cout <<
" -rate : display rate information during run" << std::endl;
164 std::cout <<
" -print [sub=N] [hex|dec] : print events, see -help print for more info" << std::endl;
165 std::cout <<
" -help [topic] : show this help or for selected topic" << std::endl;
166 std::cout <<
" -graphics : enable graphics in the analysis" << std::endl;
167 std::cout <<
"" << std::endl;
168 std::cout <<
"ANALYSIS: common analysis configurations" << std::endl;
169 std::cout <<
" -name name : specify analysis instance name" << std::endl;
170 std::cout <<
" -asf [filename] : enable store autosave file and set autosave filename (default <Name>ASF.root)" << std::endl;
171 std::cout <<
" -enable-asf [interval] : enable store of autosave file, optionally interval in seconds" << std::endl;
172 std::cout <<
" -disable-asf : disable usage of asf" << std::endl;
173 std::cout <<
" -prefs [filename] : load preferences (analysis configuration) from specified file (default Go4AnalysisPrefs.root)" << std::endl;
174 std::cout <<
" -no-prefs : disable preferences loading" << std::endl;
175 std::cout <<
" -maxtreesize value : define maximum tree size, value can be: 2g, 1900m, 1900000000" << std::endl;
176 std::cout <<
"" << std::endl;
177 std::cout <<
"STEP: individual step configurations" << std::endl;
178 std::cout <<
" -step name : select step by it's name, if not found, first step will be used" << std::endl;
179 std::cout <<
" -step number : select step by it's number (first step has number 0)" << std::endl;
180 std::cout <<
" -enable-step : enable step processing" << std::endl;
181 std::cout <<
" -disable-step : disable step processing" << std::endl;
182 std::cout <<
" -file filename : use file filename (lmd or lml) as MBS event source" << std::endl;
183 std::cout <<
" -transport server : connect to MBS transport server" << std::endl;
184 std::cout <<
" -stream server : connect to MBS stream server" << std::endl;
185 std::cout <<
" -evserv server : connect to MBS event server" << std::endl;
186 std::cout <<
" -revserv server [port] : connect to remote event server" << std::endl;
187 std::cout <<
" -port number : select custom port number for event source" << std::endl;
188 std::cout <<
" -retry number : select number of retries when connection to source was lost" << std::endl;
189 std::cout <<
" -random : use random generator as source" << std::endl;
190 std::cout <<
" -user name : create user-defined event source" << std::endl;
191 std::cout <<
" -source filename : read step input from the root file" << std::endl;
193 std::cout <<
" -hdf5 filename : read step input from hdf5 file (.h5)" << std::endl;
195 std::cout <<
" -skip num : skip num first events in mbs event source" << std::endl;
196 std::cout <<
" -mbs-select first last step : select events interval from mbs source" << std::endl;
197 std::cout <<
" -timeout tm : specify timeout parameter for event source" << std::endl;
198 std::cout <<
" -enable-source : enable step source" << std::endl;
199 std::cout <<
" -disable-source : disable step source" << std::endl;
200 std::cout <<
" -store filename [split buffersize compression] : write step output into the root file" << std::endl;
201 std::cout <<
" -overwrite-store : overwrite file, when store output" << std::endl;
202 std::cout <<
" -append-store : append to file, when store output" << std::endl;
203 std::cout <<
" -backstore name : create backstore for online tree draw" << std::endl;
205 std::cout <<
" -hdf5store filename : write step output into hdf5 file (.h5)" << std::endl;
207 std::cout <<
" -userstore name : create user-defined store for output data" << std::endl;
208 std::cout <<
" -enable-store : enable step store" << std::endl;
209 std::cout <<
" -disable-store : disable step store" << std::endl;
210 std::cout <<
" -enable-errstop : enable stop-on-error mode" << std::endl;
211 std::cout <<
" -disable-errstop : disable stop-on-error mode" << std::endl;
212 std::cout <<
" -inpevt-class name : (re)define class name of input event" << std::endl;
213 std::cout <<
" -outevt-class name : (re)define class name of output event" << std::endl;
214 std::cout << std::endl;
215 std::cout <<
"USER: user-defined arguments" << std::endl;
216 std::cout <<
" -args [userargs] : create user analysis with constructor (int argc, char** argv) signature" << std::endl;
217 std::cout <<
" all following arguments will be provided as array of strings, first argument - analysis name" << std::endl;
218 std::cout << std::endl;
237 if (mbs) mbs->
PrintMbsEvent(fSubId, fLong, fHex, fData, fBufHead, fFileHead);
263 int FindArg(
int argc,
char **argv,
const char* argname)
265 if ((argname==0) || (strlen(argname)==0))
return -1;
266 for (
int n=0;n<argc;n++)
267 if (strcmp(argv[n], argname)==0)
return n;
271 const char*
GetArgValue(
int argc,
char **argv,
const char* argname,
int* pos = 0,
bool incomplete =
false)
273 int n = pos ? *pos : 0;
276 if (strcmp(argv[n], argname)==0) {
277 if ((n+1<argc) && (argv[n+1][0]!=
'-')) {
296 TList* lst =
new TList;
297 lst->SetOwner(kTRUE);
299 if (prev!=0)
TGo4Log::Debug(
"Search user classes in loaded library");
301 while ((name = TClassTable::Next()) != 0) {
302 if (prev && prev->FindObject(name))
continue;
304 TNamed* obj =
new TNamed(name, name);
317 TObjArray evnt_classes;
319 TClass *proc_cl(0), *an_cl(0), *evsrc_cl(0), *evstore_cl(0);
321 while ((obj = iter()) != 0) {
322 TClass* cl = TClass::GetClass(obj->GetName());
325 if ((cl==0) || !cl->IsStartingWithTObject())
continue;
327 if (cl->InheritsFrom(TGo4EventProcessor::Class())) {
329 if ((cl!=TGo4EventProcessor::Class()) && ((proc_cl==0) || cl->InheritsFrom(proc_cl))) proc_cl = cl;
331 if (cl->InheritsFrom(TGo4EventSource::Class())) {
332 if ((cl != TGo4EventSource::Class()) && !evsrc_cl) evsrc_cl = cl;
334 if (cl->InheritsFrom(TGo4EventStore::Class())) {
335 if ((cl != TGo4EventStore::Class()) && !evstore_cl) evstore_cl = cl;
337 if (cl->InheritsFrom(TGo4EventElement::Class())) {
338 if (cl != TGo4EventElement::Class()) evnt_classes.Add(cl);
340 if (cl->InheritsFrom(TGo4Analysis::Class())) {
341 if ((cl != TGo4Analysis::Class()) && !an_cl) an_cl = cl;
351 TGo4Log::Info(
"Find user analysis class %s", an_cl->GetName());
353 TMethod* meth = an_cl->GetMethodWithPrototype(an_cl->GetName(),
"int,char**");
355 TGo4Log::Info(
"!!! Find constructor with prototype %s::%s(int, char**)", an_cl->GetName(), an_cl->GetName());
357 if ((user_argc>0) && (user_argv!=0))
358 user_argv[0] = (
char*) name;
361 user_argv = (
char**) &name;
365 TString cmd = TString::Format(
"new %s(%d, (char**)0x%x)", an_cl->GetName(), user_argc, user_argv);
367 TString cmd = TString::Format(
"new %s(%d, (char**)%p)", an_cl->GetName(), user_argc, user_argv);
375 if ((analysis!=0) && (err==0))
return analysis;
377 TGo4Log::Error(
"Cannot create analysis class %s instance with (int, char**) prototype", an_cl->GetName());
378 TGo4Log::Error(
"Implement correct analysis constructor with such signature in user library");
383 meth = an_cl->GetMethodWithPrototype(an_cl->GetName(),
"const char*");
385 TGo4Log::Info(
"!!! Find constructor with prototype %s::%s(const char*)", an_cl->GetName(), an_cl->GetName());
387 TString cmd = TString::Format(
"new %s(\"%s\")", an_cl->GetName(), name);
394 if ((analysis!=0) && (err==0))
return analysis;
396 TGo4Log::Error(
"Cannot create analysis class %s instance with (const char*) prototype", an_cl->GetName());
397 TGo4Log::Error(
"Implement correct analysis constructor with such signature in user library");
402 TIter iter(an_cl->GetListOfMethods());
403 while ((meth = (TMethod*) iter()) != 0) {
404 if (strcmp(meth->GetName(), an_cl->GetName()) != 0)
continue;
405 if (meth->GetListOfMethodArgs()->GetSize()==0)
continue;
410 TGo4Log::Error(
"Cannot find non-default constructor for class %s", an_cl->GetName());
411 TGo4Log::Error(
"Implement analysis constructor with (const char*) or (int,char**) signature");
412 TGo4Log::Error(
"Or define TGo4Analysis* CreateUserAnalysis(const char*) function in user library");
416 TGo4Log::Info(
"Find constructor with %d arguments", meth->GetListOfMethodArgs()->GetSize());
418 TMethodArg *argument = 0;
419 TIter next(meth->GetListOfMethodArgs());
421 TString cmd = TString::Format(
"new %s(", an_cl->GetName());
425 while ((argument = (TMethodArg *) next())) {
427 if (counter>0) cmd+=
", ";
430 TDataType *datatype = gROOT->GetType(argument->GetTypeName());
432 TString basictype = (datatype==0) ?
"int" : datatype->GetTypeName();
434 TGo4Log::Debug(
"Argument %s type %s basictype %s", argument->GetName(), argument->GetTitle(), basictype.Data());
436 TString argDflt = argument->GetDefault() ? argument->GetDefault() :
"";
437 if (argDflt.Length()>0) {
442 bool isptr = strchr(argument->GetTitle(),
'*') != 0;
444 if ((datatype==0) && !isptr) {
445 TGo4Log::Error(
"Cannot specify any value for argument %s of class %s constructor", argument->GetName(), an_cl->GetName());
446 TGo4Log::Error(
"Add CreateUserAnalysis(const char*) function in user library");
451 if ((basictype ==
"char") || (basictype=
"Text_t")) cmd+=
"\"\"";
454 if ((counter==2) && (basictype==
"int")) {
455 TGo4Log::Info(
"Special treatment for second integer argument, suppose MBS input type");
458 if (basictype==
"bool") {
470 if ((analysis!=0) && (err==0))
return analysis;
472 TGo4Log::Error(
"Cannot create analysis class %s instance", an_cl->GetName());
473 TGo4Log::Error(
"Add CreateUserAnalysis(const char*) function in user library");
478 TClass *outev_cl(0), *inpev_cl(0);
480 const char* inp_evnt_classname =
GetArgValue(user_argc, user_argv,
"-inpevt-class");
481 const char* out_evnt_classname =
GetArgValue(user_argc, user_argv,
"-outevt-class");
483 if (inp_evnt_classname!=0) {
484 inpev_cl = gROOT->GetClass(inp_evnt_classname);
490 if (!inpev_cl->InheritsFrom(TGo4EventElement::Class())) {
491 TGo4Log::Error(
"Class %s cannot be used as input event", inp_evnt_classname);
495 evnt_classes.Remove(inpev_cl);
496 evnt_classes.Compress();
499 if (out_evnt_classname!=0) {
500 outev_cl = gROOT->GetClass(out_evnt_classname);
506 if (!outev_cl->InheritsFrom(TGo4EventElement::Class())) {
507 TGo4Log::Error(
"Class %s cannot be used as output event", out_evnt_classname);
511 evnt_classes.Remove(outev_cl);
512 evnt_classes.Compress();
517 if ((evsrc_cl!=0) && (inpev_cl==0) && (evnt_classes.GetLast() >= 0)) {
522 for (
int n=0; n<=evnt_classes.GetLast(); n++) {
523 TClass* cl = (TClass*) evnt_classes.At(n);
527 if (inpev_cl!=0) { inpev_cl = 0;
break; }
536 evnt_classes.Remove(inpev_cl);
537 evnt_classes.Compress();
543 for (
int n=0; n<=evnt_classes.GetLast(); n++) {
544 TClass* cl = (TClass*) evnt_classes.At(n);
545 if ((outev_cl==0) || cl->InheritsFrom(outev_cl)) outev_cl = cl;
549 TGo4Log::Info(
"Create default analysis with print-processor class");
552 if (proc_cl==0)
return 0;
553 TGo4Log::Info(
"Create default analysis with processor class %s", proc_cl->GetName());
555 TGo4Log::Info(
"Use class %s as output event", outev_cl->GetName());
560 TGo4Log::Info(
"Use class %s as input event", inpev_cl->GetName());
563 analysis->SetAnalysisName(name);
592 step->SetSourceEnabled(kTRUE);
593 step->SetStoreEnabled(evstore_cl != 0);
594 step->SetProcessEnabled(kTRUE);
595 step->SetErrorStopEnabled(kTRUE);
599 analysis->AddAnalysisStep(step);
605 int main(
int argc,
char **argv)
608 std::cerr <<
"Please check your system configuration and restart analysis again" << std::endl;
617 int phelp =
FindArg(argc, argv,
"-help");
618 if (phelp < 0) phelp =
FindArg(argc, argv,
"-h") > 0;
620 usage(phelp < argc-1 ? argv[phelp+1] : 0);
625 char** user_argv = 0;
627 int userargspos =
FindArg(argc, argv,
"-args");
628 if (userargspos<0) userargspos =
FindArg(argc, argv,
"-x");
630 user_argc = argc - userargspos;
631 user_argv = argv + userargspos;
636 bool doprint = (
FindArg(argc, argv,
"-print") > 0) || (
FindArg(argc, argv,
"-type") > 0) ||
637 (
FindArg(argc, argv,
"-pr") > 0) || (
FindArg(argc, argv,
"-ty") > 0);
640 const char* logfile =
GetArgValue(argc, argv,
"-log", 0,
true);
649 TString info =
"go4analysis";
650 for (
int n=1;n<argc;n++) { info +=
" "; info += argv[n]; }
668 gInterpreter->SetProcessLineLock(kFALSE);
673 if (go4inc.Length()>0)
674 gInterpreter->AddIncludePath(go4inc.Data());
676 const char *extra_incl = gSystem->Getenv(
"GO4EXTRAINCLUDE");
677 if (extra_incl && *extra_incl)
678 gInterpreter->AddIncludePath(extra_incl);
680 const char* analysis_name =
GetArgValue(argc, argv,
"-server");
681 if (analysis_name==0) analysis_name =
GetArgValue(argc, argv,
"-gui");
682 if (analysis_name==0) analysis_name =
GetArgValue(argc, argv,
"-name");
683 if (analysis_name==0) analysis_name =
"Go4Analysis";
688 bool isanylib =
false;
689 const char* libname = 0;
690 while ((libname =
GetArgValue(argc, argv,
"-lib", &argpos))!=0) {
692 if (gSystem->Load(libname)<0)
return -1;
697 if (!isanylib && (!doprint ||
GetArgValue(argc, argv,
"-user"))) {
698 libname =
"libGo4UserAnalysis";
700 if (gSystem->Load(libname)<0)
return -1;
708 if (crfunc) analysis = crfunc(analysis_name);
712 std::cerr <<
"!!! Analysis instance cannot be created" << std::endl;
713 std::cerr <<
"!!! PLEASE check your analysis library " << libname << std::endl;
714 std::cerr <<
"!!! One requires user subclass for TGo4Analysis class in user library" << std::endl;
715 std::cerr <<
"!!! Alternatively, CreateUserAnalysis(const char*) function can be implemented" << std::endl;
716 std::cerr <<
"!!! See Go4ExampleSimple, Go4Example1Step or Go4Example2Step for details" << std::endl;
720 delete lst0; lst0 = 0;
721 delete lst1; lst1 = 0;
725 std::cerr <<
"No active step in analysis found" << std::endl;
733 gROOT->SetBatch(kTRUE);
736 http_args.SetOwner(kTRUE);
738 const char* auth_domain =
"go4";
741 Bool_t batchMode(kTRUE);
742 Bool_t servermode(kFALSE);
743 Bool_t httpmode(kFALSE);
744 Bool_t hserver(kFALSE);
745 Bool_t loadprefs(kTRUE);
746 Bool_t showrate(kFALSE);
747 Double_t process_interv(-1.);
748 const char* hname =
"";
749 const char* hpasswd =
"";
750 const char* hostname =
"localhost";
766 while (narg < argc) {
767 if (strcmp(argv[narg],
"-server")==0) {
772 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) narg++;
774 if(strcmp(argv[narg],
"-gui") == 0) {
776 if (argc <= narg + 3)
showerror(
"Not all -gui arguments specified");
779 hostname = argv[narg++];
780 iport = atoi(argv[narg++]);
783 if (strcmp(argv[narg],
"-http")==0) {
786 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
787 http_args.Add(
new TObjString(Form(
"http:%s?top=Go4", argv[narg++])));
789 http_args.Add(
new TObjString(
"http:8080?top=Go4"));
791 if (strcmp(argv[narg],
"-fastcgi")==0) {
794 if (narg >= argc)
showerror(
"fastcgi options not specified");
795 http_args.Add(
new TObjString(Form(
"fastcgi:%s?top=Go4", argv[narg++])));
797 if (strcmp(argv[narg],
"-jsroot")==0) {
799 if (narg >= argc)
showerror(
"jsroot location not specified");
800 http_args.Add(
new TObjString(Form(
"jsroot:%s", argv[narg++])));
802 if (strcmp(argv[narg],
"-auth")==0) {
804 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
805 auth_file = argv[narg++];
809 if (strcmp(argv[narg],
"-domain")==0) {
811 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
812 auth_domain = argv[narg++];
817 if (strcmp(argv[narg],
"-dabc")==0) {
819 if (narg >= argc)
showerror(
"Master dabc node not specified");
820 const char* hostname = gSystem->HostName();
821 if ((hostname==0) || (*hostname==0)) hostname =
"localhost";
822 http_args.Add(
new TObjString(Form(
"dabc:%s?top=Go4/%s_pid%d", argv[narg++],hostname,gSystem->GetPid())));
826 if(strcmp(argv[narg],
"-lib") == 0) {
828 if (++narg >= argc)
showerror(
"library name not specified");
831 if(strcmp(argv[narg],
"-name") == 0) {
833 if (++narg >= argc)
showerror(
"analysis name not specified");
836 if (strcmp(argv[narg],
"-step")==0) {
838 const char* step_name = argv[narg++];
841 if (sscanf(step_name,
"%d", &step_number)==1)
844 if (step==0)
showerror(
"step not found");
848 if(strcmp(argv[narg],
"-enable-step")==0) {
852 if(strcmp(argv[narg],
"-disable-step")==0) {
856 if ((strcmp(argv[narg],
"-file")==0) || (strcmp(argv[narg],
"-f")==0)) {
860 while ((narg<argc) && (argv[narg][0]!=
'-'))
866 showerror(
"LMD/LML file name not specified");
868 if (strcmp(argv[narg],
"-source")==0) {
875 showerror(
"Input file name not specified");
877 if ((strcmp(argv[narg],
"-transport")==0) || (strcmp(argv[narg],
"-tr")==0)) {
884 showerror(
"MBS Transport server name not specified");
886 if ((strcmp(argv[narg],
"-stream")==0) || (strcmp(argv[narg],
"-st")==0)) {
893 showerror(
"MBS Stream server name not specified");
895 if ((strcmp(argv[narg],
"-evserv")==0) || (strcmp(argv[narg],
"-ev")==0)) {
902 showerror(
"MBS Event server name not specified");
904 if ((strcmp(argv[narg],
"-random")==0) || (strcmp(argv[narg],
"-rnd")==0)) {
911 if (strcmp(argv[narg],
"-user")==0) {
918 showerror(
"User source name not specified");
922 if (strcmp(argv[narg],
"-hdf5")==0) {
929 showerror(
"HDF5 file name not specified");
934 if ((strcmp(argv[narg],
"-revserv")==0) || (strcmp(argv[narg],
"-rev")==0)) {
936 const char* serv_name = argv[narg++];
938 if ((narg < argc) && (argv[narg][0] !=
'-'))
939 serv_port = atoi(argv[narg++]);
945 showerror(
"Remote event server name or port are not specified");
947 if (strcmp(argv[narg],
"-skip")==0) {
950 if (param==0)
showerror(
"only in MBS source events can be skipped");
951 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) {
953 if (sscanf(argv[narg],
"%u",&value)!=1)
954 showerror(Form(
"Value error %s", argv[narg]));
959 if (strcmp(argv[narg],
"-port")==0) {
962 if ((narg < argc) && (argv[narg][0]!=
'-')) {
963 if (sscanf(argv[narg],
"%d",&port)!=1)
964 showerror(Form(
"Value error %s", argv[narg]));
968 if (param) param->
SetPort(port);
973 if (strcmp(argv[narg],
"-retry")==0) {
976 if ((narg < argc) && (argv[narg][0]!=
'-')) {
977 if (sscanf(argv[narg],
"%d",&nretry)!=1)
978 showerror(Form(
"Value error %s", argv[narg]));
984 if (strcmp(argv[narg],
"-mbs-select")==0) {
987 if (param==0)
showerror(
"only in MBS source events can be selected");
989 while ((cnt<3) && (narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) {
991 if ((cnt==1) && (strcmp(argv[narg],
"all")==0)) value = 0;
else
992 if (sscanf(argv[narg],
"%u",&value)!=1)
993 showerror(Form(
"Value error %s", argv[narg]));
1000 if(strcmp(argv[narg],
"-store")==0) {
1001 if (++narg >= argc)
showerror(
"Store name not specified");
1003 const char* sourcename = argv[narg++];
1005 int buffersize = 64000;
1006 int compression = 5;
1009 while ((cnt<3) && (narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) {
1011 if (sscanf(argv[narg],
"%d",&value)!=1)
1012 showerror(Form(
"Value error %s", argv[narg]));
1013 if (cnt==0) splitlevel = value;
else
1014 if (cnt==1) buffersize = value;
else
1015 if (cnt==2) compression = value;
1023 if (strcmp(argv[narg],
"-timeout")==0) {
1024 if (++narg >= argc)
showerror(
"Timeout value not specified");
1027 if (sscanf(argv[narg],
"%d",&value)!=1)
1028 showerror(Form(
"Timeout value error %s", argv[narg]));
1032 if (strcmp(argv[narg],
"-overwrite-store")==0) {
1036 else showerror(
"No file-store parameter available");
1038 if (strcmp(argv[narg],
"-append-store")==0) {
1042 else showerror(
"No file-store parameter available");
1044 if(strcmp(argv[narg],
"-backstore")==0) {
1045 if (++narg < argc) {
1050 showerror(
"Backstore name not specified");
1052 if(strcmp(argv[narg],
"-userstore")==0) {
1053 if (++narg < argc) {
1058 showerror(
"User store name not specified");
1061 if(strcmp(argv[narg],
"-hdf5store")==0) {
1062 if (++narg < argc) {
1067 showerror(
"HDF5 store name not specified");
1070 if ((strcmp(argv[narg],
"-events")==0) || (strcmp(argv[narg],
"-number")==0) || (strcmp(argv[narg],
"-num")==0)) {
1071 if (++narg < argc) {
1072 if (sscanf(argv[narg++],
"%ld",&maxevents)!=1) maxevents = -1;
1074 showerror(
"number of events to process not specified");
1076 if (strcmp(argv[narg],
"-asf")==0) {
1079 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1082 if (strcmp(argv[narg],
"-enable-asf")==0) {
1085 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1088 if (strcmp(argv[narg],
"-disable-asf")==0) {
1092 if (strcmp(argv[narg],
"-prefs")==0) {
1094 const char* fname = 0;
1095 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1096 fname = argv[narg++];
1100 if (strcmp(argv[narg],
"-no-prefs")==0) {
1104 if(strcmp(argv[narg],
"-log")==0) {
1106 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) narg++;
1108 if(strcmp(argv[narg],
"-gdebug")==0) {
1110 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1111 gDebug = TString(argv[narg++]).Atoi();
1115 if((strcmp(argv[narg],
"-v")==0) || (strcmp(argv[narg],
"-v0")==0) || (strcmp(argv[narg],
"-v1")==0) || (strcmp(argv[narg],
"-v2")==0) || (strcmp(argv[narg],
"-v3")==0)) {
1118 if((strcmp(argv[narg],
"-graphics")==0) || (strcmp(argv[narg],
"-gr")==0)) {
1120 gROOT->SetBatch(kFALSE);
1121 process_interv = 0.1;
1122 new TApplication(
"Go4App", &app_argc, argv);
1123 TStyle::BuildStyles();
1126 if(strcmp(argv[narg],
"-run")==0) {
1130 if(strcmp(argv[narg],
"-norun")==0) {
1134 if(strcmp(argv[narg],
"-maxtreesize")==0) {
1136 long long maxtreesize = 1900000000;
1137 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-')) {
1139 strncpy(sbuf, argv[narg],
sizeof(sbuf)-1);
1140 long long mult(1), val(1);
1141 int len = strlen(sbuf);
1142 if ((sbuf[len-1]==
'g') || (sbuf[len-1]==
'G')) { mult = 1000000000; sbuf[len-1] = 0; }
else
1143 if ((sbuf[len-1]==
'm') || (sbuf[len-1]==
'M')) { mult = 1000000; sbuf[len-1] = 0; }
else
1144 if ((sbuf[len-1]==
'k') || (sbuf[len-1]==
'K')) { mult = 1000; sbuf[len-1] = 0; }
1145 if (sscanf(sbuf,
"%lld", &val)==1) maxtreesize = val*mult;
1148 TGo4Log::Info(
"Set tree file size limit to %lld bytes", maxtreesize);
1151 if ((strcmp(argv[narg],
"-print")==0) || (strcmp(argv[narg],
"-type")==0) || (strcmp(argv[narg],
"-ty")==0) || (strcmp(argv[narg],
"-pr")==0)) {
1153 while ((narg<argc) && (argv[narg][0]!=
'-')) {
1154 if (strncmp(argv[narg],
"sub=",4)==0) {
1157 if (strcmp(argv[narg],
"hex")==0) {
1161 if (strcmp(argv[narg],
"dec")==0) {
1165 if (strcmp(argv[narg],
"long")==0) {
1169 if (strcmp(argv[narg],
"short")==0) {
1173 if (strcmp(argv[narg],
"data")==0) {
1176 if (strcmp(argv[narg],
"nodata")==0) {
1179 if (strcmp(argv[narg],
"fhead")==0) {
1182 if (strcmp(argv[narg],
"bhead")==0) {
1188 if(strcmp(argv[narg],
"-enable-store")==0) {
1192 if(strcmp(argv[narg],
"-disable-store")==0) {
1196 if(strcmp(argv[narg],
"-enable-source")==0) {
1200 if(strcmp(argv[narg],
"-disable-source")==0) {
1204 if(strcmp(argv[narg],
"-disable-errstop")==0) {
1208 if(strcmp(argv[narg],
"-enable-errstop")==0) {
1212 if(strcmp(argv[narg],
"-rate")==0) {
1216 if(strcmp(argv[narg],
"-norate")==0) {
1220 if(strcmp(argv[narg],
"-inpevt-class")==0) {
1224 if (narg < argc) narg++;
1226 if(strcmp(argv[narg],
"-outevt-class")==0) {
1230 if (narg < argc) narg++;
1232 if(strcmp(argv[narg],
"-hserver")==0) {
1235 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1236 hname = argv[narg++];
1237 if ((narg < argc) && (strlen(argv[narg]) > 0) && (argv[narg][0]!=
'-'))
1238 hpasswd = argv[narg++];
1240 showerror(Form(
"Unknown argument %d %s", narg, argv[narg]));
1244 if (http_args.GetLast() >= 0) {
1245 if (gSystem->Load(
"libGo4Http")!=0)
1246 showerror(
"Fail to load libGo4Http.so library");
1255 for (Int_t n=0;n<=http_args.GetLast();n++) {
1256 TString engine = http_args[n]->GetName();
1257 if ((engine.Index(
"http:")==0) && (auth_file.Length()>0))
1258 engine.Append(TString::Format(
"&auth_file=%s&auth_domain=%s", auth_file.Data(), auth_domain));
1260 cmd.Form(
"TGo4Sniffer::CreateEngine(\"%s\");", engine.Data());
1261 res = gROOT->ProcessLineFast(cmd.Data(), &err);
1262 if ((res<=0) || (err!=0)) {
1263 printf(
"Fail to start %s", engine.Data());
1268 process_interv = 0.1;
1274 TGo4Log::Info(
"Main: starting analysis in batch mode ... ");
1276 Bool_t enter_loop = kTRUE;
1277 if ((canrun>=0) || autorun) {
1281 enter_loop = kFALSE;
1288 analysis->
RunImplicitLoop(maxevents, showrate, process_interv, httpmode);
1293 if (hostname==0) hostname =
"localhost";
1295 if(servermode)
TGo4Log::Info(
"Main: starting analysis in server mode ...");
1296 else TGo4Log::Info(
"Main: starting analysis in slave mode ...");
1298 if (canrun<0) autorun =
false;
1300 TGo4AnalysisClient* client =
new TGo4AnalysisClient(
"UserClient", analysis, hostname, iport, hserver, hname, hpasswd, servermode, autorun, kFALSE, loadprefs, showrate);
1306 #if ROOT_VERSION_CODE <= ROOT_VERSION(5,25,2)
1308 gSystem->AddFileHandler(
new TFileHandler(0, TFileHandler::kRead));
1326 gSystem->ProcessEvents();
1329 if(termcounter == 0) {
1333 if (termcounter>0) {
1335 if (termcounter == 0) {
void SetStartEvent(UInt_t firstindex)
static TGo4Log * Instance()
virtual Bool_t BuildEvent(TGo4EventElement *dest)
void SetRetryCnt(Int_t cnt)
Bool_t LoadStatus(const char *filename=0)
void SetStopEvent(UInt_t lastindex)
TGo4Analysis *( UserCreateFunc)(const char *name)
static Bool_t CheckVersion(Int_t version)
static void SetMaxTreeSize(Long64_t sz)
virtual Bool_t CheckEventClass(TClass *cl)
void DefUserEventSource(const char *Sclass)
void SetEventStore(TGo4EventStoreParameter *kind)
static void WriteLogfile(const char *text, Bool_t withtime=kTRUE)
void DefEventProcessor(const char *Pname, const char *Pclass)
TList * GetClassesList(TList *prev=0)
static void CloseLogfile()
static const char * GetDefaultLogname()
static void SetIgnoreLevel(Int_t level)
TGo4PrintFactory(const char *name)
TGo4EventProcessor * CreateEventProcessor(TGo4EventProcessorParameter *par)
static void OpenLogfile(const char *name=0, const char *headercomment=0, Bool_t appendmode=kFALSE)
virtual void PrintEvent()
int main(int argc, char **argv)
TGo4AnalysisStep * GetAnalysisStep(const char *name)
void SetSourceEnabled(Bool_t on=kTRUE)
void SetOverwriteMode(Bool_t over=kTRUE)
Int_t RunImplicitLoop(Int_t times, Bool_t showrate=kFALSE, Double_t process_event_interval=-1., Bool_t iswebserver=kFALSE)
static const char * GO4INCPATH()
TGo4EventStoreParameter * GetEventStore() const
void SetAutoSave(Bool_t on=kTRUE)
static void EnableRedirection()
static void SetPollingMode(Bool_t on=kTRUE)
void SetTimeout(Int_t out)
int FindArg(int argc, char **argv, const char *argname)
void DefOutputEvent(const char *Oname, const char *Oclass)
void SetEventInterval(UInt_t skipinterval)
const char * GetName() const
#define __GO4BUILDVERSION__
void PrintMbsEvent(Int_t subid=-1, Bool_t longw=kTRUE, Bool_t hexw=kTRUE, Bool_t dataw=kTRUE, Bool_t bufhead=kFALSE, Bool_t filhead=kFALSE)
void showerror(const char *msg)
void SetStoreEnabled(Bool_t on=kTRUE)
TGo4EventSourceParameter * GetEventSource() const
void AddMoreFile(const char *more)
const char * GetArgValue(int argc, char **argv, const char *argname, int *pos=0, bool incomplete=false)
TGo4EventElement * GetInputEvent()
virtual Bool_t InitEventClasses()
void usage(const char *subtopic=0)
void SetProcessEnabled(Bool_t on=kTRUE)
void SetEventSource(TGo4EventSourceParameter *kind)
void SetAutoSaveFile(const char *filename=0, Bool_t overwrite=kFALSE, Int_t compression=5)
TGo4AnalysisStep * GetAnalysisStepNum(Int_t number)
static TString subGO4SYS(const char *subdir)
void DefUserEventStore(const char *Sclass)
void SetErrorStopEnabled(Bool_t on)
TGo4PrintProcessor(const char *name)
void DefInputEvent(const char *Iname, const char *Iclass)
static void SetRunningMode(int mode)
static TGo4Analysis * Instance()
static void Error(const char *text,...)
static void Info(const char *text,...)
TGo4Analysis * CreateDefaultAnalysis(TList *lst, const char *name, int user_argc, char **user_argv, bool doprint)
void SetAutoSaveInterval(Int_t interval=0)
static void Debug(const char *text,...)
static void LogfileEnable(Bool_t on=kTRUE)