Gaudi Framework, version v20r4

Generated: 8 Jan 2009

HRWNTupleCnv.cpp

Go to the documentation of this file.
00001 // $Header: /tmp/svngaudi/tmp.jEpFh25751/Gaudi/HbookCnv/src/HRWNTupleCnv.cpp,v 1.5 2006/01/10 20:11:14 hmd Exp $
00002 #define HBOOKCNV_HRWNTUPLECNV_CPP
00003 
00004 
00005 #define ALLOW_ALL_TYPES
00006 
00007 // Compiler include files
00008 #include <cstdio>
00009 
00010 // Include files
00011 #include "GaudiKernel/xtoa.h"
00012 #include "GaudiKernel/CnvFactory.h"
00013 #include "GaudiKernel/GenericAddress.h"
00014 #include "GaudiKernel/INTupleSvc.h"
00015 
00016 #include "GaudiKernel/MsgStream.h"
00017 #include "GaudiKernel/NTuple.h"
00018 
00019 #include "NTupleInfo.h"
00020 #include "HRWNTupleCnv.h"
00021 #include "HbookDef.h"
00022 
00023 //------------------------------------------------------------------------------
00024 //
00025 // Implementation of class :  HbookCnv::HRWNTupleCnv
00026 //
00027 // Author :                   Markus Frank
00028 //
00029 //------------------------------------------------------------------------------
00030 
00031 
00032 // Instantiation of a static factory class used by clients to create
00033 // instances of this service
00034 DECLARE_NAMESPACE_CONVERTER_FACTORY(HbookCnv,HRWNTupleCnv)
00035 
00036 
00037 StatusCode HbookCnv::HRWNTupleCnv::book(long idh, const std::string& loc, INTuple* nt)  {
00038   MsgStream log(msgSvc(), "HbookRWNTupleCnv");
00039   if ( !::HEXIST(idh) )    {
00040     const INTuple::ItemContainer& items = nt->items();
00041     NTUPLEINFO tags;
00042     float buffer[512];
00043     memset(&tags,0, sizeof(tags));
00044     tags.id = idh;
00045     tags.numVar = items.size();
00046     strncpy(tags.rzdir, loc.data(), loc.length());
00047     strncpy(tags.title, nt->title().data(), nt->title().length());
00048     for (size_t length = items.size(), i = 0; i < length; i++ )    {
00049       long len = items[i]->name().length();
00050       long nam_len = (len > 8) ? 8 : len;
00051       long pad_len=sizeof(tags.name[i])-nam_len-1;
00052       ::strncpy(tags.name[i], items[i]->name().data(), nam_len);
00053       ::memset(&tags.name[i][nam_len], ' ', pad_len);
00054       buffer[i] = float(items[i]->type());
00055     }
00056     StatusCode status = ::RWNT_BOOK(tags);
00057     if ( status.isSuccess() )   {
00058       log << MSG::INFO << "Booked Row wise HBOOK N tuple with ID:" << idh
00059           << " \"" << nt->title() << "\" in directory <" << loc << ">" << endreq;
00060       if ( dataTypePolicy() == USE_DATA_TYPES )   {
00061         ::HFN(idh, buffer);
00062       }
00063       log << MSG::DEBUG;
00064       if ( log.isActive() ) ::HPRINT( idh );
00065       return StatusCode::SUCCESS;
00066     }
00067     else    {
00068       log << MSG::ERROR << "HBOOK N tuple " << idh
00069           << "\"" << nt->title() 
00070           << "\" cannot be booked in directory <" << loc << ">" << endreq;
00071     }
00072   }
00073   log << MSG::ERROR << "HBOOK N tuple " << idh << " \"" << nt->title() 
00074       << "\" already exists." << endreq;
00075   return StatusCode::FAILURE;
00076 }
00077 
00078 
00080 StatusCode HbookCnv::HRWNTupleCnv::writeData(long idh, INTuple* nt)   {
00081   const INTuple::ItemContainer& items = nt->items();
00082   INTuple::ItemContainer::const_iterator i;
00083   float buffer[512], *buff = buffer;
00084   for (i = items.begin(); i != items.end(); i++)    {
00085     switch( (*i)->type() )   {
00086     case DataTypeInfo::BOOL:              // bool 
00087       *buff++ = float( *(bool*)(*i)->buffer() );
00088       break;
00089     case DataTypeInfo::CHAR:              // char 
00090       *buff++ = float( *(char*)(*i)->buffer() );
00091       break;
00092     case DataTypeInfo::SHORT:             // short
00093       *buff++ = float( *(short*)(*i)->buffer() );
00094       break;
00095     case DataTypeInfo::INT:               // int 
00096       *buff++ = float( *(int*)(*i)->buffer() );
00097       break;
00098     case DataTypeInfo::LONG:              // long 
00099       *buff++ = float( *(long*)(*i)->buffer() );
00100       break;
00101     case DataTypeInfo::UCHAR:             // unsigned char 
00102       *buff++ = float( *(unsigned char*)(*i)->buffer() );
00103       break;
00104     case DataTypeInfo::USHORT:            // unsigned short
00105       *buff++ = float( *(unsigned short*)(*i)->buffer() ); 
00106       break;
00107     case DataTypeInfo::UINT:              // unsigned int 
00108       *buff++ = float( *(unsigned int*)(*i)->buffer() );
00109       break;
00110     case DataTypeInfo::ULONG:             // unsigned long 
00111       *buff++ = float( *(unsigned long*)(*i)->buffer() );
00112       break;
00113     case DataTypeInfo::FLOAT:             // float 
00114       *buff++ = *(float*)((*i)->buffer());
00115       break;
00116     case DataTypeInfo::DOUBLE:            // double 
00117       *buff++ = float( *(double*)(*i)->buffer() );
00118       break;
00119     default:
00120       *buff++ = 0.0;
00121       break;
00122     }
00123     (*i)->reset();
00124   }
00125   ::HFN(idh, buffer);
00126   return StatusCode::SUCCESS;
00127 }
00128 
00129 
00131 StatusCode HbookCnv::HRWNTupleCnv::readData(long id, INTuple* pObject, long ievt)    {
00132   long istat = 0, numevt = 0, idn = 0;
00133   float buffer[512], *buff = buffer;
00134   StatusCode status = StatusCode::SUCCESS;
00135   INTuple::ItemContainer& items = pObject->items();
00136   ievt++;
00137   if ( dataTypePolicy() == USE_DATA_TYPES )   {
00138     ievt++;
00139   }
00140 //  ::HGNF(id, ievt, buffer, istat);
00141   ::HGN(id, idn, ievt, buffer, istat);
00142   ::HNOENT( id, numevt);
00143   if ( istat == 0 && ievt <= numevt )   {
00144     INTuple::ItemContainer::iterator i;
00145     for (i = items.begin(); i != items.end(); i++)    {
00146       try   {
00147         long item_type = (*i)->type();
00148         switch( item_type )   {
00149         case DataTypeInfo::BOOL:              // bool 
00150           (dynamic_cast< NTuple::_Item<bool>* >(*i))->set((*buff++ < 0.000000001) ? false : true);
00151           break;
00152         case DataTypeInfo::CHAR:              // char 
00153           (dynamic_cast< NTuple::_Item<char>* >(*i))->set(char(*buff++));
00154           break;
00155         case DataTypeInfo::SHORT:             // short
00156           (dynamic_cast< NTuple::_Item<short>* >(*i))->set(short(*buff++));
00157           break;
00158         case DataTypeInfo::INT:               // int 
00159           (dynamic_cast< NTuple::_Item<int>* >(*i))->set(int(*buff++));
00160           break;
00161         case DataTypeInfo::LONG:              // long 
00162           (dynamic_cast< NTuple::_Item<long>* >(*i))->set(long(*buff++));
00163           break;
00164         case DataTypeInfo::UCHAR:             // unsigned char 
00165           (dynamic_cast< NTuple::_Item<unsigned char>* >(*i))->set((unsigned char)(*buff++));
00166           break;
00167         case DataTypeInfo::USHORT:            // unsigned short
00168           (dynamic_cast< NTuple::_Item<unsigned short>* >(*i))->set((unsigned short)(*buff++));
00169           break;
00170         case DataTypeInfo::UINT:              // unsigned int 
00171           (dynamic_cast< NTuple::_Item<unsigned int>* >(*i))->set((unsigned int)(*buff++));
00172           break;
00173         case DataTypeInfo::ULONG:             // unsigned long 
00174           (dynamic_cast< NTuple::_Item<unsigned long>* >(*i))->set((unsigned long)(*buff++));
00175           break;
00176         case DataTypeInfo::FLOAT:             // float 
00177           (dynamic_cast< NTuple::_Item<float>* >(*i))->set(float(*buff++));
00178           break;
00179         case DataTypeInfo::DOUBLE:            // double 
00180           (dynamic_cast< NTuple::_Item<double>* >(*i))->set(double(*buff++));
00181           break;
00182         case DataTypeInfo::OBJECT_ADDR:
00183           (dynamic_cast< NTuple::_Item<IOpaqueAddress*>* >(*i))->set(0);
00184           break;
00185         default:
00186           buff++;
00187           break;
00188         }
00189       }
00190       catch (...)     {
00191         status = StatusCode::FAILURE;
00192       }
00193     }
00194     return status;
00195   }
00196   return StatusCode::FAILURE;
00197 }
00198 
00199 
00200 #define CREATE_RWNTUPLE_COL(i,tuple,TYP) {                            \
00201 item = createNTupleItem(tags, i, tuple, NTuple::Range<TYP>::min(), NTuple::Range<TYP>::max(), size); }
00202 
00204 StatusCode HbookCnv::HRWNTupleCnv::load(long idh, INTuple*& refpObject)   {
00205   MsgStream log(msgSvc(), "HbookNTupleCnv");
00206   NTUPLEINFO tags;
00207 
00208   memset(&tags,0,sizeof(tags));
00209   tags.id = idh;
00210   StatusCode status = ::RWNT_INFO(tags);
00211   if ( status.isSuccess() && tags.numEnt > 0 )     {
00212     NTuple::Tuple* pObj = 0;
00213     status = m_ntupleSvc->create(CLID_RowWiseTuple, tags.title, pObj);
00214     INTuple* ntup = dynamic_cast<INTuple*>(pObj);
00215     if ( status.isSuccess() && 0 != ntup)   {
00216       long size = 0, istat = 0;
00217       std::string typ = "NONE";
00218       float buffer[512];
00219       std::string call = "HRWNTupleCnv::load";
00220       ::HGNPAR( idh, call.data(), call.length());
00221       // Make info compatible with column wise N-tuples
00222       for ( int i = 0; i < tags.numVar; i++ )   {
00223         ::strcpy(tags.block[i],"AUTO_BLK");
00224       }
00225       if ( dataTypePolicy() == USE_DATA_TYPES )   {
00226         ::HGNF(idh, 1, buffer, istat);
00227       }
00228       else if ( dataTypePolicy() == FORTRAN_STYLE )   {
00229         for ( int i = 0; i < tags.numVar; i++ )   {
00230           char c1 = ::toupper(tags.name[i][0]);
00231           if ( c1 >= 'I' && c1 <= 'N' )
00232             buffer[i] = DataTypeInfo::INT;
00233           else
00234             buffer[i] = DataTypeInfo::FLOAT;
00235         }
00236       }
00237       else if ( dataTypePolicy() == HUNGARIAN_STYLE )   {
00238         for ( int i = 0; i < tags.numVar; i++ )   {
00239           char c1 = ::toupper(tags.name[i][0]);
00240           char c2 = ::toupper(tags.name[i][1]);
00241           switch(c1)    {
00242           case 'B':   buffer[i] = DataTypeInfo::BOOL;             break;
00243           case 'C':   buffer[i] = DataTypeInfo::CHAR;             break;
00244           case 'S':   buffer[i] = DataTypeInfo::SHORT;            break;
00245           case 'I':   buffer[i] = DataTypeInfo::INT;              break;
00246           case 'L':   buffer[i] = DataTypeInfo::LONG;             break;
00247           case 'F':   buffer[i] = DataTypeInfo::FLOAT;            break;
00248           case 'D':   buffer[i] = DataTypeInfo::DOUBLE;           break;
00249           case 'O':   buffer[i] = DataTypeInfo::OBJECT_ADDR;      break;
00250           case 'U':
00251             switch(c2)    {
00252             case 'C':   buffer[i] = DataTypeInfo::UCHAR;          break;
00253             case 'S':   buffer[i] = DataTypeInfo::USHORT;         break;
00254             case 'I':   buffer[i] = DataTypeInfo::UINT;           break;
00255             case 'L':   buffer[i] = DataTypeInfo::ULONG;          break;
00256             default:
00257             log << MSG::ERROR << "Cannot Create Item for Var[" << i << "]: " 
00258                               << " Name:" << tags.name[i] 
00259                               << " Unknown data type" << endreq;
00260             return StatusCode::FAILURE;
00261             }
00262             break;
00263           default:
00264             log << MSG::ERROR << "Cannot Create Item for Var[" << i << "]: " 
00265                               << " Name:" << tags.name[i] 
00266                               << " Unknown data type" << endreq;
00267             return StatusCode::FAILURE;
00268           }
00269         }
00270       }
00271       else    {
00272         for ( int i = 0; i < tags.numVar; i++ )   {
00273           buffer[i] = float(DataTypeInfo::FLOAT);
00274         }
00275       }
00276       if ( istat == 0 )   {
00277         for ( int i = 0; i < tags.numVar; i++ )   {
00278           INTupleItem* item = 0;
00279           switch( long(buffer[i]) )   {
00280             case DataTypeInfo::BOOL:              // bool 
00281               CREATE_RWNTUPLE_COL(i,ntup, bool)
00282               break;
00283             case DataTypeInfo::CHAR:              // char 
00284               CREATE_RWNTUPLE_COL(i,ntup, char)
00285               break;
00286             case DataTypeInfo::SHORT:             // short
00287               CREATE_RWNTUPLE_COL(i,ntup, short)
00288               break;
00289             case DataTypeInfo::INT:               // int 
00290               CREATE_RWNTUPLE_COL(i,ntup, int)
00291               break;
00292             case DataTypeInfo::LONG:              // long 
00293               CREATE_RWNTUPLE_COL(i,ntup, long)
00294               break;
00295             case DataTypeInfo::UCHAR:             // unsigned char 
00296               CREATE_RWNTUPLE_COL(i,ntup, unsigned char)
00297               break;
00298             case DataTypeInfo::USHORT:            // unsigned short
00299               CREATE_RWNTUPLE_COL(i,ntup, unsigned short)
00300               break;
00301             case DataTypeInfo::UINT:              // unsigned int 
00302               CREATE_RWNTUPLE_COL(i,ntup, unsigned int)
00303               break;
00304             case DataTypeInfo::ULONG:             // unsigned long 
00305               CREATE_RWNTUPLE_COL(i,ntup, unsigned long)
00306               break;
00307             case DataTypeInfo::FLOAT:             // float 
00308               CREATE_RWNTUPLE_COL(i,ntup, float)
00309               break;
00310             case DataTypeInfo::DOUBLE:            // double 
00311               CREATE_RWNTUPLE_COL(i,ntup, double)
00312               break;
00313             case DataTypeInfo::OBJECT_ADDR:
00314               //CREATE_RWNTUPLE_COL(i,ntup, IOpaqueAddress*)
00315               break;
00316             default:
00317               break;
00318           }
00319           if ( item )    {
00320             ntup->items().push_back(item);
00321             log << MSG::DEBUG << "Create Var[" << i << "]: " 
00322                 << item->typeName() << "[1]"
00323                 << " Name:" << tags.name[i]
00324                 << "[" << tags.frange[i][0] << "," << tags.frange[i][1] 
00325                 << "]" << endreq;
00326           }
00327           else    {
00328             log << MSG::ERROR << "Cannot Create Item for Var[" << i << "]: " 
00329                               << " Name:" << tags.name[i] << endreq;
00330           }
00331         }
00332         log << MSG::DEBUG << "Total buffer size of NTuple: " << size << " Bytes." << endreq; 
00333         refpObject = ntup;
00334         return StatusCode::SUCCESS;
00335       }
00336     }
00337   }
00338   return StatusCode::FAILURE;
00339 }

Generated at Thu Jan 8 17:44:24 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004