#include <mMuiFindRoad.h>
Public Methods | |
mMuiFindRoad () | |
~mMuiFindRoad () | |
virtual PHBoolean | event (PHCompositeNode *) |
Private Methods | |
void | set_interface_ptrs (PHCompositeNode *top_node) |
void | find_roads () |
void | associate_clusters () |
void | associate_cluster (TMuiRoadMapO::pointer road_ptr, TMuiClusterMapO::pointer in_cluster_ptr, const PHPoint &road_point, double in_distance) |
void | fit_roads () |
void | set_road_parameters () |
void | apply_road_cuts () |
void | eliminate_duplicates () |
bool | cluster_list_equal (const TMuiRoadMapO::pointer road1, const TMuiRoadMapO::pointer road2) |
Private Attributes | |
const mMuiFindRoadPar * | _mod_par |
TMuiClusterMapO * | _cluster_map |
TMuiRoadMapO * | _road_map |
TMuiRoadFinder::road_list | _roads |
PHTimeServer::timer | _timer |
Object | Description | Privilege |
const mMuiFindRoadPar* | Parameter Table | immutable |
TMuiClusterMapO* | IOC | mutable |
TMuiRoadMapO* | IOC | mutable |
Definition at line 49 of file mMuiFindRoad.h.
|
Destructor Definition at line 41 of file mMuiFindRoad.cxx.
00041 { } |
|
Definition at line 451 of file mMuiFindRoad.cxx. References _mod_par, _road_map, and mMuiFindRoadPar::get_min_cluster.
00452 { 00453 // Here we punt on roads that don't have a minimum number of associated 00454 // TMuiCluster. 00455 // 00456 TMuiRoadMapO::iterator road_iter = _road_map->range(); 00457 while(TMuiRoadMapO::pointer road_ptr = road_iter.next()){ 00458 // Minimum hits/cluster cut 00459 // 00460 if(road_ptr->get()->get_nhit() < _mod_par->get_min_cluster()) { 00461 _road_map->erase(road_ptr->get()->get_key()); 00462 } 00463 } 00464 } |
|
Definition at line 225 of file mMuiFindRoad.cxx. Referenced by associate_clusters.
00229 { 00230 // Loop over TMuiCluster associated with this road 00231 // if we find a cluster at same locations as input [ 00232 // if new cluster is closer [ 00233 // remove old association 00234 // associate new cluster 00235 // return 00236 // ] else [ 00237 // do nothing 00238 // return 00239 // ] 00240 // ] 00241 // 00242 // (if we get here no previous association in this location exists) 00243 // Associate road and cluster 00244 // 00245 TMuiClusterMapO::key_iterator cluster_iter = road_ptr->get()->get_associated<TMuiClusterO>(); 00246 while(TMuiClusterMapO::pointer cluster_ptr = cluster_iter.next()){ 00247 00248 // Check for existing TMuiCluster at this location and keep the closest one. 00249 // 00250 if(cluster_ptr->get()->get_plane() == in_cluster_ptr->get()->get_plane() 00251 && cluster_ptr->get()->get_orientation() == in_cluster_ptr->get()->get_orientation()) { 00252 00253 double distance = PHGeometry::distanceLinePoint(cluster_ptr->get()->get_coord(),trk_point); 00254 // Keep the old one. 00255 // 00256 if(distance < in_distance) { 00257 return; 00258 } else { 00259 // Keep the new one, remove the old one. 00260 // 00261 PHKey::disassociate(road_ptr,cluster_ptr); 00262 PHKey::associate(road_ptr, in_cluster_ptr); 00263 return; 00264 } 00265 } 00266 } 00267 // No existing cluster at this location 00268 // 00269 PHKey::associate(road_ptr, in_cluster_ptr); 00270 } |
|
Definition at line 184 of file mMuiFindRoad.cxx. References _cluster_map, _mod_par, _road_map, associate_cluster, TMuiClusterMapO::get, and mMuiFindRoadPar::get_coord_proximity_cut. Referenced by event.
00185 { 00186 // Loop over TMuiRoad [ 00187 // Loop over TMuiCluster in same arm 00188 // It cluster is close enough to extrapolated 00189 // road, then call associate_cluster(..) 00190 // ] 00191 // ] 00192 00193 // Get an iterator to all roads 00194 // 00195 TMuiRoadMapO::iterator road_iter = _road_map->range(); 00196 while(TMuiRoadMapO::pointer road_ptr = road_iter.next()){ 00197 00198 UShort_t arm = road_ptr->get()->get_arm(); 00199 00200 // Get an iterator to all TMuiCluster in same arm 00201 // 00202 TMuiClusterMapO::iterator cluster_iter = _cluster_map->get(arm); 00203 while(TMuiClusterMapO::pointer cluster_ptr = cluster_iter.next()){ 00204 // Extract the z, PHLine and road parameters 00205 // 00206 PHLine line = cluster_ptr->get()->get_coord(); 00207 double z_cluster = cluster_ptr->get()->get_centroidpos().getZ(); 00208 const TMutFitPar* fit_par = road_ptr->get()->get_const_fitpar(); 00209 00210 // Calculate distance form TMuiCluster to extrapolated road 00211 // 00212 PHPoint trk_point = TMutTrackUtil::linear_track_model(fit_par,z_cluster); 00213 double distance = PHGeometry::distanceLinePoint(line,trk_point); 00214 00215 // If the cluster is close enough to the extrapolated Road then associate 00216 // 00217 if(distance < _mod_par->get_coord_proximity_cut()){ 00218 associate_cluster(road_ptr,cluster_ptr,trk_point,distance); 00219 } 00220 } 00221 } 00222 } |
|
Definition at line 489 of file mMuiFindRoad.cxx. Referenced by eliminate_duplicates.
00491 { 00492 TMuiClusterMapO::key_iterator road1_iter = road1->get()->get_associated<TMuiClusterO>(); 00493 TMuiClusterMapO::key_iterator road2_iter = road1->get()->get_associated<TMuiClusterO>(); 00494 if(road1_iter.count() != road2_iter.count()) return false; 00495 while(TMuiClusterMapO::pointer road1_ptr = road1_iter.next()){ 00496 bool match = false; 00497 road2_iter = road2->get()->get_associated<TMuiClusterO>(); 00498 while(TMuiClusterMapO::pointer road2_ptr = road2_iter.next()){ 00499 if(road1_ptr->get()->get_key() == road2_ptr->get()->get_key()) { 00500 match = true; 00501 } 00502 } 00503 if(!match) return false; 00504 } 00505 return true; 00506 } |
|
Definition at line 467 of file mMuiFindRoad.cxx. References _road_map, and cluster_list_equal.
00468 { 00469 typedef std::vector<TMuiRoadMapO::value_type> cluster_list; 00470 cluster_list remove_list; 00471 TMuiRoadMapO::iterator road_iter = _road_map->range(); 00472 while(TMuiRoadMapO::pointer road_ptr = road_iter.next()){ 00473 TMuiRoadMapO::iterator road_iter2 = road_iter; 00474 ++road_iter2; 00475 while(TMuiRoadMapO::pointer road_ptr2 = road_iter2.next()) { 00476 if(cluster_list_equal(road_ptr, road_ptr2)) { 00477 remove_list.push_back(*road_ptr2); 00478 } 00479 } 00480 } 00481 00482 cluster_list::iterator remove_iter = remove_list.begin(); 00483 for(;remove_iter != remove_list.end(); ++remove_iter){ 00484 _road_map->erase(remove_iter->get()->get_key()); 00485 } 00486 } |
|
Event method Definition at line 46 of file mMuiFindRoad.cxx. References _mod_par, _road_map, _timer, associate_clusters, find_roads, fit_roads, TMuiParBase::get_verbosity, set_interface_ptrs, set_road_parameters, and MUIOO::TRACE.
00047 { 00048 00049 _timer.get()->restart(); 00050 00051 try { 00052 00053 // Reset IOC pointers 00054 // 00055 set_interface_ptrs(top_node); 00056 00057 // Find Roads using chosen algorithm 00058 // 00059 find_roads(); 00060 00061 // Do the associations 00062 // 00063 associate_clusters(); 00064 00065 // Do a final fit, now after everything is settled 00066 // 00067 fit_roads(); 00068 00069 // Set road parameters that have not yet been set 00070 // 00071 set_road_parameters(); 00072 00073 // Apply road cuts - done in TMuiRoadFinder; not much too add here yet 00074 // 00075 //apply_road_cuts(); 00076 00077 // Eliminate duplicate roads 00078 // 00079 //eliminate_duplicates(); 00080 00081 } 00082 catch(std::exception& e) { 00083 00084 MUIOO::TRACE(e.what()); 00085 return False; 00086 } 00087 00088 // If verbose dump the contents of the cluster map 00089 // 00090 _timer.get()->stop(); 00091 if(_mod_par->get_verbosity() >= MUIOO::ALOT) _road_map->print(); 00092 if(_mod_par->get_verbosity() >= MUIOO::SOME) _timer.get()->print(); 00093 00094 return True; 00095 } |
|
Definition at line 115 of file mMuiFindRoad.cxx. References _cluster_map, _mod_par, _road_map, _roads, TMuiRoadFinder::find, TMuiClusterMapO::get, mMuiFindRoadPar::get_coord_dca_cut, mMuiFindRoadPar::get_coord_proximity_cut, mMuiFindRoadPar::get_min_cluster, mMuiFindRoadPar::get_min_point, mMuiFindRoadPar::get_mode, mMuiFindRoadPar::get_phi_window, TMuiRoadFinder::get_road_list, mMuiFindRoadPar::get_theta_window, mMuiFindRoadPar::get_use_window, TMuiParBase::get_verbosity, TMuiRoadMapO::insert_new, mMuiFindRoadPar::NO_REVERSE, TMuiRoadFinder::road_window, TMuiRoadFinder::set_dca_cut, TMuiRoadFinder::set_min_cluster, TMuiRoadFinder::set_min_point, TMuiRoadFinder::set_prox_cut, and TMuiRoadFinder::set_reversed_algo. Referenced by event.
00116 { 00117 /* 00118 cout << "mMuiFindRoad::find_roads() mod-par dump" << endl; 00119 _mod_par->print(); 00120 */ 00121 // The road finding algorithm is encapsulated in TMuiRoadFinder 00122 // 00123 TMuiRoadFinder road_finder; 00124 // 00125 // some parameters are hardwired as statics into TMuiRoadFinder 00126 // use parameter file to set them 00127 road_finder.set_dca_cut(_mod_par->get_coord_dca_cut()); 00128 road_finder.set_prox_cut(_mod_par->get_coord_proximity_cut()); 00129 road_finder.set_min_cluster(_mod_par->get_min_cluster()); 00130 road_finder.set_min_point(_mod_par->get_min_point()); 00131 if (_mod_par->get_mode() == mMuiFindRoadPar::NO_REVERSE) { 00132 road_finder.set_reversed_algo(false); 00133 } 00134 else { 00135 road_finder.set_reversed_algo(true); 00136 } 00137 // window usage 00138 bool use_window = _mod_par->get_use_window(); 00139 TMuiRoadFinder::road_window phi_window = std::make_pair(0,0); 00140 TMuiRoadFinder::road_window theta_window = std::make_pair(0,0); 00141 if (use_window) { 00142 // set ranges of phi and theta windows 00143 // the windows are centered by TMuiRoadFinder 00144 // when starting a road 00145 phi_window.first -= 0.5 * _mod_par->get_phi_window(); 00146 theta_window.first -= 0.5 * _mod_par->get_theta_window(); 00147 phi_window.second += 0.5 * _mod_par->get_phi_window(); 00148 theta_window.second += 0.5 * _mod_par->get_theta_window(); 00149 } 00150 00151 // Clear local list 00152 // 00153 _roads.clear(); 00154 00155 // Loop over all/both arms and envoke the road finder if given 00156 // arm has hits. 00157 // 00158 for(int arm=0; arm<MUIOO::NumberOfArms;++arm) { 00159 if(_cluster_map->get(arm).count()){ 00160 road_finder.find(_cluster_map, arm, 00161 use_window, phi_window, theta_window); 00162 // Splice all roads found in this section into local list 00163 // 00164 _roads.splice(_roads.end(), road_finder.get_road_list()); 00165 } 00166 } 00167 00168 // Get the list of roads found by the algorithm and instantiate an IOC 00169 // for those found. 00170 // 00171 TMuiRoadFinder::road_list::const_iterator road_list_iter = _roads.begin(); 00172 for(;road_list_iter!=_roads.end();++road_list_iter){ 00173 00174 if(_mod_par->get_verbosity() == MUIOO::ALOT) road_list_iter->print(); 00175 00176 TMuiRoadMapO::iterator road_iter = _road_map->insert_new(road_list_iter->get_arm()); 00177 // Seed the full fit with road parameters 00178 // 00179 road_iter->get()->set_fit_par(road_list_iter->get_fit_par()); 00180 } 00181 } |
|
Definition at line 273 of file mMuiFindRoad.cxx. References _road_map, and MUIOO::TRACE. Referenced by event.
00274 { 00275 // Here we'll do a final fit after all associations 00276 // and include all clusters in the fit 00277 // Get an iterator to all roads 00278 // 00279 TMuiRoadMapO::iterator road_iter = _road_map->range(); 00280 while(TMuiRoadMapO::pointer road_ptr = road_iter.next()) { 00281 00282 TMutFitPar fit_par = road_ptr->get()->get_fit_par(); 00283 00284 // Iterator for all clusters associated to this road 00285 TMuiClusterMapO::const_key_iterator clust_iter = 00286 road_ptr->get()->get_associated<TMuiClusterO>(); 00287 00288 // arrays for cluster info 00289 // The second argument is the array dimension 00290 // horizontal 00291 int n_h = 0; 00292 boost::array<double,MUIOO::MAX_PLANE> hx = {{0}}; 00293 boost::array<double,MUIOO::MAX_PLANE> hy = {{0}}; 00294 boost::array<double,MUIOO::MAX_PLANE> hz = {{0}}; 00295 // vertical 00296 int n_v = 0; 00297 boost::array<double,MUIOO::MAX_PLANE> vx = {{0}}; 00298 boost::array<double,MUIOO::MAX_PLANE> vy = {{0}}; 00299 boost::array<double,MUIOO::MAX_PLANE> vz = {{0}}; 00300 00301 double z0 = road_ptr->get()->get_gap0_point().getZ(); 00302 00303 // use constants from float.h to really init min/max properly 00304 double z_max = -DBL_MAX; 00305 double z_min = DBL_MAX; 00306 00307 while(TMuiClusterMapO::const_pointer clust_ptr = clust_iter.next()) { 00308 00309 PHPoint cpos = clust_ptr->get()->get_centroidpos(); 00310 z_min = std::min(z_min,cpos.getZ()); 00311 z_max = std::max(z_max,cpos.getZ()); 00312 if (clust_ptr->get()->get_orientation() == kHORIZ) { 00313 if (n_h >= MUIOO::MAX_PLANE) { 00314 MUIOO::TRACE(" too many horizontal clusters associated to road"); 00315 } 00316 hx.at(n_h) = cpos.getX(); 00317 hy.at(n_h) = cpos.getY(); 00318 hz.at(n_h) = cpos.getZ() - z0; 00319 n_h++; 00320 } 00321 else { // vertical 00322 if (n_v >= MUIOO::MAX_PLANE) { 00323 MUIOO::TRACE(" too many vertical clusters associated to road"); 00324 } 00325 vx.at(n_v) = cpos.getX(); 00326 vy.at(n_v) = cpos.getY(); 00327 vz.at(n_v) = cpos.getZ() - z0; 00328 n_v++; 00329 } 00330 } 00331 00332 double x0=0,m_x=0, y0=0, m_y=0; 00333 double hcov00=0, hcov11=0, hcov22=0; 00334 double vcov00=0, vcov11=0, vcov22=0; 00335 double chi2x=0, chi2y=0; 00336 00337 // Fit x: method from gsl_fit.h 00338 // use vertical info 00339 gsl_fit_linear(vz.begin(),1,vx.begin(),1,n_v, 00340 &x0,&m_x,&vcov00,&vcov11,&vcov22,&chi2x); 00341 00342 // Fit y 00343 // use horizontal info 00344 gsl_fit_linear(hz.begin(),1,hy.begin(),1,n_h, 00345 &y0,&m_y,&hcov00,&hcov11,&hcov22,&chi2y); 00346 00347 // no sanity check made on results - let's just store them 00348 fit_par.set_x(x0); 00349 fit_par.set_y(y0); 00350 fit_par.set_z(z0); 00351 fit_par.set_dxdz(m_x); 00352 fit_par.set_dydz(m_y); 00353 00354 // for the covariance part, we don't need to use all the 4x4 space 00355 // in TMutFitPar, 2*3 is enough; first horizontal and then vertical info 00356 fit_par.set_covar(kHORIZ, 0, hcov00); 00357 fit_par.set_covar(kHORIZ, 1, hcov11); 00358 fit_par.set_covar(kHORIZ, 2, hcov22); 00359 fit_par.set_covar(kVERT, 0, vcov00); 00360 fit_par.set_covar(kVERT, 1, vcov11); 00361 fit_par.set_covar(kVERT, 2, vcov22); 00362 00363 // chi-sq and degrees of freedom 00364 double chisq = chi2x + chi2y; 00365 size_t ndof = n_h + n_v - 2*2; 00366 if (ndof > 0) { 00367 chisq /= ndof; 00368 road_ptr->get()->set_road_quality(chisq); 00369 } 00370 else { 00371 road_ptr->get()->set_road_quality(0.0); 00372 } 00373 road_ptr->get()->set_freedom(ndof); 00374 fit_par.set_chi_square(chisq); 00375 00376 // "begin" is closest to interaction region 00377 // 00378 if(road_ptr->get()->get_arm() == MUIOO::South) { 00379 fit_par.set_z_begin(z_max) ; 00380 fit_par.set_z_end(z_min); 00381 } 00382 else { 00383 fit_par.set_z_begin(z_min) ; 00384 fit_par.set_z_end(z_max); 00385 } 00386 road_ptr->get()->set_fit_par(fit_par); 00387 } 00388 00389 return; 00390 } |
|
Reset IOC and external interface pointers Definition at line 100 of file mMuiFindRoad.cxx. References _cluster_map, _mod_par, and _road_map. Referenced by event.
00100 { 00101 00102 // module runtime parameters 00103 // 00104 _mod_par = TMutNode<mMuiFindRoadPar>::find_node(top_node,"mMuiFindRoadPar"); 00105 00106 // TMuiCluster IOC 00107 // 00108 _cluster_map = TMutNode<TMuiClusterMapO>::find_node(top_node,"TMuiClusterMapO"); 00109 // TMuiRoad IOC 00110 // 00111 _road_map = TMutNode<TMuiRoadMapO>::find_node(top_node,"TMuiRoadMapO"); 00112 } |
|
Definition at line 393 of file mMuiFindRoad.cxx. References _road_map. Referenced by event.
00394 { 00395 // The parameters that have been set so far is basically 00396 // just which clusters belong to it and what the fit parameters 00397 // are. freedom and road_quality should be set in fit_roads() 00398 // Not set variables are 00399 // nhit - number of clusters in both orientations 00400 // depth - last plane hit 00401 // gapbit - bit coding of which gap/plane and orientation had a hit 00402 // max_hit_plane - maximum hits associated per plane? 00403 // ghost_flag 00404 // group 00405 // golden 00406 // 00407 // The last three of these are not too relevant for this roadfinder 00408 // and we'll leave them as their init values. 00409 // The ones with ?, I'm not exactly sure of the meaning of 00410 // (previously not set in standard road finder: mMuiRoadFinder1) 00411 00412 // Get an iterator to all roads 00413 // 00414 TMuiRoadMapO::iterator road_iter = _road_map->range(); 00415 while(TMuiRoadMapO::pointer road_ptr = road_iter.next()) { 00416 00417 // Iterator for all clusters associated to this road 00418 TMuiClusterMapO::const_key_iterator clust_iter = 00419 road_ptr->get()->get_associated<TMuiClusterO>(); 00420 00421 road_ptr->get()->set_nhit(clust_iter.count()); 00422 00423 00424 UShort_t depth = 0; 00425 UShort_t gapbit = 0; 00426 UShort_t hits_plane[MUIOO::MAX_PLANE] = {0}; 00427 00428 while(TMuiClusterMapO::const_pointer clust_ptr = clust_iter.next()) { 00429 00430 if (depth < clust_ptr->get()->get_plane()) { 00431 depth = clust_ptr->get()->get_plane(); 00432 } 00433 gapbit=gapbit | (clust_ptr->get()->get_plane() << 00434 (MUIOO::MAX_PLANE*clust_ptr->get()->get_orientation())); 00435 hits_plane[clust_ptr->get()->get_plane()]++; 00436 } 00437 road_ptr->get()->set_depth(depth); 00438 road_ptr->get()->set_gapbit(gapbit); 00439 UShort_t max_hit_plane = 0; 00440 for (int plane = 0; plane<MUIOO::MAX_PLANE; plane++) { 00441 if (max_hit_plane < hits_plane[plane]) { 00442 max_hit_plane = hits_plane[plane]; 00443 } 00444 } 00445 road_ptr->get()->set_max_hit_plane(max_hit_plane); 00446 } 00447 return; 00448 } |
|
Definition at line 103 of file mMuiFindRoad.h. Referenced by associate_clusters, find_roads, and set_interface_ptrs. |
|
Definition at line 102 of file mMuiFindRoad.h. Referenced by apply_road_cuts, associate_clusters, event, find_roads, and set_interface_ptrs. |
|
Definition at line 104 of file mMuiFindRoad.h. Referenced by apply_road_cuts, associate_clusters, eliminate_duplicates, event, find_roads, fit_roads, set_interface_ptrs, and set_road_parameters. |
|
Definition at line 108 of file mMuiFindRoad.h. Referenced by find_roads. |
|
Definition at line 112 of file mMuiFindRoad.h. Referenced by event. |