00001 #ifndef EmcTrackCnv_CXX
00002 #define EmcTrackCnv_CXX 1
00003
00004 #include "GaudiKernel/MsgStream.h"
00005 #include "GaudiKernel/DataObject.h"
00006 #include "GaudiKernel/ObjectVector.h"
00007
00008 #include "TClonesArray.h"
00009
00010 #include "EventModel/EventModel.h"
00011
00012 #include "DstEvent/DstEvent.h"
00013 #include "DstEvent/DstEmcShower.h"
00014 #include "RootEventData/TEmcTrack.h"
00015 #include "RootEventData/TDstEvent.h"
00016
00017 #include "RootCnvSvc/Dst/DstCnv.h"
00018 #include "RootCnvSvc/Dst/EmcTrackCnv.h"
00019 #include "RootCnvSvc/RootAddress.h"
00020
00021 #include <vector>
00022
00023 using namespace std;
00024
00025
00026
00027
00028
00029
00030 EmcTrackCnv::EmcTrackCnv(ISvcLocator* svc)
00031 : RootEventBaseCnv(classID(), svc)
00032 {
00033
00034 MsgStream log(msgSvc(), "EmcTrackCnv");
00035
00036 m_rootTreename ="Rec";
00037 m_rootBranchname ="m_emcTrackCol";
00038
00039 m_adresses.push_back(&m_emcTrackCol);
00040 m_emcTrackCol=0;
00041
00042 }
00043
00044 StatusCode EmcTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00045
00046
00047 MsgStream log(msgSvc(), "EmcTrackCnv");
00048 log << MSG::DEBUG << "EmcTrackCnv::TObjectToDataObject" << endreq;
00049 StatusCode sc=StatusCode::SUCCESS;
00050
00051
00052 DstEmcShowerCol* emcTrackTdsCol = new DstEmcShowerCol;
00053 refpObject=emcTrackTdsCol;
00054
00055
00056
00057 if (!m_emcTrackCol) return sc;
00058 TIter emcTrackIter(m_emcTrackCol);
00059 TEmcTrack *emcTrackRoot = 0;
00060 while ((emcTrackRoot = (TEmcTrack*)emcTrackIter.Next())) {
00061 int trackId = emcTrackRoot->trackId();
00062 int numHits = emcTrackRoot->numHits();
00063 int status = emcTrackRoot->status();
00064 int cellId = emcTrackRoot->cellId();
00065 int module = emcTrackRoot->module();
00066 double x = emcTrackRoot->x();
00067 double y = emcTrackRoot->y();
00068 double z = emcTrackRoot->z();
00069 double dtheta = emcTrackRoot->dtheta();
00070 double dphi = emcTrackRoot->dphi();
00071 double energy = emcTrackRoot->energy();
00072 double dE = emcTrackRoot->dE();
00073 double eSeed = emcTrackRoot->eSeed();
00074 double e3x3 = emcTrackRoot->e3x3();
00075 double e5x5 = emcTrackRoot->e5x5();
00076 double time = emcTrackRoot->time();
00077 double secondMoment = emcTrackRoot->secondMoment();
00078 double latMoment = emcTrackRoot->latMoment();
00079 double a20Moment = emcTrackRoot->a20Moment();
00080 double a42Moment = emcTrackRoot->a42Moment();
00081
00082 HepSymMatrix matrix(3);
00083 matrix[0][0]=emcTrackRoot->err(0);
00084 matrix[1][1]=emcTrackRoot->err(1);
00085 matrix[2][2]=emcTrackRoot->err(2);
00086 matrix[0][1]=emcTrackRoot->err(3);
00087 matrix[0][2]=emcTrackRoot->err(4);
00088 matrix[1][2]=emcTrackRoot->err(5);
00089
00090 DstEmcShower *emcTrackTds = new DstEmcShower();
00091 m_common.m_rootEmcShowerMap[emcTrackRoot] = emcTrackTds;
00092
00093 emcTrackTds->setTrackId(trackId );
00094 emcTrackTds->setNumHits(numHits );
00095 emcTrackTds->setStatus(status );
00096 emcTrackTds->setCellId( cellId );
00097 emcTrackTds->setModule( module);
00098 HepPoint3D pos(x,y,z);
00099 emcTrackTds->setPosition(pos);
00100 emcTrackTds->setEnergy( energy );
00101 emcTrackTds->setDE( dE );
00102 emcTrackTds->setDtheta( dtheta );
00103 emcTrackTds->setDphi( dphi );
00104 emcTrackTds->setESeed(eSeed);
00105 emcTrackTds->setE3x3(e3x3);
00106 emcTrackTds->setE5x5(e5x5);
00107 emcTrackTds->setTime(time);
00108 emcTrackTds->setSecondMoment(secondMoment);
00109 emcTrackTds->setLatMoment(latMoment);
00110 emcTrackTds->setA20Moment(a20Moment);
00111 emcTrackTds->setA42Moment(a42Moment);
00112 emcTrackTds->setErrorMatrix( matrix );
00113
00114 emcTrackTdsCol->push_back(emcTrackTds);
00115
00116
00117 }
00118
00119
00120 delete m_emcTrackCol;
00121 m_emcTrackCol = 0;
00122 return StatusCode::SUCCESS;
00123 }
00124
00125 StatusCode EmcTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00126
00127 MsgStream log(msgSvc(), "EmcTrackCnv");
00128 log << MSG::DEBUG << "EmcTrackCnv::DataObjectToTObject" << endreq;
00129 StatusCode sc=StatusCode::SUCCESS;
00130
00131 DstEmcShowerCol * emcTrackColTds=dynamic_cast<DstEmcShowerCol *> (obj);
00132 if (!emcTrackColTds) {
00133 log << MSG::ERROR << "Could not downcast to EmcTrackCol" << endreq;
00134 return StatusCode::FAILURE;
00135 }
00136
00137 DataObject *evt;
00138 m_eds->findObject(EventModel::Dst::Event,evt);
00139 if (evt==NULL) {
00140 log << MSG::ERROR << "Could not get DstEvent in TDS " << endreq;
00141 return StatusCode::FAILURE;
00142 }
00143 DstEvent * devtTds=dynamic_cast<DstEvent *> (evt);
00144 if (!devtTds) {
00145 log << MSG::ERROR << "EmcTrackCnv:Could not downcast to TDS DstEvent" << endreq;
00146 }
00147 IOpaqueAddress *addr;
00148
00149 m_cnvSvc->getDstCnv()->createRep(evt,addr);
00150 TDstEvent *recEvt=m_cnvSvc->getDstCnv()->getWriteObject();
00151
00152 const TObjArray *m_emcTrackCol = recEvt->getEmcTrackCol();
00153 if (!m_emcTrackCol) return sc;
00154 recEvt->clearEmcTrackCol();
00155 DstEmcShowerCol::const_iterator emcTrackTds;
00156
00157 for (emcTrackTds = emcTrackColTds->begin(); emcTrackTds != emcTrackColTds->end(); emcTrackTds++) {
00158 Int_t trackId = (*emcTrackTds)->trackId();
00159 Int_t numHits = (*emcTrackTds)->numHits();
00160 Int_t status =(*emcTrackTds)->status();
00161 Int_t cellId =(*emcTrackTds)->cellId();
00162 Int_t module =(*emcTrackTds)->module();
00163 Double_t x = (*emcTrackTds)->x();
00164 Double_t y = (*emcTrackTds)->y();
00165 Double_t z = (*emcTrackTds)->z();
00166 Double_t dtheta =(*emcTrackTds)->dtheta();
00167 Double_t dphi =(*emcTrackTds)->dphi();
00168 Double_t energy = (*emcTrackTds)->energy();
00169 Double_t dE = (*emcTrackTds)->dE();
00170 Double_t eSeed = (*emcTrackTds)->eSeed();
00171 Double_t e3x3 = (*emcTrackTds)->e3x3();
00172 Double_t e5x5 = (*emcTrackTds)->e5x5();
00173 Double_t time = (*emcTrackTds)->time();
00174 Double_t secondMoment = (*emcTrackTds)->secondMoment();
00175 Double_t latMoment = (*emcTrackTds)->latMoment();
00176 Double_t a20Moment = (*emcTrackTds)->a20Moment();
00177 Double_t a42Moment = (*emcTrackTds)->a42Moment();
00178
00179 HepSymMatrix matrix = (*emcTrackTds)->errorMatrix();
00180 Double_t err[6];
00181 err[0] = matrix[0][0];
00182 err[1] = matrix[1][1];
00183 err[2] = matrix[2][2];
00184 err[3] = matrix[0][1];
00185 err[4] = matrix[0][2];
00186 err[5] = matrix[1][2];
00187
00188 TEmcTrack *emcTrackRoot = new TEmcTrack();
00189
00190
00191
00192 emcTrackRoot->setTrackId(trackId );
00193 emcTrackRoot->setNumHits(numHits );
00194 emcTrackRoot->setStatus(status );
00195 emcTrackRoot->setCellId( cellId );
00196 emcTrackRoot->setModule( module);
00197 emcTrackRoot->setX( x );
00198 emcTrackRoot->setY( y );
00199 emcTrackRoot->setZ( z );
00200 emcTrackRoot->setEnergy( energy );
00201 emcTrackRoot->setDE( dE );
00202 emcTrackRoot->setDtheta( dtheta );
00203 emcTrackRoot->setDphi( dphi );
00204 emcTrackRoot->setESeed( eSeed );
00205 emcTrackRoot->setE3x3( e3x3 );
00206 emcTrackRoot->setE5x5( e5x5 );
00207 emcTrackRoot->setTime( time );
00208 emcTrackRoot->setSecondMoment(secondMoment);
00209 emcTrackRoot->setLatMoment(latMoment);
00210 emcTrackRoot->setA20Moment(a20Moment);
00211 emcTrackRoot->setA42Moment(a42Moment);
00212 emcTrackRoot->setErr( err );
00213
00214 recEvt->addEmcTrack(emcTrackRoot);
00215 }
00216
00217 return StatusCode::SUCCESS;
00218 }
00219 #endif