00001 #include "SIO/SIOVertexHandler.h"
00002
00003 #include <algorithm>
00004 #include "SIO/LCSIO.h"
00005
00006 #include "EVENT/LCIO.h"
00007 #include "EVENT/Vertex.h"
00008 #include "IOIMPL/VertexIOImpl.h"
00009 #include "IMPL/LCFlagImpl.h"
00010
00011 #include "SIO_functions.h"
00012 #include "SIO_block.h"
00013 #include "SIO/SIOLCParameters.h"
00014
00015
00016 #include <iostream>
00017
00018 using namespace EVENT ;
00019 using namespace IMPL ;
00020 using namespace IOIMPL ;
00021
00022
00023 namespace SIO{
00024
00025 SIOVertexHandler::~SIOVertexHandler(){ }
00026
00027 unsigned int SIOVertexHandler::init( SIO_stream* stream,
00028 SIO_operation op,
00029 EVENT::LCCollection* col ,
00030 unsigned int vers ) {
00031
00032 unsigned int status ;
00033
00034
00035 if( op == SIO_OP_READ ) {
00036
00037
00038 SIO_DATA( stream , &_flag , 1 ) ;
00039
00040 if( vers > SIO_VERSION_ENCODE( 1, 1) )
00041 SIOLCParameters::read( stream , col->parameters() , vers ) ;
00042
00043 col->setFlag( _flag ) ;
00044 _vers = vers ;
00045
00046
00047 imr.clear();
00048
00049 parameters.clear();
00050 col->getParameters().getStringVals("_lcio.VertexAlgorithmTypes",parameters);
00051 for(unsigned int i=0; i<parameters.size(); i++){
00052
00053 imr[i]=parameters[i];
00054 }
00055 }
00056
00057 else if( op == SIO_OP_WRITE ) {
00058
00059
00060 _flag = col->getFlag() ;
00061
00062 LCSIO_WRITE( stream, _flag ) ;
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 parameters.clear();
00089 _set.clear();
00090 Vertex* v;
00091 for(int i=0; i<col->getNumberOfElements(); i++){
00092 v = dynamic_cast<Vertex*>( col->getElementAt( i ) ) ;
00093 _set.insert(v->getAlgorithmType());
00094 }
00095 for(std::set<std::string>::iterator it=_set.begin(); it!=_set.end(); it++){
00096 parameters.push_back(*it);
00097 }
00098
00099 col->parameters().setValues("_lcio.VertexAlgorithmTypes",parameters);
00100
00101 SIOLCParameters::write( stream , col->getParameters() ) ;
00102
00103 _vers = vers ;
00104
00105 }
00106 return ( SIO_BLOCK_SUCCESS ) ;
00107 }
00108
00109
00110 unsigned int SIOVertexHandler::read(SIO_stream* stream, LCObject** objP){
00111
00112 unsigned int status ;
00113
00114
00115 VertexIOImpl* vtx = new VertexIOImpl ;
00116 *objP = vtx ;
00117
00118
00119 SIO_DATA( stream , &(vtx->_primary) , 1 ) ;
00120 int algtype;
00121 SIO_DATA( stream , &algtype , 1 ) ;
00122 vtx->setAlgorithmType(imr[algtype]);
00123
00124
00125
00126
00127
00128
00129
00130
00131 SIO_DATA( stream , &(vtx->_chi2) , 1 ) ;
00132 SIO_DATA( stream , &(vtx->_probability) , 1 ) ;
00133 SIO_DATA( stream , vtx->_vpos , 3 ) ;
00134
00135
00136 float cov[VTXCOVMATRIX] ;
00137 SIO_DATA( stream , cov , VTXCOVMATRIX ) ;
00138 vtx->setCovMatrix( cov ) ;
00139
00140
00141 int nPara ;
00142 SIO_DATA( stream , &nPara , 1 ) ;
00143 float aParameter ;
00144 for(int i=0; i<nPara; i++){
00145 SIO_DATA( stream , &aParameter , 1 ) ;
00146 vtx->addParameter( aParameter ) ;
00147 }
00148
00149
00150 SIO_PNTR( stream , &(vtx->_aParticle) ) ;
00151
00152
00153 SIO_PTAG( stream , dynamic_cast<const Vertex*>(vtx) ) ;
00154 return ( SIO_BLOCK_SUCCESS ) ;
00155 }
00156
00157
00158 unsigned int SIOVertexHandler::write(SIO_stream* stream, const LCObject* obj){
00159
00160 unsigned int status ;
00161
00162
00163
00164
00165 const Vertex* vtx = dynamic_cast<const Vertex*>(obj) ;
00166
00167
00168 LCSIO_WRITE( stream, vtx->isPrimary() ) ;
00169
00170
00171 LCSIO_WRITE( stream, static_cast<size_t> (distance( _set.begin(),_set.find( vtx->getAlgorithmType() )))) ;
00172
00173
00174
00175
00176 LCSIO_WRITE( stream, vtx->getChi2() ) ;
00177 LCSIO_WRITE( stream, vtx->getProbability() ) ;
00178
00179
00180 float* pos = const_cast<float*> ( vtx->getPosition() ) ;
00181 SIO_DATA( stream, pos , 3 ) ;
00182
00183
00184 const FloatVec& cov = vtx->getCovMatrix() ;
00185 for(unsigned int i=0; i<cov.size(); i++){
00186 LCSIO_WRITE( stream, cov[i] ) ;
00187 }
00188
00189
00190 int nPara = vtx->getParameters().size() ;
00191 SIO_DATA( stream , &nPara , 1 ) ;
00192 for(int i=0; i<nPara; i++){
00193 LCSIO_WRITE( stream, vtx->getParameters()[i] ) ;
00194 }
00195
00196
00197 EVENT::ReconstructedParticle* recP = vtx->getAssociatedParticle() ;
00198 SIO_PNTR( stream , &recP ) ;
00199
00200
00201
00202 SIO_PTAG( stream , vtx ) ;
00203
00204 return ( SIO_BLOCK_SUCCESS ) ;
00205 }
00206
00207 }