00001 #ifndef ExtTrackCnv_CXX
00002 #define ExtTrackCnv_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/DstExtTrack.h"
00014
00015 #include "RootEventData/TExtTrack.h"
00016 #include "RootEventData/TDstEvent.h"
00017
00018 #include "RootCnvSvc/Dst/DstCnv.h"
00019 #include "RootCnvSvc/Dst/ExtTrackCnv.h"
00020 #include "RootCnvSvc/RootAddress.h"
00021
00022 #include "CLHEP/Matrix/Vector.h"
00023 #include "CLHEP/Matrix/SymMatrix.h"
00024 #include "CLHEP/Vector/ThreeVector.h"
00025
00026 #include "string.h"
00027
00028 using namespace std;
00029
00030 using CLHEP::Hep3Vector;
00031 using CLHEP::HepSymMatrix;
00032
00033
00034
00035
00036
00037
00038 ExtTrackCnv::ExtTrackCnv(ISvcLocator* svc)
00039 : RootEventBaseCnv(classID(), svc)
00040 {
00041
00042 MsgStream log(msgSvc(), "ExtTrackCnv");
00043
00044 m_rootBranchname ="m_extTrackCol";
00045
00046 m_adresses.push_back(&m_extTrackCol);
00047 m_extTrackCol=0;
00048 }
00049
00050 StatusCode ExtTrackCnv::TObjectToDataObject(DataObject*& refpObject) {
00051
00052
00053 MsgStream log(msgSvc(), "ExtTrackCnv");
00054 log << MSG::DEBUG << "ExtTrackCnv::TObjectToDataObject" << endreq;
00055 StatusCode sc=StatusCode::SUCCESS;
00056
00057
00058 DstExtTrackCol* extTrackTdsCol = new DstExtTrackCol;
00059 refpObject=extTrackTdsCol;
00060
00061
00062
00063 if (!m_extTrackCol) return sc;
00064 TIter extTrackIter(m_extTrackCol);
00065 TExtTrack *extTrackRoot = 0;
00066 while ((extTrackRoot = (TExtTrack*)extTrackIter.Next())) {
00067
00068 int trackId = extTrackRoot->GetTrackId();
00069
00070 double p1x = extTrackRoot->GetTof1PositionX();
00071 double p1y = extTrackRoot->GetTof1PositionY();
00072 double p1z = extTrackRoot->GetTof1PositionZ();
00073 double m1x = extTrackRoot->GetTof1MomentumX();
00074 double m1y = extTrackRoot->GetTof1MomentumY();
00075 double m1z = extTrackRoot->GetTof1MomentumZ();
00076 Hep3Vector tof1p(p1x,p1y,p1z);
00077 Hep3Vector tof1m(m1x,m1y,m1z);
00078
00079
00080 string v1s = extTrackRoot->GetTof1VolumeName().Data();
00081 int v1n = extTrackRoot->GetTof1VolumeNumber() ;
00082 double tof1= extTrackRoot->GetTof1();
00083 double tof1path= extTrackRoot->GetTof1Path();
00084 double z1 = extTrackRoot->GetTof1PosSigmaAlongZ();
00085 double t1 = extTrackRoot->GetTof1PosSigmaAlongT();
00086 double x1 = extTrackRoot->GetTof1PosSigmaAlongX();
00087 double y1 = extTrackRoot->GetTof1PosSigmaAlongY();
00088 HepSymMatrix e1m(6) ;
00089 for (int i = 0;i<6 ;i++ )
00090 for (int j= 0;j<6 ;j++ )
00091 e1m[i][j]= extTrackRoot->GetTof1ErrorMatrix(i , j) ;
00092
00093
00094 double p2x = extTrackRoot->GetTof2PositionX() ;
00095 double p2y = extTrackRoot->GetTof2PositionY() ;
00096 double p2z = extTrackRoot->GetTof2PositionZ() ;
00097 double m2x = extTrackRoot->GetTof2MomentumX() ;
00098 double m2y = extTrackRoot->GetTof2MomentumY() ;
00099 double m2z = extTrackRoot->GetTof2MomentumZ();
00100 Hep3Vector tof2p(p2x,p2y,p2z);
00101 Hep3Vector tof2m(m2x,m2y,m2z);
00102
00103 string v2s = extTrackRoot->GetTof2VolumeName().Data();
00104 int v2n = extTrackRoot->GetTof2VolumeNumber() ;
00105 double tof2= extTrackRoot->GetTof2();
00106 double tof2path = extTrackRoot->GetTof2Path();
00107 double z2 = extTrackRoot->GetTof2PosSigmaAlongZ() ;
00108 double t2 = extTrackRoot->GetTof2PosSigmaAlongT();
00109 double x2 = extTrackRoot->GetTof2PosSigmaAlongX();
00110 double y2 = extTrackRoot->GetTof2PosSigmaAlongY();
00111 HepSymMatrix e2m(6) ;
00112 for (int i = 0;i<6 ;i++ )
00113 for (int j= 0;j<6 ;j++ )
00114 e2m[i][j]= extTrackRoot->GetTof2ErrorMatrix(i,j) ;
00115
00116
00117 double pEx = extTrackRoot->GetEmcPositionX();
00118 double pEy = extTrackRoot->GetEmcPositionY();
00119 double pEz = extTrackRoot->GetEmcPositionZ();
00120 double mEx = extTrackRoot->GetEmcMomentumX();
00121 double mEy = extTrackRoot->GetEmcMomentumY();
00122 double mEz = extTrackRoot->GetEmcMomentumZ();
00123 Hep3Vector Ep(pEx,pEy,pEz);
00124 Hep3Vector Em(mEx,mEy,mEz);
00125
00126 string vEs = extTrackRoot->GetEmcVolumeName().Data();
00127 int vEn = extTrackRoot->GetEmcVolumeNumber();
00128 double theta = extTrackRoot->GetEmcPosSigmaAlongTheta();
00129 double phi = extTrackRoot->GetEmcPosSigmaAlongPhi();
00130 HepSymMatrix eEm(6) ;
00131 for(int i=0;i<6 ;i++ )
00132 for(int j= 0;j<6 ;j++ )
00133 eEm[i][j]= extTrackRoot->GetEmcErrorMatrix(i,j);
00134 double emcPath=extTrackRoot->emcPath();
00135
00136
00137 double pMx = extTrackRoot->GetMucPositionX() ;
00138 double pMy = extTrackRoot->GetMucPositionY() ;
00139 double pMz = extTrackRoot->GetMucPositionZ() ;
00140 double mMx = extTrackRoot->GetMucMomentumX() ;
00141 double mMy = extTrackRoot->GetMucMomentumY() ;
00142 double mMz = extTrackRoot->GetMucMomentumZ();
00143 Hep3Vector Mp(pMx,pMy,pMz);
00144 Hep3Vector Mm(mMx,mMy,mMz);
00145
00146 string vMs = extTrackRoot->GetMucVolumeName().Data();
00147 int vMn = extTrackRoot->GetMucVolumeNumber() ;
00148
00149 double zM = extTrackRoot->GetMucPosSigmaAlongZ() ;
00150 double tM = extTrackRoot->GetMucPosSigmaAlongT();
00151 double xM = extTrackRoot->GetMucPosSigmaAlongX();
00152 double yM = extTrackRoot->GetMucPosSigmaAlongY();
00153 HepSymMatrix eMm(6) ;
00154 for (int i = 0;i<6 ;i++ )
00155 for (int j= 0;j<6 ;j++ )
00156 eMm[i][j]= extTrackRoot->GetMucErrorMatrix(i,j) ;
00157
00158 DstExtTrack *extTrackTds = new DstExtTrack();
00159 m_common.m_rootExtTrackMap[extTrackRoot] = extTrackTds;
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 extTrackTds->SetTrackId(trackId);
00200 extTrackTds->SetTof1Data( tof1p, tof1m, v1s, v1n , tof1, tof1path, e1m, z1, t1, x1, y1 );
00201 extTrackTds->SetTof2Data( tof2p, tof2m, v2s, v2n , tof2, tof2path, e2m, z2, t2, x2, y2 );
00202 extTrackTds->SetEmcData( Ep, Em, vEs, vEn , theta, phi , eEm);
00203 extTrackTds->SetEmcPath(emcPath);
00204 extTrackTds->SetMucData( Mp, Mm, vMs, vMn , eMm, zM, tM, xM, yM );
00205
00206 extTrackTdsCol->push_back(extTrackTds);
00207
00208
00209
00210
00211 }
00212
00213 delete m_extTrackCol;
00214 m_extTrackCol = 0;
00215 return StatusCode::SUCCESS;
00216 }
00217
00218 StatusCode ExtTrackCnv::DataObjectToTObject(DataObject* obj,RootAddress* rootaddr) {
00219
00220 MsgStream log(msgSvc(), "ExtTrackCnv");
00221 log << MSG::DEBUG << "ExtTrackCnv::DataObjectToTObject" << endreq;
00222 StatusCode sc=StatusCode::SUCCESS;
00223
00224 DstExtTrackCol * extTrackColTds=dynamic_cast<DstExtTrackCol *> (obj);
00225 if (!extTrackColTds) {
00226 log << MSG::ERROR << "Could not downcast to DstExtTrackCol" << endreq;
00227 return StatusCode::FAILURE;
00228 }
00229
00230 DataObject *evt;
00231 m_eds->findObject(EventModel::Dst::Event,evt);
00232 if (evt==NULL) {
00233 log << MSG::ERROR << "Could not get ReconEvent in TDS " << endreq;
00234 return StatusCode::FAILURE;
00235 }
00236
00237 DstEvent * devtTds=dynamic_cast<DstEvent *> (evt);
00238 if (!devtTds) {
00239 log << MSG::ERROR << "ExtTrackCnv:Could not downcast to TDS Dst Event" << endreq;
00240 }
00241 IOpaqueAddress *addr;
00242
00243 m_cnvSvc->getDstCnv()->createRep(evt,addr);
00244 TDstEvent *recEvt=m_cnvSvc->getDstCnv()->getWriteObject();
00245
00246 const TObjArray *m_extTrackCol = recEvt->getExtTrackCol();
00247
00248 if (!m_extTrackCol) return sc;
00249
00250 recEvt->clearExtTrackCol();
00251 DstExtTrackCol::const_iterator extTrackTds;
00252
00253 for (extTrackTds = extTrackColTds->begin(); extTrackTds != extTrackColTds->end(); extTrackTds++) {
00254
00255 Int_t trackId = (*extTrackTds)->GetTrackId();
00256
00257 Double_t p1x = (*extTrackTds)->tof1Position().x();
00258 Double_t p1y = (*extTrackTds)->tof1Position().y();
00259 Double_t p1z = (*extTrackTds)->tof1Position().z();
00260 Double_t m1x = (*extTrackTds)->tof1Momentum().x();
00261 Double_t m1y = (*extTrackTds)->tof1Momentum().y();
00262 Double_t m1z = (*extTrackTds)->tof1Momentum().z();
00263
00264 TString v1s = (*extTrackTds)->tof1VolumeName() ;
00265 Int_t v1n = (*extTrackTds)->tof1VolumeNumber() ;
00266 Double_t tof1= (*extTrackTds)->tof1();
00267 Double_t tof1p = (*extTrackTds)->tof1Path();
00268 Double_t z1 = (*extTrackTds)->tof1PosSigmaAlongZ();
00269 Double_t t1 = (*extTrackTds)->tof1PosSigmaAlongT();
00270 Double_t x1 = (*extTrackTds)->tof1PosSigmaAlongX();
00271 Double_t y1 = (*extTrackTds)->tof1PosSigmaAlongY();
00272 Double_t e1m[6][6];
00273 HepSymMatrix e1mTds = (*extTrackTds)->tof1ErrorMatrix();
00274 for (int i = 0;i<6 ;i++ )
00275 for (int j= 0;j<6 ;j++ )
00276 e1m[i][j] = e1mTds[i][j];
00277
00278
00279 Double_t p2x = (*extTrackTds)->tof2Position().x();
00280 Double_t p2y = (*extTrackTds)->tof2Position().y();
00281 Double_t p2z = (*extTrackTds)->tof2Position().z();
00282 Double_t m2x = (*extTrackTds)->tof2Momentum().x();
00283 Double_t m2y = (*extTrackTds)->tof2Momentum().y();
00284 Double_t m2z = (*extTrackTds)->tof2Momentum().z();
00285
00286 TString v2s = (*extTrackTds)->tof2VolumeName() ;
00287 Int_t v2n = (*extTrackTds)->tof2VolumeNumber() ;
00288 Double_t tof2= (*extTrackTds)->tof2();
00289 Double_t tof2p = (*extTrackTds)->tof2Path();
00290 Double_t z2 = (*extTrackTds)->tof2PosSigmaAlongZ();
00291 Double_t t2 = (*extTrackTds)->tof2PosSigmaAlongT();
00292 Double_t x2 = (*extTrackTds)->tof2PosSigmaAlongX();
00293 Double_t y2 = (*extTrackTds)->tof2PosSigmaAlongY();
00294 Double_t e2m[6][6];
00295 HepSymMatrix e2mTds = (*extTrackTds)->tof2ErrorMatrix();
00296 for (int i = 0;i<6 ;i++ )
00297 for (int j= 0;j<6 ;j++ )
00298 e2m[i][j] = e2mTds[i][j];
00299
00300 Double_t pEx = (*extTrackTds)->emcPosition().x();
00301 Double_t pEy = (*extTrackTds)->emcPosition().y();
00302 Double_t pEz = (*extTrackTds)->emcPosition().z();
00303 Double_t mEx = (*extTrackTds)->emcMomentum().x();
00304 Double_t mEy = (*extTrackTds)->emcMomentum().y();
00305 Double_t mEz = (*extTrackTds)->emcMomentum().z();
00306
00307 TString vEs = (*extTrackTds)->emcVolumeName() ;
00308 Int_t vEn = (*extTrackTds)->emcVolumeNumber() ;
00309
00310 Double_t theta = (*extTrackTds)->emcPosSigmaAlongTheta();
00311 Double_t phi = (*extTrackTds)->emcPosSigmaAlongPhi();
00312
00313 Double_t eEm[6][6];
00314 HepSymMatrix eEmTds = (*extTrackTds)->emcErrorMatrix();
00315 for (int i = 0;i<6 ;i++ )
00316 for (int j= 0;j<6 ;j++ )
00317 eEm[i][j] = eEmTds[i][j];
00318 Double_t emcPath=(*extTrackTds)->emcPath();
00319
00320
00321 Double_t pMx = (*extTrackTds)->mucPosition().x();
00322 Double_t pMy = (*extTrackTds)->mucPosition().y();
00323 Double_t pMz = (*extTrackTds)->mucPosition().z();
00324 Double_t mMx = (*extTrackTds)->mucMomentum().x();
00325 Double_t mMy = (*extTrackTds)->mucMomentum().y();
00326 Double_t mMz = (*extTrackTds)->mucMomentum().z();
00327
00328 TString vMs = (*extTrackTds)->mucVolumeName() ;
00329 Int_t vMn = (*extTrackTds)->mucVolumeNumber() ;
00330
00331 Double_t zM = (*extTrackTds)->mucPosSigmaAlongZ();
00332 Double_t tM = (*extTrackTds)->mucPosSigmaAlongT();
00333 Double_t xM = (*extTrackTds)->mucPosSigmaAlongX();
00334 Double_t yM = (*extTrackTds)->mucPosSigmaAlongY();
00335
00336 Double_t eMm[6][6];
00337 HepSymMatrix eMmTds = (*extTrackTds)->mucErrorMatrix();
00338 for (int i = 0;i<6 ;i++ )
00339 for (int j= 0;j<6 ;j++ )
00340 eMm[i][j]= eMmTds[i][j];
00341
00342
00343
00344
00345
00346 TExtTrack *extTrackRoot = new TExtTrack();
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 extTrackRoot->SetTrackId(trackId);
00376
00377 extTrackRoot->SetTof1PositionX(p1x);
00378 extTrackRoot->SetTof1PositionY(p1y);
00379 extTrackRoot->SetTof1PositionZ(p1z);
00380 extTrackRoot->SetTof1MomentumX(m1x);
00381 extTrackRoot->SetTof1MomentumY(m1y);
00382 extTrackRoot->SetTof1MomentumZ(m1z);
00383
00384 extTrackRoot->SetTof1VolumeName(v1s);
00385 extTrackRoot->SetTof1VolumeNumber(v1n);
00386
00387 extTrackRoot->SetTof1(tof1);
00388 extTrackRoot->SetTof1Path(tof1p);
00389
00390 extTrackRoot->SetTof1PosSigmaAlongZ(z1);
00391 extTrackRoot->SetTof1PosSigmaAlongT(t1);
00392 extTrackRoot->SetTof1PosSigmaAlongX(x1);
00393 extTrackRoot->SetTof1PosSigmaAlongY(y1);
00394
00395 extTrackRoot->SetTof1ErrorMatrix(e1m);
00396
00397 extTrackRoot->SetTof2PositionX(p2x);
00398 extTrackRoot->SetTof2PositionY(p2y);
00399 extTrackRoot->SetTof2PositionZ(p2z);
00400 extTrackRoot->SetTof2MomentumX(m2x);
00401 extTrackRoot->SetTof2MomentumY(m2y);
00402 extTrackRoot->SetTof2MomentumZ(m2z);
00403
00404 extTrackRoot->SetTof2VolumeName(v2s);
00405 extTrackRoot->SetTof2VolumeNumber(v2n);
00406
00407 extTrackRoot->SetTof2(tof2);
00408 extTrackRoot->SetTof2Path(tof2p);
00409
00410 extTrackRoot->SetTof2PosSigmaAlongZ(z2);
00411 extTrackRoot->SetTof2PosSigmaAlongT(t2);
00412 extTrackRoot->SetTof2PosSigmaAlongX(x2);
00413 extTrackRoot->SetTof2PosSigmaAlongY(y2);
00414
00415 extTrackRoot->SetTof2ErrorMatrix(e2m);
00416
00417 extTrackRoot->SetEmcPositionX(pEx);
00418 extTrackRoot->SetEmcPositionY(pEy);
00419 extTrackRoot->SetEmcPositionZ(pEz);
00420 extTrackRoot->SetEmcMomentumX(mEx);
00421 extTrackRoot->SetEmcMomentumY(mEy);
00422 extTrackRoot->SetEmcMomentumZ(mEz);
00423
00424 extTrackRoot->SetEmcVolumeName(vEs);
00425 extTrackRoot->SetEmcVolumeNumber(vEn);
00426
00427 extTrackRoot->SetEmcPosSigmaAlongTheta(theta);
00428 extTrackRoot->SetEmcPosSigmaAlongPhi(phi);
00429
00430 extTrackRoot->SetEmcErrorMatrix(eEm);
00431 extTrackRoot->SetEmcPath(emcPath);
00432
00433 extTrackRoot->SetMucPositionX(pMx);
00434 extTrackRoot->SetMucPositionY(pMy);
00435 extTrackRoot->SetMucPositionZ(pMz);
00436 extTrackRoot->SetMucMomentumX(mMx);
00437 extTrackRoot->SetMucMomentumY(mMy);
00438 extTrackRoot->SetMucMomentumZ(mMz);
00439
00440 extTrackRoot->SetMucVolumeName(vMs);
00441 extTrackRoot->SetMucVolumeNumber(vMn);
00442
00443 extTrackRoot->SetMucPosSigmaAlongZ(zM);
00444 extTrackRoot->SetMucPosSigmaAlongT(tM);
00445 extTrackRoot->SetMucPosSigmaAlongX(xM);
00446 extTrackRoot->SetMucPosSigmaAlongY(yM);
00447
00448 extTrackRoot->SetMucErrorMatrix(eMm);
00449
00450 recEvt->addExtTrack(extTrackRoot);
00451 }
00452
00453 return StatusCode::SUCCESS;
00454 }
00455 #endif