JLab Software Meeting September 22, 2005 David Lawrence Attending: David Lawrence, Elliott Wolin, Steve Wood, Rob Feuerbach Sergey Boiarnov, Vardan Gyurjyan, Ole Hansen DANA Analysis Framework ------------------------- My slides can be found at: http://www.jlab.org/~davidl/HallD/Presentations/2005_09_22_DANA/ David Lawrence gave an overview of the DANA analysis framework currently being developed for Hall-D. The framework is an object- oriented software package written in C++. It provides for reconstruction software to be written in a modular way where the framework brokers the communication between modules (factories). DANA follows a "factory" model in which factory objects are written that produce data objects of a certain type. C++ templates are used to identify the factory who produces data objects of the desired type. Objects are created on demand and then "recycled" during the event (i.e. pointers and not objects are passed) so CPU usage is focussed only where it is needed. Factories can be "tagged" so that more than one factory can be used to produce the same type of objects. The object pointers are passed in STL vectors as const pointers. The framework is designed to process events in multiple threads. Early testing on SMP machines shows the processing rate scales approximately with the number of threads (until the number of threads exceeds the number of CPUs). Other features such as data object identifiers, configuration parameters, and event sources are also dicussed. Discussion ----------- Most of the discussion was made on clarifying how certain features are implemented in DANA and how to accomplish some specific tasks. For example, if one wanted to re-analyze the same event multiple times, but with some parameters adjusted between iterations. While I'm not sure I made the answer to this clear at the meeting, it can be done with the existing framework like this: DFactory_base *fac = loop->GetFactory("PID"); DFactory_PID *pidfac = dynamic_cast(fac); if(pidfac){ vector > all_pids; // vector to hold all results // Loop over all values of param we wish to try for(int i=0; i pids = pidfac->TryWithParams(params[i]); // Remember the results of this for later comparison all_pids.push_back(pids); } // .... Compare results .... // Delete objects created by TryWithParams() method for(int i=0; i pids = all_pids[i]; for(int j=0; j