Hi,
On Wed, 2006-05-31 at 17:06 +0200, Roland Kuhn wrote:
> Yes, of course it is not impossible. Only, to set a break point in
> myscript, I'd have to jump through some hoops. Also, giving command
> line options is more cumbersome. Another problem is the use of
> external libraries which require certain flags to be passed to the
> compiler. There's certainly a way with CINT (I don't know), but it is
> more complicated than the trivial Makefile.
Take a look at the attached two scripts. Do for example
prompt> root
Root> .x makeRng.C
Root> gslRandom::main(10);
Note the lines in `makeRng.C' that sets the compiler and linker flags.
To debug do
prompt> gdb root.exe
(gdb) run
Root> .x makeRng.C
^C
(gdb) break 'gslRandom::main(unsigned int)'
(gdb) continue
Root> gslRandom::main(10)
That breaks execution in the `gslRandom::main' and drops to the GDB prompt.
> > In addition from the command line you can load any plug-in library.
>
> This is not about possible/impossible, it is about ease of use for
> different types of application.
For certain types of applications it can be quite useful to have a program that takes care of the event-loop, while the actual contents of the data pipeline is customised through a script:
int main(int argc, char** argv)
{
TApplication app("job", 0, 0); if (argc < 2) { std::cerr << "Usage: " << argv[0] << " CONFIG " << std::endl; return 1; } JobManager* job = JobManager::Instance(); gROOT->Macro(argv[1]) job->Initialise(); while (job->Event()); return job->Finalise();
with a configuration script like
void
Config()
{
JobManager* job = JobManager::Instance();
gSystem->Load("RawReader.so"); RawReader* raw = new RawReader("raw.dat"); gSystem->Load("Reco.so"); Clusterer* cluster = new Clusterer; Tracker* tracker = new Tracker Output* output = new Output("out.root"); job->Add(raw); job->Add(cluster); job->Add(tracker); job->Add(output);
And a jobmanager like
class JobManager : ...
{
public:
void Add(Task* t) { fList.Add(t); }
void Initialize() {
TIter next(&fList); Task* t = 0; while ((t = static_cast<Task*>(next()))) t->Initialize();}
TIter next(&fList); Task* t = 0; while ((t = static_cast<Task*>(next()))) t->Event();}
int ret = 0; TIter next(&fList); Task* t = 0; while ((t = static_cast<Task*>(next()))) { ret = t->Finalize(); if (ret != 0) return ret; } return ret;
In this way, a user can freely customise a job through editing scripts and compiling plug-ins with AClic, with out any `cumbersome' `select' calls. See also http://cern.ch/root/#framework
Yours,
-- ___ | Christian Holm Christensen |_| | ------------------------------------------------------------- | | Address: Sankt Hansgade 23, 1. th. Phone: (+45) 35 35 96 91 _| DK-2200 Copenhagen N Cell: (+45) 24 61 85 91 _| Denmark Office: (+45) 353 25 404 ____| Email: cholm_at_nbi.dk Web: www.nbi.dk/~cholm | |Received on Wed May 31 2006 - 20:59:03 MEST
This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:31:58 MET