00001 #include <algorithm>
00002 #include "GaudiKernel/MsgStream.h"
00003
00004 #include "EventModel/EventModel.h"
00005 #include "EvtRecEvent/EvtRecObject.h"
00006 #include "EvtRecEvent/EvtRecVeeVertex.h"
00007
00008 #include "RootEventData/TEvtRecObject.h"
00009 #include "RootEventData/TEvtRecVeeVertex.h"
00010
00011 #include "RootCnvSvc/RootAddress.h"
00012 #include "RootCnvSvc/EvtRec/EvtRecCnv.h"
00013 #include "RootCnvSvc/EvtRec/EvtRecVeeVertexCnv.h"
00014
00015 #include "CLHEP/Matrix/Vector.h"
00016 #include "CLHEP/Matrix/SymMatrix.h"
00017 using CLHEP::HepVector;
00018 using CLHEP::HepSymMatrix;
00019
00020 EvtRecVeeVertexCnv::EvtRecVeeVertexCnv(ISvcLocator* svc)
00021 : RootEventBaseCnv(classID(), svc)
00022 {
00023 m_rootBranchname = "m_evtRecVeeVertexCol";
00024 m_adresses.push_back(&m_evtRecVeeVertexCol);
00025 m_evtRecVeeVertexCol = 0;
00026 }
00027
00028 StatusCode EvtRecVeeVertexCnv::TObjectToDataObject(DataObject*& refpObject) {
00029
00030 MsgStream log(msgSvc(), "EvtRecVeeVertexCnv");
00031 log << MSG::DEBUG << "EvtRecVeeVertexCnv::TObjectToDataObject" << endreq;
00032
00033
00034 EvtRecVeeVertexCol* evtRecVeeVertexCol = new EvtRecVeeVertexCol;
00035 refpObject = evtRecVeeVertexCol;
00036
00037 if ( ! m_evtRecVeeVertexCol ) return StatusCode::SUCCESS;
00038
00039 IDataProviderSvc* dataSvc = 0;
00040 StatusCode sc = serviceLocator()->getService("EventDataSvc",
00041 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00042 if ( sc.isFailure() ) {
00043 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecVeeVertexCnv" << endreq;
00044 return sc;
00045 }
00046
00047 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol(dataSvc, EventModel::EvtRec::EvtRecTrackCol);
00048 if ( ! evtRecTrackCol) {
00049 log << MSG::INFO << "Could not find EvtRecTrackCol" << endreq;
00050 }
00051
00052
00053 TIter evtRecVeeVertexIter(m_evtRecVeeVertexCol);
00054 TEvtRecVeeVertex* evtRecVeeVertexRoot = 0;
00055 while ( (evtRecVeeVertexRoot = (TEvtRecVeeVertex*)evtRecVeeVertexIter.Next() ) ) {
00056 EvtRecVeeVertex* evtRecVeeVertex = new EvtRecVeeVertex();
00057 m_common.m_rootEvtRecVeeVertexMap[evtRecVeeVertexRoot] = evtRecVeeVertex;
00058
00059 evtRecVeeVertex->setVertexId( evtRecVeeVertexRoot->vertexId() );
00060 evtRecVeeVertex->setVertexType( evtRecVeeVertexRoot->vertexType() );
00061 evtRecVeeVertex->setChi2( evtRecVeeVertexRoot->chi2() );
00062 evtRecVeeVertex->setNdof( evtRecVeeVertexRoot->ndof() );
00063 evtRecVeeVertex->setMass( evtRecVeeVertexRoot->mass() );
00064
00065 HepVector wTrackParameter(7, 0);
00066 for (int i = 0; i < 7; i++) {
00067 wTrackParameter[i] = evtRecVeeVertexRoot->w(i);
00068 }
00069 evtRecVeeVertex->setW( wTrackParameter );
00070
00071 HepSymMatrix EwTrackParameter(7, 0);
00072 int i = 0;
00073 for (int j = 0; j < 7; j++) {
00074 for (int k = j; k < 7; k++) {
00075 EwTrackParameter[j][k] = EwTrackParameter[k][j] = evtRecVeeVertexRoot->Ew(i);
00076 i++;
00077 }
00078 }
00079 evtRecVeeVertex->setEw( EwTrackParameter );
00080
00081 std::pair<int, int> pairId;
00082 pairId.first = evtRecVeeVertexRoot->pair(0);
00083 pairId.second = evtRecVeeVertexRoot->pair(1);
00084 evtRecVeeVertex->setPair( pairId );
00085 evtRecVeeVertex->setNCharge( evtRecVeeVertexRoot->nCharge() );
00086 evtRecVeeVertex->setNTracks( evtRecVeeVertexRoot->nTracks() );
00087 int evtRecTrackId0 = evtRecVeeVertexRoot->daughter(0);
00088 if ( evtRecTrackId0 >= 0) {
00089 evtRecVeeVertex->addDaughter(
00090 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(evtRecTrackId0)), 0
00091 );
00092 }
00093 int evtRecTrackId1 = evtRecVeeVertexRoot->daughter(1);
00094 if ( evtRecTrackId1 >= 0) {
00095 evtRecVeeVertex->addDaughter(
00096 dynamic_cast<EvtRecTrack*>(evtRecTrackCol->containedObject(evtRecTrackId1)), 1
00097 );
00098 }
00099
00100 evtRecVeeVertexCol->push_back(evtRecVeeVertex);
00101 }
00102
00103 delete m_evtRecVeeVertexCol;
00104 m_evtRecVeeVertexCol = 0;
00105 return StatusCode::SUCCESS;
00106 }
00107
00108 StatusCode EvtRecVeeVertexCnv::DataObjectToTObject(DataObject* obj, RootAddress* rootaddr) {
00109 MsgStream log(msgSvc(), "EvtRecVeeVertexCnv");
00110 log << MSG::DEBUG << "EvtRecVeeVertexCnv::DataObjectToTObject" << endreq;
00111
00112 EvtRecVeeVertexCol* evtRecVeeVertexCol = dynamic_cast<EvtRecVeeVertexCol*> (obj);
00113 if ( ! evtRecVeeVertexCol ) {
00114 log << MSG::ERROR << "Could not downcast to EvtRecVeeVertexCol" << endreq;
00115 return StatusCode::FAILURE;
00116 }
00117
00118 DataObject* evt;
00119 m_eds->findObject(EventModel::EvtRec::Event, evt);
00120 if ( evt == NULL ) {
00121 log << MSG::ERROR << "Could not get EvtRecObject in TDS" << endreq;
00122 return StatusCode::FAILURE;
00123 }
00124 EvtRecObject* devtTds = dynamic_cast<EvtRecObject*> (evt);
00125 if ( ! devtTds ) {
00126 log << MSG::ERROR << "EvtRecVeeVertexCnv: Could not downcast to TDS EvtRecObject" << endreq;
00127 }
00128
00129 IOpaqueAddress *addr;
00130 m_cnvSvc->getEvtRecCnv()->createRep(evt, addr);
00131 TEvtRecObject* recEvt = m_cnvSvc->getEvtRecCnv()->getWriteObject();
00132
00133 const TObjArray* m_evtRecVeeVertexCol = recEvt->getEvtRecVeeVertexCol();
00134 if ( ! m_evtRecVeeVertexCol ) return StatusCode::SUCCESS;
00135
00136 IDataProviderSvc* dataSvc = 0;
00137 StatusCode sc = serviceLocator()->getService("EventDataSvc",
00138 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00139 if ( sc.isFailure() ) {
00140 log << MSG::FATAL << "Could not get EventDataSvc in EvtRecVeeVertexCnv" << endreq;
00141 return sc;
00142 }
00143
00144 EvtRecTrackCol::iterator evtRecTrackColbegin, evtRecTrackColend;
00145
00146 SmartDataPtr<EvtRecTrackCol> evtRecTrackCol(dataSvc, EventModel::EvtRec::EvtRecTrackCol);
00147 if ( ! evtRecTrackCol) {
00148 log << MSG::INFO << "Could not find EvtRecTrackCol" << endreq;
00149 }
00150 else {
00151 evtRecTrackColbegin = evtRecTrackCol->begin();
00152 evtRecTrackColend = evtRecTrackCol->end();
00153 }
00154
00155
00156 recEvt->clearEvtRecVeeVertexCol();
00157 EvtRecVeeVertexCol::const_iterator evtRecVeeVertex = evtRecVeeVertexCol->begin();
00158
00159 for ( ; evtRecVeeVertex != evtRecVeeVertexCol->end(); evtRecVeeVertex++) {
00160 EvtRecVeeVertex* ptr = *evtRecVeeVertex;
00161 TEvtRecVeeVertex* evtRecVeeVertexRoot = new TEvtRecVeeVertex();
00162
00163 evtRecVeeVertexRoot->setVertexId( ptr->vertexId() );
00164 evtRecVeeVertexRoot->setVertexType( ptr->vertexType() );
00165 evtRecVeeVertexRoot->setChi2( ptr->chi2() );
00166 evtRecVeeVertexRoot->setNdof( ptr->ndof() );
00167 evtRecVeeVertexRoot->setMass( ptr->mass() );
00168
00169 double wTrackParameter[7];
00170 for (int i = 0; i < 7; i++) {
00171 wTrackParameter[i] = ptr->w()[i];
00172 }
00173 evtRecVeeVertexRoot->setW( wTrackParameter );
00174 double EwTrackParameter[28];
00175 int i = 0;
00176 for (int j = 0; j < 7; j++) {
00177 for (int k = j; k < 7; k++) {
00178 EwTrackParameter[i] = ptr->Ew()[j][k];
00179 i++;
00180 }
00181 }
00182 assert(i == 28);
00183 evtRecVeeVertexRoot->setEw( EwTrackParameter );
00184 int pairId[2];
00185 pairId[0] = ptr->pair(0);
00186 pairId[1] = ptr->pair(1);
00187 evtRecVeeVertexRoot->setPair( pairId );
00188 evtRecVeeVertexRoot->setNCharge( ptr->nCharge() );
00189 evtRecVeeVertexRoot->setNTracks( ptr->nTracks() );
00190
00191 int daughterId[2];
00192 if ( ptr->daughter(0).target() != NULL && ptr->daughter(1).target() != NULL ) {
00193 assert(evtRecTrackColbegin != evtRecTrackColend);
00194 EvtRecTrackCol::iterator it0 = find(evtRecTrackColbegin,
00195 evtRecTrackColend, ptr->daughter(0).target());
00196 EvtRecTrackCol::iterator it1 = find(evtRecTrackColbegin,
00197 evtRecTrackColend, ptr->daughter(1).target());
00198 assert(it0 != evtRecTrackColend);
00199 assert(it1 != evtRecTrackColend);
00200 daughterId[0] = it0 - evtRecTrackColbegin;
00201 daughterId[1] = it1 - evtRecTrackColbegin;
00202 evtRecVeeVertexRoot->setDaughter( daughterId );
00203 }
00204 recEvt->addEvtRecVeeVertex(evtRecVeeVertexRoot);
00205 }
00206
00207 return StatusCode::SUCCESS;
00208 }