00001 #ifndef MdcKalTrackCnv_CXX
00002 #define MdcKalTrackCnv_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/DstMdcKalTrack.h"
00013 #include "MdcRecEvent/RecMdcKalTrack.h"
00014 #include "RootEventData/TMdcKalTrack.h"
00015 #include "RootEventData/TDstEvent.h"
00016
00017 #include "RootCnvSvc/Dst/DstCnv.h"
00018 #include "RootCnvSvc/Dst/MdcKalTrackCnv.h"
00019 #include "RootCnvSvc/RootAddress.h"
00020
00021 #include "CLHEP/Matrix/Vector.h"
00022 #include "CLHEP/Matrix/SymMatrix.h"
00023 #include "CLHEP/Vector/ThreeVector.h"
00024 #include "CLHEP/Geometry/Point3D.h"
00025 #include <vector>
00026 #include "string.h"
00027 #include <cmath>
00028
00029 using CLHEP::HepVector;
00030 using CLHEP::HepSymMatrix;
00031
00032
00033 MdcKalTrackCnv::MdcKalTrackCnv(ISvcLocator* svc)
00034 : RootEventBaseCnv(classID(), svc)
00035 {
00036
00037 MsgStream log(msgSvc(), "MdcKalTrackCnv");
00038 m_rootBranchname ="m_mdcKalTrackCol";
00039 m_adresses.push_back(&m_mdcKalTrackCol);
00040 m_mdcKalTrackCol=0;
00041 }
00042
00043 StatusCode MdcKalTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00044
00045
00046 MsgStream log(msgSvc(), "MdcKalTrackCnv");
00047 log << MSG::DEBUG << "MdcKalTrackCnv::TObjectToDataObject" << endreq;
00048 StatusCode sc=StatusCode::SUCCESS;
00049
00050
00051 DstMdcKalTrackCol* mdcKalTrackTdsCol = new DstMdcKalTrackCol;
00052 refpObject=mdcKalTrackTdsCol;
00053
00054
00055 if (!m_mdcKalTrackCol) return sc;
00056 TIter mdcKalTrackIter(m_mdcKalTrackCol);
00057 TMdcKalTrack *mdcKalTrackRoot = 0;
00058 while ((mdcKalTrackRoot = (TMdcKalTrack*)mdcKalTrackIter.Next())) {
00059 std::vector<HepVector> zhelixs;
00060 std::vector<HepSymMatrix> zerrors;
00061 std::vector<HepPoint3D> pocas;
00062 std::vector<HepVector> fhelixs;
00063 std::vector<HepSymMatrix> ferrors;
00064
00065 HepVector zhelix(5);
00066 HepSymMatrix zerror(5);
00067 HepPoint3D poca(0,0,0);
00068
00069 HepVector zhelix_e(5);
00070 HepSymMatrix zerror_e(5);
00071 HepPoint3D poca_e(0,0,0);
00072
00073 HepVector zhelix_mu(5);
00074 HepSymMatrix zerror_mu(5);
00075 HepPoint3D poca_mu(0,0,0);
00076
00077 HepVector zhelix_k(5);
00078 HepSymMatrix zerror_k(5);
00079 HepPoint3D poca_k(0,0,0);
00080
00081 HepVector zhelix_p(5);
00082 HepSymMatrix zerror_p(5);
00083 HepPoint3D poca_p(0,0,0);
00084
00085 HepVector fhelix(5);
00086 HepSymMatrix ferror(5);
00087
00088 HepVector fhelix_e(5);
00089 HepSymMatrix ferror_e(5);
00090
00091 HepVector fhelix_mu(5);
00092 HepSymMatrix ferror_mu(5);
00093
00094 HepVector fhelix_k(5);
00095 HepSymMatrix ferror_k(5);
00096
00097 HepVector fhelix_p(5);
00098 HepSymMatrix ferror_p(5);
00099
00100
00101 DstMdcKalTrack *mdcKalTrackTds = new DstMdcKalTrack();
00102 m_common.m_rootMdcKalTrackMap[mdcKalTrackRoot] = mdcKalTrackTds;
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 log<<MSG::DEBUG<<"T to DST, poca: "<<poca<<endreq;
00115
00116 for (int i=0; i<5; i++){
00117 zhelix[i] = mdcKalTrackRoot->getZHelix(i);
00118 zhelix_e[i] = mdcKalTrackRoot->getZHelixE(i);
00119 zhelix_mu[i] = mdcKalTrackRoot->getZHelixMu(i);
00120 zhelix_k[i] = mdcKalTrackRoot->getZHelixK(i);
00121 zhelix_p[i] = mdcKalTrackRoot->getZHelixP(i);
00122
00123 fhelix[i] = mdcKalTrackRoot->getFHelix(i);
00124 fhelix_e[i] = mdcKalTrackRoot->getFHelixE(i);
00125 fhelix_mu[i] = mdcKalTrackRoot->getFHelixMu(i);
00126 fhelix_k[i] = mdcKalTrackRoot->getFHelixK(i);
00127 fhelix_p[i] = mdcKalTrackRoot->getFHelixP(i);
00128
00129 for (int j=0; j<=i; j++){
00130 zerror[i][j] = mdcKalTrackRoot->getZError(i,j);
00131 zerror_e[i][j] = mdcKalTrackRoot->getZErrorE(i,j);
00132 zerror_mu[i][j] = mdcKalTrackRoot->getZErrorMu(i,j);
00133 zerror_k[i][j] = mdcKalTrackRoot->getZErrorK(i,j);
00134 zerror_p[i][j] = mdcKalTrackRoot->getZErrorP(i,j);
00135
00136 zerror[j][i] = zerror[i][j];
00137 zerror_e[j][i] = zerror_e[i][j];
00138 zerror_mu[j][i] = zerror_mu[i][j];
00139 zerror_k[j][i] = zerror_k[i][j];
00140 zerror_p[j][i] = zerror_p[i][j];
00141
00142 ferror[i][j] = mdcKalTrackRoot->getFError(i,j);
00143 ferror_e[i][j] = mdcKalTrackRoot->getFErrorE(i,j);
00144 ferror_mu[i][j] = mdcKalTrackRoot->getFErrorMu(i,j);
00145 ferror_k[i][j] = mdcKalTrackRoot->getFErrorK(i,j);
00146 ferror_p[i][j] = mdcKalTrackRoot->getFErrorP(i,j);
00147
00148 ferror[j][i] = ferror[i][j];
00149 ferror_e[j][i] = ferror_e[i][j];
00150 ferror_mu[j][i] = ferror_mu[i][j];
00151 ferror_k[j][i] = ferror_k[i][j];
00152 ferror_p[j][i] = ferror_p[i][j];
00153 }
00154 }
00155
00156
00157 double dr = zhelix[0];
00158 double phi0 = zhelix[1];
00159 double kappa = zhelix[2];
00160 double dz = zhelix[3];
00161 double tanl = zhelix[4];
00162 poca[0]=dr*cos(phi0);
00163 poca[1]=dr*sin(phi0);
00164 poca[2]=dz;
00165
00166 dr = zhelix_e[0];
00167 phi0 = zhelix_e[1];
00168 kappa = zhelix_e[2];
00169 dz = zhelix_e[3];
00170 tanl = zhelix_e[4];
00171 poca_e[0]=dr*cos(phi0);
00172 poca_e[1]=dr*sin(phi0);
00173 poca_e[2]=dz;
00174
00175 dr = zhelix_mu[0];
00176 phi0 = zhelix_mu[1];
00177 kappa = zhelix_mu[2];
00178 dz = zhelix_mu[3];
00179 tanl = zhelix_mu[4];
00180 poca_mu[0]=dr*cos(phi0);
00181 poca_mu[1]=dr*sin(phi0);
00182 poca_mu[2]=dz;
00183
00184 dr = zhelix_k[0];
00185 phi0 = zhelix_k[1];
00186 kappa = zhelix_k[2];
00187 dz = zhelix_k[3];
00188 tanl = zhelix_k[4];
00189 poca_k[0]=dr*cos(phi0);
00190 poca_k[1]=dr*sin(phi0);
00191 poca_k[2]=dz;
00192
00193 dr = zhelix_p[0];
00194 phi0 = zhelix_p[1];
00195 kappa = zhelix_p[2];
00196 dz = zhelix_p[3];
00197 tanl = zhelix_p[4];
00198 poca_p[0]=dr*cos(phi0);
00199 poca_p[1]=dr*sin(phi0);
00200 poca_p[2]=dz;
00201
00202
00203 log<<MSG::DEBUG<<"T to DST, zhelix: "<<zhelix<<endreq;
00204 log<<MSG::DEBUG<<"T to DST, zerror: "<<zerror<<endreq;
00205
00206 zhelixs.push_back(zhelix_e);
00207 zhelixs.push_back(zhelix_mu);
00208 zhelixs.push_back(zhelix);
00209 zhelixs.push_back(zhelix_k);
00210 zhelixs.push_back(zhelix_p);
00211 zerrors.push_back(zerror_e);
00212 zerrors.push_back(zerror_mu);
00213 zerrors.push_back(zerror);
00214 zerrors.push_back(zerror_k);
00215 zerrors.push_back(zerror_p);
00216
00217 fhelixs.push_back(fhelix_e);
00218 fhelixs.push_back(fhelix_mu);
00219 fhelixs.push_back(fhelix);
00220 fhelixs.push_back(fhelix_k);
00221 fhelixs.push_back(fhelix_p);
00222 ferrors.push_back(ferror_e);
00223 ferrors.push_back(ferror_mu);
00224 ferrors.push_back(ferror);
00225 ferrors.push_back(ferror_k);
00226 ferrors.push_back(ferror_p);
00227
00228 pocas.push_back(poca_e);
00229 pocas.push_back(poca_mu);
00230 pocas.push_back(poca);
00231 pocas.push_back(poca_k);
00232 pocas.push_back(poca_p);
00233
00234 for(int m=0; m<5; m++){
00235 int charge;
00236 double pxy(0.),px(0.),py(0.),pz(0.),ptot(0.),dr(0.),phi0(0.),kappa(0.),dz(0.),tanl(0.),x(0.),y(0.),z(0.),vx0(0.),vy0(0.),vz0(0.);
00237 dr = zhelixs[m][0];
00238 phi0 = zhelixs[m][1];
00239 kappa = zhelixs[m][2];
00240 dz = zhelixs[m][3];
00241 tanl = zhelixs[m][4];
00242
00243
00244
00245
00246
00247 x = dr * cos(phi0);
00248 y = dr * sin(phi0);
00249 z = dz;
00250
00251
00252
00253 if (kappa > 0.0000000001)
00254 charge = 1;
00255 else if (kappa < -0.0000000001)
00256 charge = -1;
00257 else
00258 charge = 0;
00259
00260 if(kappa!=0) pxy = 1.0/fabs(kappa);
00261 else pxy = 0;
00262
00263 px = pxy * (-sin(phi0));
00264 py = pxy * cos(phi0);
00265 pz = pxy * tanl;
00266 ptot = sqrt(px*px+py*py+pz*pz);
00267
00268 mdcKalTrackTds->setCharge(charge,m);
00269 mdcKalTrackTds->setPxy(pxy,m);
00270 mdcKalTrackTds->setPx(px,m);
00271 mdcKalTrackTds->setPy(py,m);
00272 mdcKalTrackTds->setPz(pz,m);
00273 mdcKalTrackTds->setP(ptot,m);
00274 mdcKalTrackTds->setTheta(acos(pz/ptot),m);
00275 mdcKalTrackTds->setPhi(atan2(py,px),m);
00276 mdcKalTrackTds->setX(x,m);
00277 mdcKalTrackTds->setY(y,m);
00278 mdcKalTrackTds->setZ(z,m);
00279 mdcKalTrackTds->setR(sqrt(x*x+y*y),m);
00280
00281 mdcKalTrackTds->setStat(mdcKalTrackRoot->getStat(m),0,m);
00282 mdcKalTrackTds->setStat(mdcKalTrackRoot->getStat2(m),1,m);
00283 mdcKalTrackTds->setChisq(mdcKalTrackRoot->getChisq(m),0,m);
00284 mdcKalTrackTds->setNdf(mdcKalTrackRoot->getNdf(m),0,m);
00285 mdcKalTrackTds->setNlayer(mdcKalTrackRoot->getNlayer(m),m);
00286 }
00287
00288 mdcKalTrackTds->setTrackId(mdcKalTrackRoot->getTrackId());
00289
00290 for(int jj=0; jj<5; jj++){
00291 mdcKalTrackTds->setZHelix(zhelixs[jj],jj);
00292 mdcKalTrackTds->setZError(zerrors[jj],jj);
00293 mdcKalTrackTds->setFHelix(fhelixs[jj],jj);
00294 mdcKalTrackTds->setFError(ferrors[jj],jj);
00295 mdcKalTrackTds->setPoca(pocas[jj],jj);
00296 }
00297
00298 mdcKalTrackTdsCol->push_back(mdcKalTrackTds);
00299 }
00300
00301 delete m_mdcKalTrackCol;
00302 m_mdcKalTrackCol = 0;
00303 return StatusCode::SUCCESS;
00304 }
00305
00306 StatusCode MdcKalTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00307
00308 MsgStream log(msgSvc(), "MdcKalTrackCnv");
00309 log << MSG::DEBUG << "MdcKalTrackCnv::DataObjectToTObject" << endreq;
00310 StatusCode sc=StatusCode::SUCCESS;
00311
00312 DstMdcKalTrackCol * mdcKalTrackColTds=dynamic_cast<DstMdcKalTrackCol *> (obj);
00313
00314 if (!mdcKalTrackColTds) {
00315 log << MSG::ERROR << "Could not downcast to DstMdcKalTrackCol" << endreq;
00316 return StatusCode::FAILURE;
00317 }
00318
00319 DataObject *evt;
00320 m_eds->findObject(EventModel::Dst::Event,evt);
00321 if (evt==NULL) {
00322 log << MSG::ERROR << "Could not get ReconEvent in TDS " << endreq;
00323 return StatusCode::FAILURE;
00324 }
00325
00326 DstEvent * devtTds=dynamic_cast<DstEvent *> (evt);
00327 if (!devtTds) {
00328 log << MSG::ERROR << "MdcKalTrackCnv:Could not downcast to TDS Dst Event" << endreq;
00329 }
00330 IOpaqueAddress *addr;
00331
00332 m_cnvSvc->getDstCnv()->createRep(evt,addr);
00333 TDstEvent *recEvt=m_cnvSvc->getDstCnv()->getWriteObject();
00334
00335 const TObjArray *m_mdcKalTrackCol = recEvt->getMdcKalTrackCol();
00336
00337 if (!m_mdcKalTrackCol) return sc;
00338
00339 recEvt->clearMdcKalTrackCol();
00340 DstMdcKalTrackCol::const_iterator mdcKalTrackTds;
00341
00342 for (mdcKalTrackTds = mdcKalTrackColTds->begin(); mdcKalTrackTds != mdcKalTrackColTds->end(); mdcKalTrackTds++) {
00343
00344
00345
00346
00347 Double_t zhelix[5];
00348 Double_t zerror[5][5];
00349
00350
00351 Double_t zhelix_e[5];
00352 Double_t zerror_e[5][5];
00353
00354
00355 Double_t zhelix_mu[5];
00356 Double_t zerror_mu[5][5];
00357
00358
00359 Double_t zhelix_k[5];
00360 Double_t zerror_k[5][5];
00361
00362
00363 Double_t zhelix_p[5];
00364 Double_t zerror_p[5][5];
00365
00366 Double_t fhelix[5];
00367 Double_t ferror[5][5];
00368 Double_t fhelix_e[5];
00369 Double_t ferror_e[5][5];
00370 Double_t fhelix_mu[5];
00371 Double_t ferror_mu[5][5];
00372 Double_t fhelix_k[5];
00373 Double_t ferror_k[5][5];
00374 Double_t fhelix_p[5];
00375 Double_t ferror_p[5][5];
00376
00377 TMdcKalTrack *mdcKalTrackRoot = new TMdcKalTrack();
00378
00379 RecMdcKalTrack* recMdcKalTrackTds=(RecMdcKalTrack*) (*mdcKalTrackTds);
00380
00381 for(int k=0; k<5; k++){
00382 mdcKalTrackRoot->setStat((*mdcKalTrackTds)->getStat(k),k);
00383 mdcKalTrackRoot->setStat2(recMdcKalTrackTds->getStat(1,k),k);
00384 mdcKalTrackRoot->setChisq((*mdcKalTrackTds)->getChisq(k),k);
00385 mdcKalTrackRoot->setNdf((*mdcKalTrackTds)->getNdf(k),k);
00386 mdcKalTrackRoot->setNlayer((*mdcKalTrackTds)->getNlayer(k),k);
00387
00388
00389
00390 }
00391
00392
00393 HepVector h_zhelix = (*mdcKalTrackTds)->getZHelix(2);
00394 HepSymMatrix h_zerror = (*mdcKalTrackTds)->getZError(2);
00395
00396
00397 HepVector h_zhelix_e = (*mdcKalTrackTds)->getZHelix(0);
00398 HepSymMatrix h_zerror_e = (*mdcKalTrackTds)->getZError(0);
00399
00400
00401 HepVector h_zhelix_mu = (*mdcKalTrackTds)->getZHelix(1);
00402 HepSymMatrix h_zerror_mu = (*mdcKalTrackTds)->getZError(1);
00403
00404
00405 HepVector h_zhelix_k = (*mdcKalTrackTds)->getZHelix(3);
00406 HepSymMatrix h_zerror_k = (*mdcKalTrackTds)->getZError(3);
00407
00408
00409 HepVector h_zhelix_p = (*mdcKalTrackTds)->getZHelix(4);
00410 HepSymMatrix h_zerror_p = (*mdcKalTrackTds)->getZError(4);
00411
00412 HepVector h_fhelix = (*mdcKalTrackTds)->getFHelix(2);
00413 HepSymMatrix h_ferror = (*mdcKalTrackTds)->getFError(2);
00414 HepVector h_fhelix_e = (*mdcKalTrackTds)->getFHelix(0);
00415 HepSymMatrix h_ferror_e = (*mdcKalTrackTds)->getFError(0);
00416 HepVector h_fhelix_mu = (*mdcKalTrackTds)->getFHelix(1);
00417 HepSymMatrix h_ferror_mu = (*mdcKalTrackTds)->getFError(1);
00418 HepVector h_fhelix_k = (*mdcKalTrackTds)->getFHelix(3);
00419 HepSymMatrix h_ferror_k = (*mdcKalTrackTds)->getFError(3);
00420 HepVector h_fhelix_p = (*mdcKalTrackTds)->getFHelix(4);
00421 HepSymMatrix h_ferror_p = (*mdcKalTrackTds)->getFError(4);
00422
00423 mdcKalTrackRoot->setTrackId((*mdcKalTrackTds)->getTrackId());
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435 for (int i=0; i<5; i++){
00436 zhelix[i] = h_zhelix[i];
00437 zhelix_e[i] = h_zhelix_e[i];
00438 zhelix_mu[i] = h_zhelix_mu[i];
00439 zhelix_p[i] = h_zhelix_p[i];
00440 zhelix_k[i] = h_zhelix_k[i];
00441 fhelix[i] = h_fhelix[i];
00442 fhelix_e[i] = h_fhelix_e[i];
00443 fhelix_mu[i] = h_fhelix_mu[i];
00444 fhelix_p[i] = h_fhelix_p[i];
00445 fhelix_k[i] = h_fhelix_k[i];
00446 for (int j=0; j<=i; j++){
00447 zerror[i][j] = h_zerror[i][j];
00448 zerror_e[i][j] = h_zerror_e[i][j];
00449 zerror_mu[i][j] = h_zerror_mu[i][j];
00450 zerror_p[i][j] = h_zerror_p[i][j];
00451 zerror_k[i][j] = h_zerror_k[i][j];
00452 zerror[j][i] = h_zerror[i][j];
00453 zerror_e[j][i] = h_zerror_e[i][j];
00454 zerror_mu[j][i] = h_zerror_mu[i][j];
00455 zerror_p[j][i] = h_zerror_p[i][j];
00456 zerror_k[j][i] = h_zerror_k[i][j];
00457 ferror[i][j] = h_ferror[i][j];
00458 ferror_e[i][j] = h_ferror_e[i][j];
00459 ferror_mu[i][j] = h_ferror_mu[i][j];
00460 ferror_p[i][j] = h_ferror_p[i][j];
00461 ferror_k[i][j] = h_ferror_k[i][j];
00462 ferror[j][i] = h_ferror[i][j];
00463 ferror_e[j][i] = h_ferror_e[i][j];
00464 ferror_mu[j][i] = h_ferror_mu[i][j];
00465 ferror_p[j][i] = h_ferror_p[i][j];
00466 ferror_k[j][i] = h_ferror_k[i][j];
00467 }
00468 }
00469
00470
00471 mdcKalTrackRoot->setZHelix(zhelix);
00472 mdcKalTrackRoot->setZError(zerror);
00473
00474
00475 mdcKalTrackRoot->setZHelixE(zhelix_e);
00476 mdcKalTrackRoot->setZErrorE(zerror_e);
00477
00478
00479 mdcKalTrackRoot->setZHelixMu(zhelix_mu);
00480 mdcKalTrackRoot->setZErrorMu(zerror_mu);
00481
00482
00483 mdcKalTrackRoot->setZHelixK(zhelix_k);
00484 mdcKalTrackRoot->setZErrorK(zerror_k);
00485
00486
00487 mdcKalTrackRoot->setZHelixP(zhelix_p);
00488 mdcKalTrackRoot->setZErrorP(zerror_p);
00489
00490 mdcKalTrackRoot->setFHelix(fhelix);
00491 mdcKalTrackRoot->setFError(ferror);
00492
00493 mdcKalTrackRoot->setFHelixE(fhelix_e);
00494 mdcKalTrackRoot->setFErrorE(ferror_e);
00495
00496 mdcKalTrackRoot->setFHelixMu(fhelix_mu);
00497 mdcKalTrackRoot->setFErrorMu(ferror_mu);
00498
00499 mdcKalTrackRoot->setFHelixK(fhelix_k);
00500 mdcKalTrackRoot->setFErrorK(ferror_k);
00501
00502 mdcKalTrackRoot->setFHelixP(fhelix_p);
00503 mdcKalTrackRoot->setFErrorP(ferror_p);
00504
00505 recEvt->addMdcKalTrack(mdcKalTrackRoot);
00506 }
00507
00508 return StatusCode::SUCCESS;
00509 }
00510 #endif