00001 #ifndef __MMUIFASTROADFINDER_H__
00002 #define __MMUIFASTROADFINDER_H__
00003
00004 #include "PHModule.h"
00005 #include "PHTimeServer.h"
00006 #include <MUIOO.h>
00007
00008 #include <mMuiFastRoadFinderPar.h>
00009 #include <TMuiRoadMapO.h>
00010 #include <TMuiHitMapO.h>
00011
00012 #include <vector>
00013
00015 struct mui_symset
00016 {
00017 UShort_t idx;
00018 Float_t cos;
00019 UShort_t depth;
00020 UShort_t nhit;
00021 UShort_t dof;
00022 UShort_t gapbit;
00023
00024 Float_t x;
00025 Float_t y;
00026 Float_t z;
00027 Float_t chisq;
00028
00029 mui_symset() : idx(0), cos(0.), depth(0), nhit(0), dof(1), gapbit(0),
00030 x(0.0), y(0.0), z(0.0), chisq(1.0) {}
00031 };
00032 typedef std::vector<mui_symset> symset_list;
00033 typedef symset_list::iterator symset_iterator;
00034
00042 class mMuiFastRoadFinder : public PHModule
00043 {
00044 enum{kTwoPacksPerPlaneMax=326};
00045 public:
00047 mMuiFastRoadFinder();
00049 ~mMuiFastRoadFinder();
00050
00052 PHBoolean event(PHCompositeNode* top_node);
00053
00054 private:
00055
00057 void set_interface_ptrs(PHCompositeNode* top_node);
00058
00060 PHBoolean init();
00061
00063 void read_idx_XoZ_map(const char* filename = "L2MuiIdxXoZ.adb");
00064
00066 void read_twopack_idx_map(const char* filename = "muioomap.adb");
00067
00069 void find_tracks();
00070
00072 void hit_to_logical(UShort_t arm, UShort_t orient);
00073
00075 void calc_symset(UShort_t arm, UShort_t orient);
00076
00079 void hit_to_logical_per_panel(UShort_t arm, UShort_t orient,
00080 UShort_t virt_panel);
00081
00083 void mui_trigger_edge_finder(int nsymsets,
00084 const float idx_XoZ[kTwoPacksPerPlaneMax],
00085 bool *gap0bit,
00086 bool *gap1bit, bool *gap2bit,
00087 bool *gap3bit, bool *gap4bit,
00088 UShort_t arm, UShort_t orient);
00089
00091 void simple_trigger_road_finder(bool **p,
00092 bool& gap1bit, bool& gap2bit,
00093 bool& gap3bit, bool& gap4bit);
00095 void orig_trigger_road_finder(bool **p,
00096 bool& gap1bit, bool& gap2bit,
00097 bool& gap3bit, bool& gap4bit);
00098
00099
00100 void gap0(bool **p, short* showermax);
00101
00102 void gap1(bool **p, short swi, short* showermax, bool* roadfound);
00103
00104 void gap2(bool **p, short swi, short* showermax, bool* roadfound);
00105
00106 void gap3(bool **p, short swi, short* showermax, bool* roadfound);
00107
00108 void gap4(bool **p, short swi, short* showermax, bool* roadfound);
00109
00110 short bsum (bool *st, long n);
00111
00113 bool _signal[kTwoPacksPerPlaneMax][MUIOO::MAX_PLANE];
00114 bool* _trigger_signal[kTwoPacksPerPlaneMax][mMuiFastRoadFinderPar::MAX_SYMSET];
00115
00116 Float_t _idx_XoZ[MUIOO::MAX_ARM][MUIOO::MAX_ORIENTATION][kTwoPacksPerPlaneMax];
00117 UShort_t _twopack_idx[MUIOO::MAX_ARM][MUIOO::MAX_PLANE][MUIOO::MAX_PANEL][MUIOO::MAX_ORIENTATION][kTwoPacksPerPlaneMax];
00118
00120 symset_list _symsets[MUIOO::MAX_ARM][MUIOO::MAX_ORIENTATION];
00121
00123 const mMuiFastRoadFinderPar* _mod_par;
00124 TMuiRoadMapO* _roadmap;
00125 TMuiHitMapO* _hitmap;
00126 PHTimeServer::timer _timer;
00127 };
00128
00129
00130 #endif