00001 #ifndef MdcTrackCnv_CXX
00002 #define MdcTrackCnv_CXX 1
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/DataObject.h"
00006 #include "GaudiKernel/ObjectVector.h"
00007 #include "TClonesArray.h"
00008 #include "EventModel/EventModel.h"
00009 #include "DstEvent/DstEvent.h"
00010 #include "DstEvent/DstMdcTrack.h"
00011 #include "RootEventData/TMdcTrack.h"
00012 #include "RootEventData/TDstEvent.h"
00013 #include "RootCnvSvc/Dst/DstCnv.h"
00014 #include "RootCnvSvc/Dst/MdcTrackCnv.h"
00015 #include "RootCnvSvc/RootAddress.h"
00016 #include <vector>
00017 #include "CLHEP/Matrix/Vector.h"
00018 #include "CLHEP/Matrix/SymMatrix.h"
00019 #include "CLHEP/Geometry/Point3D.h"
00020
00021 using namespace std;
00022
00023
00024 MdcTrackCnv::MdcTrackCnv(ISvcLocator* svc)
00025 : RootEventBaseCnv(classID(), svc)
00026 {
00027
00028 MsgStream log(msgSvc(), "MdcTrackCnv");
00029 m_rootBranchname ="m_mdcTrackCol";
00030 m_adresses.push_back(&m_mdcTrackCol);
00031 m_mdcTrackCol=0;
00032 }
00033
00034 StatusCode MdcTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00035
00036 MsgStream log(msgSvc(), "MdcTrackCnv");
00037 log << MSG::DEBUG << "MdcTrackCnv::TObjectToDataObject" << endreq;
00038 StatusCode sc=StatusCode::SUCCESS;
00039
00040
00041 DstMdcTrackCol* mdcTrackTdsCol = new DstMdcTrackCol;
00042 refpObject=mdcTrackTdsCol;
00043
00044
00045 if (!m_mdcTrackCol) return sc;
00046 TIter mdcTrackIter(m_mdcTrackCol);
00047 TMdcTrack *mdcTrackRoot = 0;
00048 while ((mdcTrackRoot = (TMdcTrack*)mdcTrackIter.Next())) {
00049
00050 int trackId = mdcTrackRoot->trackId();
00051 int charge = mdcTrackRoot->charge();
00052 double helix[5];
00053 for(int i=0; i<5; i++){
00054 helix[i] = mdcTrackRoot->helix(i);
00055 log<<MSG::INFO<<"in MdcTrackCnv, helix["<<i<<"]: "<<helix[i]<<endreq;
00056 }
00057 double pxy = mdcTrackRoot->pxy();
00058 double px = mdcTrackRoot->px();
00059 double py = mdcTrackRoot->py();
00060 double pz = mdcTrackRoot->pz();
00061 double p = mdcTrackRoot->p();
00062 double theta = mdcTrackRoot->theta();
00063 double phi = mdcTrackRoot->phi();
00064 double x = mdcTrackRoot->x();
00065 double y = mdcTrackRoot->y();
00066 double z = mdcTrackRoot->z();
00067 double r = mdcTrackRoot->r();
00068 int stat = mdcTrackRoot->stat();
00069 double chi = mdcTrackRoot->chi2();
00070 int ndof = mdcTrackRoot->ndof();
00071 int ns = mdcTrackRoot->nster();
00072 int nlayer = mdcTrackRoot->nlayer();
00073
00074 double err[15];
00075 for (int i=0; i<15; i++){
00076 err[i] = mdcTrackRoot->err(i);
00077 }
00078
00079 double poca[3];
00080 poca[0] = x;
00081 poca[1] = y;
00082 poca[2] = z;
00083
00084 log<<MSG::INFO<<"in MdcTrackCnv, mdcTrackRoot.nster "<<ns<<endreq;
00085
00086 DstMdcTrack *mdcTrackTds = new DstMdcTrack();
00087 m_common.m_rootMdcTrackMap[mdcTrackRoot] = mdcTrackTds;
00088
00089 mdcTrackTds->setTrackId( trackId );
00090 log<<MSG::INFO<<" dstMdcTrack trkid: "<<mdcTrackTds->trackId()<<endreq;
00091
00092 mdcTrackTds->setCharge( charge );
00093 mdcTrackTds->setHelix(helix);
00094 mdcTrackTds->setPoca(poca);
00095
00096 log<<MSG::INFO<<"dstMdcTrack helix: "<<mdcTrackTds->helix()<<endreq;
00097
00098 mdcTrackTds->setPxy( pxy );
00099 mdcTrackTds->setPx( px );
00100 mdcTrackTds->setPy( py );
00101 mdcTrackTds->setPz( pz );
00102 mdcTrackTds->setP( p );
00103 mdcTrackTds->setTheta( theta );
00104 mdcTrackTds->setPhi( phi );
00105 mdcTrackTds->setX( x );
00106 mdcTrackTds->setY( y );
00107 mdcTrackTds->setZ( z );
00108 mdcTrackTds->setR( r );
00109 mdcTrackTds->setStat( stat );
00110 mdcTrackTds->setChi2( chi );
00111 mdcTrackTds->setNdof( ndof );
00112 mdcTrackTds->setError( err );
00113 mdcTrackTds->setNster( ns );
00114 mdcTrackTds->setNlayer( nlayer );
00115
00116 log<<MSG::INFO<<" dstMdcTrack nster: "<<mdcTrackTds->nster()<<endreq;
00117
00118 mdcTrackTdsCol->push_back(mdcTrackTds);
00119
00120 }
00121 delete m_mdcTrackCol;
00122 m_mdcTrackCol = 0;
00123 return StatusCode::SUCCESS;
00124 }
00125
00126 StatusCode MdcTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00127
00128 MsgStream log(msgSvc(), "MdcTrackCnv");
00129 log << MSG::DEBUG << "MdcTrackCnv::DataObjectToTObject" << endreq;
00130 StatusCode sc=StatusCode::SUCCESS;
00131
00132 DstMdcTrackCol * mdcTrackColTds=dynamic_cast<DstMdcTrackCol *> (obj);
00133 if (!mdcTrackColTds) {
00134 log << MSG::ERROR << "Could not downcast to MdcTrackCol" << endreq;
00135 return StatusCode::FAILURE;
00136 }
00137
00138 DataObject *evt;
00139 m_eds->findObject(EventModel::Dst::Event,evt);
00140 if (evt==NULL) {
00141 log << MSG::ERROR << "Could not get DstEvent in TDS " << endreq;
00142 return StatusCode::FAILURE;
00143 }
00144 DstEvent * devtTds=dynamic_cast<DstEvent *> (evt);
00145 if (!devtTds) {
00146 log << MSG::ERROR << "MdcTrackCnv:Could not downcast to TDS DstEvent" << endreq;
00147 }
00148 IOpaqueAddress *addr;
00149
00150 m_cnvSvc->getDstCnv()->createRep(evt,addr);
00151 TDstEvent *recEvt=m_cnvSvc->getDstCnv()->getWriteObject();
00152
00153 const TObjArray *m_mdcTrackCol = recEvt->getMdcTrackCol();
00154 if (!m_mdcTrackCol) return sc;
00155 recEvt->clearMdcTrackCol();
00156 DstMdcTrackCol::const_iterator mdcTrackTds;
00157
00158 for (mdcTrackTds = mdcTrackColTds->begin(); mdcTrackTds != mdcTrackColTds->end(); mdcTrackTds++) {
00159 Int_t trackId =(*mdcTrackTds)->trackId();
00160 Double_t helix[5];
00161 for(int i=0;i<5;i++){
00162 helix[i] = (*mdcTrackTds)->helix(i) ;
00163 }
00164 Int_t stat = (*mdcTrackTds)->stat();
00165 Double_t chi = (*mdcTrackTds)->chi2();
00166 Int_t ndof = (*mdcTrackTds)->ndof();
00167 Double_t err[15];
00168 for (Int_t i=0; i<15; i++){
00169 err[i] = (*mdcTrackTds)->err(i);
00170 }
00171 Int_t ns = (*mdcTrackTds)->nster();
00172 Int_t fL = (*mdcTrackTds)->firstLayer();
00173 Int_t lL = (*mdcTrackTds)->lastLayer();
00174 Int_t nlayer = (*mdcTrackTds)->nlayer();
00175
00176 TMdcTrack *mdcTrackRoot = new TMdcTrack();
00177
00178 mdcTrackRoot->setTrackId( trackId );
00179
00180 mdcTrackRoot->setHelix(helix);
00181 log<<MSG::INFO<<"test,trackId: "<<mdcTrackRoot->trackId()<<endreq;
00182 log<<MSG::INFO<<"test,px: "<<mdcTrackRoot->px()
00183 <<"test,py: "<<mdcTrackRoot->py()
00184 <<"test,pz: "<<mdcTrackRoot->pz()<<endreq;
00185
00186 mdcTrackRoot->setStat( stat );
00187 mdcTrackRoot->setChi2( chi );
00188 mdcTrackRoot->setNdof( ndof );
00189 mdcTrackRoot->setErr( err );
00190 mdcTrackRoot->setNster( ns );
00191 mdcTrackRoot->setFirstLayer(fL);
00192 mdcTrackRoot->setLastLayer(lL);
00193 mdcTrackRoot->setNlayer(nlayer);
00194
00195 recEvt->addMdcTrack(mdcTrackRoot);
00196 }
00197
00198 return StatusCode::SUCCESS;
00199 }
00200 #endif