#include <TMuiRoadFinder.h>
Public Types | |
typedef std::set< TMuiClusterMapO::value_type, cluster_less_ftor > | cluster_list |
typedef std::vector< PHPoint > | point_list |
Public Methods | |
Road (TMuiRoadFinder *finder, const TMuiClusterMapO::pointer cluster_ptr, bool use_window, const road_window &theta_window, const road_window &phi_window) | |
Road (TMuiRoadFinder *finder, const TMuiClusterMapO::pointer cluster_ptr) | |
const TMutFitPar & | get_fit_par () const |
size_t | get_n_cluster () const |
size_t | get_n_point () const |
bool | add_cluster (TMuiClusterMapO::pointer cluster_ptr) |
bool | bifurcate (TMuiClusterMapO::pointer cluster_ptr) |
UShort_t | get_arm () const |
cluster_list & | get_cluster_list () |
point_list & | get_point_list () |
road_window | get_theta_window () const |
road_window | get_phi_window () const |
double | get_r_at_z (double z) const |
double | get_theta () const |
double | get_phi () const |
bool | is_complete () const |
void | set_complete (bool complete) |
bool | get_status () const |
void | set_status (bool status) |
bool | check_theta_window (const road_window &theta_window) const |
bool | check_phi_window (const road_window &theta_window) const |
void | print () const |
Static Public Methods | |
void | set_dca_cut (double dca_cut) |
void | set_prox_cut (double prox_cut) |
void | set_orient_z_dist (double orient_z_dist) |
void | set_tube_width (double tube_width) |
void | set_verbose (bool verbose) |
void | initialize_evaluation () |
void | finish_evaluation () |
Private Methods | |
PHPoint | make_point (const TMuiClusterMapO::pointer) const |
void | update_road (TMuiClusterMapO::pointer) |
void | update_road (TMuiClusterMapO::pointer, const PHPoint &point) |
bool | test_window (const PHPoint &) const |
bool | check_parallel (const TMuiClusterMapO::pointer) const |
PHPoint | project (double z) const |
bool | check_proximity (TMuiClusterMapO::pointer cluster_ptr) const |
bool | check_dca (const TMuiClusterMapO::pointer cluster_ptr, const PHPoint &) const |
bool | check_slope () const |
bool | unique_check (TMuiClusterMapO::pointer cluster_ptr) const |
bool | has_window () const |
Private Attributes | |
TMuiRoadFinder * | _finder |
UShort_t | _arm |
road_window | _theta_window |
road_window | _phi_window |
bool | _has_window |
bool | _complete |
bool | _status |
cluster_list | _clusters |
point_list | _points |
TMutFitPar | _fit_par |
Static Private Attributes | |
double | _dca_cut = 4.0 |
double | _prox_cut = 4.0 |
bool | _use_slope_cuts = false |
double | _orient_z_dist = 2.0 |
double | _tube_width = 8.35 |
bool | _verbose = false |
bool | _evaluation = false |
TFile * | _file = 0 |
TNtuple * | _ntuple = 0 |
boost::array< float, 20 > | _eval_data |
Definition at line 180 of file TMuiRoadFinder.h.
|
Definition at line 199 of file TMuiRoadFinder.h. Referenced by TMuiRoadFinder::evaluate, and get_cluster_list. |
|
Definition at line 200 of file TMuiRoadFinder.h. Referenced by get_point_list. |
|
Definition at line 202 of file TMuiRoadFinder.h. References _arm, _clusters, _complete, _finder, _has_window, _phi_window, _status, _theta_window, and get_arm.
00206 : 00207 _finder(finder), 00208 _arm(cluster_ptr->get()->get_arm()), 00209 _theta_window(theta_window), 00210 _phi_window(phi_window), 00211 _has_window(use_window), 00212 _complete(false), 00213 _status(true) 00214 { 00215 _clusters.insert(*cluster_ptr); 00216 } |
|
Definition at line 218 of file TMuiRoadFinder.h. References _arm, _clusters, _complete, _finder, _has_window, _phi_window, _status, _theta_window, and get_arm.
00218 : 00219 _finder(finder), 00220 _arm(cluster_ptr->get()->get_arm()), 00221 _theta_window(std::make_pair(0,0)), 00222 _phi_window(std::make_pair(0,0)), 00223 _has_window(false), 00224 _complete(false), 00225 _status(true) 00226 { 00227 _clusters.insert(*cluster_ptr); 00228 } |
|
Definition at line 275 of file TMuiRoadFinder.cxx. References _arm, _clusters, _eval_data, _ntuple, _points, bifurcate, check_dca, check_parallel, check_proximity, check_slope, has_window, make_point, project, test_window, unique_check, and update_road. Referenced by bifurcate.
00276 { 00277 bool was_added=false; 00278 if(_evaluation) _eval_data.assign(0); 00279 00280 // If road has a cluster in this plane and orientation and has a least 2 clusters 00281 // already then call bifurcate 00282 // 00283 if(!unique_check(cluster_ptr)) { 00284 if(_clusters.size()>1) { 00285 was_added = bifurcate(cluster_ptr); 00286 return was_added; 00287 } else { 00288 return false; // too small to add to 00289 } 00290 } 00291 00292 // If we made it until here, it means that this cluster is the first in this plane 00293 // and orientation and could add to our information on the road (if it fits in) 00294 00295 // if Road has point [ 00296 // project point to z of cluster 00297 // test theta, phi window of projected point 00298 // test projected point - cluster DCA 00299 // if added update road parameters 00300 // ] else [ 00301 // if can make point with this cluster [ 00302 // test theta, phi window of point 00303 // if added update road parameters 00304 // ] else [ 00305 // test proximity of cluster with existing cluster 00306 // ] 00307 // ] 00308 00309 if(_points.size() != 0){ 00310 00311 PHPoint point = project(cluster_ptr->get()->get_centroidpos().getZ()); 00312 if(test_window(point) && 00313 check_dca(cluster_ptr,point) && 00314 check_proximity(cluster_ptr)){ 00315 update_road(cluster_ptr); 00316 was_added = true; 00317 } 00318 00319 } 00320 else { 00321 // Check if this cluster is parallel to existing cluster 00322 // 00323 if(!check_parallel(cluster_ptr)) { 00324 // Not parallel (and the right panel/plane) so it will intersect 00325 // with an existing cluster in this road - update&add 00326 if (has_window()) { 00327 PHPoint point = make_point(cluster_ptr); 00328 // If point is in window then add coord and point to stub 00329 // 00330 if(test_window(point)){ 00331 update_road(cluster_ptr); 00332 was_added = true; 00333 } 00334 } 00335 else { 00336 update_road(cluster_ptr); 00337 was_added = true; 00338 } 00339 } 00340 else { 00341 // Prior and current cluster are parallel, check proximity and add 00342 // cluster to road if proximity cut is satisfied. 00343 // 00344 if (check_proximity(cluster_ptr)) { 00345 update_road(cluster_ptr); 00346 was_added = true; 00347 } 00348 } 00349 } 00350 00351 if(_clusters.size() >= 3){ 00352 check_slope(); 00353 } 00354 if(_evaluation) { 00355 _eval_data[0] = _arm; 00356 _eval_data[1] = cluster_ptr->get()->get_plane(); 00357 _eval_data[2] = cluster_ptr->get()->get_panel(); 00358 _eval_data[3] = cluster_ptr->get()->get_orientation(); 00359 _eval_data[4] = _clusters.size(); 00360 _eval_data[5] = was_added ? 1 : 0; 00361 _ntuple->Fill(&(_eval_data[0])); 00362 } 00363 return was_added; 00364 } |
|
Definition at line 463 of file TMuiRoadFinder.cxx. References _clusters, _finder, _has_window, _phi_window, TMuiRoadFinder::_road_list, _theta_window, TMuiRoadFinder::abort_new_road, add_cluster, TMuiRoadFinder::start_new_road, and update_road. Referenced by add_cluster.
00464 { 00465 // Sanity check 00466 // 00467 if(_finder->_road_list.size() > 500) { 00468 throw std::runtime_error(DESCRIPTION("bifurcate: too many roads")); 00469 } 00470 00471 // New road pointer with null initialization 00472 // 00473 TMuiRoadFinder::Road* new_road_ptr = 0; 00474 00475 // Loop over cluster list; copy clusters from old road that are not in the 00476 // same plane as cluster_ptr 00477 // 00478 cluster_list::iterator cluster_iter = _clusters.begin(); 00479 for(;cluster_iter!=_clusters.end();++cluster_iter){ 00480 if(cluster_ptr->get()->get_plane() != cluster_iter->get()->get_plane()) { 00481 // Old cluster 00482 // 00483 TMuiClusterMapO::value_type old_cluster = *cluster_iter; 00484 00485 // First time start the new road -- subsequent times update road with old cluster 00486 // 00487 if(!new_road_ptr) { 00488 new_road_ptr = _finder->start_new_road(&old_cluster, _has_window, _theta_window, _phi_window); 00489 } else { 00490 new_road_ptr->update_road(&old_cluster); 00491 } 00492 } 00493 } 00494 00495 // If cluster_ptr is the first then return here 00496 // 00497 if(!new_road_ptr) { 00498 _finder->start_new_road(cluster_ptr, _has_window, _theta_window, _phi_window); 00499 return true; 00500 } 00501 00502 // Now we have a road that is guarenteed *not* to have a cluster in the same plane 00503 // as cluster_ptr. Here we invoke a fancy (obtuse) piece of recursion by calling 00504 // add_cluster using the new road pointer. This will ensure that exactly the same 00505 // criteria is applied for adding clusters to roads in both the original and 00506 // new (bifurcated) road. 00507 // 00508 bool was_added = new_road_ptr->add_cluster(cluster_ptr); 00509 if(was_added) { 00510 return true; 00511 } else { 00512 _finder->abort_new_road(); 00513 return false; 00514 } 00515 } |
|
Definition at line 433 of file TMuiRoadFinder.cxx. Referenced by add_cluster.
00435 { 00436 // get the line info for the cluster 00437 PHLine line = cluster_ptr->get()->get_coord(); 00438 double distance = PHGeometry::distanceLinePoint(line, point); 00439 // normalize distance to something 00440 // width is from the narrow dimension of the tube 00441 if (_tube_width > 0) distance /= _tube_width; 00442 else return false; 00443 00444 if(_evaluation) { 00445 _eval_data[8] = distance; 00446 } 00447 00448 if(distance < _dca_cut) { 00449 // since the line distance calculation assumes an infinite line, 00450 // it is possible to get an acceptable distance even when the line is 00451 // offset from the point. Use centroidpos, which should not be more 00452 // than half the length away from any point, for this 00453 double projdist = PHGeometry::distancePointToPoint(cluster_ptr->get()->get_centroidpos(), point); 00454 double halflength = 0.5*line.length(); 00455 if (projdist < halflength) { 00456 return true; 00457 } 00458 } 00459 return false; 00460 } |
|
Definition at line 367 of file TMuiRoadFinder.cxx. References _clusters. Referenced by add_cluster.
00368 { 00369 // Loop over clusters in road cluster list and check for non-parallel cluster 00370 // in the same plane, panel 00371 cluster_list::const_iterator cluster_iter = _clusters.begin(); 00372 for(;cluster_iter!=_clusters.end();++cluster_iter){ 00373 if ( (cluster_iter->get()->get_plane() == cluster_ptr->get()->get_plane()) && 00374 (cluster_iter->get()->get_panel() == cluster_ptr->get()->get_panel()) && 00375 (cluster_iter->get()->get_orientation() != cluster_ptr->get()->get_orientation()) ) { 00376 return false; 00377 } 00378 } 00379 return true; 00380 } |
|
|
|
Definition at line 519 of file TMuiRoadFinder.cxx. References _clusters, _eval_data, _prox_cut, and _tube_width. Referenced by add_cluster.
00520 { 00521 // This method is called only when we don't have any points found yet, and 00522 // not any non-parallell clusters to this new one, in the same plane and panel. 00523 // If the new one is close enough, we'll add it to our cluster list. 00524 // 00525 // Idiot check 00526 // 00527 if(!_clusters.size()) throw std::logic_error(DESCRIPTION("attempted comparison with null entry")); 00528 00529 PHPoint point1 = cluster_ptr->get()->get_centroidpos(); 00530 00531 // Loop over clusters in road cluster list and get the closest (in Z) parallel cluster 00532 double distance = DBL_MAX; 00533 cluster_list::const_iterator best_iter; 00534 cluster_list::const_iterator cluster_iter = _clusters.begin(); 00535 for(;cluster_iter!=_clusters.end();++cluster_iter){ 00536 if (cluster_iter->get()->get_orientation() == cluster_ptr->get()->get_orientation()) { 00537 PHPoint point2 = cluster_iter->get()->get_centroidpos(); 00538 double thisdistance = std::fabs(point2.getZ() - point1.getZ()); 00539 if (thisdistance < distance) { 00540 distance = thisdistance; 00541 best_iter = cluster_iter; 00542 } 00543 } 00544 } 00545 00546 if (distance == DBL_MAX) { 00547 // nothing found to compare with 00548 return false; 00549 } 00550 00551 PHPoint point2 = best_iter->get()->get_centroidpos(); 00552 point1.setZ(0); 00553 point2.setZ(0); 00554 distance = PHGeometry::distancePointToPoint(point1,point2); 00555 00556 if (_tube_width > 0) distance /= _tube_width; 00557 else return false; 00558 00559 if(_evaluation) { 00560 _eval_data[9] = distance; 00561 } 00562 00563 if(distance < _prox_cut) { 00564 return true; 00565 } 00566 return false; 00567 } |
|
Definition at line 383 of file TMuiRoadFinder.cxx. Referenced by add_cluster.
00384 { 00385 return true; 00386 } |
|
|
|
Definition at line 835 of file TMuiRoadFinder.cxx. References _evaluation, and _ntuple.
00836 { 00837 if(_ntuple) delete _ntuple; 00838 _evaluation = false; 00839 } |
|
Definition at line 238 of file TMuiRoadFinder.h. References _arm. Referenced by Road.
00238 {return _arm;} |
|
Definition at line 242 of file TMuiRoadFinder.h. References _clusters, and cluster_list.
00242 { return _clusters; } |
|
Definition at line 230 of file TMuiRoadFinder.h. References _fit_par.
00230 {return _fit_par;} |
|
Definition at line 232 of file TMuiRoadFinder.h. References _clusters.
00232 {return _clusters.size();} |
|
Definition at line 233 of file TMuiRoadFinder.h. References _points.
00233 {return _points.size();} |
|
Definition at line 260 of file TMuiRoadFinder.h. References _fit_par.
|
|
Definition at line 245 of file TMuiRoadFinder.h. References _phi_window.
00245 { return _phi_window; } |
|
Definition at line 243 of file TMuiRoadFinder.h. References _points, and point_list.
00243 { return _points; } |
|
Definition at line 249 of file TMuiRoadFinder.h. References _fit_par, and MUIOO::SQUARE.
00249 { 00250 PHPoint p = TMutTrackUtil::linear_track_model(&_fit_par,z); 00251 return std::sqrt(MUIOO::SQUARE(p.getX()) + MUIOO::SQUARE(p.getY())); 00252 } |
|
Definition at line 286 of file TMuiRoadFinder.h. References _status.
00286 {return _status; } |
|
Definition at line 254 of file TMuiRoadFinder.h. References _fit_par, and MUIOO::SQUARE.
00254 { 00255 double r = std::sqrt(MUIOO::SQUARE(_fit_par.get_x()) + 00256 MUIOO::SQUARE(_fit_par.get_y())); 00257 return atan2(r,std::fabs(_fit_par.get_z())); 00258 } |
|
Definition at line 244 of file TMuiRoadFinder.h. References _theta_window.
00244 { return _theta_window; } |
|
Definition at line 344 of file TMuiRoadFinder.h. References _has_window. Referenced by add_cluster, and test_window.
00344 { return _has_window; } |
|
Definition at line 815 of file TMuiRoadFinder.cxx. References _evaluation, _file, _ntuple, and MUIOO::TRACE.
00816 { 00817 if(_evaluation) return; 00818 00819 _file = (TFile*)gROOT->GetListOfFiles()->FindObject("muioo_eval_ntuple.root"); 00820 if (_file) { 00821 MUIOO::TRACE("TMuiRoadFinder::Road::initialize_evaluation, creating eval root file"); 00822 _file = new TFile("muioo_eval_ntuple.root", "RECREATE"); 00823 } 00824 00825 // Fields for stub finder algorithm during add cluster stage 00826 // 00827 _ntuple = new TNtuple("road_cluster","road_cluster","arm:plane:panel:orientation:ncoord:added:phi_check:theta_check:dca_dist:prox_dist:x:y:z:phi1:phi2:theta1:theta2"); 00828 cout << " TMuiRoadFinder::Road::initialize_evaluation() ntuple created" << endl; 00829 00830 _evaluation = true; 00831 00832 return; 00833 } |
|
Definition at line 284 of file TMuiRoadFinder.h. References _complete.
00284 { return _complete; } |
|
Definition at line 738 of file TMuiRoadFinder.cxx. References _clusters, and _orient_z_dist. Referenced by add_cluster.
00739 { 00740 // get the line info for the cluster 00741 PHLine line1 = cluster_ptr->get()->get_coord(); 00742 // Loop over clusters in road cluster list and check for non-parallel cluster 00743 // in the same plane, panel 00744 cluster_list::const_iterator cluster_iter = _clusters.begin(); 00745 for(;cluster_iter!=_clusters.end();++cluster_iter){ 00746 if ( (cluster_iter->get()->get_plane() == cluster_ptr->get()->get_plane()) && 00747 (cluster_iter->get()->get_panel() == cluster_ptr->get()->get_panel()) && 00748 (cluster_iter->get()->get_orientation() != cluster_ptr->get()->get_orientation()) ) { 00749 // there should only be one candidate in the list, so we should have it now 00750 PHLine line2 = cluster_iter->get()->get_coord(); 00751 // check possible intersection of line1 and line2 00752 double distance = PHGeometry::distanceLineLine(line1, line2); 00753 00754 if (distance <= _orient_z_dist) // we had an intersection 00755 { 00756 PHPoint point = PHGeometry::closestApproachLineLine(line1, line2); 00757 return point; 00758 } 00759 } 00760 } 00761 return PHPoint(); 00762 } |
|
Definition at line 292 of file TMuiRoadFinder.h. References _clusters, and _points.
00292 { 00293 std::cout << "road: " ; 00294 // clusters 00295 cluster_list::const_iterator iter = _clusters.begin(); 00296 std::cout << " nclusters " << _clusters.size() << std::endl; 00297 for(;iter!=_clusters.end();++iter){ 00298 std::cout << " clusterkey " << iter->get()->get_key().get_obj_key() 00299 << std::endl; 00300 iter->get()->print(); 00301 } 00302 // points 00303 point_list::const_iterator piter = _points.begin(); 00304 std::cout << " npoints " << _points.size() << std::endl; 00305 for(;piter!=_points.end();++piter){ 00306 std::cout << " point " << *piter 00307 << std::endl; 00308 piter->print(); 00309 } 00310 std::cout << std::endl; 00311 } |
|
Definition at line 732 of file TMuiRoadFinder.cxx. References _fit_par. Referenced by add_cluster.
00733 { 00734 return TMutTrackUtil::linear_track_model(&_fit_par,z); 00735 } |
|
Definition at line 285 of file TMuiRoadFinder.h. References _complete.
00285 { _complete = complete; } |
|
Definition at line 264 of file TMuiRoadFinder.h. References _dca_cut.
00264 { 00265 _dca_cut = dca_cut; 00266 } |
|
Definition at line 272 of file TMuiRoadFinder.h. References _orient_z_dist.
00272 { 00273 _orient_z_dist = orient_z_dist; 00274 } |
|
Definition at line 268 of file TMuiRoadFinder.h. References _prox_cut.
00268 { 00269 _prox_cut = prox_cut; 00270 } |
|
Definition at line 287 of file TMuiRoadFinder.h. References _status.
00287 {_status = status;} |
|
Definition at line 276 of file TMuiRoadFinder.h. References _tube_width.
00276 { 00277 _tube_width = tube_width; 00278 } |
|
Definition at line 280 of file TMuiRoadFinder.h. References _verbose.
00280 { 00281 _verbose = verbose; 00282 } |
|
Definition at line 389 of file TMuiRoadFinder.cxx. References _eval_data, _phi_window, _points, _theta_window, TMuiRoadFinder::check_phi_window, TMuiRoadFinder::check_theta_window, has_window, TMuiRoadFinder::IN_WINDOW, and TMuiRoadFinder::WindowEnum. Referenced by add_cluster.
00390 { 00391 // If there is no window defined for this road then 00392 // we can say that the new cluster falls within the window.. 00393 // 00394 if (!has_window()) { 00395 return true; 00396 } 00397 00398 // If we haven't got any points, we don't have a well-defined/centered 00399 // window yet 00400 // 00401 if (_points.size() == 0) { 00402 return true; 00403 } 00404 00405 TMuiRoadFinder::WindowEnum phi_check = 00406 TMuiRoadFinder::check_phi_window(point,_phi_window); 00407 00408 TMuiRoadFinder::WindowEnum theta_check = 00409 TMuiRoadFinder::check_theta_window(point,_theta_window); 00410 00411 if(_evaluation) { 00412 _eval_data[6] = phi_check; 00413 _eval_data[7] = theta_check; 00414 _eval_data[10] = point.getX(); 00415 _eval_data[11] = point.getY(); 00416 _eval_data[12] = point.getZ(); 00417 _eval_data[13] = _phi_window.first; 00418 _eval_data[14] = _phi_window.second; 00419 _eval_data[15] = _theta_window.first; 00420 _eval_data[16] = _theta_window.second; 00421 } 00422 00423 if(phi_check == TMuiRoadFinder::IN_WINDOW && 00424 theta_check == TMuiRoadFinder::IN_WINDOW) { 00425 return true; 00426 } 00427 else { 00428 return false; 00429 } 00430 } |
|
Definition at line 765 of file TMuiRoadFinder.cxx. References _clusters. Referenced by add_cluster.
00766 { 00767 // Loop over clusters and punt if the road already has a cluster in 00768 // this plane and orientation. (no panel check here) 00769 // 00770 cluster_list::const_iterator cluster_iter = _clusters.begin(); 00771 for(;cluster_iter!=_clusters.end();++cluster_iter){ 00772 00773 if(cluster_ptr->get()->get_plane() == cluster_iter->get()->get_plane() && 00774 cluster_ptr->get()->get_orientation() == cluster_iter->get()->get_orientation()) { 00775 return false; 00776 } 00777 } 00778 return true; 00779 } |
|
|
|
Definition at line 570 of file TMuiRoadFinder.cxx. References _arm, _clusters, _fit_par, _orient_z_dist, _phi_window, _points, _status, and _theta_window. Referenced by add_cluster, and bifurcate.
00571 { 00572 // Push cluster onto cluster list 00573 // 00574 _clusters.insert(*cluster_ptr); 00575 00576 // Regenerate points list with new cluster -- repetitive but 00577 // makes the code simple. 00578 // 00579 _points.clear(); 00580 00581 // Loop over all unique combinations of clusters in this road, 00582 // attempt to make points out of cluster that share a common 00583 // plane. 00584 cluster_list::const_iterator iter1 = _clusters.begin(); 00585 for(;iter1!=_clusters.end();++iter1){ 00586 00587 PHLine line1 = iter1->get()->get_coord(); 00588 cluster_list::const_iterator iter2 = iter1; 00589 ++iter2; 00590 00591 for(;iter2!=_clusters.end();++iter2){ 00592 00593 if(iter1->get()->get_plane() == iter2->get()->get_plane() && 00594 iter1->get()->get_panel() == iter2->get()->get_panel() && 00595 iter1->get()->get_orientation() != iter2->get()->get_orientation() ){ 00596 00597 PHLine line2 = iter2->get()->get_coord(); 00598 00599 // check possible intersection of line1 and line2 00600 double distance = PHGeometry::distanceLineLine(line1, line2); 00601 00602 if (distance <= _orient_z_dist) // we had an intersection 00603 { 00604 PHPoint point = PHGeometry::closestApproachLineLine(line1, line2); 00605 _points.push_back(point); 00606 } 00607 } 00608 } 00609 } 00610 00611 // update fit parameters 00612 // std::cout << " number of points " << _points.size() << endl; 00613 if(_points.size()==0){ 00614 00615 // If we have 0 points then just initialize the fit_par with the 00616 // center of the first cluster 00617 // 00618 iter1 = _clusters.begin(); 00619 PHPoint mid_point = iter1->get()->get_centroidpos(); 00620 // One point, take the point with 0 angles (dx/ydz) 00621 // 00622 _fit_par.set_x(mid_point.getX()); 00623 _fit_par.set_y(mid_point.getY()); 00624 _fit_par.set_z(mid_point.getZ()); 00625 _fit_par.set_dxdz(0); 00626 _fit_par.set_dydz(0); 00627 } 00628 else if(_points.size()==1){ 00629 00630 // One point, take the point with 0 angles (dx/ydz) 00631 // 00632 _fit_par.set_x(_points.begin()->getX()); 00633 _fit_par.set_y(_points.begin()->getY()); 00634 _fit_par.set_z(_points.begin()->getZ()); 00635 _fit_par.set_dxdz(0); 00636 _fit_par.set_dydz(0); 00637 00638 // center the phi/theta windows around the found point 00639 PHSphPoint spherepoint; 00640 PHGeometry::cartesianToSpherical(_points[0], spherepoint); 00641 double half_phi_window_size = 0.5*(_phi_window.second - _phi_window.first); 00642 double half_theta_window_size = 0.5*(_theta_window.second - _theta_window.first); 00643 00644 _phi_window.first = static_cast<double>(spherepoint.getPhi()) 00645 - half_phi_window_size; 00646 _phi_window.second = static_cast<double>(spherepoint.getPhi()) 00647 + half_phi_window_size; 00648 _theta_window.first = static_cast<double>(spherepoint.getTheta()) 00649 - half_theta_window_size; 00650 _theta_window.second = static_cast<double>(spherepoint.getTheta()) 00651 + half_theta_window_size; 00652 } 00653 else if(_points.size()>1) { 00654 00655 // More than one point, do a linear fit 00656 // 00657 // The second argument is the array dimension 00658 boost::array<double,MUIOO::MAX_PLANE> x = {{0}}; 00659 boost::array<double,MUIOO::MAX_PLANE> y = {{0}}; 00660 boost::array<double,MUIOO::MAX_PLANE> z = {{0}}; 00661 00662 double z0 = _points[0].getZ(); 00663 size_t n_data = _points.size(); 00664 00665 // use constants from float.h to really init min/max properly 00666 double z_max = -DBL_MAX; 00667 double z_min = DBL_MAX; 00668 00669 PHSphPoint spherepoint; 00670 double phi_sum = 0.0; 00671 double theta_sum = 0.0; 00672 double half_phi_window_size = 0.5*(_phi_window.second - _phi_window.first); 00673 double half_theta_window_size = 0.5*(_theta_window.second - _theta_window.first); 00674 00675 for(size_t i=0;i<n_data;++i){ 00676 PHGeometry::cartesianToSpherical(_points[i], spherepoint); 00677 phi_sum += spherepoint.getPhi(); 00678 theta_sum += spherepoint.getTheta(); 00679 x.at(i) = _points[i].getX(); 00680 y.at(i) = _points[i].getY(); 00681 z.at(i) = _points[i].getZ() - z0; 00682 z_min = std::min(z_min,_points[i].getZ()); 00683 z_max = std::max(z_max,_points[i].getZ()); 00684 } 00685 00686 phi_sum /= n_data; 00687 theta_sum /= n_data; 00688 _phi_window.first = phi_sum - half_phi_window_size; 00689 _phi_window.second = phi_sum + half_phi_window_size; 00690 _theta_window.first = theta_sum - half_theta_window_size; 00691 _theta_window.second = theta_sum + half_theta_window_size; 00692 00693 double x0=0,m_x=0, y0=0, m_y=0; 00694 double cov00=0, cov11=0, cov22=0,chi2x=0,chi2y=0; 00695 00696 // Fit x: method from gsl_fit.h 00697 // 00698 gsl_fit_linear(z.begin(),1,x.begin(),1,n_data, 00699 &x0,&m_x,&cov00,&cov11,&cov22,&chi2x); 00700 00701 // Fit y 00702 // 00703 gsl_fit_linear(z.begin(),1,y.begin(),1,n_data, 00704 &y0,&m_y,&cov00,&cov11,&cov22,&chi2y); 00705 00706 // Sanity check (dx/dz dy/dz cut) 00707 // 00708 if(std::fabs(m_x) > 10 || std::fabs(m_y) > 10) { 00709 _status = false; 00710 return; 00711 } 00712 00713 _fit_par.set_x(x0); 00714 _fit_par.set_y(y0); 00715 _fit_par.set_z(z0); 00716 _fit_par.set_dxdz(m_x); 00717 _fit_par.set_dydz(m_y); 00718 00719 // "begin" is closest to interaction region 00720 // 00721 if(_arm == MUIOO::South) { 00722 _fit_par.set_z_begin(z_max) ; 00723 _fit_par.set_z_end(z_min); 00724 } else { 00725 _fit_par.set_z_begin(z_min) ; 00726 _fit_par.set_z_end(z_max); 00727 } 00728 } 00729 } |
|
Definition at line 337 of file TMuiRoadFinder.h. Referenced by add_cluster, get_arm, Road, and update_road. |
|
Definition at line 367 of file TMuiRoadFinder.h. Referenced by add_cluster, bifurcate, check_parallel, check_proximity, get_cluster_list, get_n_cluster, make_point, print, Road, unique_check, and update_road. |
|
Definition at line 348 of file TMuiRoadFinder.h. Referenced by is_complete, Road, and set_complete. |
|
Definition at line 30 of file TMuiRoadFinder.cxx. Referenced by set_dca_cut. |
|
Definition at line 41 of file TMuiRoadFinder.cxx. Referenced by add_cluster, check_proximity, and test_window. |
|
Definition at line 37 of file TMuiRoadFinder.cxx. Referenced by finish_evaluation, and initialize_evaluation. |
|
Definition at line 39 of file TMuiRoadFinder.cxx. Referenced by initialize_evaluation. |
|
Definition at line 333 of file TMuiRoadFinder.h. |
|
Definition at line 375 of file TMuiRoadFinder.h. Referenced by get_fit_par, get_phi, get_r_at_z, get_theta, project, and update_road. |
|
Definition at line 343 of file TMuiRoadFinder.h. Referenced by bifurcate, has_window, and Road. |
|
Definition at line 40 of file TMuiRoadFinder.cxx. Referenced by add_cluster, finish_evaluation, and initialize_evaluation. |
|
Definition at line 34 of file TMuiRoadFinder.cxx. Referenced by make_point, set_orient_z_dist, and update_road. |
|
Definition at line 342 of file TMuiRoadFinder.h. Referenced by bifurcate, get_phi_window, Road, test_window, and update_road. |
|
Definition at line 371 of file TMuiRoadFinder.h. Referenced by add_cluster, get_n_point, get_point_list, print, test_window, and update_road. |
|
Definition at line 31 of file TMuiRoadFinder.cxx. Referenced by check_proximity, and set_prox_cut. |
|
Definition at line 349 of file TMuiRoadFinder.h. Referenced by get_status, Road, set_status, and update_road. |
|
Definition at line 341 of file TMuiRoadFinder.h. Referenced by bifurcate, get_theta_window, Road, test_window, and update_road. |
|
Definition at line 35 of file TMuiRoadFinder.cxx. Referenced by check_proximity, and set_tube_width. |
|
Definition at line 38 of file TMuiRoadFinder.cxx. |
|
Definition at line 28 of file TMuiRoadFinder.cxx. Referenced by set_verbose. |