Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

TMuiRoadFinder.h

Go to the documentation of this file.
00001 
00002 //
00003 // Utility class: TMuiRoadFinder
00004 // (based on TMutStubFinder by S. Kelly)
00005 // Description: Encapsulates the road finding algorithm
00006 //              used by the mMuiFindRoad module
00007 //              
00009 
00010 #ifndef __TMUIROADFINDER_H__
00011 #define __TMUIROADFINDER_H__
00012 
00013 #include <iostream>
00014 #include<list>
00015 #include<set>
00016 #include<TDataType.h>
00017 #include<TMuiClusterMapO.h>
00018 #include<TMutFitPar.hh>
00019 #include<TMutTrackUtil.h>
00020 #include<mMuiFindRoadPar.h>
00021 #include<PHPoint.h>
00022 #include<TNtuple.h>
00023 #include<TFile.h>
00024 
00027 
00028 
00046 class TMuiRoadFinder
00047 {
00048  public:  
00049   
00050   class Road;
00051   typedef std::list<Road> road_list;
00052   typedef std::pair<float,float> road_window;
00053   enum WindowEnum { IN_WINDOW, LOW_WINDOW, HIGH_WINDOW };
00054 
00055   TMuiRoadFinder() {}
00056 
00060   void find(TMuiClusterMapO* cluster_map);
00061   
00068   void find(TMuiClusterMapO* cluster_map,
00069             UShort_t arm, 
00070             bool use_window = false,
00071             const road_window& theta_window = std::make_pair(0,0),
00072             const road_window& phi_window = std::make_pair(0,0));
00073   
00079   road_list& get_road_list() { return _road_list; }
00080   
00084   void clear_road_list() { _road_list.clear(); }
00085 
00089   std::list<TMuiClusterMapO::value_type> 
00090     TMuiRoadFinder::get_coords_in_window(TMuiClusterMapO* cluster_map,
00091                                          UShort_t arm,
00092                                          const road_window& 
00093                                          theta_window,
00094                                          const road_window& 
00095                                          phi_window);
00096 
00100   void evaluate(PHCompositeNode* top_node);
00104   static void initialize_evaluation();  
00108   static void finish_evaluation();
00109                                                       
00113   static void set_verbose(bool verbose) { 
00114     _verbose = verbose;
00115     Road::set_verbose(verbose);
00116   }
00117   
00124   static void set_reversed_algo(bool reverse_algo) { 
00125     _reverse_algo = reverse_algo;
00126   }
00127   
00131   static void set_dca_cut(double dca_cut) { 
00132     Road::set_dca_cut(dca_cut);
00133   }
00134   
00138   static void set_prox_cut(double prox_cut) { 
00139     Road::set_prox_cut(prox_cut);
00140   }
00141 
00145   static void set_orient_z_dist(double orient_z_dist) { 
00146     Road::set_orient_z_dist(orient_z_dist);
00147   }
00148 
00152   static void set_tube_width(double tube_width) { 
00153     Road::set_tube_width(tube_width);
00154   }
00155   
00159   static void set_min_cluster(UShort_t min_cluster) { 
00160     _min_cluster = min_cluster;
00161   }
00162 
00166   static void set_max_cluster_share(UShort_t max_cluster_share) { 
00167     _max_cluster_share = max_cluster_share;
00168   }
00169 
00173   static void set_min_point(UShort_t min_point) { 
00174     _min_point = min_point;
00175   }
00176   
00180   class Road {
00181     
00182   public:    
00183         
00184     struct cluster_less_ftor
00185     {
00186       bool operator()(TMuiClusterMapO::value_type cluster1, 
00187                       TMuiClusterMapO::value_type cluster2)
00188       {
00189         if(cluster1.get()->get_key().get_obj_key() < 
00190            cluster2.get()->get_key().get_obj_key()) {
00191           return true;
00192         } 
00193         else {
00194           return false;
00195         }
00196       }
00197     };   
00198     
00199     typedef std::set<TMuiClusterMapO::value_type, cluster_less_ftor> cluster_list;
00200     typedef std::vector<PHPoint> point_list;
00201     
00202     Road(TMuiRoadFinder* finder,
00203          const TMuiClusterMapO::pointer cluster_ptr,
00204          bool use_window,
00205          const road_window& theta_window,
00206          const road_window& phi_window) :
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       }
00217     
00218     Road(TMuiRoadFinder* finder, const TMuiClusterMapO::pointer cluster_ptr):
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       }
00229     
00230     const TMutFitPar & get_fit_par() const  {return _fit_par;}
00231     
00232     size_t get_n_cluster() const {return _clusters.size();}    
00233     size_t get_n_point() const {return _points.size();}    
00234     
00235     bool add_cluster(TMuiClusterMapO::pointer cluster_ptr);  
00236     bool bifurcate(TMuiClusterMapO::pointer cluster_ptr);      
00237     
00238     UShort_t get_arm() const {return _arm;}
00239     
00240     // Non-const so it can be sorted by an external ftor
00241     //
00242     cluster_list& get_cluster_list() { return _clusters; }
00243     point_list& get_point_list() { return _points; }
00244     road_window get_theta_window() const { return _theta_window; }
00245     road_window get_phi_window() const { return _phi_window; }
00246     
00247     // Return the polar radius of the road extrapolated to requested z
00248     //
00249     double get_r_at_z(double z) const {
00250       PHPoint p = TMutTrackUtil::linear_track_model(&_fit_par,z);
00251       return std::sqrt(MUIOO::SQUARE(p.getX()) + MUIOO::SQUARE(p.getY()));
00252     }
00253     
00254     double get_theta() const {
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     }
00259     
00260     double get_phi() const {
00261       return atan2(_fit_par.get_y(), _fit_par.get_x());
00262     }
00263     
00264     static void set_dca_cut(double dca_cut){
00265       _dca_cut = dca_cut;
00266     }
00267     
00268     static void set_prox_cut(double prox_cut){
00269       _prox_cut = prox_cut;
00270     }
00271 
00272     static void set_orient_z_dist(double orient_z_dist) { 
00273       _orient_z_dist = orient_z_dist;
00274     }
00275 
00276     static void set_tube_width(double tube_width) { 
00277       _tube_width = tube_width;
00278     }
00279     
00280     static void set_verbose(bool verbose){
00281       _verbose = verbose;
00282     }
00283     
00284     bool is_complete() const { return _complete; }
00285     void set_complete(bool complete) { _complete = complete; }
00286     bool get_status() const {return _status; }
00287     void set_status(bool status) {_status = status;}
00288     
00289     bool check_theta_window(const road_window& theta_window) const;
00290     bool check_phi_window(const road_window& theta_window) const;
00291     
00292     void print() const { 
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     }
00312 
00313     static void initialize_evaluation();
00314     static void finish_evaluation();
00315 
00316   private: 
00317     
00318     // Private Methods
00319     //
00320     PHPoint make_point(const TMuiClusterMapO::pointer) const;
00321     void update_road(TMuiClusterMapO::pointer);
00322     void update_road(TMuiClusterMapO::pointer, const PHPoint& point);
00323     bool test_window(const PHPoint&) const;
00324     bool check_parallel(const TMuiClusterMapO::pointer) const ;
00325     PHPoint project(double z) const;
00326     bool check_proximity(TMuiClusterMapO::pointer cluster_ptr) const;
00327     bool check_dca(const TMuiClusterMapO::pointer cluster_ptr, const PHPoint&) const;
00328     bool check_slope() const;
00329     bool unique_check(TMuiClusterMapO::pointer cluster_ptr) const;
00330     
00331     // Pointer to parent algorithm
00332     //
00333     TMuiRoadFinder* _finder;
00334     
00335     // Locators
00336     //
00337     UShort_t _arm;
00338     
00339     // Window
00340     //
00341     road_window _theta_window;
00342     road_window _phi_window;
00343     bool _has_window;
00344     bool has_window() const { return _has_window; }
00345     
00346     // Complete Tag
00347     //
00348     bool _complete;
00349     bool _status;
00350     
00351     // Cuts
00352     //
00353     static double _dca_cut;
00354     static double _prox_cut;
00355     static bool _use_slope_cuts;
00356 
00357     // Offset between orientations in z
00358     //
00359     static double _orient_z_dist;
00360 
00361     // Width of tube
00362     //
00363     static double _tube_width;
00364     
00365     // Road clusters
00366     //
00367     cluster_list _clusters;  
00368     
00369     // Road points
00370     //
00371     point_list _points;  
00372 
00373     // Road parameters
00374     //
00375     TMutFitPar _fit_par;      
00376     
00377     // Verbosity
00378     //
00379     static bool _verbose;
00380 
00381     // Evaluation
00382     //
00383     static bool _evaluation;
00384     static TFile* _file;
00385     static TNtuple* _ntuple;
00386     static boost::array<float,20> _eval_data;
00387 
00388   }; 
00389   
00390   struct road_print_ftor
00391   {
00392     void operator() (const Road& road) {
00393       road.print();
00394     }
00395   };
00396   
00397   struct road_bad_status_ftor
00398   {
00399     bool operator()(const Road& road) {
00400       return !road.get_status();
00401     }
00402   };   
00403   
00404   struct road_equal_ftor
00405   {
00406     bool operator()(Road& road1, Road& road2)
00407     {
00408       if(road1.get_cluster_list() == road2.get_cluster_list()) {
00409         return true;
00410       } 
00411       else {
00412         return false;
00413       }
00414     }
00415   };   
00416   
00417   
00418   struct road_less_ftor
00419   {
00420     bool operator()(Road& road1, Road& road2)
00421     {
00422       if(road1.get_cluster_list() < road2.get_cluster_list()) {
00423         return true;
00424       } 
00425       else {
00426         return false;
00427       }
00428     }
00429   };   
00430   
00431   struct point_less_ftor
00432   {
00433     bool operator()(const PHPoint& point1, const PHPoint& point2)
00434     {
00435       double r1 = std::sqrt(MUIOO::SQUARE(point1.getX()) +
00436                             MUIOO::SQUARE(point1.getY()) +
00437                             MUIOO::SQUARE(point1.getZ()));
00438       
00439       double r2 = std::sqrt(MUIOO::SQUARE(point2.getX()) +
00440                             MUIOO::SQUARE(point2.getY()) +
00441                             MUIOO::SQUARE(point2.getZ()));
00442       
00443       return r1 < r2;
00444     }
00445   };
00446   
00447   static WindowEnum check_phi_window(const PHPoint& point, 
00448                                      const TMuiRoadFinder::road_window& 
00449                                      phi_window);
00450  
00451   static WindowEnum check_theta_window(const PHPoint& point, 
00452                                        const TMuiRoadFinder::road_window&
00453                                        theta_window);
00454  private:
00455   
00456   friend class Road;
00457   
00458   bool append_to_road(TMuiClusterMapO::pointer);
00459   
00460   TMuiRoadFinder::Road* start_new_road(TMuiClusterMapO::pointer,
00461                                        bool use_window,
00462                                        const road_window& theta_window,
00463                                        const road_window& phi_window);
00464   void abort_new_road();
00465   
00466   void set_complete_tag();
00467   
00468   void remove_includes();
00469   
00470   void print_roads() const;
00471   
00472   // Storage for road list
00473   //
00474   road_list _road_list;
00475   
00476   // Verbosity
00477   //
00478   static bool _verbose;
00479   static bool _reverse_algo;
00480   static UShort_t _min_cluster;
00481   static UShort_t _min_point;
00482   static UShort_t _max_cluster_share;
00483 
00484   static bool _evaluation; 
00485   static TFile* _file; 
00486   static TNtuple* _ntuple; 
00487 };
00488 
00489 #endif

MUIOO: PHENIX Muon Identifier Analysis Framework. Documentation by doxygen
Last modified: