Gaudi Framework, version v21r9

Home   Generated: 3 May 2010

GaudiTuples.icpp

Go to the documentation of this file.
00001 // $Id: GaudiTuples.icpp,v 1.10 2008/05/15 08:50:32 marcocle Exp $
00002 // ============================================================================
00003 // CVS tag $Name:  $, version $Revision: 1.10 $
00004 // ============================================================================
00005 // Include files
00006 // ============================================================================
00007 // Gaudi
00008 // ============================================================================
00009 #include "GaudiKernel/IRegistry.h"
00010 #include "GaudiKernel/ToStream.h"
00011 // ============================================================================
00012 // GaudiAlg
00013 // ============================================================================
00014 #include "GaudiAlg/GaudiTuples.h"
00015 #include "GaudiAlg/Tuple.h"
00016 #include "GaudiAlg/TupleObj.h"
00017 #include "GaudiAlg/GaudiTupleAlg.h"
00018 #include "GaudiAlg/TupleDetail.h"
00019 #include "GaudiAlg/Print.h"
00020 // ============================================================================
00021 /* @file GaudiTuples.cpp
00022  *
00023  *  Implementation file for class : GaudiTuples
00024  *
00025  *  @author Chris Jones   Christopher.Rob.Jones@cern.ch
00026  *  @author Vanya BELYAEV Ivan.Belyaev@itep.ru
00027  *  @date   2005-08-08
00028  */
00029 // ============================================================================
00030 // Disable warning on windows
00031 #ifdef _WIN32
00032 #pragma warning ( disable:4661 ) // incomplete explicit templates
00033 #endif
00034 // ============================================================================
00035 // Destructor
00036 //=============================================================================
00037 template <class PBASE>
00038 GaudiTuples<PBASE>::~GaudiTuples() {}
00039 //=============================================================================
00040 // Initialize ntupling
00041 //=============================================================================
00042 template <class PBASE>
00043 StatusCode GaudiTuples<PBASE>::
00044 #ifdef __ICC
00045   i_gtInitialize
00046 #else
00047   initialize
00048 #endif
00049   ()
00050 {
00051   // initialize base class
00052   const StatusCode sc = PBASE::initialize();
00053   if ( sc.isFailure() ) return sc;
00054 
00055   if ( produceNTuples() )
00056   {
00057     // check the existance of service
00058     if ( this->ntupleSvc() == 0 )
00059     { return  this->Error( "INTupleSvc* points to NULL!" ); }
00060     // Print ntuple path
00061     this->Print( "The N-Tuple   path is set to be '" + nTuplePath() + "'",
00062                  StatusCode(StatusCode::SUCCESS, true) , MSG::DEBUG);
00063   }
00064   else
00065   { this->debug() << "Production of N-Tuples is switched OFF" << endmsg; }
00066 
00067   if ( produceEvtCols() )
00068   {
00069     // check the existance of service
00070     if ( 0 == this->evtColSvc() )
00071     { return  this->Error( "INTupleSvc* points to NULL!" ); }
00072     // Print EvtCol path
00073     this->Print( "The EventCol  path is set to be '" + evtColPath() + "'",
00074                  StatusCode(StatusCode::SUCCESS, true) , MSG::DEBUG );
00075   }
00076   else
00077   { this->debug() << "Production of Event Collections is switched OFF" << endmsg; }
00078 
00079   return sc;
00080 }
00081 
00082 //=============================================================================
00083 // finalize ntupling
00084 //=============================================================================
00085 template <class PBASE>
00086 StatusCode GaudiTuples<PBASE>::
00087 #ifdef __ICC
00088   i_gtFinalize
00089 #else
00090   finalize
00091 #endif
00092   ()
00093 {
00094   if ( !( nTupleMapTitle () . empty () &&
00095           nTupleMapID    () . empty () &&
00096           evtColMapTitle () . empty () &&
00097           evtColMapID    () . empty ()
00098           ) )
00099   {
00100     const int nNtuples = nTupleMapID () . size () ;
00101     const int nEvtCols = evtColMapID () . size ();
00102     this->always()
00103       << "Booked " << nNtuples << " N-Tuples and " << nEvtCols
00104       << " Event Tag Collections" << endmsg ;
00105   }
00106 
00107   if ( produceNTuples () && tuplesPrint  () ) { printTuples  () ; }
00108   if ( produceEvtCols () && evtColsPrint () ) { printEvtCols () ; }
00109 
00110   { // release ntuples and clear the container
00111     for( TupleMapTitle::iterator itup = m_nTupleMapTitle.begin() ;
00112          m_nTupleMapTitle.end() != itup ; ++itup )
00113     { if( 0 != itup->second ) { itup->second->release() ; } }
00114     m_nTupleMapTitle.clear() ;
00115   }
00116   { // release ntuples and clear the container
00117     for( TupleMapID::iterator itup = m_nTupleMapID.begin() ;
00118          m_nTupleMapID.end() != itup ; ++itup )
00119     { if( 0 != itup->second ) { itup->second->release() ; } }
00120     m_nTupleMapID.clear();
00121   }
00122   { // release ntuples and clear the container
00123     for( TupleMapTitle::iterator itup = m_evtColMapTitle.begin() ;
00124          m_evtColMapTitle.end() != itup ; ++itup )
00125     { if( 0 != itup->second ) { itup->second->release() ; } }
00126     m_evtColMapTitle.clear();
00127   }
00128   { // release ntuples and clear the container
00129     for( TupleMapID::iterator itup = m_evtColMapID.begin() ;
00130          m_evtColMapID.end() != itup ; ++itup )
00131     { if( 0 != itup->second ) { itup->second->release() ; } }
00132     m_evtColMapID.clear() ;
00133   }
00134   // finalize base class
00135   return PBASE::finalize();
00136 }
00137 
00138 // ============================================================================
00139 // get N-tuple object ( book on-demand ) with unique identidier
00140 // ============================================================================
00141 template <class PBASE>
00142 Tuples::Tuple GaudiTuples<PBASE>::nTuple
00143 ( const std::string& title ,
00144   const CLID&        clid  ) const
00145 {
00146   // look up in the table
00147   Tuples::TupleObj* tuple = m_nTupleMapTitle[ title ]  ;
00148   if ( 0 != tuple ) { return Tuple( tuple ) ; }                  // RETURN
00149   // Create the tuple ID
00150   TupleID ID;
00151   if ( this->useNumericAutoIDs() || title.empty() )
00152   {
00153     if ( ! this->useNumericAutoIDs() )
00154     {
00155       this -> Warning( "Cannot generate automatic literal ID from an empty title ! Using numeric ID instead for nTuple ID",
00156                        StatusCode::SUCCESS );
00157     }
00158     // propose the tuple ID
00159     ID = TupleID ( m_nTupleMapID.size() + 1 + nTupleOffSet() );
00160     // adjust the proposed ID
00161     while ( nTupleExists(ID) || evtColExists(ID) )
00162     { ID = TupleID ( ID.numeric() + 1 ) ; }
00163   }
00164   else
00165   {
00166     // use the title to create a unique literal ID
00167     ID = TupleID( this->convertTitleToID(title) );
00168     // Just in case ...
00169     while ( nTupleExists(ID) || evtColExists(ID) )
00170     { ID = TupleID(ID.idAsString()+"_"); }
00171   }
00172   // return
00173   return nTuple( ID , title , clid ) ;
00174 }
00175 // ============================================================================
00176 
00177 // ============================================================================
00178 // Access an Event Tag Collection object (book on-demand) with unique identifier
00179 // ============================================================================
00180 template <class PBASE>
00181 Tuples::Tuple GaudiTuples<PBASE>::evtCol
00182 ( const std::string& title ,
00183   const CLID&        clid  ) const
00184 {
00185   // look up in the table
00186   Tuples::TupleObj* tuple = m_evtColMapTitle[ title ]  ;
00187   if ( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00188   // Create the tuple ID
00189   TupleID ID;
00190   if ( this->useNumericAutoIDs() || title.empty() )
00191   {
00192     if ( ! this->useNumericAutoIDs() )
00193     {
00194       this -> Warning( "Cannot generate automatic literal ID from an empty title ! Using numeric ID instead for evtCol ID",
00195                        StatusCode::SUCCESS );
00196     }
00197     // proposed the tuple ID
00198     ID = TupleID ( m_evtColMapID.size() + 1 + evtColOffSet() ) ;
00199     // adjust the proposed ID
00200     while ( nTupleExists(ID) || evtColExists(ID) )
00201     { ID = TupleID ( ID.numeric() + 1 ) ; }
00202   }
00203   else
00204   {
00205     // use the title to create a unique literal ID
00206     ID = TupleID( this->convertTitleToID(title) );
00207     // Just in case ...
00208     while ( nTupleExists(ID) || evtColExists(ID) )
00209     { ID = TupleID ( ID.idAsString()+"_" ) ; }
00210   }
00211   // return
00212   return evtCol( ID , title , clid ) ;
00213 }
00214 // ============================================================================
00215 
00216 // ============================================================================
00217 // get N-tuple object ( book on-demand ) with forced ID
00218 // ============================================================================
00219 template <class PBASE>
00220 Tuples::Tuple GaudiTuples<PBASE>::nTuple
00221 ( const TupleID&     ID     ,
00222   const std::string& title1 ,
00223   const CLID&        clid   ) const
00224 {
00225   // Check ID
00226   if ( ID.undefined() )
00227   { this->Error("Undefined NTuple ID : Title='"+title1+"'"); return Tuple(0); }
00228   
00229   // look up in the table
00230   Tuples::TupleObj * tuple = m_nTupleMapID[ ID ] ;
00231   if( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00232   
00233   // convert ID to the string
00234   const std::string tID = ID.idAsString() ;
00235 
00236   // adjust the NTuple title
00237   const std::string title = title1.empty() ? ( "NTuple #" + tID ) : title1 ;
00238 
00239   // book new ntuple
00240   if( produceNTuples() )
00241   {
00242     // book NTupel
00243     NTuple::Tuple * tup = 0;
00244     if ( ID.numeric() )
00245     {
00246       tup = this->ntupleSvc() -> book ( nTuplePath() , ID.numericID() , clid , title );
00247     }
00248     else if ( ID.literal() )
00249     {
00250       tup = this->ntupleSvc() -> book ( nTuplePath() , ID.literalID() , clid , title );
00251     }
00252     else { this->Error( "Undefined NTuple ID" ); }
00253 
00254     // assertion
00255     this->Assert( 0 != tup , "Could not book the N-Tuple='" + title + "'" ) ;
00256     // some printout
00257     if( 0 != tup -> registry() && this->msgLevel(MSG::DEBUG) )
00258     { this->debug() << "Booked NTuple '" << title << "' ID=" << tID
00259                     << "' Path='"  << nTuplePath() << "' TS='"
00260                     << tup -> registry() -> identifier() << "'" << endmsg; }
00261 
00262     tuple = createNTuple ( title , tup                , clid ) ;
00263   }
00264   else
00265   {
00266     tuple = createNTuple ( title , (NTuple::Tuple*) 0 , clid ) ;
00267   }
00268   // increment the reference
00269   tuple -> addRef();
00270   //
00271   m_nTupleMapID [ ID ] = tuple ;
00272   //
00273   tuple -> addRef();
00274   m_nTupleMapTitle[ title ] = tuple ;
00275   // return
00276   return Tuple( tuple ) ;
00277 }
00278 // ============================================================================
00279 template <class PBASE>
00280 Tuples::Tuple GaudiTuples<PBASE>::evtCol
00281 ( const TupleID&     ID     ,
00282   const std::string& title1 ,
00283   const CLID&        clid   ) const
00284 {
00285   // Check ID
00286   if ( ID.undefined() )
00287   { this->Error("Undefined NTuple ID : Title='"+title1+"'"); return Tuple(0); }
00288 
00289   // look up in the table
00290   Tuples::TupleObj* tuple = m_evtColMapID[ID] ;
00291   if ( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00292   
00293   // convert ID to the string
00294   const std::string tID = ID.idAsString() ;
00295 
00296   // adjust the NTuple title
00297   const std::string title = title1.empty() ? ( "EvtCol #" + tID ) : title1 ;
00298 
00299   // book new ntuple
00300   if( produceEvtCols() )
00301   {
00302     // book NTuple
00303     NTuple::Tuple* tup = 0;
00304     if (  ID.numeric() )
00305     {
00306       tup = this->evtColSvc()->book ( evtColPath() , ID.numericID() , clid , title ) ;
00307     }
00308     else if ( ID.literal() )
00309     {
00310       tup = this->evtColSvc()->book ( evtColPath() , ID.literalID() , clid , title ) ;
00311     }
00312     else { this->Error( "Undefined NTuple ID" ); }
00313 
00314     // assertion
00315     this->Assert( 0 != tup , "Could not book the EvtCol='" + title + "'" ) ;
00316     // some printout
00317     if( 0 != tup -> registry() && this->msgLevel(MSG::DEBUG) )
00318     { this->debug() << "Booked EvtCol '" << title << "' ID=" << tID
00319                     << "' Path='" << evtColPath() << "' TS='"
00320                     << tup -> registry() -> identifier() << "'" << endmsg ; }
00321 
00322     tuple = createEvtCol ( title , tup                , clid ) ;
00323   }
00324   else
00325   {
00326     tuple = createEvtCol ( title , (NTuple::Tuple*) 0 , clid ) ;
00327   }
00328   // increment the reference
00329   tuple -> addRef();
00330   //
00331   m_evtColMapID [ ID ] = tuple ;
00332   //
00333   tuple -> addRef();
00334   m_evtColMapTitle[ title ] = tuple ;
00335   // return
00336   return Tuple( tuple ) ;
00337 }
00338 // ============================================================================
00339 // create TupleObj
00340 // ============================================================================
00341 template <class PBASE>
00342 Tuples::TupleObj* GaudiTuples<PBASE>::createNTuple
00343 ( const std::string& name  ,
00344   NTuple::Tuple*     tuple ,
00345   const CLID&        clid  ) const
00346 {
00347   return Tuples::createTupleObj
00348     ( this , "Tuple '" + name  + "'" , tuple , clid , Tuples::NTUPLE ) ;
00349 }
00350 // ============================================================================
00351 
00352 // ============================================================================
00353 // create TupleObj for event tag collection
00354 // ============================================================================
00355 template <class PBASE>
00356 Tuples::TupleObj* GaudiTuples<PBASE>::createEvtCol
00357 ( const std::string& name  ,
00358   NTuple::Tuple*     tuple ,
00359   const CLID&        clid  ) const
00360 {
00361   return Tuples::createTupleObj
00362     ( this , "EvtCol '" + name  + "'" , tuple , clid , Tuples::EVTCOL ) ;
00363 }
00364 // ============================================================================
00365 // perform the actual printout of N-tuples
00366 // ============================================================================
00367 template <class PBASE>
00368 long GaudiTuples<PBASE>::printTuples  () const
00369 {
00370 
00371   if ( nTupleMapTitle().empty() && nTupleMapID().empty() )
00372   { if (this->msgLevel(MSG::DEBUG)) this->debug() << "No N-Tuples   are booked" << endmsg ; }
00373   else
00374   { this->always() << "List of booked N-Tuples in directory "
00375                    << "\"" << nTuplePath() << "\"" << endmsg ; }
00376   
00377   // helper container to sort it:
00378   typedef std::map<TupleID,const Tuples::TupleObj*> OrderedMapType;
00379   OrderedMapType OrderedMap ( nTupleMapID().begin() , nTupleMapID().end() ) ;
00380   //
00381   for ( OrderedMapType::const_iterator entry = OrderedMap.begin() ;
00382         OrderedMap.end() != entry ; ++entry )
00383   {
00384     if ( 0 == entry->second ) { continue ; }
00385     const NTuple::Tuple* tuple = entry->second->tuple() ;
00386     if ( 0 == tuple )
00387     { this->error() << " NTuple::Tuple* points to NULL" << endmsg ; continue ; }
00388     this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first ) << endmsg ;
00389   }
00390   //
00391   return this->nTupleMapID().size() ;
00392 }
00393 // ============================================================================
00394 // perform the actual printout of Evt Tag Collections
00395 // ============================================================================
00396 template <class PBASE>
00397 long GaudiTuples<PBASE>::printEvtCols () const
00398 {
00399   if ( evtColMapTitle().empty() && evtColMapID().empty() )
00400   { this->always() << "No Event Tag Collections are booked" << endmsg ; }
00401   else
00402   { this->always() << "List of booked Event Tag Collections in directory "
00403                    << "\"" << evtColPath() << "\"" << endmsg ; }
00404   
00405   // helper container to sort it:
00406   typedef std::map<TupleID,const Tuples::TupleObj*> OrderedMapType;
00407   OrderedMapType OrderedMap ( evtColMapID().begin() , evtColMapID().end() ) ;
00408   //
00409   for ( OrderedMapType::const_iterator entry = OrderedMap.begin() ;
00410         OrderedMap.end() != entry ; ++entry )
00411   {
00412     if ( 0 == entry->second ) { continue ; }
00413     const NTuple::Tuple* tuple = entry->second->tuple() ;
00414     if ( 0 == tuple )
00415     { this->error() << " NTuple::Tuple* points to NULL" << endmsg ; continue ; }
00416     this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first )
00417                    << " Items:"
00418                    << Gaudi::Utils::toString ( entry->second->items() ) << endmsg ;
00419   }
00420   //
00421   return this->evtColMapID().size() ;
00422 }
00423 // ============================================================================
00424 // check the existence AND validity of the N-Tuple with the given ID
00425 // ============================================================================
00426 template <class PBASE>
00427 bool GaudiTuples<PBASE>::nTupleExists ( const TupleID& ID ) const
00428 { return m_nTupleMapID.end() != m_nTupleMapID.find ( ID ) ; }
00429 // ============================================================================
00430 // check the existence AND validity of the Event Tag Collection with the given ID
00431 // ============================================================================
00432 template <class PBASE>
00433 bool GaudiTuples<PBASE>::evtColExists ( const TupleID& ID ) const
00434 { return m_evtColMapID.end() != m_evtColMapID.find ( ID ) ; }
00435 // ============================================================================
00436 // Handle method for changes in the 'NTuplePrint'      property
00437 // ============================================================================
00438 template <class PBASE>
00439 void GaudiTuples<PBASE>::printNTupleHandler  ( Property& )
00440 {
00441   // no action if not yet initialized
00442   if ( this -> FSMState() < Gaudi::StateMachine::INITIALIZED ) { return ; }
00443   if ( this -> tuplesPrint() ) { this -> printTuples () ; }
00444 }
00445 // ============================================================================
00446 // Handle method for changes in the 'EvtColsPrint'      property
00447 // ============================================================================
00448 template <class PBASE>
00449 void GaudiTuples<PBASE>::printEvtColHandler  ( Property& )
00450 {
00451   // no action if not yet initialized
00452   if ( this -> FSMState() < Gaudi::StateMachine::INITIALIZED ) { return ; }
00453   if ( this -> evtColsPrint() ) { this -> printEvtCols () ; }
00454 }
00455 // ============================================================================
00456 // The END
00457 // ============================================================================

Generated at Mon May 3 12:14:02 2010 for Gaudi Framework, version v21r9 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004