1#ifndef MdcKalTrackCnv_CXX
2#define MdcKalTrackCnv_CXX 1
4#include "GaudiKernel/MsgStream.h"
5#include "GaudiKernel/DataObject.h"
6#include "GaudiKernel/ObjectVector.h"
8#include "TClonesArray.h"
21#include "CLHEP/Matrix/Vector.h"
22#include "CLHEP/Matrix/SymMatrix.h"
23#include "CLHEP/Vector/ThreeVector.h"
24#include "CLHEP/Geometry/Point3D.h"
29using CLHEP::HepVector;
30using CLHEP::HepSymMatrix;
37 MsgStream log(
msgSvc(),
"MdcKalTrackCnv");
46 MsgStream log(
msgSvc(),
"MdcKalTrackCnv");
47 log << MSG::DEBUG <<
"MdcKalTrackCnv::TObjectToDataObject" << endreq;
48 StatusCode sc=StatusCode::SUCCESS;
52 refpObject=mdcKalTrackTdsCol;
55 if (!m_mdcKalTrackCol)
return sc;
56 TIter mdcKalTrackIter(m_mdcKalTrackCol);
58 while ((mdcKalTrackRoot = (
TMdcKalTrack*)mdcKalTrackIter.Next())) {
59 std::vector<HepVector> zhelixs;
60 std::vector<HepSymMatrix> zerrors;
61 std::vector<HepPoint3D> pocas;
62 std::vector<HepVector> fhelixs;
63 std::vector<HepSymMatrix> ferrors;
66 HepSymMatrix zerror(5);
69 HepVector zhelix_e(5);
70 HepSymMatrix zerror_e(5);
73 HepVector zhelix_mu(5);
74 HepSymMatrix zerror_mu(5);
77 HepVector zhelix_k(5);
78 HepSymMatrix zerror_k(5);
81 HepVector zhelix_p(5);
82 HepSymMatrix zerror_p(5);
86 HepSymMatrix ferror(5);
88 HepVector fhelix_e(5);
89 HepSymMatrix ferror_e(5);
91 HepVector fhelix_mu(5);
92 HepSymMatrix ferror_mu(5);
94 HepVector fhelix_k(5);
95 HepSymMatrix ferror_k(5);
97 HepVector fhelix_p(5);
98 HepSymMatrix ferror_p(5);
114 log<<MSG::DEBUG<<
"T to DST, poca: "<<poca<<endreq;
116 for (
int i=0; i<5; i++){
117 zhelix[i] = mdcKalTrackRoot->
getZHelix(i);
123 fhelix[i] = mdcKalTrackRoot->
getFHelix(i);
129 for (
int j=0; j<=i; j++){
130 zerror[i][j] = mdcKalTrackRoot->
getZError(i,j);
131 zerror_e[i][j] = mdcKalTrackRoot->
getZErrorE(i,j);
132 zerror_mu[i][j] = mdcKalTrackRoot->
getZErrorMu(i,j);
133 zerror_k[i][j] = mdcKalTrackRoot->
getZErrorK(i,j);
134 zerror_p[i][j] = mdcKalTrackRoot->
getZErrorP(i,j);
136 zerror[j][i] = zerror[i][j];
137 zerror_e[j][i] = zerror_e[i][j];
138 zerror_mu[j][i] = zerror_mu[i][j];
139 zerror_k[j][i] = zerror_k[i][j];
140 zerror_p[j][i] = zerror_p[i][j];
142 ferror[i][j] = mdcKalTrackRoot->
getFError(i,j);
143 ferror_e[i][j] = mdcKalTrackRoot->
getFErrorE(i,j);
144 ferror_mu[i][j] = mdcKalTrackRoot->
getFErrorMu(i,j);
145 ferror_k[i][j] = mdcKalTrackRoot->
getFErrorK(i,j);
146 ferror_p[i][j] = mdcKalTrackRoot->
getFErrorP(i,j);
148 ferror[j][i] = ferror[i][j];
149 ferror_e[j][i] = ferror_e[i][j];
150 ferror_mu[j][i] = ferror_mu[i][j];
151 ferror_k[j][i] = ferror_k[i][j];
152 ferror_p[j][i] = ferror_p[i][j];
157 double dr = zhelix[0];
158 double phi0 = zhelix[1];
159 double kappa = zhelix[2];
160 double dz = zhelix[3];
161 double tanl = zhelix[4];
162 poca[0]=dr*
cos(phi0);
163 poca[1]=dr*
sin(phi0);
171 poca_e[0]=dr*
cos(phi0);
172 poca_e[1]=dr*
sin(phi0);
177 kappa = zhelix_mu[2];
180 poca_mu[0]=dr*
cos(phi0);
181 poca_mu[1]=dr*
sin(phi0);
189 poca_k[0]=dr*
cos(phi0);
190 poca_k[1]=dr*
sin(phi0);
198 poca_p[0]=dr*
cos(phi0);
199 poca_p[1]=dr*
sin(phi0);
203 log<<MSG::DEBUG<<
"T to DST, zhelix: "<<zhelix<<endreq;
204 log<<MSG::DEBUG<<
"T to DST, zerror: "<<zerror<<endreq;
206 zhelixs.push_back(zhelix_e);
207 zhelixs.push_back(zhelix_mu);
208 zhelixs.push_back(zhelix);
209 zhelixs.push_back(zhelix_k);
210 zhelixs.push_back(zhelix_p);
211 zerrors.push_back(zerror_e);
212 zerrors.push_back(zerror_mu);
213 zerrors.push_back(zerror);
214 zerrors.push_back(zerror_k);
215 zerrors.push_back(zerror_p);
217 fhelixs.push_back(fhelix_e);
218 fhelixs.push_back(fhelix_mu);
219 fhelixs.push_back(fhelix);
220 fhelixs.push_back(fhelix_k);
221 fhelixs.push_back(fhelix_p);
222 ferrors.push_back(ferror_e);
223 ferrors.push_back(ferror_mu);
224 ferrors.push_back(ferror);
225 ferrors.push_back(ferror_k);
226 ferrors.push_back(ferror_p);
228 pocas.push_back(poca_e);
229 pocas.push_back(poca_mu);
230 pocas.push_back(poca);
231 pocas.push_back(poca_k);
232 pocas.push_back(poca_p);
234 for(
int m=0; m<5; m++){
236 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.);
238 phi0 = zhelixs[m][1];
239 kappa = zhelixs[m][2];
241 tanl = zhelixs[m][4];
253 if (kappa > 0.0000000001)
255 else if (kappa < -0.0000000001)
260 if(kappa!=0) pxy = 1.0/fabs(kappa);
263 px = pxy * (-
sin(phi0));
264 py = pxy *
cos(phi0);
266 ptot = sqrt(px*px+py*py+pz*pz);
269 mdcKalTrackTds->
setPxy(pxy,m);
270 mdcKalTrackTds->
setPx(px,m);
271 mdcKalTrackTds->
setPy(py,m);
272 mdcKalTrackTds->
setPz(pz,m);
273 mdcKalTrackTds->
setP(ptot,m);
274 mdcKalTrackTds->
setTheta(acos(pz/ptot),m);
275 mdcKalTrackTds->
setPhi(atan2(py,px),m);
276 mdcKalTrackTds->
setX(
x,m);
277 mdcKalTrackTds->
setY(
y,m);
278 mdcKalTrackTds->
setZ(z,m);
279 mdcKalTrackTds->
setR(sqrt(
x*
x+
y*
y),m);
290 for(
int jj=0; jj<5; jj++){
291 mdcKalTrackTds->
setZHelix(zhelixs[jj],jj);
292 mdcKalTrackTds->
setZError(zerrors[jj],jj);
293 mdcKalTrackTds->
setFHelix(fhelixs[jj],jj);
294 mdcKalTrackTds->
setFError(ferrors[jj],jj);
295 mdcKalTrackTds->
setPoca(pocas[jj],jj);
298 mdcKalTrackTdsCol->push_back(mdcKalTrackTds);
301 delete m_mdcKalTrackCol;
302 m_mdcKalTrackCol = 0;
303 return StatusCode::SUCCESS;
308 MsgStream log(
msgSvc(),
"MdcKalTrackCnv");
309 log << MSG::DEBUG <<
"MdcKalTrackCnv::DataObjectToTObject" << endreq;
310 StatusCode sc=StatusCode::SUCCESS;
314 if (!mdcKalTrackColTds) {
315 log << MSG::ERROR <<
"Could not downcast to DstMdcKalTrackCol" << endreq;
316 return StatusCode::FAILURE;
322 log << MSG::ERROR <<
"Could not get ReconEvent in TDS " << endreq;
323 return StatusCode::FAILURE;
328 log << MSG::ERROR <<
"MdcKalTrackCnv:Could not downcast to TDS Dst Event" << endreq;
330 IOpaqueAddress *addr;
337 if (!m_mdcKalTrackCol)
return sc;
340 DstMdcKalTrackCol::const_iterator mdcKalTrackTds;
342 for (mdcKalTrackTds = mdcKalTrackColTds->begin(); mdcKalTrackTds != mdcKalTrackColTds->end(); mdcKalTrackTds++) {
348 Double_t zerror[5][5];
351 Double_t zhelix_e[5];
352 Double_t zerror_e[5][5];
355 Double_t zhelix_mu[5];
356 Double_t zerror_mu[5][5];
359 Double_t zhelix_k[5];
360 Double_t zerror_k[5][5];
363 Double_t zhelix_p[5];
364 Double_t zerror_p[5][5];
367 Double_t ferror[5][5];
368 Double_t fhelix_e[5];
369 Double_t ferror_e[5][5];
370 Double_t fhelix_mu[5];
371 Double_t ferror_mu[5][5];
372 Double_t fhelix_k[5];
373 Double_t ferror_k[5][5];
374 Double_t fhelix_p[5];
375 Double_t ferror_p[5][5];
381 for(
int k=0; k<5; k++){
382 mdcKalTrackRoot->
setStat((*mdcKalTrackTds)->getStat(k),k);
384 mdcKalTrackRoot->
setChisq((*mdcKalTrackTds)->getChisq(k),k);
385 mdcKalTrackRoot->
setNdf((*mdcKalTrackTds)->getNdf(k),k);
386 mdcKalTrackRoot->
setNlayer((*mdcKalTrackTds)->getNlayer(k),k);
393 HepVector h_zhelix = (*mdcKalTrackTds)->
getZHelix(2);
394 HepSymMatrix h_zerror = (*mdcKalTrackTds)->getZError(2);
397 HepVector h_zhelix_e = (*mdcKalTrackTds)->getZHelix(0);
398 HepSymMatrix h_zerror_e = (*mdcKalTrackTds)->getZError(0);
401 HepVector h_zhelix_mu = (*mdcKalTrackTds)->getZHelix(1);
402 HepSymMatrix h_zerror_mu = (*mdcKalTrackTds)->getZError(1);
405 HepVector h_zhelix_k = (*mdcKalTrackTds)->getZHelix(3);
406 HepSymMatrix h_zerror_k = (*mdcKalTrackTds)->getZError(3);
409 HepVector h_zhelix_p = (*mdcKalTrackTds)->getZHelix(4);
410 HepSymMatrix h_zerror_p = (*mdcKalTrackTds)->getZError(4);
412 HepVector h_fhelix = (*mdcKalTrackTds)->getFHelix(2);
413 HepSymMatrix h_ferror = (*mdcKalTrackTds)->getFError(2);
414 HepVector h_fhelix_e = (*mdcKalTrackTds)->getFHelix(0);
415 HepSymMatrix h_ferror_e = (*mdcKalTrackTds)->getFError(0);
416 HepVector h_fhelix_mu = (*mdcKalTrackTds)->getFHelix(1);
417 HepSymMatrix h_ferror_mu = (*mdcKalTrackTds)->getFError(1);
418 HepVector h_fhelix_k = (*mdcKalTrackTds)->getFHelix(3);
419 HepSymMatrix h_ferror_k = (*mdcKalTrackTds)->getFError(3);
420 HepVector h_fhelix_p = (*mdcKalTrackTds)->getFHelix(4);
421 HepSymMatrix h_ferror_p = (*mdcKalTrackTds)->getFError(4);
423 mdcKalTrackRoot->
setTrackId((*mdcKalTrackTds)->getTrackId());
435 for (
int i=0; i<5; i++){
436 zhelix[i] = h_zhelix[i];
437 zhelix_e[i] = h_zhelix_e[i];
438 zhelix_mu[i] = h_zhelix_mu[i];
439 zhelix_p[i] = h_zhelix_p[i];
440 zhelix_k[i] = h_zhelix_k[i];
441 fhelix[i] = h_fhelix[i];
442 fhelix_e[i] = h_fhelix_e[i];
443 fhelix_mu[i] = h_fhelix_mu[i];
444 fhelix_p[i] = h_fhelix_p[i];
445 fhelix_k[i] = h_fhelix_k[i];
446 for (
int j=0; j<=i; j++){
447 zerror[i][j] = h_zerror[i][j];
448 zerror_e[i][j] = h_zerror_e[i][j];
449 zerror_mu[i][j] = h_zerror_mu[i][j];
450 zerror_p[i][j] = h_zerror_p[i][j];
451 zerror_k[i][j] = h_zerror_k[i][j];
452 zerror[j][i] = h_zerror[i][j];
453 zerror_e[j][i] = h_zerror_e[i][j];
454 zerror_mu[j][i] = h_zerror_mu[i][j];
455 zerror_p[j][i] = h_zerror_p[i][j];
456 zerror_k[j][i] = h_zerror_k[i][j];
457 ferror[i][j] = h_ferror[i][j];
458 ferror_e[i][j] = h_ferror_e[i][j];
459 ferror_mu[i][j] = h_ferror_mu[i][j];
460 ferror_p[i][j] = h_ferror_p[i][j];
461 ferror_k[i][j] = h_ferror_k[i][j];
462 ferror[j][i] = h_ferror[i][j];
463 ferror_e[j][i] = h_ferror_e[i][j];
464 ferror_mu[j][i] = h_ferror_mu[i][j];
465 ferror_p[j][i] = h_ferror_p[i][j];
466 ferror_k[j][i] = h_ferror_k[i][j];
508 return StatusCode::SUCCESS;
double sin(const BesAngle a)
double cos(const BesAngle a)
ObjectVector< DstMdcKalTrack > DstMdcKalTrackCol
static TDstEvent * getWriteObject()
returns object to be written (maintained here for all DIGI-converters)
void setFHelix(const HepVector &fhelix, const int pid)
void setPhi(const double phi, const int pid)
void setStat(int stat, int i, int pid)
void setY(const double y, const int pid)
void setPz(const double pz, const int pid)
void setChisq(double chisq, int i, int pid)
void setZError(const HepSymMatrix &error, const int pid)
void setX(const double x, const int pid)
void setP(const double p, const int pid)
void setPoca(const HepPoint3D &poca, const int pid)
void setPx(const double px, const int pid)
void setZ(const double z, const int pid)
void setTheta(const double theta, const int pid)
void setR(const double r, const int pid)
void setPxy(const double pxy, const int pid)
void setPy(const double py, const int pid)
void setFError(const HepSymMatrix &ferror, const int pid)
void setTrackId(int trackId)
void setZHelix(const HepVector &helix, const int pid)
void setCharge(const int charge, const int pid)
void setNdf(int ndf, int i, int pid)
void setNlayer(int nlayer, int pid)
MdcKalTrackCnv(ISvcLocator *svc)
virtual StatusCode TObjectToDataObject(DataObject *&obj)
transformation from root
virtual StatusCode DataObjectToTObject(DataObject *obj, RootAddress *addr)
transformation to root
const HepVector & getZHelix() const
int getStat(int i, int pid) const
Definition of a Root address, derived from IOpaqueAddress.
Base class for all Root Converters.
std::vector< void * > m_adresses
each converter knows the corresponding adresses
IDataProviderSvc * m_eds
pointer to eventdataservice
std::string m_rootBranchname
root branchname (may be concatenated of severals)
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)
Convert the transient object to the requested representation.
void clearMdcKalTrackCol()
const TObjArray * getMdcKalTrackCol() const
void addMdcKalTrack(TMdcKalTrack *Track)
void setNdf(const Int_t ndf, const Int_t pid)
Double_t getFErrorE(Int_t i, Int_t j) const
Double_t getFHelix(Int_t i) const
void setZErrorMu(const Double_t zerror_mu[5][5])
void setZHelixK(const Double_t zhelix_k[5])
void setFHelix(const Double_t fhelix[5])
void setFErrorP(const Double_t ferror_p[5][5])
Double_t getZErrorP(Int_t i, Int_t j) const
void setZError(const Double_t zerror[5][5])
Double_t getZHelix(Int_t i) const
void setFHelixE(const Double_t fhelix_e[5])
void setChisq(const Double_t chisq, const Int_t pid)
void setFHelixMu(const Double_t fhelix_mu[5])
Double_t getFHelixMu(Int_t i) const
Double_t getFHelixK(Int_t i) const
Double_t getZErrorE(Int_t i, Int_t j) const
void setZErrorP(const Double_t zerror_p[5][5])
Int_t getStat(const Int_t pid) const
void setZErrorE(const Double_t zerror_e[5][5])
void setZHelixE(const Double_t zhelix_e[5])
Double_t getFErrorK(Int_t i, Int_t j) const
Int_t getNdf(const Int_t pid) const
void setZErrorK(const Double_t zerror_k[5][5])
Double_t getZError(Int_t i, Int_t j) const
Int_t getNlayer(const Int_t pid) const
void setFHelixK(const Double_t fhelix_k[5])
void setFHelixP(const Double_t fhelix_p[5])
Double_t getFErrorP(Int_t i, Int_t j) const
Double_t getChisq(const Int_t pid) const
Double_t getZHelixK(Int_t i) const
void setZHelix(const Double_t zhelix[5])
void setNlayer(const Int_t nlayer, const Int_t pid)
void setZHelixMu(const Double_t zhelix_mu[5])
void setFErrorMu(const Double_t ferror_mu[5][5])
Double_t getFHelixP(Int_t i) const
Double_t getFHelixE(Int_t i) const
void setFErrorK(const Double_t ferror_k[5][5])
Double_t getZHelixMu(Int_t i) const
Double_t getZHelixE(Int_t i) const
Double_t getFError(Int_t i, Int_t j) const
void setTrackId(const Int_t trackId)
void setStat2(const Int_t stat, const Int_t pid)
Double_t getZHelixP(Int_t i) const
void setZHelixP(const Double_t zhelix_p[5])
Int_t getStat2(const Int_t pid) const
void setFError(const Double_t ferror[5][5])
Double_t getFErrorMu(Int_t i, Int_t j) const
Double_t getZErrorK(Int_t i, Int_t j) const
void setStat(const Int_t stat, const Int_t pid)
void setFErrorE(const Double_t ferror_e[5][5])
Double_t getZErrorMu(Int_t i, Int_t j) const
static std::map< const TObject *, const DstMdcKalTrack * > m_rootMdcKalTrackMap
_EXTERN_ std::string Event