00001 #include "SIO/SIOCalHitHandler.h"
00002
00003 #include "SIO/LCSIO.h"
00004
00005 #include "EVENT/LCIO.h"
00006 #include "EVENT/MCParticle.h"
00007 #include "EVENT/CalorimeterHit.h"
00008 #include "IOIMPL/CalorimeterHitIOImpl.h"
00009 #include "IMPL/LCFlagImpl.h"
00010
00011 #include "SIO_functions.h"
00012 #include "SIO_block.h"
00013
00014
00015 using namespace EVENT ;
00016 using namespace IMPL ;
00017 using namespace IOIMPL ;
00018
00019
00020 namespace SIO{
00021
00022 unsigned int SIOCalHitHandler::read(SIO_stream* stream,
00023 LCObject** objP ){
00024 unsigned int status ;
00025
00026
00027 CalorimeterHitIOImpl* hit = new CalorimeterHitIOImpl ;
00028 *objP = hit ;
00029
00030 SIO_DATA( stream , &(hit->_cellID0) , 1 ) ;
00031
00032 LCFlagImpl lcFlag(_flag) ;
00033
00034
00035
00036 if( lcFlag.bitSet( LCIO::RCHBIT_ID1 ) ||
00037
00038 ( SIO_VERSION_MAJOR(_vers)==0 && SIO_VERSION_MINOR(_vers)==8) ){
00039
00040 SIO_DATA( stream , &(hit->_cellID1) , 1 ) ;
00041
00042 }
00043 SIO_DATA( stream , &(hit->_energy) , 1 ) ;
00044
00045 if( _vers > SIO_VERSION_ENCODE( 1, 9 ) && lcFlag.bitSet( LCIO::RCHBIT_ENERGY_ERROR )){
00046 SIO_DATA( stream , &(hit->_energyError) , 1 ) ;
00047 }
00048
00049
00050 if( _vers > SIO_VERSION_ENCODE( 1, 2) && lcFlag.bitSet( LCIO::RCHBIT_TIME ) ){
00051 SIO_DATA( stream , &(hit->_time) , 1 ) ;
00052 }
00053
00054 if( lcFlag.bitSet( LCIO::RCHBIT_LONG ) ){
00055 SIO_DATA( stream , hit->_position , 3 ) ;
00056 }
00057
00058 if( _vers > SIO_VERSION_ENCODE( 1, 2) ){
00059 SIO_DATA( stream , &(hit->_type) , 1 ) ;
00060 SIO_PNTR( stream , &(hit->_rawHit) ) ;
00061 }
00062
00063
00064
00065 if( _vers > SIO_VERSION_ENCODE( 1, 2) ){
00066
00067 if( ! lcFlag.bitSet( LCIO::RCHBIT_NO_PTR ) )
00068 SIO_PTAG( stream , dynamic_cast<const CalorimeterHit*>(hit) ) ;
00069
00070 }else{
00071
00072 if( lcFlag.bitSet( LCIO::RCHBIT_NO_PTR ) )
00073 SIO_PTAG( stream , dynamic_cast<const CalorimeterHit*>(hit) ) ;
00074 }
00075
00076 return ( SIO_BLOCK_SUCCESS ) ;
00077 }
00078
00079
00080 unsigned int SIOCalHitHandler::write(SIO_stream* stream,
00081 const LCObject* obj ){
00082
00083 unsigned int status ;
00084
00085 const CalorimeterHit* hit = dynamic_cast<const CalorimeterHit*>(obj) ;
00086
00087 LCFlagImpl lcFlag(_flag) ;
00088
00089
00090 LCSIO_WRITE( stream, hit->getCellID0() ) ;
00091
00092 if( lcFlag.bitSet( LCIO::RCHBIT_ID1 ) ){
00093 LCSIO_WRITE( stream, hit->getCellID1() ) ;
00094 }
00095 LCSIO_WRITE( stream, hit->getEnergy() ) ;
00096 if( lcFlag.bitSet( LCIO::RCHBIT_ENERGY_ERROR ) ){
00097 LCSIO_WRITE( stream, hit->getEnergyError() ) ;
00098 }
00099
00100 if( lcFlag.bitSet( LCIO::RCHBIT_TIME ) ){
00101 LCSIO_WRITE( stream , hit->getTime() ) ;
00102 }
00103
00104
00105
00106 if( lcFlag.bitSet( LCIO::RCHBIT_LONG ) ){
00107 float* pos = const_cast<float*> ( hit->getPosition() ) ;
00108 SIO_DATA( stream, pos , 3 ) ;
00109 }
00110
00111
00112 LCSIO_WRITE( stream , hit->getType() ) ;
00113
00114 EVENT::LCObject *rawHit = hit->getRawHit() ;
00115 SIO_PNTR( stream , &rawHit ) ;
00116
00117 if( !lcFlag.bitSet( LCIO::RCHBIT_NO_PTR ) ){
00118 SIO_PTAG( stream , hit ) ;
00119 }
00120
00121 return ( SIO_BLOCK_SUCCESS ) ;
00122 }
00123
00124 }