File indexing completed on 2025-08-03 08:15:04
0001 #include "SVReco.h"
0002
0003
0004
0005 #include <trackbase_historic/SvtxTrack.h>
0006 #include <trackbase_historic/SvtxTrack_v1.h>
0007 #include <trackbase_historic/SvtxTrackState_v1.h>
0008 #include <trackbase_historic/SvtxVertex.h>
0009 #include <trackbase_historic/SvtxVertex_v1.h>
0010 #include <trackbase_historic/SvtxTrackMap.h>
0011 #include <trackbase_historic/SvtxVertexMap.h>
0012
0013 #include <trackbase/TrkrClusterContainer.h>
0014 #include <trackbase/TrkrClusterv1.h>
0015 #include <trackbase/TrkrHitSet.h>
0016 #include <trackbase/TrkrHitSetContainer.h>
0017 #include <trackbase/TrkrClusterHitAssoc.h>
0018 #include <mvtx/MvtxDefs.h>
0019 #include <intt/InttDefs.h>
0020
0021 #include <g4jets/JetMap.h>
0022
0023 #include <fun4all/Fun4AllReturnCodes.h>
0024 #include <fun4all/PHTFileServer.h>
0025
0026
0027 #include <g4detectors/PHG4Cell.h>
0028 #include <g4detectors/PHG4CylinderGeomContainer.h>
0029 #include <mvtx/CylinderGeom_Mvtx.h>
0030 #include <intt/CylinderGeomIntt.h>
0031
0032 #include <g4main/PHG4Hit.h>
0033 #include <g4main/PHG4HitContainer.h>
0034 #include <g4main/PHG4TruthInfoContainer.h>
0035 #include <g4main/PHG4Particle.h>
0036
0037 #include <phgenfit/Fitter.h>
0038 #include <phgenfit/PlanarMeasurement.h>
0039 #include <phgenfit/Track.h>
0040 #include <phgenfit/SpacepointMeasurement.h>
0041
0042 #include <phool/getClass.h>
0043 #include <phool/phool.h>
0044 #include <phool/PHCompositeNode.h>
0045 #include <phool/PHIODataNode.h>
0046 #include <phool/PHNodeIterator.h>
0047
0048 #include <phgeom/PHGeomUtility.h>
0049 #include <phfield/PHFieldUtility.h>
0050
0051 #include <GenFit/FieldManager.h>
0052 #include <GenFit/GFRaveVertex.h>
0053 #include <GenFit/GFRaveVertexFactory.h>
0054 #include <GenFit/MeasuredStateOnPlane.h>
0055 #include <GenFit/RKTrackRep.h>
0056 #include <GenFit/StateOnPlane.h>
0057 #include <GenFit/Track.h>
0058 #include <GenFit/KalmanFitterInfo.h>
0059
0060
0061
0062 #include <TClonesArray.h>
0063 #include <TMatrixDSym.h>
0064 #include <TTree.h>
0065 #include <TVector3.h>
0066 #include <TRandom3.h>
0067 #include <TRotation.h>
0068
0069 #include <iostream>
0070 #include <utility>
0071 #include <memory>
0072
0073 #define LogDebug(exp) std::cout<<"DEBUG: " <<__FILE__<<": "<<__LINE__<<": "<< exp <<std::endl
0074 #define LogError(exp) std::cout<<"ERROR: " <<__FILE__<<": "<<__LINE__<<": "<< exp <<std::endl
0075 #define LogWarning(exp) std::cout<<"WARNING: "<<__FILE__<<": "<<__LINE__<<": "<< exp <<std::endl
0076
0077 using namespace std;
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092 SVReco::SVReco(const string &name) :
0093 _mag_field_file_name("/phenix/upgrades/decadal/fieldmaps/sPHENIX.2d.root"),
0094 _mag_field_re_scaling_factor(1.4 / 1.5),
0095 _reverse_mag_field(false),
0096 _fitter(NULL),
0097 _track_fitting_alg_name("DafRef"),
0098 _n_maps_layer(3),
0099 _n_intt_layer(4),
0100 _primary_pid_guess(11),
0101 _cut_Ncluster(false),
0102 _cut_min_pT(0.1),
0103 _cut_dca(5.0),
0104 _cut_chi2_ndf(5),
0105 _use_ladder_geom(false),
0106 _vertex_finder(NULL),
0107 _vertexing_method("avf-smoothing:1"),
0108 _clustermap(NULL),
0109 _trackmap(NULL),
0110 _vertexmap(NULL),
0111 _do_eval(false),
0112 _verbosity(10),
0113 _do_evt_display(false)
0114 {
0115
0116 }
0117
0118
0119 int SVReco::InitEvent(PHCompositeNode *topNode) {
0120 cout<<"getting SVR nodes"<<endl;
0121 GetNodes(topNode);
0122
0123
0124 for(auto p : _main_rf_phgf_tracks) delete p;
0125 _main_rf_phgf_tracks.clear();
0126
0127 _svtxtrk_gftrk_map.clear();
0128 _svtxtrk_wt_map.clear();
0129 _svtxtrk_id.clear();
0130
0131
0132 cout<<"start SVR track loop"<<endl;
0133 for (SvtxTrackMap::Iter iter = _trackmap->begin(); iter != _trackmap->end();
0134 ++iter) {
0135 SvtxTrack* svtx_track = iter->second;
0136
0137 if (!svtx_track || svtx_track->get_ndf()<40 || svtx_track->get_pt()<_cut_min_pT ||
0138 (svtx_track->get_chisq()/svtx_track->get_ndf())>_cut_chi2_ndf ||
0139 fabs(svtx_track->get_dca3d_xy())>_cut_dca || fabs(svtx_track->get_dca3d_z())>_cut_dca)
0140 continue;
0141
0142 int n_MVTX = 0, n_INTT = 0, n_TPC = 0;
0143
0144 for (SvtxTrack::ConstClusterKeyIter iter2 = svtx_track->begin_cluster_keys(); iter2!=svtx_track->end_cluster_keys(); iter2++) {
0145 TrkrDefs::cluskey cluster_key = *iter2;
0146
0147
0148 float layer = (float) TrkrDefs::getLayer(cluster_key);
0149 if (layer<_n_maps_layer) n_MVTX++;
0150 else if (layer<_n_maps_layer+_n_intt_layer) n_INTT++;
0151 else n_TPC++;
0152 }
0153
0154
0155 if ( _cut_Ncluster && (n_MVTX<2 || n_INTT<2 || n_TPC<25) ){
0156 continue;
0157 }
0158
0159
0160
0161 PHGenFit::Track* rf_phgf_track = MakeGenFitTrack(svtx_track);
0162
0163
0164 if (rf_phgf_track) {
0165
0166
0167 _svtxtrk_id.push_back(svtx_track->get_id());
0168 _svtxtrk_gftrk_map[svtx_track->get_id()] = _main_rf_phgf_tracks.size();
0169 _main_rf_phgf_tracks.push_back(rf_phgf_track);
0170 }
0171 }
0172 cout<<"exit track loop ntracks="<<_main_rf_phgf_tracks.size()<<'\n';
0173
0174 return Fun4AllReturnCodes::EVENT_OK;
0175 }
0176
0177 PHGenFit::Track* SVReco::getPHGFTrack(SvtxTrack* svtxtrk){
0178 if(svtxtrk)return _main_rf_phgf_tracks[_svtxtrk_gftrk_map[svtxtrk->get_id()]];
0179 else return NULL;
0180 }
0181
0182
0183 int SVReco::InitRun(PHCompositeNode *topNode) {
0184
0185 CreateNodes(topNode);
0186
0187 TGeoManager* tgeo_manager = PHGeomUtility::GetTGeoManager(topNode);
0188 PHField * field = PHFieldUtility::GetFieldMapNode(nullptr, topNode);
0189
0190 _fitter = PHGenFit::Fitter::getInstance(tgeo_manager, field,
0191 _track_fitting_alg_name, "RKTrackRep", _do_evt_display);
0192
0193 if (!_fitter) {
0194 cerr << PHWHERE << endl;
0195 return Fun4AllReturnCodes::ABORTRUN;
0196 }
0197
0198 _vertex_finder = new genfit::GFRaveVertexFactory(_verbosity);
0199 _vertex_finder->setMethod(_vertexing_method.data());
0200
0201 if (!_vertex_finder) {
0202 std::cerr<< PHWHERE<<" bad run init no SVR"<<endl;
0203 return Fun4AllReturnCodes::ABORTRUN;
0204 }
0205
0206 return Fun4AllReturnCodes::EVENT_OK;
0207 }
0208
0209
0210 genfit::GFRaveVertex* SVReco::findSecondaryVertex(SvtxTrack* track1, SvtxTrack* track2) {
0211
0212 _vertex_finder->setMethod("avr");
0213
0214
0215 vector<genfit::GFRaveVertex*> rave_vertices_conversion;
0216 vector<genfit::Track*> rf_gf_tracks_conversion;
0217
0218 if (_svtxtrk_gftrk_map.find(track1->get_id())!=_svtxtrk_gftrk_map.end()&&
0219 _svtxtrk_gftrk_map.find(track2->get_id())!=_svtxtrk_gftrk_map.end())
0220 {
0221 unsigned int trk_index = _svtxtrk_gftrk_map[track1->get_id()];
0222 PHGenFit::Track* rf_phgf_track = _main_rf_phgf_tracks[trk_index];
0223 rf_gf_tracks_conversion.push_back(rf_phgf_track->getGenFitTrack());
0224
0225
0226
0227
0228
0229 trk_index = _svtxtrk_gftrk_map[track2->get_id()];
0230 rf_phgf_track = _main_rf_phgf_tracks[trk_index];
0231
0232
0233 rf_gf_tracks_conversion.push_back(rf_phgf_track->getGenFitTrack());
0234 }
0235 if (rf_gf_tracks_conversion.size()>1){
0236 try{
0237 _vertex_finder->findVertices(&rave_vertices_conversion, rf_gf_tracks_conversion);
0238 }catch (...){
0239 std::cout << PHWHERE << "GFRaveVertexFactory::findVertices failed!";
0240 }
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250 if(rave_vertices_conversion.size()>0) return rave_vertices_conversion[0];
0251 else return NULL;
0252 }
0253 else return NULL;
0254 }
0255
0256 SVReco::~SVReco(){
0257 cout<<PHWHERE<<"delete"<<endl;
0258 if(_fitter){
0259 delete _fitter;
0260 _fitter=NULL;
0261 }
0262 cout<<PHWHERE<<"delete"<<endl;
0263 if(_vertex_finder){
0264 delete _vertex_finder;
0265 _vertex_finder=NULL;
0266 }
0267 cout<<PHWHERE<<"delete"<<endl;
0268 for (std::vector<PHGenFit::Track*>::iterator i = _main_rf_phgf_tracks.begin(); i != _main_rf_phgf_tracks.end(); ++i)
0269 {
0270 if(*i)
0271 delete *i;
0272 *i=NULL;
0273 }
0274 }
0275
0276
0277 void SVReco::printGenFitTrackKinematics(PHGenFit::Track* track){
0278
0279 TVector3 vertex_position(0, 0, 0);
0280
0281 std::shared_ptr<genfit::MeasuredStateOnPlane> gf_state_vertex_ca = NULL;
0282 try {
0283 gf_state_vertex_ca = std::shared_ptr < genfit::MeasuredStateOnPlane> (track->extrapolateToPoint(vertex_position));
0284 } catch (...) {
0285 if (_verbosity >= 2)
0286 LogWarning("extrapolateToPoint failed!");
0287 }
0288 TVector3 mom = gf_state_vertex_ca->getMom();
0289 TMatrixDSym cov = gf_state_vertex_ca->get6DCov();
0290
0291 cout << "OUT Ex: " << sqrt(cov[0][0]) << ", Ey: " << sqrt(cov[1][1]) << ", Ez: " << sqrt(cov[2][2]) << endl;
0292 cout << "OUT Px: " << mom.X() << ", Py: " << mom.Y() << ", Pz: " << mom.Z() << endl;
0293 }
0294
0295
0296
0297
0298 void SVReco::reset_eval_variables(){
0299 gf_prim_vtx_ntrk = rv_prim_vtx_ntrk = 0;
0300 for (int i=0; i<3; i++){
0301 gf_prim_vtx[i] = gf_prim_vtx_err[i] = -999;
0302 rv_prim_vtx[i] = rv_prim_vtx_err[i] = -999;
0303 }
0304
0305 rv_sv_njets = 0;
0306
0307 for (int ijet=0; ijet<10; ijet++){
0308 rv_sv_jet_id[ijet] = -999;
0309 rv_sv_jet_prop[ijet][0] = rv_sv_jet_prop[ijet][1] = -999;
0310 rv_sv_jet_pT[ijet] = -999;
0311 rv_sv_jet_px[ijet] = rv_sv_jet_py[ijet] = rv_sv_jet_pz[ijet] = -999;
0312
0313 rv_sv_pT00_nvtx[ijet] = rv_sv_pT05_nvtx[ijet] = rv_sv_pT10_nvtx[ijet] = rv_sv_pT15_nvtx[ijet] = 0;
0314
0315 for (int ivtx=0; ivtx<30; ivtx++){
0316 rv_sv_pT00_vtx_ntrk[ijet][ivtx] = rv_sv_pT05_vtx_ntrk[ijet][ivtx] = rv_sv_pT10_vtx_ntrk[ijet][ivtx] = rv_sv_pT15_vtx_ntrk[ijet][ivtx] = 0;
0317 rv_sv_pT00_vtx_ntrk_good[ijet][ivtx] = rv_sv_pT05_vtx_ntrk_good[ijet][ivtx] = rv_sv_pT10_vtx_ntrk_good[ijet][ivtx] = rv_sv_pT15_vtx_ntrk_good[ijet][ivtx] = 0;
0318 rv_sv_pT00_vtx_ntrk_good_pv[ijet][ivtx] = rv_sv_pT05_vtx_ntrk_good_pv[ijet][ivtx] = rv_sv_pT10_vtx_ntrk_good_pv[ijet][ivtx] = rv_sv_pT15_vtx_ntrk_good_pv[ijet][ivtx] = 0;
0319
0320 rv_sv_pT00_vtx_mass[ijet][ivtx] = rv_sv_pT00_vtx_mass_corr[ijet][ivtx] = rv_sv_pT00_vtx_pT[ijet][ivtx] = -999;
0321 rv_sv_pT05_vtx_mass[ijet][ivtx] = rv_sv_pT05_vtx_mass_corr[ijet][ivtx] = rv_sv_pT05_vtx_pT[ijet][ivtx] = -999;
0322 rv_sv_pT10_vtx_mass[ijet][ivtx] = rv_sv_pT10_vtx_mass_corr[ijet][ivtx] = rv_sv_pT10_vtx_pT[ijet][ivtx] = -999;
0323 rv_sv_pT15_vtx_mass[ijet][ivtx] = rv_sv_pT15_vtx_mass_corr[ijet][ivtx] = rv_sv_pT15_vtx_pT[ijet][ivtx] = -999;
0324
0325 rv_sv_pT00_vtx_x[ijet][ivtx] = rv_sv_pT00_vtx_y[ijet][ivtx] = rv_sv_pT00_vtx_z[ijet][ivtx] = -999;
0326 rv_sv_pT00_vtx_ex[ijet][ivtx] = rv_sv_pT00_vtx_ey[ijet][ivtx] = rv_sv_pT00_vtx_ez[ijet][ivtx] = -999;
0327 rv_sv_pT05_vtx_x[ijet][ivtx] = rv_sv_pT05_vtx_y[ijet][ivtx] = rv_sv_pT05_vtx_z[ijet][ivtx] = -999;
0328 rv_sv_pT05_vtx_ex[ijet][ivtx] = rv_sv_pT05_vtx_ey[ijet][ivtx] = rv_sv_pT05_vtx_ez[ijet][ivtx] = -999;
0329 rv_sv_pT10_vtx_x[ijet][ivtx] = rv_sv_pT10_vtx_y[ijet][ivtx] = rv_sv_pT10_vtx_z[ijet][ivtx] = -999;
0330 rv_sv_pT10_vtx_ex[ijet][ivtx] = rv_sv_pT10_vtx_ey[ijet][ivtx] = rv_sv_pT10_vtx_ez[ijet][ivtx] = -999;
0331 rv_sv_pT15_vtx_x[ijet][ivtx] = rv_sv_pT15_vtx_y[ijet][ivtx] = rv_sv_pT15_vtx_z[ijet][ivtx] = -999;
0332 rv_sv_pT15_vtx_ex[ijet][ivtx] = rv_sv_pT15_vtx_ey[ijet][ivtx] = rv_sv_pT15_vtx_ez[ijet][ivtx] = -999;
0333
0334 rv_sv_pT00_vtx_jet_theta[ijet][ivtx] = rv_sv_pT00_vtx_pT[ijet][ivtx] = -999;
0335 rv_sv_pT05_vtx_jet_theta[ijet][ivtx] = rv_sv_pT05_vtx_pT[ijet][ivtx] = -999;
0336 rv_sv_pT10_vtx_jet_theta[ijet][ivtx] = rv_sv_pT10_vtx_pT[ijet][ivtx] = -999;
0337 rv_sv_pT15_vtx_jet_theta[ijet][ivtx] = rv_sv_pT15_vtx_pT[ijet][ivtx] = -999;
0338
0339 rv_sv_pT00_vtx_chi2[ijet][ivtx] = rv_sv_pT00_vtx_ndf[ijet][ivtx] = -999;
0340 rv_sv_pT05_vtx_chi2[ijet][ivtx] = rv_sv_pT05_vtx_ndf[ijet][ivtx] = -999;
0341 rv_sv_pT10_vtx_chi2[ijet][ivtx] = rv_sv_pT10_vtx_ndf[ijet][ivtx] = -999;
0342 rv_sv_pT15_vtx_chi2[ijet][ivtx] = rv_sv_pT15_vtx_ndf[ijet][ivtx] = -999;
0343
0344 }
0345 }
0346
0347 return;
0348 }
0349
0350 int SVReco::CreateNodes(PHCompositeNode *topNode){
0351
0352 return Fun4AllReturnCodes::EVENT_OK;
0353 }
0354
0355
0356
0357
0358
0359 int SVReco::GetNodes(PHCompositeNode * topNode){
0360 _clustermap = findNode::getClass<TrkrClusterContainer>(topNode, "TRKR_CLUSTER");
0361 if (!_clustermap){
0362 cout << PHWHERE << " TRKR_CLUSTERS node not found on node tree"
0363 << endl;
0364 return Fun4AllReturnCodes::ABORTEVENT;
0365 }
0366
0367 _trackmap = findNode::getClass<SvtxTrackMap>(topNode, "SvtxTrackMap");
0368 if (!_trackmap){
0369 cout << PHWHERE << " SvtxTrackMap node not found on node tree"
0370 << endl;
0371 return Fun4AllReturnCodes::ABORTEVENT;
0372 }
0373
0374 _vertexmap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0375 if (!_vertexmap){
0376 cout << PHWHERE << " SvtxVertexrMap node not found on node tree"
0377 << endl;
0378 return Fun4AllReturnCodes::ABORTEVENT;
0379 }
0380
0381 _geom_container_intt = findNode::getClass<PHG4CylinderGeomContainer>(topNode, "CYLINDERGEOM_INTT");
0382 if (!_geom_container_intt)
0383 {
0384 cout << PHWHERE << "CYLINDERGEOM_INTT node not found on node tree"
0385 << endl;
0386 return Fun4AllReturnCodes::ABORTEVENT;
0387 }
0388 _geom_container_maps = findNode::getClass<PHG4CylinderGeomContainer>(topNode, "CYLINDERGEOM_MVTX");
0389 if (!_geom_container_maps)
0390 {
0391 cout << PHWHERE << "CYLINDERGEOM_MVTX node not found on node tree"
0392 << endl;
0393 return Fun4AllReturnCodes::ABORTEVENT;
0394 }
0395 if(!_vertex_finder){
0396 std::cerr<< PHWHERE<<" bad run init no SVR"<<endl;
0397 return Fun4AllReturnCodes::ABORTRUN;
0398 }
0399
0400
0401 return Fun4AllReturnCodes::EVENT_OK;
0402 }
0403
0404
0405 PHGenFit::Track* SVReco::MakeGenFitTrack(const SvtxTrack* intrack){
0406 if (!intrack){
0407 cerr << PHWHERE << " Input SvtxTrack is NULL!" << endl;
0408 return NULL;
0409 }
0410
0411 if (_use_ladder_geom and !_geom_container_intt and !_geom_container_maps) {
0412 cout << PHWHERE << "No PHG4CylinderGeomContainer found!" << endl;
0413 return NULL;
0414 }
0415
0416 TVector3 seed_pos(intrack->get_x(), intrack->get_y(), intrack->get_z());
0417 TVector3 seed_mom(intrack->get_px(), intrack->get_py(), intrack->get_pz());
0418 TMatrixDSym seed_cov(6);
0419 for (int i=0; i<6; i++){
0420 for (int j=0; j<6; j++){
0421 seed_cov[i][j] = intrack->get_error(i,j);
0422 }
0423 }
0424
0425
0426 std::vector<PHGenFit::Measurement*> measurements;
0427
0428 for (auto iter = intrack->begin_cluster_keys(); iter != intrack->end_cluster_keys(); ++iter){
0429
0430 TrkrCluster* cluster = _clustermap->findCluster(*iter);
0431 if (!cluster) {
0432 LogError("No cluster Found!");
0433 continue;
0434 }
0435 float x = cluster->getPosition(0);
0436 float y = cluster->getPosition(1);
0437 float radius = sqrt(x*x+y*y);
0438 TVector3 pos(cluster->getPosition(0), cluster->getPosition(1), cluster->getPosition(2));
0439 seed_mom.SetPhi(pos.Phi());
0440 seed_mom.SetTheta(pos.Theta());
0441
0442 TVector3 n(cluster->getPosition(0), cluster->getPosition(1), 0);
0443
0444
0445 if (_use_ladder_geom){
0446 unsigned int trkrid = TrkrDefs::getTrkrId(*iter);
0447 unsigned int layer = TrkrDefs::getLayer(*iter);
0448 if (trkrid == TrkrDefs::mvtxId) {
0449 int stave_index = MvtxDefs::getStaveId(*iter);
0450 int chip_index = MvtxDefs::getChipId(*iter);
0451
0452 double ladder_location[3] = { 0.0, 0.0, 0.0 };
0453
0454 CylinderGeom_Mvtx *geom = (CylinderGeom_Mvtx*) _geom_container_maps->GetLayerGeom(layer);
0455
0456 geom->find_sensor_center(stave_index, 0, 0, chip_index, ladder_location);
0457 n.SetXYZ(ladder_location[0], ladder_location[1], 0);
0458 n.RotateZ(geom->get_stave_phi_tilt());
0459 }
0460 else if (trkrid == TrkrDefs::inttId) {
0461
0462 CylinderGeomIntt* geom = (CylinderGeomIntt*) _geom_container_intt->GetLayerGeom(layer);
0463 double hit_location[3] = { 0.0, 0.0, 0.0 };
0464 geom->find_segment_center(InttDefs::getLadderZId(*iter),InttDefs::getLadderPhiId(*iter), hit_location);
0465
0466 n.SetXYZ(hit_location[0], hit_location[1], 0);
0467 n.RotateZ(geom->get_strip_phi_tilt());
0468 }
0469 }
0470 PHGenFit::Measurement* meas = new PHGenFit::PlanarMeasurement(pos, n,radius*cluster->getPhiError(), cluster->getZError());
0471 measurements.push_back(meas);
0472 }
0473 genfit::AbsTrackRep* rep = new genfit::RKTrackRep(_primary_pid_guess);
0474 PHGenFit::Track* track(new PHGenFit::Track(rep, seed_pos, seed_mom, seed_cov));
0475 track->addMeasurements(measurements);
0476
0477 if (_fitter->processTrack(track, false) != 0) {
0478 if (_verbosity >= 1)
0479 LogWarning("Track fitting failed");
0480 return NULL;
0481 }
0482
0483 track->getGenFitTrack()->setMcTrackId(intrack->get_id());
0484
0485 return track;
0486 }
0487
0488
0489 PHGenFit::Track* SVReco::MakeGenFitTrack(const SvtxTrack* intrack, const SvtxVertex* invertex){
0490 if (!intrack){
0491 cerr << PHWHERE << " Input SvtxTrack is NULL!" << endl;
0492 return NULL;
0493 }
0494
0495 if (_use_ladder_geom and !_geom_container_intt and !_geom_container_maps) {
0496 cout << PHWHERE << "No PHG4CylinderGeomContainer found!" << endl;
0497 return NULL;
0498 }
0499
0500
0501 std::vector<PHGenFit::Measurement*> measurements;
0502
0503
0504 if (invertex and invertex->size_tracks() > 1) {
0505 TVector3 pos(invertex->get_x(), invertex->get_y(), invertex->get_z());
0506 TMatrixDSym cov(3);
0507 cov.Zero();
0508 bool is_vertex_cov_sane = true;
0509 cout<<"Making covarience for vtx measurement"<<endl;
0510 for (unsigned int i = 0; i < 3; i++)
0511 for (unsigned int j = 0; j < 3; j++) {
0512 cov(i, j) = invertex->get_error(i, j);
0513 }
0514
0515 cout<<"Made covarience"<<endl;
0516 if (is_vertex_cov_sane) {
0517 PHGenFit::Measurement* meas = new PHGenFit::SpacepointMeasurement(
0518 pos, cov);
0519 measurements.push_back(meas);
0520 }
0521
0522
0523 TVector3 seed_pos(intrack->get_x(), intrack->get_y(), intrack->get_z());
0524 TVector3 seed_mom(intrack->get_px(), intrack->get_py(), intrack->get_pz());
0525 TMatrixDSym seed_cov(6);
0526 for (int i=0; i<6; i++){
0527 for (int j=0; j<6; j++){
0528 seed_cov[i][j] = intrack->get_error(i,j);
0529 }
0530 }
0531 cout<<"Making track cluster measurments"<<endl;
0532
0533 for (auto iter = intrack->begin_cluster_keys(); iter != intrack->end_cluster_keys(); ++iter){
0534
0535 TrkrCluster* cluster = _clustermap->findCluster(*iter);
0536 if (!cluster) {
0537 LogError("No cluster Found!");
0538 continue;
0539 }
0540 float x = cluster->getPosition(0);
0541 float y = cluster->getPosition(1);
0542 float radius = sqrt(x*x+y*y);
0543 TVector3 pos(cluster->getPosition(0), cluster->getPosition(1), cluster->getPosition(2));
0544 seed_mom.SetPhi(pos.Phi());
0545 seed_mom.SetTheta(pos.Theta());
0546
0547 TVector3 n(cluster->getPosition(0), cluster->getPosition(1), 0);
0548
0549
0550 if (_use_ladder_geom){
0551 unsigned int trkrid = TrkrDefs::getTrkrId(*iter);
0552 unsigned int layer = TrkrDefs::getLayer(*iter);
0553 if (trkrid == TrkrDefs::mvtxId) {
0554 int stave_index = MvtxDefs::getStaveId(*iter);
0555 int chip_index = MvtxDefs::getChipId(*iter);
0556
0557 double ladder_location[3] = { 0.0, 0.0, 0.0 };
0558
0559 CylinderGeom_Mvtx *geom = (CylinderGeom_Mvtx*) _geom_container_maps->GetLayerGeom(layer);
0560
0561 geom->find_sensor_center(stave_index, 0, 0, chip_index, ladder_location);
0562 n.SetXYZ(ladder_location[0], ladder_location[1], 0);
0563 n.RotateZ(geom->get_stave_phi_tilt());
0564 }
0565 else if (trkrid == TrkrDefs::inttId) {
0566
0567 CylinderGeomIntt* geom = (CylinderGeomIntt*) _geom_container_intt->GetLayerGeom(layer);
0568 double hit_location[3] = { 0.0, 0.0, 0.0 };
0569 geom->find_segment_center(InttDefs::getLadderZId(*iter),InttDefs::getLadderPhiId(*iter), hit_location);
0570
0571 n.SetXYZ(hit_location[0], hit_location[1], 0);
0572 n.RotateZ(geom->get_strip_phi_tilt());
0573 }
0574 }
0575 PHGenFit::Measurement* meas = new PHGenFit::PlanarMeasurement(pos, n,radius*cluster->getPhiError(), cluster->getZError());
0576 measurements.push_back(meas);
0577 }
0578 genfit::AbsTrackRep* rep = new genfit::RKTrackRep(_primary_pid_guess);
0579 PHGenFit::Track* track(new PHGenFit::Track(rep, seed_pos, seed_mom, seed_cov));
0580 track->addMeasurements(measurements);
0581
0582 if (_fitter->processTrack(track, false) != 0) {
0583 if (_verbosity >= 1)
0584 LogWarning("Track fitting failed");
0585 return NULL;
0586 }
0587 track->getGenFitTrack()->setMcTrackId(intrack->get_id());
0588 return track;
0589 }
0590 else{
0591 cerr<<PHWHERE<<": invalid vertex"<<endl;
0592 return NULL;
0593 }
0594
0595 }
0596
0597
0598 PHGenFit::Track* SVReco::MakeGenFitTrack(const SvtxTrack* intrack, const genfit::GFRaveVertex* invertex){
0599 if (!intrack){
0600 cerr << PHWHERE << " Input SvtxTrack is NULL!" << endl;
0601 return NULL;
0602 }
0603
0604 if (_use_ladder_geom and !_geom_container_intt and !_geom_container_maps) {
0605 cout << PHWHERE << "No PHG4CylinderGeomContainer found!" << endl;
0606 return NULL;
0607 }
0608
0609
0610 std::vector<PHGenFit::Measurement*> measurements;
0611
0612
0613
0614 if (invertex and invertex->getNTracks() > 1) {
0615 TVector3 pos=invertex->getPos();
0616 TMatrixDSym cov = invertex->getCov();
0617 PHGenFit::Measurement* meas = new PHGenFit::SpacepointMeasurement(
0618 pos, cov);
0619 measurements.push_back(meas);
0620
0621
0622 TVector3 seed_pos(intrack->get_x(), intrack->get_y(), intrack->get_z());
0623 TVector3 seed_mom(intrack->get_px(), intrack->get_py(), intrack->get_pz());
0624 TMatrixDSym seed_cov(6);
0625 for (int i=0; i<6; i++){
0626 for (int j=0; j<6; j++){
0627 seed_cov[i][j] = intrack->get_error(i,j);
0628 }
0629 }
0630 cout<<"Making track cluster measurments"<<endl;
0631
0632 for (auto iter = intrack->begin_cluster_keys(); iter != intrack->end_cluster_keys(); ++iter){
0633
0634 TrkrCluster* cluster = _clustermap->findCluster(*iter);
0635 if (!cluster) {
0636 LogError("No cluster Found!");
0637 continue;
0638 }
0639 float x = cluster->getPosition(0);
0640 float y = cluster->getPosition(1);
0641 float radius = sqrt(x*x+y*y);
0642 TVector3 pos(cluster->getPosition(0), cluster->getPosition(1), cluster->getPosition(2));
0643 seed_mom.SetPhi(pos.Phi());
0644 seed_mom.SetTheta(pos.Theta());
0645
0646 TVector3 n(cluster->getPosition(0), cluster->getPosition(1), 0);
0647
0648
0649 if (_use_ladder_geom){
0650 unsigned int trkrid = TrkrDefs::getTrkrId(*iter);
0651 unsigned int layer = TrkrDefs::getLayer(*iter);
0652 if (trkrid == TrkrDefs::mvtxId) {
0653 int stave_index = MvtxDefs::getStaveId(*iter);
0654 int chip_index = MvtxDefs::getChipId(*iter);
0655
0656 double ladder_location[3] = { 0.0, 0.0, 0.0 };
0657
0658 CylinderGeom_Mvtx *geom = (CylinderGeom_Mvtx*) _geom_container_maps->GetLayerGeom(layer);
0659
0660 geom->find_sensor_center(stave_index, 0, 0, chip_index, ladder_location);
0661 n.SetXYZ(ladder_location[0], ladder_location[1], 0);
0662 n.RotateZ(geom->get_stave_phi_tilt());
0663 }
0664 else if (trkrid == TrkrDefs::inttId) {
0665
0666 CylinderGeomIntt* geom = (CylinderGeomIntt*) _geom_container_intt->GetLayerGeom(layer);
0667 double hit_location[3] = { 0.0, 0.0, 0.0 };
0668 geom->find_segment_center(InttDefs::getLadderZId(*iter),InttDefs::getLadderPhiId(*iter), hit_location);
0669
0670 n.SetXYZ(hit_location[0], hit_location[1], 0);
0671 n.RotateZ(geom->get_strip_phi_tilt());
0672 }
0673 }
0674 PHGenFit::Measurement* meas = new PHGenFit::PlanarMeasurement(pos, n,radius*cluster->getPhiError(), cluster->getZError());
0675 measurements.push_back(meas);
0676 }
0677 genfit::AbsTrackRep* rep = new genfit::RKTrackRep(_primary_pid_guess);
0678 PHGenFit::Track* track(new PHGenFit::Track(rep, seed_pos, seed_mom, seed_cov));
0679 track->addMeasurements(measurements);
0680
0681 if (_fitter->processTrack(track, false) != 0) {
0682 if (_verbosity >= 1)
0683 LogWarning("Track fitting failed");
0684 return NULL;
0685 }
0686 track->getGenFitTrack()->setMcTrackId(intrack->get_id());
0687 return track;
0688 }
0689 else{
0690 cerr<<PHWHERE<<": invalid vertex"<<endl;
0691 return NULL;
0692 }
0693
0694 }
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792 SvtxVertex* SVReco::GFRVVtxToSvtxVertex(genfit::GFRaveVertex* rave_vtx)const{
0793 SvtxVertex* svtx_vtx= new SvtxVertex_v1();
0794
0795 svtx_vtx->set_chisq(rave_vtx->getChi2());
0796 svtx_vtx->set_ndof(rave_vtx->getNdf());
0797 svtx_vtx->set_position(0, rave_vtx->getPos().X());
0798 svtx_vtx->set_position(1, rave_vtx->getPos().Y());
0799 svtx_vtx->set_position(2, rave_vtx->getPos().Z());
0800
0801 for (int i = 0; i < 3; i++)
0802 for (int j = 0; j < 3; j++)
0803 svtx_vtx->set_error(i, j, rave_vtx->getCov()[i][j]);
0804
0805 for (unsigned int i = 0; i < rave_vtx->getNTracks(); i++) {
0806
0807 const genfit::Track* rave_track =
0808 rave_vtx->getParameters(i)->getTrack();
0809 for (unsigned int j = 0; j < _main_rf_phgf_tracks.size(); j++) {
0810 if (rave_track == _main_rf_phgf_tracks[j]->getGenFitTrack())
0811 svtx_vtx->insert_track(j);
0812 }
0813 }
0814 return svtx_vtx;
0815 }
0816
0817
0818
0819
0820 void SVReco::FillVertexMap(
0821 const std::vector<genfit::GFRaveVertex*>& rave_vertices,
0822 const std::vector<genfit::Track*>& gf_tracks){
0823
0824 for (unsigned int ivtx=0; ivtx<rave_vertices.size(); ++ivtx){
0825 genfit::GFRaveVertex* rave_vtx = rave_vertices[ivtx];
0826 rv_prim_vtx_ntrk = rave_vtx->getNTracks();
0827
0828
0829
0830
0831
0832 for (int itrk=0; itrk< rv_prim_vtx_ntrk; itrk++){
0833
0834 TVector3 rvtrk_mom = rave_vtx->getParameters(itrk)->getMom();
0835 float rvtrk_w = rave_vtx->getParameters(itrk)->getWeight();
0836
0837 unsigned int rvtrk_mc_id = rave_vtx->getParameters(itrk)->getTrack()->getMcTrackId();
0838 _svtxtrk_wt_map[rvtrk_mc_id] = rvtrk_w;
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878 }
0879 }
0880 return;
0881 }
0882
0883 int SVReco::GetSVMass_mom(
0884 const genfit::GFRaveVertex* rave_vtx,
0885 float & vtx_mass,
0886 float & vtx_px,
0887 float & vtx_py,
0888 float & vtx_pz,
0889 int & ntrk_good_pv
0890 ){
0891
0892 float sum_E = 0, sum_px = 0, sum_py = 0, sum_pz = 0;
0893
0894 int N_good = 0, N_good_pv = 0;
0895
0896 for (unsigned int itrk=0; itrk<rave_vtx->getNTracks(); itrk++){
0897 TVector3 mom_trk = rave_vtx->getParameters(itrk)->getMom();
0898
0899 double w_trk = rave_vtx->getParameters(itrk)->getWeight();
0900
0901 sum_px += mom_trk.X();
0902 sum_py += mom_trk.Y();
0903 sum_pz += mom_trk.Z();
0904 sum_E += sqrt(mom_trk.Mag2() + 0.140*0.140);
0905
0906
0907 if ( w_trk>0.7 ){
0908 N_good++;
0909
0910 unsigned int rvtrk_mc_id = rave_vtx->getParameters(itrk)->getTrack()->getMcTrackId();
0911
0912 if ( _svtxtrk_wt_map[rvtrk_mc_id]>0.7 ){
0913 N_good_pv++;
0914 }
0915 }
0916
0917 }
0918
0919 vtx_mass = sqrt(sum_E*sum_E - sum_px*sum_px - sum_py*sum_py - sum_pz*sum_pz);
0920 vtx_px = sum_px;
0921 vtx_py = sum_py;
0922 vtx_pz = sum_pz;
0923
0924 ntrk_good_pv = N_good_pv;
0925
0926
0927 return N_good;
0928 }
0929
0930
0931 void SVReco::FillSVMap(
0932 const std::vector<genfit::GFRaveVertex*>& rave_vertices,
0933 const std::vector<genfit::Track*>& gf_tracks){
0934
0935 return;
0936 }
0937
0938 PHGenFit::Track* SVReco::refitTrack(SvtxVertex* vtx, SvtxTrack* svtxtrk){
0939 PHGenFit::Track* gftrk = MakeGenFitTrack(svtxtrk,vtx);
0940 if(gftrk) {
0941 cout<<"good genfit refit"<<endl;
0942
0943 return gftrk;
0944 }
0945 else {
0946 cout<<"No refit possible"<<endl;
0947 return NULL;
0948 }
0949 }
0950
0951 PHGenFit::Track* SVReco::refitTrack(genfit::GFRaveVertex* vtx, SvtxTrack* svtxtrk){
0952 PHGenFit::Track* gftrk = MakeGenFitTrack(svtxtrk,vtx);
0953 if(gftrk) {
0954 cout<<"good genfit refit"<<endl;
0955
0956 return gftrk;
0957 }
0958 else {
0959 cout<<"No refit possible"<<endl;
0960 return NULL;
0961 }
0962 }
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982 std::shared_ptr<SvtxTrack> SVReco::MakeSvtxTrack(const SvtxTrack* svtx_track,
0983 const PHGenFit::Track* phgf_track, const SvtxVertex* vertex) {
0984
0985 double chi2 = phgf_track->get_chi2();
0986 double ndf = phgf_track->get_ndf();
0987
0988 TVector3 vertex_position(0, 0, 0);
0989 TMatrixF vertex_cov(3,3);
0990 double dvr2 = 0;
0991 double dvz2 = 0;
0992
0993 if (vertex) {
0994 vertex_position.SetXYZ(vertex->get_x(), vertex->get_y(),
0995 vertex->get_z());
0996 dvr2 = vertex->get_error(0, 0) + vertex->get_error(1, 1);
0997 dvz2 = vertex->get_error(2, 2);
0998
0999 for(int i=0;i<3;i++)
1000 for(int j=0;j<3;j++)
1001 vertex_cov[i][j] = vertex->get_error(i,j);
1002 }
1003 else{
1004 cerr<<PHWHERE<<": No vertex to make SvtxTrack"<<endl;
1005 }
1006
1007
1008 std::shared_ptr<genfit::MeasuredStateOnPlane> gf_state_beam_line_ca = nullptr;
1009 try {
1010 gf_state_beam_line_ca = std::shared_ptr<genfit::MeasuredStateOnPlane>(phgf_track->extrapolateToLine(vertex_position,
1011 TVector3(0., 0., 1.)));
1012 } catch (...) {
1013 if (_verbosity >= 2)
1014 LogWarning("extrapolateToLine failed!");
1015 }
1016 if(!gf_state_beam_line_ca) return nullptr;
1017
1018
1019
1020
1021
1022
1023
1024
1025 double u = gf_state_beam_line_ca->getState()[3];
1026 double v = gf_state_beam_line_ca->getState()[4];
1027
1028 double du2 = gf_state_beam_line_ca->getCov()[3][3];
1029 double dv2 = gf_state_beam_line_ca->getCov()[4][4];
1030
1031
1032
1033
1034
1035
1036 std::shared_ptr < SvtxTrack_v1 > out_track = std::shared_ptr < SvtxTrack_v1
1037 > (new SvtxTrack_v1(*static_cast<const SvtxTrack_v1*>(svtx_track)));
1038
1039 out_track->set_dca2d(u);
1040 out_track->set_dca2d_error(sqrt(du2 + dvr2));
1041
1042 std::shared_ptr<genfit::MeasuredStateOnPlane> gf_state_vertex_ca = nullptr;
1043 try {
1044 gf_state_vertex_ca = std::shared_ptr < genfit::MeasuredStateOnPlane
1045 > (phgf_track->extrapolateToPoint(vertex_position));
1046 } catch (...) {
1047 if (_verbosity >= 2)
1048 LogWarning("extrapolateToPoint failed!");
1049 }
1050 if (!gf_state_vertex_ca) {
1051
1052 return nullptr;
1053 }
1054
1055 TVector3 mom = gf_state_vertex_ca->getMom();
1056 TVector3 pos = gf_state_vertex_ca->getPos();
1057 TMatrixDSym cov = gf_state_vertex_ca->get6DCov();
1058
1059
1060
1061
1062
1063 u = gf_state_vertex_ca->getState()[3];
1064 v = gf_state_vertex_ca->getState()[4];
1065
1066 du2 = gf_state_vertex_ca->getCov()[3][3];
1067 dv2 = gf_state_vertex_ca->getCov()[4][4];
1068
1069
1070 double dca3d = sqrt(u * u + v * v);
1071 double dca3d_error = sqrt(du2 + dv2 + dvr2 + dvz2);
1072
1073 out_track->set_dca(dca3d);
1074 out_track->set_dca_error(dca3d_error);
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136 float dca3d_xy = NAN;
1137 float dca3d_z = NAN;
1138 float dca3d_xy_error = NAN;
1139 float dca3d_z_error = NAN;
1140
1141 try{
1142 TMatrixF pos_in(3,1);
1143 TMatrixF cov_in(3,3);
1144 TMatrixF pos_out(3,1);
1145 TMatrixF cov_out(3,3);
1146
1147 TVectorD state6(6);
1148 TMatrixDSym cov6(6,6);
1149
1150 gf_state_vertex_ca->get6DStateCov(state6, cov6);
1151
1152 TVector3 vn(state6[3], state6[4], state6[5]);
1153
1154
1155 pos_in[0][0] = state6[0] - vertex_position.X();
1156 pos_in[1][0] = state6[1] - vertex_position.Y();
1157 pos_in[2][0] = state6[2] - vertex_position.Z();
1158
1159
1160 for(int i=0;i<3;++i){
1161 for(int j=0;j<3;++j){
1162 cov_in[i][j] = cov6[i][j] + vertex_cov[i][j];
1163 }
1164 }
1165
1166 dca3d_xy = pos_out[0][0];
1167 dca3d_z = pos_out[2][0];
1168 dca3d_xy_error = sqrt(cov_out[0][0]);
1169 dca3d_z_error = sqrt(cov_out[2][2]);
1170
1171 #ifdef _DEBUG_
1172 cout<<__LINE__<<": Vertex: ----------------"<<endl;
1173 vertex_position.Print();
1174 vertex_cov.Print();
1175
1176 cout<<__LINE__<<": State: ----------------"<<endl;
1177 state6.Print();
1178 cov6.Print();
1179
1180 cout<<__LINE__<<": Mean: ----------------"<<endl;
1181 pos_in.Print();
1182 cout<<"===>"<<endl;
1183 pos_out.Print();
1184
1185 cout<<__LINE__<<": Cov: ----------------"<<endl;
1186 cov_in.Print();
1187 cout<<"===>"<<endl;
1188 cov_out.Print();
1189
1190 cout<<endl;
1191 #endif
1192
1193 } catch (...) {
1194 if (_verbosity > 0)
1195 LogWarning("DCA calculationfailed!");
1196 }
1197
1198 out_track->set_dca3d_xy(dca3d_xy);
1199 out_track->set_dca3d_z(dca3d_z);
1200 out_track->set_dca3d_xy_error(dca3d_xy_error);
1201 out_track->set_dca3d_z_error(dca3d_z_error);
1202
1203
1204
1205 out_track->set_chisq(chi2);
1206 out_track->set_ndf(ndf);
1207 out_track->set_charge(phgf_track->get_charge());
1208
1209 out_track->set_px(mom.Px());
1210 out_track->set_py(mom.Py());
1211 out_track->set_pz(mom.Pz());
1212
1213 out_track->set_x(pos.X());
1214 out_track->set_y(pos.Y());
1215 out_track->set_z(pos.Z());
1216
1217 for (int i = 0; i < 6; i++) {
1218 for (int j = i; j < 6; j++) {
1219 out_track->set_error(i, j, cov[i][j]);
1220 }
1221 }
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283 #ifdef _DEBUG_
1284 cout << __LINE__ << endl;
1285 #endif
1286
1287 const genfit::Track *gftrack = phgf_track->getGenFitTrack();
1288 const genfit::AbsTrackRep *rep = gftrack->getCardinalRep();
1289 for(unsigned int id = 0; id< gftrack->getNumPointsWithMeasurement();++id) {
1290 genfit::TrackPoint *trpoint = gftrack->getPointWithMeasurementAndFitterInfo(id, gftrack->getCardinalRep());
1291
1292 if(!trpoint) {
1293 if (_verbosity > 1)
1294 LogWarning("!trpoint");
1295 continue;
1296 }
1297
1298 genfit::KalmanFitterInfo* kfi = static_cast<genfit::KalmanFitterInfo*>( trpoint->getFitterInfo(rep) );
1299 if(!kfi) {
1300 if (_verbosity > 1)
1301 LogWarning("!kfi");
1302 continue;
1303 }
1304
1305 std::shared_ptr<const genfit::MeasuredStateOnPlane> gf_state = nullptr;
1306 try {
1307
1308 const genfit::MeasuredStateOnPlane* temp_state = &(kfi->getFittedState(true));
1309 gf_state = std::shared_ptr <genfit::MeasuredStateOnPlane> (new genfit::MeasuredStateOnPlane(*temp_state));
1310 } catch (...) {
1311 if (_verbosity > 1)
1312 LogWarning("Exrapolation failed!");
1313 }
1314 if (!gf_state) {
1315 if (_verbosity > 1)
1316 LogWarning("Exrapolation failed!");
1317 continue;
1318 }
1319 genfit::MeasuredStateOnPlane temp;
1320 float pathlength = -phgf_track->extrapolateToPoint(temp,vertex_position,id);
1321
1322 std::shared_ptr<SvtxTrackState> state = std::shared_ptr<SvtxTrackState> (new SvtxTrackState_v1(pathlength));
1323 state->set_x(gf_state->getPos().x());
1324 state->set_y(gf_state->getPos().y());
1325 state->set_z(gf_state->getPos().z());
1326
1327 state->set_px(gf_state->getMom().x());
1328 state->set_py(gf_state->getMom().y());
1329 state->set_pz(gf_state->getMom().z());
1330
1331
1332
1333 for (int i = 0; i < 6; i++) {
1334 for (int j = i; j < 6; j++) {
1335 state->set_error(i, j, gf_state->get6DCov()[i][j]);
1336 }
1337 }
1338
1339 out_track->insert_state(state.get());
1340
1341 #ifdef _DEBUG_
1342 cout
1343 <<__LINE__
1344 <<": " << id
1345 <<": " << pathlength <<" => "
1346 <<sqrt(state->get_x()*state->get_x() + state->get_y()*state->get_y())
1347 <<endl;
1348 #endif
1349 }
1350
1351 return out_track;
1352 }