00001 #ifndef RecMdcTrackCnv_CXX
00002 #define RecMdcTrackCnv_CXX 1
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/DataObject.h"
00006 #include "GaudiKernel/ObjectVector.h"
00007
00008 #include "TClonesArray.h"
00009 #include "Identifier/MdcID.h"
00010 #include "Identifier/Identifier.h"
00011
00012 #include "EventModel/EventModel.h"
00013
00014 #include "ReconEvent/ReconEvent.h"
00015 #include "MdcRecEvent/RecMdcTrack.h"
00016 #include "MdcRecEvent/RecMdcHit.h"
00017 #include "RootEventData/TRecMdcTrack.h"
00018 #include "RootEventData/TRecTrackEvent.h"
00019
00020 #include "RootCnvSvc/Rec/RecTrackCnv.h"
00021 #include "RootCnvSvc/Rec/RecMdcTrackCnv.h"
00022 #include "RootCnvSvc/RootAddress.h"
00023
00024 #include <vector>
00025
00026 using namespace std;
00027
00028
00029
00030
00031
00032
00033 RecMdcTrackCnv::RecMdcTrackCnv(ISvcLocator* svc)
00034 : RootEventBaseCnv(classID(), svc)
00035 {
00036
00037 MsgStream log(msgSvc(), "RecMdcTrackCnv");
00038
00039 m_rootBranchname ="m_recMdcTrackCol";
00040
00041 m_adresses.push_back(&m_recMdcTrackCol);
00042 m_recMdcTrackCol=0;
00043 }
00044
00045 StatusCode RecMdcTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00046
00047 MsgStream log(msgSvc(), "RecMdcTrackCnv");
00048 log << MSG::DEBUG << "RecMdcTrackCnv::TObjectToDataObject" << endreq;
00049
00050
00051 RecMdcTrackCol* recMdcTrackCol = new RecMdcTrackCol;
00052 refpObject = recMdcTrackCol;
00053
00054 if (!m_recMdcTrackCol) return StatusCode::SUCCESS;
00055 TIter mdcTrackIter(m_recMdcTrackCol);
00056
00057
00058
00059
00060
00061
00062
00063 IDataProviderSvc* dataSvc = 0;
00064 StatusCode sc = serviceLocator()->getService ("EventDataSvc",
00065 IDataProviderSvc::interfaceID(), (IInterface*&)dataSvc);
00066 if (!sc.isSuccess()) {
00067 log << MSG::FATAL << "Could not get EventDataSvc in RecMdcTrackCnv" << endreq;
00068 return( StatusCode::FAILURE);
00069 }
00070 SmartDataPtr<RecMdcHitCol> recMdcHitCol(dataSvc,"/Event/Recon/RecMdcHitCol");
00071 if (!recMdcHitCol) {
00072 log << MSG::FATAL << "Could not find RecMdcHitCol" << endreq;
00073 return( StatusCode::FAILURE);
00074 }
00075
00076
00077
00078
00079
00080
00081
00082 mdcTrackIter = m_recMdcTrackCol;
00083 TRecMdcTrack *recMdcTrackRoot = 0;
00084 while ((recMdcTrackRoot = (TRecMdcTrack*)mdcTrackIter.Next())) {
00085 int trackId = recMdcTrackRoot->trackId();
00086 int charge = recMdcTrackRoot->charge();
00087 double helix[5];
00088 for(int i=0;i<5; i++){
00089 helix[i] = recMdcTrackRoot->helix(i);
00090 }
00091 double pxy = recMdcTrackRoot->pxy();
00092 double px = recMdcTrackRoot->px();
00093 double py = recMdcTrackRoot->py();
00094 double pz = recMdcTrackRoot->pz();
00095 double p = recMdcTrackRoot->p();
00096 double theta = recMdcTrackRoot->theta();
00097 double phi = recMdcTrackRoot->phi();
00098 double x = recMdcTrackRoot->x();
00099 double y = recMdcTrackRoot->y();
00100 double z = recMdcTrackRoot->z();
00101 double r = recMdcTrackRoot->r();
00102 int stat = recMdcTrackRoot->stat();
00103 double chi = recMdcTrackRoot->chi2();
00104 int ndof = recMdcTrackRoot->ndof();
00105 int nlayer= recMdcTrackRoot->nlayer();
00106 double err[15];
00107 for (int i=0; i<15; i++){
00108 err[i] = recMdcTrackRoot->err(i);
00109 }
00110 int nh = recMdcTrackRoot->nhits();
00111 int ns = recMdcTrackRoot->nster();
00112
00113 double vx0 = recMdcTrackRoot->vx0();
00114 double vy0 = recMdcTrackRoot->vy0();
00115 double vz0 = recMdcTrackRoot->vz0();
00116 double fiterm = recMdcTrackRoot->fiTerm();
00117 RecMdcTrack *recMdcTrack = new RecMdcTrack();
00118 m_common.m_rootRecMdcTrackMap[recMdcTrackRoot] = recMdcTrack;
00119
00120 recMdcTrack->setTrackId( trackId );
00121 recMdcTrack->setCharge( charge );
00122 recMdcTrack->setHelix( helix );
00123 recMdcTrack->setPxy( pxy );
00124 recMdcTrack->setPx( px );
00125 recMdcTrack->setPy( py );
00126 recMdcTrack->setPz( pz );
00127 recMdcTrack->setP( p );
00128 recMdcTrack->setTheta( theta );
00129 recMdcTrack->setPhi( phi );
00130 recMdcTrack->setX( x );
00131 recMdcTrack->setY( y );
00132 recMdcTrack->setZ( z );
00133 recMdcTrack->setR( r );
00134 recMdcTrack->setStat( stat );
00135 recMdcTrack->setChi2( chi );
00136 recMdcTrack->setNdof( ndof );
00137 recMdcTrack->setError( err );
00138 recMdcTrack->setNhits( nh );
00139 recMdcTrack->setNster( ns );
00140 recMdcTrack->setNlayer( nlayer );
00141
00142
00143 recMdcTrack->setVX0( vx0 );
00144 recMdcTrack->setVY0( vy0 );
00145 recMdcTrack->setVZ0( vz0 );
00146 recMdcTrack->setFiTerm( fiterm );
00147
00148 HitRefVec theHitRefVec;
00149
00150 RecMdcHitCol::iterator iter = recMdcHitCol->begin();
00151 for (;iter != recMdcHitCol->end(); iter++){
00152
00153
00154 if((*iter)->getTrkId() == trackId){
00155 SmartRef<RecMdcHit> refhit(*iter);
00156 theHitRefVec.push_back(refhit);
00157 }
00158 }
00159
00160 recMdcTrack->setVecHits(theHitRefVec);
00161
00162 int nhits = recMdcTrack->getVecHits().size();
00163
00164
00165
00166 for(int ii=0; ii <nhits ; ii++){
00167
00168
00169
00170 Identifier id(recMdcTrack->getVecHits()[ii]->getMdcId());
00171 int layer = MdcID::layer(id);
00172 int wire = MdcID::wire(id);
00173
00174 }
00175 recMdcTrackCol->push_back(recMdcTrack);
00176 }
00177
00178 delete m_recMdcTrackCol;
00179 m_recMdcTrackCol = 0;
00180 return StatusCode::SUCCESS;
00181 }
00182
00183
00184
00185
00186 StatusCode RecMdcTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00187
00188 MsgStream log(msgSvc(), "RecMdcTrackCnv");
00189 log << MSG::DEBUG << "RecMdcTrackCnv::DataObjectToTObject" << endreq;
00190
00191 RecMdcTrackCol * mdcTrackColTds=dynamic_cast<RecMdcTrackCol *> (obj);
00192 if (!mdcTrackColTds) {
00193 log << MSG::ERROR << "Could not downcast to MdcTrackCol" << endreq;
00194 return StatusCode::FAILURE;
00195 }
00196 DataObject *evt;
00197 StatusCode sc = m_eds->findObject(EventModel::Recon::Event,evt);
00198 if (!sc.isSuccess()) {
00199 log << MSG::ERROR << "Could not get ReconEvent in TDS " << endreq;
00200 return StatusCode::FAILURE;
00201 }
00202 ReconEvent * devtTds=dynamic_cast<ReconEvent *> (evt);
00203 if (!devtTds) {
00204 log << MSG::ERROR << "RecMdcTrackCnv:Could not downcast to TDS ReconEvent" << endreq;
00205 }
00206
00207 IOpaqueAddress *addr;
00208
00209 m_cnvSvc->getRecTrackCnv()->createRep(evt,addr);
00210 TRecTrackEvent *recEvt=m_cnvSvc->getRecTrackCnv()->getWriteObject();
00211
00212 const TObjArray *m_recMdcTrackCol = recEvt->getRecMdcTrackCol();
00213 if (!m_recMdcTrackCol) return StatusCode::SUCCESS;
00214
00215 recEvt->clearRecMdcTrackCol();
00216
00217 RecMdcTrackCol::const_iterator recMdcTrack;
00218 for (recMdcTrack = mdcTrackColTds->begin(); recMdcTrack != mdcTrackColTds->end(); recMdcTrack++) {
00219 Int_t trackId =(*recMdcTrack)->trackId();
00220 Double_t helix[5];
00221 for(int i=0;i<5;i++){
00222 log<<MSG::INFO<<" recMdcTrack.helix("<<i<<"): "<<(*recMdcTrack)->helix(i)<<endreq;
00223 helix[i] = (*recMdcTrack)->helix(i);
00224 }
00225
00226 Int_t stat = (*recMdcTrack)->stat();
00227 Double_t chi = (*recMdcTrack)->chi2();
00228 Int_t ndof = (*recMdcTrack)->ndof();
00229 Int_t ns = (*recMdcTrack)->nster();
00230 Int_t nlayer =(*recMdcTrack)->nlayer();
00231
00232 Double_t er[15];
00233 for (Int_t i=0; i<15; i++){
00234 er[i] = (*recMdcTrack)->err(i);
00235 }
00236 Int_t nh = (*recMdcTrack)->getNhits();
00237
00238 Double_t vx0 = (*recMdcTrack)->getVX0();
00239 Double_t vy0 = (*recMdcTrack)->getVY0();
00240 Double_t vz0 = (*recMdcTrack)->getVZ0();
00241 Double_t fiterm =(*recMdcTrack)->getFiTerm();
00242
00243 TRecMdcTrack *recMdcTrackRoot = new TRecMdcTrack();
00244
00245
00246 recMdcTrackRoot->setTrackId( trackId );
00247 recMdcTrackRoot->setHelix(helix);
00248 log<<MSG::INFO<<" test,recMdcTrackRoot.px: "<<recMdcTrackRoot->px()
00249 <<" recMdcTrackRoot.py: "<<recMdcTrackRoot->py()
00250 <<" recMdcTrackRoot.pz: "<<recMdcTrackRoot->pz()
00251 <<endreq;
00252
00253 recMdcTrackRoot->setStat( stat );
00254 recMdcTrackRoot->setChi2( chi );
00255 recMdcTrackRoot->setNdof( ndof );
00256 recMdcTrackRoot->setNlayer( nlayer );
00257 recMdcTrackRoot->setErr( er );
00258 recMdcTrackRoot->setNhits( nh );
00259 recMdcTrackRoot->setNster( ns );
00260
00261 recMdcTrackRoot->setVX0( vx0 );
00262 recMdcTrackRoot->setVY0( vy0 );
00263 recMdcTrackRoot->setVZ0( vz0 );
00264 recMdcTrackRoot->setFiTerm( fiterm );
00265
00266 recEvt->addRecMdcTrack(recMdcTrackRoot);
00267 }
00268
00269
00270 return StatusCode::SUCCESS;
00271 }
00272 #endif