00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012
00013 #include <mMuiRoadAssoc.h>
00014 #include <mMuiRoadAssocPar.h>
00015 #include <TMutNode.h>
00016 #include <PHException.h>
00017 #include <MUTOO.h>
00018 #include <PHTimer.h>
00019 #include <TMutTrkMap.h>
00020 #include <TMuiRoadMapO.h>
00021 #include <PHPoint.h>
00022 #include <TMutTrackUtil.h>
00023
00024
00025
00026
00029
00030
00031 #include <iostream>
00032 #include <string>
00033 #include <map>
00034
00035 mMuiRoadAssoc::mMuiRoadAssoc() : _timer("mMuiRoadAssoc")
00036 {
00037 name = "mMuiRoadAssoc";
00038 MUTOO::TRACE("initializing module " + std::string(name.getString()));
00039 }
00040
00041
00042
00043 mMuiRoadAssoc::~mMuiRoadAssoc() { }
00044
00045
00046
00047 PHBoolean mMuiRoadAssoc::event(PHCompositeNode* top_node)
00048 {
00049 _timer.restart();
00050
00051 try {
00052
00053
00054
00055 set_interface_ptrs(top_node);
00056
00057
00058
00059 typedef std::multimap<UShort_t, TMuiRoadMapO::value_type> road_multimap;
00060 typedef std::multimap<UShort_t, TMuiRoadMapO::value_type>::iterator multimap_iterator;
00061 typedef std::pair<multimap_iterator,multimap_iterator> Range;
00062
00063
00064 TMutTrkMap::iterator trk_iter = _trk_map->range();
00065 while( TMutTrkMap::pointer trk_ptr = trk_iter.next() ) {
00066
00067 road_multimap roads_to_test;
00068 TMuiRoadMapO::key_iterator road_iter = trk_ptr->get()->get_associated<TMuiRoadO>();
00069
00070
00071 while( TMuiRoadMapO::pointer road_ptr = road_iter.next() ) {
00072 roads_to_test.insert( std::make_pair( road_ptr->get()->get_depth(), road_ptr->get() ));
00073 PHKey::disassociate(trk_ptr, road_ptr);
00074 }
00075
00076
00077
00078
00079 for(UShort_t depth=2;depth<5;++depth){
00080
00081
00082 Range range = roads_to_test.equal_range(depth);
00083 multimap_iterator map_iter = range.first;
00084
00085
00086 double closest_dist = DBL_MAX;
00087 multimap_iterator closest_iter = map_iter;
00088
00089
00090 for(; map_iter!=range.second; ++map_iter){
00091
00092
00093 PHPoint road_point = map_iter->second->get_gap0_point();
00094 double z0 = (map_iter->second->get_fit_par()).get_z();
00095 const TMutTrkPar* trk_par = trk_ptr->get()->get_trk_par_station(MUTOO::Station3);
00096 TMutFitPar* lcl_fitpar = new TMutFitPar(trk_par->get_x(),
00097 trk_par->get_y(),
00098 trk_par->get_z(),
00099 ( trk_par->get_px()/trk_par->get_pz() ),
00100 ( trk_par->get_py()/trk_par->get_pz() ),
00101 trk_par->get_chi_square() );
00102 const PHPoint extrap_point = TMutTrackUtil::linear_track_model(lcl_fitpar, z0);
00103 delete lcl_fitpar;
00104
00105 double dist = distance( extrap_point, road_point );
00106 if( dist < closest_dist ){
00107 closest_dist = dist;
00108 closest_iter = map_iter;
00109 }
00110 }
00111 if( closest_iter != range.second )
00112 PHKey::associate(*trk_ptr, closest_iter->second);
00113
00114 }
00115 }
00116
00117 } catch(std::exception& e) {
00118 MUTOO::TRACE(e.what());
00119 return False;
00120 }
00121
00122 if(_mod_par->get_verbosity() >= MUTOO::SOME) _timer.print();
00123 if(_mod_par->get_verbosity() >= MUTOO::ALOT) _trk_map->print();
00124 return True;
00125 }
00126
00128 void mMuiRoadAssoc::set_interface_ptrs(PHCompositeNode* top_node){
00129
00130
00131
00132 _mod_par = TMutNode<mMuiRoadAssocPar>::find_node(top_node,"mMuiRoadAssocPar");
00133
00134 _trk_map = TMutNode<TMutTrkMap>::find_node(top_node,"TMutTrkMap");
00135
00136 }
00137
00138 double mMuiRoadAssoc::distance(PHPoint p1, PHPoint p2) {
00139 double x1 = p1.getX();
00140 double y1 = p1.getY();
00141 double z1 = p1.getZ();
00142 double x2 = p2.getX();
00143 double y2 = p2.getY();
00144 double z2 = p2.getZ();
00145
00146 return std::sqrt( MUTOO::SQUARE(x2-x1)+MUTOO::SQUARE(y2-y1)+MUTOO::SQUARE(z2-z1));
00147 }