| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

AutoPositionerTool Class Reference

Implementation of IPositionerTool which automatically determines parent volume and support path. More...

#include <AutoPositionerTool.h>

Inheritance diagram for AutoPositionerTool:

[legend]
Collaboration diagram for AutoPositionerTool:
[legend]
List of all members.

Public Types

 SUCCESS
 NO_INTERFACE
 VERSMISMATCH
 LAST_ERROR
 SUCCESS
 NO_INTERFACE
 VERSMISMATCH
 LAST_ERROR
enum  Status

Public Member Functions

 AutoPositionerTool (const std::string &type, const std::string &name, const IInterface *parent)
 ~AutoPositionerTool ()
virtual StatusCode initialize ()
virtual StatusCode reinitialize ()
virtual StatusCode finalize ()
virtual StatusCode queryInterface (const InterfaceID &riid, void **ppvInterface)
StatusCode placeVolume ()
 Place a volume in the geometry.
INTupleSvcntupleSvc () const
INTupleSvcevtColSvc () const
IDataProviderSvcdetSvc () const
IDataProviderSvcevtSvc () const
IIncidentSvcincSvc () const
IChronoStatSvcchronoSvc () const
IHistogramSvchistoSvc () const
IAlgContextSvccontextSvc () const
DataObjectput (IDataProviderSvc *svc, DataObject *object, const std::string &address, const bool useRootInTES=true) const
DataObjectput (DataObject *object, const std::string &address, const bool useRootInTES=true) const
Gaudi::Utils::GetData< TYPE
>::return_type 
get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
Gaudi::Utils::GetData< TYPE
>::return_type 
get (const std::string &location, const bool useRootInTES=true) const
TYPE * getDet (IDataProviderSvc *svc, const std::string &location) const
TYPE * getDet (const std::string &location) const
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
bool exist (const std::string &location, const bool useRootInTES=true) const
bool existDet (IDataProviderSvc *svc, const std::string &location) const
bool existDet (const std::string &location) const
TYPE * getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
TYPE * getOrCreate (const std::string &location, const bool useRootInTES=true) const
TOOL * tool (const std::string &type, const std::string &name, const IInterface *parent=0, bool create=true) const
TOOL * tool (const std::string &type, const IInterface *parent=0, bool create=true) const
SERVICE * svc (const std::string &name, const bool create=true) const
IUpdateManagerSvcupdMgrSvc () const
IDataProviderSvcfastContainersSvc () const
StatusCode Error (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
StatusCode Warning (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
StatusCode Print (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
StatusCode Assert (const bool ok, const std::string &message="", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Assert (const bool ok, const char *message, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg, const std::exception &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg="no message", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
MsgStreammsgStream (const MSG::Level level) const
MsgStreamalways () const
MsgStreamfatal () const
MsgStreamerr () const
MsgStreamerror () const
MsgStreamwarning () const
MsgStreaminfo () const
MsgStreamdebug () const
MsgStreamverbose () const
MsgStreammsg () const
const Statisticscounters () const
StatEntitycounter (const std::string &tag) const
MSG::Level msgLevel () const
bool msgLevel (const MSG::Level level) const
void resetMsgStream () const
bool typePrint () const
bool propsPrint () const
bool statPrint () const
bool errorsPrint () const
long printStat (const MSG::Level level=MSG::ALWAYS) const
long printErrors (const MSG::Level level=MSG::ALWAYS) const
long printProps (const MSG::Level level=MSG::ALWAYS) const
void registerCondition (const std::string &condition, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (const std::string &condition, CondType *&condPtrDest, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (char *condition, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (TargetClass *condition, StatusCode(CallerClass::*mf)()=NULL)
StatusCode runUpdate ()
TransientFastContainer< T > * getFastContainer (const std::string &location, typename TransientFastContainer< T >::size_type initial=0)
StatusCode release (const IInterface *interface) const
virtual unsigned long release ()
const std::string & context () const
const std::string & rootInTES () const
double globalTimeOffset () const
virtual unsigned long addRef ()
virtual const std::string & name () const
virtual const std::string & type () const
virtual const IInterfaceparent () const
virtual StatusCode configure ()
virtual StatusCode start ()
virtual StatusCode stop ()
virtual StatusCode terminate ()
virtual StatusCode restart ()
virtual Gaudi::StateMachine::State FSMState () const
virtual Gaudi::StateMachine::State targetFSMState () const
virtual StatusCode sysInitialize ()
virtual StatusCode sysStart ()
virtual StatusCode sysStop ()
virtual StatusCode sysFinalize ()
virtual StatusCode sysReinitialize ()
virtual StatusCode sysRestart ()
virtual StatusCode setProperty (const Property &p)
virtual StatusCode setProperty (const std::string &s)
virtual StatusCode setProperty (const std::string &n, const std::string &v)
StatusCode setProperty (const std::string &name, const TYPE &value)
virtual StatusCode getProperty (Property *p) const
virtual const PropertygetProperty (const std::string &name) const
virtual StatusCode getProperty (const std::string &n, std::string &v) const
virtual const std::vector<
Property * > & 
getProperties () const
PropertyMgrgetPropertyMgr ()
ISvcLocatorserviceLocator () const
ISvcLocatorsvcLoc () const
IMessageSvcmsgSvc () const
IToolSvctoolSvc () const
StatusCode setProperties ()
StatusCode service (const std::string &name, T *&svc, bool createIf=true) const
StatusCode service (const std::string &type, const std::string &name, T *&svc) const
void declInterface (const InterfaceID &, void *)
PropertydeclareProperty (const std::string &name, T &property, const std::string &doc="none") const
PropertydeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="") const
IAuditorSvcauditorSvc () const
IMonitorSvcmonitorSvc () const
void declareInfo (const std::string &name, const T &var, const std::string &desc) const
void declareInfo (const std::string &name, const std::string &format, const void *var, int size, const std::string &desc) const
virtual const std::string & type () const =0
virtual const IInterfaceparent () const =0
virtual StatusCode configure ()=0
virtual StatusCode start ()=0
virtual StatusCode stop ()=0
virtual StatusCode terminate ()=0
virtual StatusCode restart ()=0
virtual Gaudi::StateMachine::State FSMState () const =0
virtual StatusCode sysInitialize ()=0
virtual StatusCode sysStart ()=0
virtual StatusCode sysStop ()=0
virtual StatusCode sysFinalize ()=0
virtual StatusCode sysReinitialize ()=0
virtual StatusCode sysRestart ()=0
virtual unsigned long refCount () const =0
virtual const std::string & name () const =0
virtual unsigned long addRef ()=0
virtual unsigned long release ()=0

Static Public Member Functions

static const InterfaceIDinterfaceID ()
static const InterfaceIDinterfaceID ()
static const InterfaceIDinterfaceID ()
static const InterfaceIDinterfaceID ()

Public Attributes

 SUCCESS
 NO_INTERFACE
 VERSMISMATCH
 LAST_ERROR

Protected Types

typedef std::map< std::string,
StatEntity
Statistics
typedef std::map< std::string,
unsigned int > 
Counter
typedef std::vector< IAlgTool * > AlgTools
typedef std::pair< IInterface *,
std::string > 
ServiceEntry
typedef std::vector< ServiceEntryServices

Protected Member Functions

StatusCode releaseTool (const IAlgTool *tool) const
StatusCode releaseSvc (const IInterface *svc) const
int outputLevel () const
virtual unsigned long refCount () const
IntegerPropertyoutputLevelProperty ()
void initOutputLevel (Property &prop)

Static Protected Attributes

static const bool IgnoreRootInTES
static const bool UseRootInTES

Private Member Functions

StatusCode addDetectorElement (std::string detElemName, std::string detElemPath, std::string logVolName, std::string support, std::string npath)

Private Attributes

IDataProviderSvcm_detSvc
ICoordSysSvcm_coordSvc
std::string m_physVolName
std::string m_logVolName
std::string m_coordDetElemPath
std::vector< double > m_position
std::vector< double > m_rotation
std::string m_detElemName
std::string m_detElemPath
std::vector< std::vector<
std::string > > 
m_subDetElements

Detailed Description

Implementation of IPositionerTool which automatically determines parent volume and support path.

Example Use:

DiffBallPositioner.PhysicalVolume = "pvDiffuserBall" DiffBallPositioner.LogicalVolume = "/dd/Geometry/CalibrationSources/lvDiffuserBall" DiffBallPositioner.CoordinateDetElem = "/dd/Structure/AD/db-oil1" DiffBallPositioner.Position = [0., 0., 0.] DiffBallPositioner.Rotation = [0., 0., 0., 0., 0., 0., 0., 0., 0.] DiffBallPositioner.Element = "db-diffuserBallCenter1"

dandwyer@caltech.edu 25/11/2008

Definition at line 28 of file AutoPositionerTool.h.


Constructor & Destructor Documentation

AutoPositionerTool::AutoPositionerTool ( const std::string &  type,
const std::string &  name,
const IInterface parent 
)

Definition at line 16 of file AutoPositionerTool.cc.

00019   : GaudiTool(type, name, parent)
00020   , m_detSvc(0)
00021   , m_coordSvc(0)
00022 {
00023   declareProperty("PhysicalVolume",m_physVolName="",
00024                   "Name of the physical volume to add to geometry");
00025   declareProperty("LogicalVolume",m_logVolName="",
00026                   "Name of the logical volume to associate with the physical");
00027   declareProperty("CoordinateDetElem",m_coordDetElemPath="",
00028                   "Name of the detector element used for coordinates");
00029   declareProperty("Position",m_position=std::vector<double>(3,0.),
00030                   "Position of the new volume in the parent coordinates");
00031   double identity[] = {1., 0., 0., 
00032                        0., 1., 0.,
00033                        0., 0., 1.};
00034   declareProperty("Rotation",m_rotation=std::vector<double>(identity,
00035                                                             identity+9),
00036                   "Rotation of the new volume in the parent coordinates");
00037   declareProperty("Element",m_detElemName="",
00038                   "Name of the detector element to place in the TDS");
00039   declareProperty("ElementPath",m_detElemPath="/dd/Structure/DayaBay",
00040                   "Path for the new detector element in the TDS");
00041   declareProperty("SubDetectorElements",
00042                   m_subDetElements=std::vector< std::vector<std::string> >(),
00043                   "Information for defining additional daughter detector elements");
00044 }

AutoPositionerTool::~AutoPositionerTool (  ) 

Definition at line 46 of file AutoPositionerTool.cc.

00047 {
00048 }


Member Function Documentation

StatusCode AutoPositionerTool::initialize (  )  [virtual]

Reimplemented from GaudiTool.

Definition at line 50 of file AutoPositionerTool.cc.

00051 {
00052     this->GaudiTool::initialize();
00053 
00054     debug() << "AutoPositionerTool::initialize()" << endreq;
00055     StatusCode sc = service("DetectorDataSvc",m_detSvc,true);
00056     if (sc.isFailure()) return sc;
00057 
00058     sc = service("CoordSysSvc",m_coordSvc,true);
00059     if (sc.isFailure()) return sc;
00060 
00061     return sc;
00062 }

StatusCode AutoPositionerTool::reinitialize (  )  [virtual]

Reimplemented from GaudiTool.

Definition at line 64 of file AutoPositionerTool.cc.

00065 {
00066     return StatusCode::SUCCESS;
00067 }

StatusCode AutoPositionerTool::finalize (  )  [virtual]

Reimplemented from GaudiTool.

Definition at line 69 of file AutoPositionerTool.cc.

00070 {
00071     m_detSvc->release();
00072     m_coordSvc->release();
00073     return this->GaudiTool::finalize();
00074 }

StatusCode AutoPositionerTool::queryInterface ( const InterfaceID riid,
void **  ppvInterface 
) [virtual]

Reimplemented from GaudiTool.

Definition at line 76 of file AutoPositionerTool.cc.

00078 {
00079   StatusCode sc = StatusCode::FAILURE;
00080   if (ppvInterface) {
00081     *ppvInterface = 0;
00082     
00083     if (IPositionerTool::interfaceID().versionMatch(riid)) {
00084       *ppvInterface = static_cast<IPositionerTool*>(this);
00085       sc = StatusCode::SUCCESS;
00086       addRef();
00087     }
00088     else sc = GaudiTool::queryInterface( riid, ppvInterface );    
00089   }
00090   return sc;
00091 }

StatusCode AutoPositionerTool::placeVolume (  )  [virtual]

Place a volume in the geometry.

Implements IPositionerTool.

Definition at line 97 of file AutoPositionerTool.cc.

00098 {
00099 
00100   // Find placement detector element based on coordinate volume
00101   IDetectorElement* coordDetElem = getDet<IDetectorElement>(m_coordDetElemPath);
00102   if(!coordDetElem){
00103     error() << "AutoPositionerTool::placeVolume(): "
00104             << "could not find detector element at: " << m_coordDetElemPath
00105             << endreq;
00106     return StatusCode::FAILURE;
00107   }
00108 
00109   // Find global coordinates of new volume
00110   Gaudi::XYZPoint referencePosition(m_position[0],m_position[1],m_position[2]);
00111   Gaudi::XYZPoint globalPosition = 
00112     coordDetElem->geometry()->toGlobal( referencePosition );
00113 
00114   info() << "Using " << coordDetElem->name() 
00115          << " as reference system for placement of " << m_detElemName 
00116          << " at local position " << referencePosition 
00117          << " and global position " << globalPosition << endreq;
00118 
00119   // Find parent detector element
00120   IDetectorElement* parentDetElem = m_coordSvc->belongsToDE(globalPosition);
00121   if(!parentDetElem){
00122     error() << "AutoPositionerTool::placeVolume(): "
00123             << "could not find detector element at global position: " 
00124             << globalPosition << endreq;
00125     return StatusCode::FAILURE;
00126   }
00127   info() << "Using " << parentDetElem->name() 
00128          << " as supporting element for placement of " 
00129          << m_detElemName << endreq;
00130 
00131   // Find parent logical volume and relative path
00132   //IGeometryInfo* parentGeometry = 
00133   //  parentDetElem->geometry()->belongsTo(globalPosition, -1);
00134   //std::string npath;
00135   IGeometryInfo* startGeom = parentDetElem->geometry();
00136   ILVolume::PVolumePath pvPath;
00137   StatusCode sc = 
00138     parentDetElem->geometry()->fullGeoInfoForPoint(globalPosition, -1,
00139                                                    startGeom, pvPath);
00140   if(!sc.isSuccess()){
00141     error() << "AutoPositionerTool::placeVolume(): "
00142             << "could not find parent geometry at global position: " 
00143             << globalPosition << endreq;
00144     return StatusCode::FAILURE;
00145   }
00146   info() << "FullGeoInfoForPoint: " << startGeom->lvolumeName() << endreq;
00147   ILVolume::PVolumePath::iterator pvPathIter, pvPathEnd = pvPath.end();
00148   std::string npath;
00149   std::string parentLVolName = startGeom->lvolumeName();
00150   for(pvPathIter = pvPath.begin(); pvPathIter != pvPathEnd; pvPathIter++){
00151     parentLVolName = (*pvPathIter)->lvolumeName();
00152     if( npath.size() > 0 ) npath.append( "/" );
00153     npath.append( (*pvPathIter)->name() );
00154     info() << "  npath: " << npath << endreq;
00155   }
00156   if( npath.size() > 0 ){
00157     error() << "Parent volume " << parentLVolName 
00158             << " must have a defined detector element."
00159             << " Please define a detector element, and then you can place "
00160             <<  m_logVolName << " inside." << endreq;
00161     return StatusCode::FAILURE;
00162   }
00163   info() << "Using " << parentLVolName 
00164          << " as parent volume for placement of " << m_logVolName << endreq;
00165   IGeometryInfo* parentGeometry = parentDetElem->geometry();
00166 
00167   // Find parent logical volume for physical volume
00168   SmartDataPtr<LVolume> parentLogVol(m_detSvc, parentLVolName);
00169   if(!parentLogVol){
00170     error() << "AutoPositionerTool::placeVolume(): "
00171             << "could not find parent volume of name: " << parentLVolName
00172             << endreq;
00173     return StatusCode::FAILURE;
00174   }
00175 
00176   // Check if physical volume already exists in parent logical volume
00177   bool pvolumeExists = false;
00178   ILVolume::PVolumes::const_iterator pvIter = parentLogVol->pvBegin();
00179   for(;pvIter != parentLogVol->pvEnd(); pvIter++){
00180     if((*pvIter)->name() == m_physVolName){
00181       warning() << "AutoPositionerTool::placeVolume(): "
00182                 << "physical volume " << m_physVolName
00183                 << " already exists in parent volume " << parentLVolName
00184                 << endreq;
00185       pvolumeExists = true;
00186       break;
00187     }
00188   }
00189 
00190   if( !pvolumeExists ){
00191     // Place physical volume
00192     // Find placement coordinates in local parent volume
00193     Gaudi::XYZPoint localPosition = parentGeometry->toLocal( globalPosition );
00194     Gaudi::XYZPoint parGlobalPosition = 
00195       parentGeometry->toGlobal( Gaudi::XYZPoint(0.,0.,0.) );
00196     info() << "Parent Global position is " << parGlobalPosition << endreq;
00197     info() << "CoordRef Global position is " << globalPosition << endreq;
00198     info() << "Difference is " << parGlobalPosition - globalPosition << endreq;
00199     info() << "Placing " << m_detElemName 
00200            << " at " << localPosition << " in parent volume " 
00201            << parentLVolName<< endreq;
00202 
00203     // Check if point is inside
00204     if( parentLogVol->isInside(localPosition) ){
00205       info() << "Yep, position " << localPosition
00206              << "is inside " << parentLVolName<< endreq;
00207     }else{
00208       info() << "Ack!  Position " << localPosition
00209              << "is not inside " << parentLVolName << endreq;
00210     }      
00211 
00212     {
00213       const SolidBase* solid = dynamic_cast<const SolidBase*>(parentLogVol->solid());
00214       info() << "X-extent: " << solid->xMin() << " " << solid->xMax() << endreq;
00215       info() << "Y-extent: " << solid->yMin() << " " << solid->yMax() << endreq;
00216       info() << "Z-extent: " << solid->zMin() << " " << solid->zMax() << endreq;
00217     }
00218     {
00219       SmartDataPtr<LVolume> logVol(m_detSvc, m_logVolName);
00220       const SolidBase* solid = dynamic_cast<const SolidBase*>(logVol->solid());
00221       info() << "X-extent: " << solid->xMin() << " " << solid->xMax() << endreq;
00222       info() << "Y-extent: " << solid->yMin() << " " << solid->yMax() << endreq;
00223       info() << "Z-extent: " << solid->zMin() << " " << solid->zMax() << endreq;
00224     }
00225 
00226     // Create the physical volume
00227     Gaudi::Rotation3D rotation(m_rotation.begin(), m_rotation.end());
00228     IPVolume* pv = 
00229       parentLogVol->createPVolume(m_physVolName, m_logVolName,
00230                                   Gaudi::Transform3D(rotation, Gaudi::XYZVector(localPosition)).Inverse() );
00231   
00232     if( 0 == pv ) {
00233       error() << "AutoPositionerTool::placeVolume(): "
00234               << "could not create volume: " << m_physVolName
00235               << endreq;
00236       return StatusCode::FAILURE;
00237     }
00238   }
00239 
00240   if(m_detElemName != ""){
00241     // Add the corresponding detector element if a name is provided
00242     std::string pvPath = npath;
00243     if(pvPath.size() > 0) npath.append( "/" );
00244     pvPath.append( m_physVolName );
00245 
00246     sc = addDetectorElement(m_detElemName, m_detElemPath, m_logVolName,
00247                             parentDetElem->name(), pvPath);
00248     if( !sc.isSuccess() ) return sc; 
00249 
00250     // Add any sub-detector elements below the current detector element
00251     std::vector< std::vector<std::string> >::iterator sdIter, 
00252       sdEnd = m_subDetElements.end(); 
00253     for(sdIter = m_subDetElements.begin(); sdIter != sdEnd; sdIter++){
00254       std::vector<std::string> fields = *sdIter;
00255       if( fields.size() != 4 ){
00256         error() << "Wrong number of sub-detector element fields: " 
00257                 << fields.size() << endreq;
00258         for(int fieldIdx=0; fieldIdx<fields.size(); fieldIdx++){
00259           error() << "  Field " << fieldIdx << ": " << fields[fieldIdx] 
00260                   <<endreq;
00261         }
00262         return StatusCode::FAILURE;
00263       }
00264       std::string subDetElemName = fields[0];
00265       std::string support = fields[1];
00266       std::string logVolName = fields[2];
00267       std::string subPvPath = fields[3];
00268       sc = addDetectorElement(subDetElemName, m_detElemPath, logVolName,
00269                               support, subPvPath);
00270       if( !sc.isSuccess() ) return sc; 
00271     }
00272   }
00273 
00274   return sc;
00275 }

StatusCode AutoPositionerTool::addDetectorElement ( std::string  detElemName,
std::string  detElemPath,
std::string  logVolName,
std::string  support,
std::string  npath 
) [private]

Definition at line 277 of file AutoPositionerTool.cc.

00281                                                                   {
00282   // Add the detector element for existing geometry
00283   info() << "Using " << support 
00284          << " as support path for placement of " << detElemName
00285          << " at path " << detElemPath << endreq;  
00286   DetectorElement* detElem = new DetectorElement;
00287   StatusCode sc = m_detSvc->registerObject( detElemPath, detElemName, detElem);
00288   if( sc.isFailure() ){
00289     error() << "Failed to register object with support / name: " 
00290             << support << " / " << detElemName << endreq;
00291     return sc;
00292   }
00293   info() << "Using physical path " << npath 
00294          << "relative to support " << support
00295          << " for placement of " << logVolName << endreq;  
00296   detElem->createGeometryInfo( logVolName, support, npath);
00297   return sc;
00298 }

const InterfaceID & IPositionerTool::interfaceID (  )  [static, inherited]

Reimplemented from IAlgTool.

Definition at line 7 of file IPositionerTool.cc.

00007                                                 {
00008   return IID_IPositionerTool;
00009 }


Member Data Documentation

IDataProviderSvc* AutoPositionerTool::m_detSvc [private]

Reimplemented from GaudiTool.

Definition at line 55 of file AutoPositionerTool.h.

ICoordSysSvc* AutoPositionerTool::m_coordSvc [private]

Definition at line 56 of file AutoPositionerTool.h.

std::string AutoPositionerTool::m_physVolName [private]

Definition at line 58 of file AutoPositionerTool.h.

std::string AutoPositionerTool::m_logVolName [private]

Definition at line 59 of file AutoPositionerTool.h.

std::string AutoPositionerTool::m_coordDetElemPath [private]

Definition at line 60 of file AutoPositionerTool.h.

std::vector<double> AutoPositionerTool::m_position [private]

Definition at line 61 of file AutoPositionerTool.h.

std::vector<double> AutoPositionerTool::m_rotation [private]

Definition at line 62 of file AutoPositionerTool.h.

std::string AutoPositionerTool::m_detElemName [private]

Definition at line 63 of file AutoPositionerTool.h.

std::string AutoPositionerTool::m_detElemPath [private]

Definition at line 64 of file AutoPositionerTool.h.

std::vector< std::vector<std::string> > AutoPositionerTool::m_subDetElements [private]

Definition at line 65 of file AutoPositionerTool.h.


The documentation for this class was generated from the following files:
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:15:10 2011 for DetHelpers by doxygen 1.4.7