00001
00002
00003
00004
00005
00006
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
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
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
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
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
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
00332
00333 TMuiRoadFinder* _finder;
00334
00335
00336
00337 UShort_t _arm;
00338
00339
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
00347
00348 bool _complete;
00349 bool _status;
00350
00351
00352
00353 static double _dca_cut;
00354 static double _prox_cut;
00355 static bool _use_slope_cuts;
00356
00357
00358
00359 static double _orient_z_dist;
00360
00361
00362
00363 static double _tube_width;
00364
00365
00366
00367 cluster_list _clusters;
00368
00369
00370
00371 point_list _points;
00372
00373
00374
00375 TMutFitPar _fit_par;
00376
00377
00378
00379 static bool _verbose;
00380
00381
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
00473
00474 road_list _road_list;
00475
00476
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