00001 #ifndef DedxCnv_CXX
00002 #define DedxCnv_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 #include "DstEvent/DstEvent.h"
00012 #include "DstEvent/DstMdcDedx.h"
00013 #include "RootEventData/TMdcDedx.h"
00014 #include "RootEventData/TDstEvent.h"
00015
00016 #include "RootCnvSvc/Dst/DstCnv.h"
00017 #include "RootCnvSvc/Dst/MdcDedxCnv.h"
00018 #include "RootCnvSvc/RootAddress.h"
00019
00020
00021
00022
00023
00024
00025
00026 MdcDedxCnv::MdcDedxCnv(ISvcLocator* svc)
00027 : RootEventBaseCnv(classID(), svc)
00028 {
00029
00030 MsgStream log(msgSvc(), "MdcDedxCnv");
00031
00032 m_rootBranchname ="m_mdcDedxCol";
00033
00034 m_adresses.push_back(&m_mdcDedxCol);
00035 m_mdcDedxCol=0;
00036 }
00037
00038 StatusCode MdcDedxCnv::TObjectToDataObject(DataObject*& refpObject) {
00039
00040
00041 MsgStream log(msgSvc(), "MdcDedxCnv");
00042 log << MSG::DEBUG << "MdcDedxCnv::TObjectToDataObject" << endreq;
00043 StatusCode sc=StatusCode::SUCCESS;
00044
00045
00046 DstMdcDedxCol* mdcDedxTdsCol = new DstMdcDedxCol;
00047 refpObject=mdcDedxTdsCol;
00048
00049
00050
00051 if (!m_mdcDedxCol) return sc;
00052 TIter mdcDedxIter(m_mdcDedxCol);
00053 TMdcDedx *mdcDedxRoot = 0;
00054 while ((mdcDedxRoot = (TMdcDedx*)mdcDedxIter.Next())) {
00055
00056 int trackId = mdcDedxRoot->trackId();
00057 int particleId = mdcDedxRoot->particleId();
00058 int status = mdcDedxRoot->status();
00059 int truncAlg = mdcDedxRoot->truncAlg();
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 double chi[5];
00072 chi[0] = mdcDedxRoot->chiE();
00073 chi[1] = mdcDedxRoot->chiMu();
00074 chi[2] = mdcDedxRoot->chiPi();
00075 chi[3] = mdcDedxRoot->chiK();
00076 chi[4] = mdcDedxRoot->chiP();
00077 int numGoodHits = mdcDedxRoot->numGoodHits();
00078 int numTotalHits = mdcDedxRoot->numTotalHits();
00079
00080 double probPH = mdcDedxRoot->probPH();
00081 double normPH = mdcDedxRoot->normPH();
00082 double errorPH = mdcDedxRoot->errorPH();
00083 double twentyPH = mdcDedxRoot->twentyPH();
00084
00085
00086
00087
00088 DstMdcDedx *mdcDedxTds = new DstMdcDedx();
00089 m_common.m_rootMdcDedxMap[mdcDedxRoot] = mdcDedxTds;
00090
00091 mdcDedxTds->setTrackId(trackId);
00092 mdcDedxTds->setParticleId(particleId);
00093 mdcDedxTds->setStatus (status);
00094 mdcDedxTds->setTruncAlg(truncAlg);
00095
00096
00097
00098
00099
00100
00101
00102
00103 mdcDedxTds->setChi(chi);
00104
00105 mdcDedxTds->setNumGoodHits( numGoodHits);
00106 mdcDedxTds->setNumTotalHits( numTotalHits);
00107
00108 mdcDedxTds->setProbPH(probPH);
00109 mdcDedxTds->setNormPH(normPH);
00110 mdcDedxTds->setErrorPH(errorPH);
00111 mdcDedxTds->setTwentyPH(twentyPH);
00112
00113
00114
00115
00116 mdcDedxTdsCol->push_back(mdcDedxTds);
00117
00118
00119 }
00120
00121 delete m_mdcDedxCol;
00122 m_mdcDedxCol = 0;
00123 return StatusCode::SUCCESS;
00124 }
00125
00126 StatusCode MdcDedxCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00127
00128 MsgStream log(msgSvc(), "MdcDedxCnv");
00129 log << MSG::DEBUG << "MdcDedxCnv::DataObjectToTObject" << endreq;
00130 StatusCode sc=StatusCode::SUCCESS;
00131
00132 DstMdcDedxCol * mdcDedxColTds=dynamic_cast<DstMdcDedxCol *> (obj);
00133 if (!mdcDedxColTds) {
00134 log << MSG::ERROR << "Could not downcast to MdcDedxCol" << 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 << "MdcDedxCnv: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_mdcDedxCol = recEvt->getMdcDedxCol();
00154 if (!m_mdcDedxCol) return sc;
00155 recEvt->clearMdcDedxCol();
00156 DstMdcDedxCol::const_iterator mdcDedxTds;
00157
00158 for (mdcDedxTds = mdcDedxColTds->begin(); mdcDedxTds != mdcDedxColTds->end(); mdcDedxTds++) {
00159 Int_t trackId = (*mdcDedxTds)->trackId();
00160 Int_t particleId = (*mdcDedxTds)->particleId();
00161 Int_t status = (*mdcDedxTds)->status();
00162 Int_t truncAlg =(*mdcDedxTds)->truncAlg();
00163
00164
00165
00166
00167
00168 Double_t chiE = (*mdcDedxTds)->chi(0);
00169 Double_t chiMu = (*mdcDedxTds)->chi(1);
00170 Double_t chiPi = (*mdcDedxTds)->chi(2);
00171 Double_t chiK = (*mdcDedxTds)->chi(3);
00172 Double_t chiP = (*mdcDedxTds)->chi(4);
00173
00174 Int_t numGoodHits = (*mdcDedxTds)->numGoodHits();
00175 Int_t numTotalHits = (*mdcDedxTds)->numTotalHits();
00176
00177 Double_t probPH = (*mdcDedxTds)->probPH();
00178 Double_t normPH = (*mdcDedxTds)->normPH();
00179 Double_t errorPH = (*mdcDedxTds)->errorPH();
00180 Double_t twentyPH =(*mdcDedxTds)->twentyPH();
00181
00182
00183
00184 log << MSG::INFO <<"check Reconstrunction root"<<" particle Id is : "<<particleId
00185 <<"track id is : "<<trackId
00186 <<" and status is : "<<status<<endreq;
00187
00188
00189 TMdcDedx *mdcDedxRoot = new TMdcDedx();
00190
00191
00192 mdcDedxRoot->setTrackId(trackId);
00193 mdcDedxRoot->setParticleId(particleId);
00194 mdcDedxRoot->setStatus (status);
00195 mdcDedxRoot->setTruncAlg(truncAlg);
00196
00197 mdcDedxRoot->setChiE(chiE);
00198 mdcDedxRoot->setChiMu(chiMu);
00199 mdcDedxRoot->setChiPi(chiPi);
00200 mdcDedxRoot->setChiK(chiK);
00201 mdcDedxRoot->setChiP(chiP);
00202
00203 mdcDedxRoot->setNumGoodHits( numGoodHits);
00204 mdcDedxRoot->setNumTotalHits( numTotalHits);
00205
00206 mdcDedxRoot->setProbPH(probPH);
00207 mdcDedxRoot->setNormPH(normPH);
00208 mdcDedxRoot->setErrorPH(errorPH);
00209 mdcDedxRoot->setTwentyPH(twentyPH);
00210
00211
00212
00213 log << MSG::INFO << "check Reconstrunction root"<<" particle Id is : "<<particleId
00214 <<"track id is : "<<trackId
00215 <<" and status is : "<<status<<endreq;
00216
00217
00218
00219 recEvt->addMdcDedx(mdcDedxRoot);
00220 }
00221
00222 return StatusCode::SUCCESS;
00223 }
00224 #endif