Gaudi Framework, version v20r2

Generated: 18 Jul 2008

HNTupleCnv.cpp

Go to the documentation of this file.
00001 // $Header: /local/reps/Gaudi/HbookCnv/src/HNTupleCnv.cpp,v 1.9 2006/03/13 17:17:32 hmd Exp $
00002 #define HBOOKCNV_HNTUPLECNV_CPP
00003 
00004 
00005 // Include files
00006 #include "GaudiKernel/CnvFactory.h"
00007 #include "GaudiKernel/DataObject.h"
00008 #include "GaudiKernel/IRegistry.h"
00009 #include "GaudiKernel/IOpaqueAddress.h"
00010 #include "GaudiKernel/IDataProviderSvc.h"
00011 #include "GaudiKernel/INTupleSvc.h"
00012 
00013 #include "GaudiKernel/MsgStream.h"
00014 #include "GaudiKernel/NTuple.h"
00015 #include "NTupleInfo.h"
00016 #include "HNTupleCnv.h"
00017 #include "HbookDef.h"
00018 
00019 //------------------------------------------------------------------------------
00020 //
00021 // Implementation of class :  HbookCnv::HNTupleCnv
00022 //
00023 // Author :                   Markus Frank
00024 //
00025 //------------------------------------------------------------------------------
00026 
00028 HbookCnv::HNTupleCnv::HNTupleCnv(ISvcLocator* svc, const CLID& clid)
00029 : HConverter(clid, svc), m_ntupleSvc(0)         {
00030 }
00031 
00033 HbookCnv::HNTupleCnv::~HNTupleCnv()             {
00034 }
00035 
00037 StatusCode HbookCnv::HNTupleCnv::initialize()   {
00038   StatusCode status = Converter::initialize();
00039   if ( status.isSuccess() )   {
00040     status = dataProvider()->queryInterface(IID_INTupleSvc, (void**)&m_ntupleSvc);
00041   }
00042   return status;
00043 }
00044 
00046 StatusCode HbookCnv::HNTupleCnv::finalize()     {
00047   if ( m_ntupleSvc != 0 )     {
00048     m_ntupleSvc->release();
00049   }
00050   m_ntupleSvc = 0;
00051   return Converter::finalize();
00052 }
00053 
00055 StatusCode HbookCnv::HNTupleCnv::updateObj(IOpaqueAddress* pAddress, DataObject* pObject)   {
00056   StatusCode status = StatusCode::FAILURE;
00057   try   {
00058     unsigned long* info = (unsigned long*)pAddress->ipar();
00059     const std::string& dir = pAddress->par()[0];
00060     setDiskDirectory(dir);
00061     setDirectory(dir);
00062     status = readData(info[0], dynamic_cast<INTuple*>(pObject), info[1]++);
00063   }
00064   catch (...)   {
00065   }
00066   return status;
00067 }
00068 
00070 StatusCode HbookCnv::HNTupleCnv::createObj(IOpaqueAddress* pAddress, DataObject*& refpObject)   {
00071   long id = pAddress->ipar()[0];
00072   IRegistry* pReg = pAddress->registry();
00073   StatusCode status = readObject( pReg->identifier(), id );
00074   if ( status.isSuccess() )   {
00075     MsgStream log(msgSvc(), "HbookNTupleCnv");
00076     INTuple* nt = 0;
00077     log << MSG::DEBUG;
00078     if ( log.isActive() ) ::HPRINT (id);
00079     status = load(id, nt);
00080     refpObject = dynamic_cast<DataObject*>(nt);
00081   }
00082   return status;
00083 }
00084 
00086 StatusCode HbookCnv::HNTupleCnv::createRep(DataObject* pObject, IOpaqueAddress*& pAddr)  {
00087   pAddr = 0;
00088   try   {  
00089     typedef std::pair<std::string,long> hID;
00090     typedef std::map< hID, bool > hIDMap;
00091     static hIDMap usedIDs;
00092     IRegistry* pReg = pObject->registry();
00093     INTuple* pTuple = dynamic_cast<INTuple*>(pObject);
00094     // Get address again....it does not change
00095     pAddr = pReg->address();
00096     if ( 0 == pAddr )    {
00097       char* stop = 0;
00098       const std::string& regName = pReg->identifier();
00099       const std::string rzLoc = regName.substr(0, regName.rfind('/'));
00100       long id = ::strtol(pReg->name().c_str()+1, &stop, 10);
00101       if ( 0 >= id || usedIDs.find(hID(rzLoc,id)) != usedIDs.end() )
00102       {
00103         MsgStream msg(msgSvc(), "HNTupleCnv");
00104         if ( 0 >= id )
00105         {
00106           msg << MSG::WARNING
00107               << "Ntuple ID " << pReg->identifier()
00108               << "' is an invalid HBOOK identifier" << endreq;
00109         }
00110         else
00111         {
00112           // ID is already used 
00113           msg << MSG::WARNING << "Ntuple ID '" << pReg->identifier() 
00114               << "' is already used" << endreq;
00115         }
00116         id = 1001;
00117         while ( usedIDs.find(hID(rzLoc,id)) != usedIDs.end() ) { ++id; }
00118         const std::string root = pReg->identifier().substr(0,pReg->identifier().rfind('/'));
00119         msg << MSG::WARNING 
00120             << "  -> Adjusting PERSISTENT ID to '" << root << "/" << id << "'" << endreq;
00121       }
00122       usedIDs[hID(rzLoc,id)] = true;
00123       StatusCode status = createDirectory(rzLoc);
00124       if ( !status.isSuccess() )   {
00125         return status;
00126       }
00127       setDirectory(rzLoc);
00128       setDiskDirectory(rzLoc);
00129       status = book(id, diskDirectory(rzLoc), pTuple);
00130       if ( !status.isSuccess() )   {
00131         return status;
00132       }
00133       status = createAddress( rzLoc, objType(), id, pAddr );
00134       if ( !status.isSuccess() )   {
00135         return status;
00136       }
00137     }
00138     setDirectory(pAddr->par()[0]);
00139     return writeData(pAddr->ipar()[0], pTuple);
00140   }
00141   catch (...)   {
00142   }
00143   return StatusCode::FAILURE;
00144 }
00145 
00147 StatusCode HbookCnv::HNTupleCnv::updateRep(IOpaqueAddress* pAddress, DataObject* pObject )
00148 {
00149   MsgStream log(msgSvc(), "HNTupleCnv");
00150   if ( 0 != pAddress )    {
00151     IRegistry* pDir = pAddress->registry();
00152     if ( 0 != pDir )    {
00153       const std::string& regName = pDir->identifier();
00154       const std::string loc = regName.substr(0, regName.rfind('/'));
00155       long id = pAddress->ipar()[0];
00156       log << MSG::INFO << "Saving:" << regName << " with ID:" << id << endreq;
00157       return writeObject( loc, id );
00158     }
00159   } 
00160   else {
00161     log << MSG::WARNING << "empty ntuple: " 
00162         << pObject->registry()->identifier() << endreq;
00163     return ( createRep(pObject,pAddress) );
00164   }
00165   return StatusCode::FAILURE;
00166 }
00167 
00168 bool HbookCnv::parseName( std::string full,
00169                           std::string &blk,
00170                                             std::string &var)
00171 { 
00172   int sp;
00173   if ( (sp=full.find("/")) != -1 ) {
00174     blk = full.substr(0,sp);
00175     var = full.substr(sp+1,full.length());
00176     return true;
00177   }
00178   else {
00179     blk = "AUTO_BLK";
00180     var = full;
00181     return false;
00182   }
00183 }
00184 
00185 
00186 
00188 #define INSTANTIATE(TYP)  \
00189 template INTupleItem* createNTupleItem<TYP>(NTUPLEINFO& tags, long i, INTuple* tuple, TYP minimum, TYP maximum, long& size);
00190 
00191 namespace HbookCnv  {
00192   template<class TYP>
00193   INTupleItem* createNTupleItem (NTUPLEINFO& tags, long i, INTuple* tuple, TYP /* minimum */, TYP /* maximum */ , long& size)   {
00194     size = 0;
00195     INTupleItem* col = 0;
00196 
00197     std::string varname;
00198     std::string blkname = tags.block[i];
00199 
00200     if (blkname != "AUTO_BLK") {
00201       varname = blkname + "/" + tags.name[i];
00202     } else {
00203       varname = tags.name[i];
00204     }
00205 
00206     //if ( tags.isRangeWithin(i, minimum,maximum))
00207     {
00208       long ind = tags.getIndex(tags.index[i]);
00209       long dim1 = 1, dim2 = 1;
00210       TYP min, max, null;
00211       tags.getBounds(i, min, max, null); 
00212       switch( tags.dim[i] )   {
00213       case 0:            
00214         col = NTuple::_Item<TYP>::create (tuple, varname, typeid(TYP), min, max, null);
00215         break;            
00216       case 1:             
00217         dim1 = (ind>=0) ? tags.idist(ind) : tags.theDim[i][0];
00218           col = NTuple::_Array<TYP>::create (tuple, varname,typeid(TYP),tags.index[i],dim1,min,max,null);
00219         break;           
00220       case 2:              
00221         dim1 = (ind>=0) ? tags.idist(ind) : tags.theDim[i][0];
00222         dim2 = (ind>=0) ? tags.theDim[i][0] : tags.theDim[i][1];
00223         col = NTuple::_Matrix<TYP>::create (tuple, varname,typeid(TYP),tags.index[i],dim1,dim2,min,max,null);
00224         break;
00225       default:
00226         break;
00227       }
00228       size += dim1 * dim2 * ((sizeof(TYP) < 4) ? 4 : sizeof(TYP)); 
00229     }
00230     return col;
00231   }
00232 
00233   INSTANTIATE(float)
00234   INSTANTIATE(double)
00235   INSTANTIATE(bool)
00236   INSTANTIATE(char)
00237   INSTANTIATE(int)
00238   INSTANTIATE(short)
00239   INSTANTIATE(long)
00240   INSTANTIATE(unsigned char)
00241   INSTANTIATE(unsigned int)
00242   INSTANTIATE(unsigned short)
00243   INSTANTIATE(unsigned long)
00244     //  INSTANTIATE(IOpaqueAddress*)
00245 
00246     INTupleItem* createNTupleItem (NTUPLEINFO& tags, long i, INTuple* tuple, IOpaqueAddress* /* minimum */, IOpaqueAddress* /* maximum */, long& size)   {
00247     size = 0;
00248     INTupleItem* col = 0;
00249     long ind = tags.getIndex(tags.index[i]);
00250     long dim1 = 1, dim2 = 1;
00251 
00252     std::string varname;
00253     std::string blkname = tags.block[i];
00254 
00255     if (blkname != "AUTO_BLK") {
00256       varname = blkname + "/" + tags.name[i];
00257     } else {
00258       varname = tags.name[i];
00259     }
00260 
00261     switch( tags.dim[i] )   {
00262     case 0:            
00263       col = NTuple::_Item<IOpaqueAddress*>::create (tuple, varname,typeid(IOpaqueAddress*), 0,(IOpaqueAddress*)0xffffffff,0);
00264       break;            
00265     case 1:             
00266       dim1 = (ind>=0) ? tags.idist(ind) : tags.theDim[i][0];
00267       col = NTuple::_Array<IOpaqueAddress*>::create (tuple, varname,typeid(IOpaqueAddress*), 
00268                                                      tags.index[i], dim1, 0,(IOpaqueAddress*)0xffffffff,0);
00269       break;           
00270     case 2:              
00271       dim1 = (ind>=0) ? tags.idist(ind) : tags.theDim[i][0];
00272       dim2 = (ind>=0) ? tags.theDim[i][0] : tags.theDim[i][1];
00273       col = NTuple::_Matrix<IOpaqueAddress*>::create (tuple, varname,typeid(IOpaqueAddress*), 
00274                                                       tags.index[i],dim1,dim2,0,(IOpaqueAddress*)0xffffffff,0);
00275       break;
00276     default:
00277       break;
00278     }
00279     size += dim1 * dim2 * ((sizeof(IOpaqueAddress*) < 4) ? 4 : sizeof(IOpaqueAddress*)); 
00280     return col;
00281   }
00282 };

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