Gaudi Framework, version v20r2

Generated: 18 Jul 2008

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: v11r1 $, 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 //=============================================================================
00041 // Initialize ntupling
00042 //=============================================================================
00043 template <class PBASE>
00044 StatusCode GaudiTuples<PBASE>::initialize()
00045 {
00046   // initialize base class
00047   const StatusCode sc = PBASE::initialize();
00048   if ( sc.isFailure() ) return sc;
00049 
00050   if ( produceNTuples() )
00051   {
00052     // check the existance of service
00053     if ( 0 == this->ntupleSvc() )
00054     { return  this->Error( "INTupleSvc* points to NULL!" ); }
00055     // Print ntuple path
00056     Print( "The N-Tuple   path is set to be '" + nTuplePath() + "'", 
00057            StatusCode(StatusCode::SUCCESS, true) , MSG::DEBUG);
00058   }
00059   else
00060   { this->debug() << "Production of N-Tuples is switched OFF" << endreq; }
00061 
00062   if ( produceEvtCols() )
00063   {
00064     // check the existance of service
00065     if ( 0 == this->evtColSvc() )
00066     { return  this->Error( "INTupleSvc* points to NULL!" ); }
00067     // Print EvtCol path
00068     Print( "The EventCol  path is set to be '" + evtColPath() + "'", 
00069            StatusCode(StatusCode::SUCCESS, true) , MSG::DEBUG );
00070   }
00071   else
00072   { this->debug() << "Production of Event Collections is switched OFF" << endreq; }
00073 
00074   return sc;
00075 }
00076 
00077 //=============================================================================
00078 // finalize ntupling
00079 //=============================================================================
00080 template <class PBASE>
00081 StatusCode GaudiTuples<PBASE>::finalize()
00082 {
00083   if ( !( nTupleMapTitle() .empty() &&
00084           nTupleMapNumID() .empty() &&
00085           nTupleMapLitID() .empty() &&
00086           evtColMapTitle() .empty() &&
00087           evtColMapNumID() .empty() &&
00088           evtColMapLitID() .empty()
00089           ) )
00090   {
00091     const int nNtuples = nTupleMapNumID().size() + nTupleMapLitID().size();
00092     const int nEvtCols = evtColMapNumID().size() + evtColMapLitID().size();
00093     this->always()
00094       << "Booked " << nNtuples << " N-Tuples and " << nEvtCols
00095       << " Event Tag Collections" << endreq ;
00096   }
00097 
00098   if ( produceNTuples () && tuplesPrint  () ) { printTuples  () ; }
00099   if ( produceEvtCols () && evtColsPrint () ) { printEvtCols () ; }
00100 
00101   { // release ntuples and clear the container
00102     for( TupleMapTitle::iterator itup = m_nTupleMapTitle.begin() ;
00103          m_nTupleMapTitle.end() != itup ; ++itup )
00104     { if( 0 != itup->second ) { itup->second->release() ; } }
00105     m_nTupleMapTitle.clear() ;
00106   }
00107   { // release ntuples and clear the container
00108     for( TupleMapNumID::iterator itup = m_nTupleMapNumID.begin() ;
00109          m_nTupleMapNumID.end() != itup ; ++itup )
00110     { if( 0 != itup->second ) { itup->second->release() ; } }
00111     m_nTupleMapNumID.clear();
00112   }
00113   { // release ntuples and clear the container
00114     for( TupleMapLitID::iterator itup = m_nTupleMapLitID.begin() ;
00115          m_nTupleMapLitID.end() != itup ; ++itup )
00116     { if( 0 != itup->second ) { itup->second->release() ; } }
00117     m_nTupleMapLitID.clear();
00118   }
00119   { // release ntuples and clear the container
00120     for( TupleMapTitle::iterator itup = m_evtColMapTitle.begin() ;
00121          m_evtColMapTitle.end() != itup ; ++itup )
00122     { if( 0 != itup->second ) { itup->second->release() ; } }
00123     m_evtColMapTitle.clear();
00124   }
00125   { // release ntuples and clear the container
00126     for( TupleMapNumID::iterator itup = m_evtColMapNumID.begin() ;
00127          m_evtColMapNumID.end() != itup ; ++itup )
00128     { if( 0 != itup->second ) { itup->second->release() ; } }
00129     m_evtColMapNumID.clear() ;
00130   }
00131   { // release ntuples and clear the container
00132     for( TupleMapLitID::iterator itup = m_evtColMapLitID.begin() ;
00133          m_evtColMapLitID.end() != itup ; ++itup )
00134     { if( 0 != itup->second ) { itup->second->release() ; } }
00135     m_evtColMapLitID.clear() ;
00136   }
00137 
00138   // finalize base class
00139   return PBASE::finalize();
00140 }
00141 
00142 // ============================================================================
00143 // get N-tuple object ( book on-demand ) with unique identidier
00144 // ============================================================================
00145 template <class PBASE>
00146 Tuples::Tuple GaudiTuples<PBASE>::nTuple
00147 ( const std::string& title ,
00148   const CLID&        clid  ) const
00149 {
00150   // look up in the table
00151   Tuples::TupleObj* tuple = m_nTupleMapTitle[ title ]  ;
00152   if ( 0 != tuple ) { return Tuple( tuple ) ; }                  // RETURN
00153   // Create the tuple ID
00154   TupleID ID;
00155   if ( this->useNumericAutoIDs() || title.empty() )
00156   {
00157     if ( ! this->useNumericAutoIDs() )
00158     {
00159       this -> Warning( "Cannot generate automatic literal ID from an empty title ! Using numeric ID instead for nTuple ID",
00160                        StatusCode::SUCCESS );
00161     }
00162     // propose the tuple ID
00163     ID = TupleID ( m_nTupleMapNumID.size() + 1 + nTupleOffSet() );
00164     // adjust the proposed ID
00165     while ( nTupleExists(ID) || evtColExists(ID) ) { ++ID ; }
00166   }
00167   else
00168   {
00169     // use the title to create a unique literal ID
00170     ID = TupleID( this->convertTitleToID(title) );
00171     // Just in case ...
00172     while ( nTupleExists(ID) || evtColExists(ID) ) { ID = TupleID(ID.idAsString()+"_"); }
00173   }
00174   // return
00175   return nTuple( ID , title , clid ) ;
00176 }
00177 // ============================================================================
00178 
00179 // ============================================================================
00180 // Access an Event Tag Collection object (book on-demand) with unique identifier
00181 // ============================================================================
00182 template <class PBASE>
00183 Tuples::Tuple GaudiTuples<PBASE>::evtCol
00184 ( const std::string& title ,
00185   const CLID&        clid  ) const
00186 {
00187   // look up in the table
00188   Tuples::TupleObj* tuple = m_evtColMapTitle[ title ]  ;
00189   if ( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00190   // Create the tuple ID
00191   TupleID ID;
00192   if ( this->useNumericAutoIDs() || title.empty() )
00193   {
00194     if ( ! this->useNumericAutoIDs() )
00195     {
00196       this -> Warning( "Cannot generate automatic literal ID from an empty title ! Using numeric ID instead for evtCol ID",
00197                        StatusCode::SUCCESS );
00198     }
00199     // proposed the tuple ID
00200     ID = m_evtColMapNumID.size() + 1 + evtColOffSet() ;
00201     // adjust the proposed ID
00202     while ( nTupleExists(ID) || evtColExists(ID) ) { ++ID ; }
00203   }
00204   else
00205   {
00206     // use the title to create a unique literal ID
00207     ID = TupleID( this->convertTitleToID(title) );
00208     // Just in case ...
00209     while ( nTupleExists(ID) || evtColExists(ID) ) { 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 =
00231     ( ID.numeric() ? m_nTupleMapNumID[ID.numericID()] : m_nTupleMapLitID[ID.literalID()] ) ;
00232   if( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00233 
00234   // convert ID to the string
00235   const std::string tID = ID.idAsString() ;
00236 
00237   // adjust the NTuple title
00238   const std::string title = title1.empty() ? ( "NTuple #" + tID ) : title1 ;
00239 
00240   // book new ntuple
00241   if( produceNTuples() )
00242   {
00243     // book NTupel
00244     NTuple::Tuple * tup = 0;
00245     if ( ID.numeric() )
00246     {
00247       tup = this->ntupleSvc() -> book ( nTuplePath() , ID.numericID() , clid , title );
00248     }
00249     else if ( ID.literal() )
00250     {
00251       tup = this->ntupleSvc() -> book ( nTuplePath() , ID.literalID() , clid , title );
00252     }
00253     else { this->Error( "Undefined NTuple ID" ); }
00254 
00255     // assertion
00256     this->Assert( 0 != tup , "Could not book the N-Tuple='" + title + "'" ) ;
00257     // some printout
00258     if( 0 != tup -> registry() && this->msgLevel(MSG::DEBUG) )
00259     { this->debug() << "Booked NTuple '" << title << "' ID=" << tID
00260                     << "' Path='"  << nTuplePath() << "' TS='"
00261                     << tup -> registry() -> identifier() << "'" << endreq; }
00262 
00263     tuple = createNTuple ( title , tup                , clid ) ;
00264   }
00265   else
00266   {
00267     tuple = createNTuple ( title , (NTuple::Tuple*) 0 , clid ) ;
00268   }
00269   // increment the reference
00270   tuple -> addRef();
00271   if   ( ID.numeric() ) { m_nTupleMapNumID [ ID.numericID() ] = tuple ; }
00272   else                  { m_nTupleMapLitID [ ID.literalID() ] = tuple ; }
00273   tuple -> addRef();
00274   m_nTupleMapTitle[ title ] = tuple ;
00275   // return
00276   return Tuple( tuple ) ;
00277 };
00278 
00279 // ============================================================================
00280 template <class PBASE>
00281 Tuples::Tuple GaudiTuples<PBASE>::evtCol
00282 ( const TupleID&     ID     ,
00283   const std::string& title1 ,
00284   const CLID&        clid   ) const
00285 {
00286   // Check ID
00287   if ( ID.undefined() )
00288   { this->Error("Undefined NTuple ID : Title='"+title1+"'"); return Tuple(0); }
00289 
00290   // look up in the table
00291   Tuples::TupleObj* tuple =
00292     ( ID.numeric() ? m_evtColMapNumID[ID.numericID()] : m_evtColMapLitID[ID.literalID()] ) ;
00293   if ( 0 != tuple ) { return Tuple( tuple ) ; }                   // RETURN
00294 
00295   // convert ID to the string
00296   const std::string tID = ID.idAsString() ;
00297 
00298   // adjust the NTuple title
00299   const std::string title = title1.empty() ? ( "EvtCol #" + tID ) : title1 ;
00300 
00301   // book new ntuple
00302   if( produceEvtCols() )
00303   {
00304     // book NTuple
00305     NTuple::Tuple* tup = 0;
00306     if (  ID.numeric() )
00307     {
00308       tup = this->evtColSvc()->book ( evtColPath() , ID.numericID() , clid , title ) ;
00309     }
00310     else if ( ID.literal() )
00311     {
00312       tup = this->evtColSvc()->book ( evtColPath() , ID.literalID() , clid , title ) ;
00313     }
00314     else { this->Error( "Undefined NTuple ID" ); }
00315 
00316     // assertion
00317     this->Assert( 0 != tup , "Could not book the EvtCol='" + title + "'" ) ;
00318     // some printout
00319     if( 0 != tup -> registry() && this->msgLevel(MSG::DEBUG) )
00320     { this->debug() << "Booked EvtCol '" << title << "' ID=" << tID
00321                     << "' Path='" << evtColPath() << "' TS='"
00322                     << tup -> registry() -> identifier() << "'" << endreq ; }
00323 
00324     tuple = createEvtCol ( title , tup                , clid ) ;
00325   }
00326   else
00327   {
00328     tuple = createEvtCol ( title , (NTuple::Tuple*) 0 , clid ) ;
00329   }
00330   // increment the reference
00331   tuple -> addRef();
00332   if   ( ID.numeric() ) { m_evtColMapNumID [ ID.numericID() ] = tuple ; }
00333   else                  { m_evtColMapLitID [ ID.literalID() ] = tuple ; }
00334   tuple -> addRef();
00335   m_evtColMapTitle[ title ] = tuple ;
00336   // return
00337   return Tuple( tuple ) ;
00338 }
00339 // ============================================================================
00340 
00341 // ============================================================================
00342 // create TupleObj
00343 // ============================================================================
00344 template <class PBASE>
00345 Tuples::TupleObj* GaudiTuples<PBASE>::createNTuple
00346 ( const std::string& name  ,
00347   NTuple::Tuple*     tuple ,
00348   const CLID&        clid  ) const
00349 {
00350   return Tuples::createTupleObj
00351     ( this , "Tuple '" + name  + "'" , tuple , clid , Tuples::NTUPLE ) ;
00352 }
00353 // ============================================================================
00354 
00355 // ============================================================================
00356 // create TupleObj for event tag collection
00357 // ============================================================================
00358 template <class PBASE>
00359 Tuples::TupleObj* GaudiTuples<PBASE>::createEvtCol
00360 ( const std::string& name  ,
00361   NTuple::Tuple*     tuple ,
00362   const CLID&        clid  ) const
00363 {
00364   return Tuples::createTupleObj
00365     ( this , "EvtCol '" + name  + "'" , tuple , clid , Tuples::EVTCOL ) ;
00366 }
00367 // ============================================================================
00368 
00369 
00370 // ============================================================================
00371 // perform the actual printout of N-tuples
00372 // ============================================================================
00373 template <class PBASE>
00374 long GaudiTuples<PBASE>::printTuples  () const
00375 {
00376 
00377   typedef std::set<const NTuple::Tuple*> _Tuples ;
00378 
00379   if ( nTupleMapTitle().empty() &&
00380        nTupleMapNumID().empty() &&
00381        nTupleMapLitID().empty() )
00382   { if (this->msgLevel(MSG::DEBUG)) this->debug() << "No N-Tuples   are booked" << endreq ; }
00383   else
00384   { this->always() << "List of booked N-Tuples in directory "
00385                    << "\"" << nTuplePath() << "\"" << endreq ; }
00386 
00387   _Tuples tuples ;
00388   { // N-Tuple by Numeric ID
00389     for ( TupleMapNumID::const_iterator entry = nTupleMapNumID().begin() ;
00390           nTupleMapNumID().end() != entry ; ++entry )
00391     {
00392       if ( 0 == entry->second ) { continue ; }
00393       const NTuple::Tuple* tuple = entry->second->tuple() ;
00394       if ( 0 == tuple )
00395       { this->error() << " NTuple::Tuple* points to NULL" << endreq ; continue ; }
00396       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00397       tuples.insert ( tuple ) ;
00398       this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first ) << endreq ;
00399     }
00400   }
00401   { // N-Tuple by Literal ID
00402     for ( TupleMapLitID::const_iterator entry = nTupleMapLitID().begin() ;
00403           nTupleMapLitID().end() != entry ; ++entry )
00404     {
00405       if ( 0 == entry->second ) { continue ; }
00406       const NTuple::Tuple* tuple = entry->second->tuple() ;
00407       if ( 0 == tuple )
00408       { this->error() << " NTuple::Tuple* points to NULL" << endreq ; continue ; }
00409       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00410       tuples.insert ( tuple ) ;
00411       this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first ) << endreq ;
00412     }
00413   }
00414   { // N-Tuples by Title
00415     for ( TupleMapTitle::const_iterator entry = nTupleMapTitle().begin() ;
00416           nTupleMapTitle().end() != entry ; ++entry )
00417     {
00418       if ( 0 == entry->second ) { continue ; }
00419       const NTuple::Tuple* tuple = entry->second->tuple() ;
00420       if ( 0 == tuple )
00421       { this->error() << " NTuple::Tuple* points to NULL" << endreq ; continue ; }
00422       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00423       tuples.insert ( tuple ) ;
00424       this->always() << GaudiAlg::PrintTuple::print ( tuple )             << endreq ;
00425     }
00426   }
00427 
00428   return tuples.size() ;
00429 };
00430 // ============================================================================
00431 
00432 // ============================================================================
00433 // perform the actual printout of Evt Tag Collections
00434 // ============================================================================
00435 template <class PBASE>
00436 long GaudiTuples<PBASE>::printEvtCols () const
00437 {
00438   typedef std::set<const NTuple::Tuple*> _Tuples ;
00439 
00440   if ( evtColMapTitle().empty() &&
00441        evtColMapNumID().empty() &&
00442        evtColMapLitID().empty() )
00443   { this->always() << "No Event Tag Collections are booked" << endreq ; }
00444   else
00445   { this->always() << "List of booked Event Tag Collections in directory "
00446                    << "\"" << evtColPath() << "\"" << endreq ; }
00447 
00448   _Tuples tuples ;
00449   { // EvtCols by Numeric ID
00450     for ( TupleMapNumID::const_iterator entry = evtColMapNumID().begin() ;
00451           evtColMapNumID().end() != entry ; ++entry )
00452     {
00453       if ( 0 == entry->second ) { continue ; }
00454       const NTuple::Tuple* tuple = entry->second->tuple() ;
00455       if ( 0 == tuple )
00456       { this->error() << "NTuple::Tuple* points to NULL" << endreq ; continue ; }
00457       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00458       tuples.insert ( tuple ) ;
00459       this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first )
00460                      << " Items:"
00461                      << Gaudi::Utils::toString ( entry->second->items() )    << endreq ;
00462     }
00463   }
00464   { // EvtCols by literal ID
00465     for ( TupleMapLitID::const_iterator entry = evtColMapLitID().begin() ;
00466           evtColMapLitID().end() != entry ; ++entry )
00467     {
00468       if ( 0 == entry->second ) { continue ; }
00469       const NTuple::Tuple* tuple = entry->second->tuple() ;
00470       if ( 0 == tuple )
00471       { this->error() << "NTuple::Tuple* points to NULL" << endreq ; continue ; }
00472       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00473       tuples.insert ( tuple ) ;
00474       this->always() << GaudiAlg::PrintTuple::print ( tuple , entry->first )
00475                      << " Items:"
00476                      << Gaudi::Utils::toString ( entry->second->items() )    << endreq ;
00477     }
00478   }
00479   { // EvtCols by Title
00480     for ( TupleMapTitle::const_iterator entry = evtColMapTitle().begin() ;
00481           evtColMapTitle().end() != entry ; ++entry )
00482     {
00483       if ( 0 == entry->second ) { continue ; }
00484       const NTuple::Tuple* tuple = entry->second->tuple() ;
00485       if ( 0 == tuple )
00486       { this->error() << "NTuple::Tuple* points to NULL" << endreq ; continue ; }
00487       if ( tuples.end() != tuples.find( tuple ) ) { continue ; }
00488       tuples.insert ( tuple ) ;
00489       this->always() << GaudiAlg::PrintTuple::print ( tuple )
00490                      << " Items:"
00491                      << Gaudi::Utils::toString ( entry->second->items() ) << endreq ;
00492     }
00493   }
00494 
00495   return tuples.size() ;
00496 }
00497 
00498 // ============================================================================
00499 // check the existence AND validity of the N-Tuple with the given ID
00500 // ============================================================================
00501 template <class PBASE>
00502 bool GaudiTuples<PBASE>::nTupleExists ( const TupleID& ID ) const
00503 {
00504   bool OK(false);
00505   if ( ID.numeric() )
00506   {
00507     TupleMapNumID::iterator found = m_nTupleMapNumID.find( ID.numericID() ) ;
00508     OK = ( m_nTupleMapNumID.end() != found );
00509   }
00510   else
00511   {
00512     TupleMapLitID::iterator found = m_nTupleMapLitID.find( ID.literalID() ) ;
00513     OK = ( m_nTupleMapLitID.end() != found );
00514   }
00515   return OK;
00516 }
00517 
00518 // ============================================================================
00519 // check the existence AND validity of the Event Tag Collection with the given ID
00520 // ============================================================================
00521 template <class PBASE>
00522 bool GaudiTuples<PBASE>::evtColExists ( const TupleID& ID ) const
00523 {
00524   bool OK(false);
00525   if ( ID.numeric() )
00526   {
00527     TupleMapNumID::iterator found = m_evtColMapNumID.find( ID.numericID() ) ;
00528     OK = ( m_evtColMapNumID.end() != found );
00529   }
00530   else
00531   {
00532     TupleMapLitID::iterator found = m_evtColMapLitID.find( ID.literalID() ) ;
00533     OK = ( m_evtColMapLitID.end() != found );
00534   }
00535   return OK;
00536 }
00537 
00538 // ============================================================================
00539 // The END
00540 // ============================================================================
00541 
00542 

Generated at Fri Jul 18 11:59:19 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004