#include <mMuiFastRoadFinder.h>
Public Methods | |
mMuiFastRoadFinder () | |
~mMuiFastRoadFinder () | |
PHBoolean | event (PHCompositeNode *top_node) |
Private Methods | |
void | set_interface_ptrs (PHCompositeNode *top_node) |
PHBoolean | init () |
void | read_idx_XoZ_map (const char *filename="L2MuiIdxXoZ.adb") |
void | read_twopack_idx_map (const char *filename="muioomap.adb") |
void | find_tracks () |
void | hit_to_logical (UShort_t arm, UShort_t orient) |
void | calc_symset (UShort_t arm, UShort_t orient) |
void | hit_to_logical_per_panel (UShort_t arm, UShort_t orient, UShort_t virt_panel) |
void | mui_trigger_edge_finder (int nsymsets, const float idx_XoZ[kTwoPacksPerPlaneMax], bool *gap0bit, bool *gap1bit, bool *gap2bit, bool *gap3bit, bool *gap4bit, UShort_t arm, UShort_t orient) |
void | simple_trigger_road_finder (bool **p, bool &gap1bit, bool &gap2bit, bool &gap3bit, bool &gap4bit) |
void | orig_trigger_road_finder (bool **p, bool &gap1bit, bool &gap2bit, bool &gap3bit, bool &gap4bit) |
void | gap0 (bool **p, short *showermax) |
void | gap1 (bool **p, short swi, short *showermax, bool *roadfound) |
void | gap2 (bool **p, short swi, short *showermax, bool *roadfound) |
void | gap3 (bool **p, short swi, short *showermax, bool *roadfound) |
void | gap4 (bool **p, short swi, short *showermax, bool *roadfound) |
short | bsum (bool *st, long n) |
Private Attributes | |
enum | kTwoPacksPerPlaneMax = 326} |
bool | _signal [kTwoPacksPerPlaneMax][MUIOO::MAX_PLANE] |
bool * | _trigger_signal [kTwoPacksPerPlaneMax][mMuiFastRoadFinderPar::MAX_SYMSET] |
Float_t | _idx_XoZ [MUIOO::MAX_ARM][MUIOO::MAX_ORIENTATION][kTwoPacksPerPlaneMax] |
UShort_t | _twopack_idx [MUIOO::MAX_ARM][MUIOO::MAX_PLANE][MUIOO::MAX_PANEL][MUIOO::MAX_ORIENTATION][kTwoPacksPerPlaneMax] |
symset_list | _symsets [MUIOO::MAX_ARM][MUIOO::MAX_ORIENTATION] |
const mMuiFastRoadFinderPar * | _mod_par |
TMuiRoadMapO * | _roadmap |
TMuiHitMapO * | _hitmap |
PHTimeServer::timer | _timer |
\
Definition at line 42 of file mMuiFastRoadFinder.h.
|
Constructor Definition at line 27 of file mMuiFastRoadFinder.cxx.
|
|
Destructor Definition at line 68 of file mMuiFastRoadFinder.cxx.
00068 {} |
|
Definition at line 1878 of file mMuiFastRoadFinder.cxx. Referenced by gap0, gap1, gap2, gap3, gap4, and orig_trigger_road_finder.
01879 { 01880 short sum = 0; 01881 for (short i = 0; i < n; i++) { 01882 if (st[i]) 01883 sum++; 01884 } 01885 return sum; 01886 } |
|
Symset calc for a certain arm and orientation Definition at line 328 of file mMuiFastRoadFinder.cxx. References _idx_XoZ, _mod_par, _trigger_signal, mMuiFastRoadFinderPar::get_mode, mui_trigger_edge_finder, orig_trigger_road_finder, mMuiFastRoadFinderPar::ORIGINAL, simple_trigger_road_finder, mMuiFastRoadFinderPar::SIMPLIFIED, and MUIOO::TRACE. Referenced by find_tracks.
00329 { 00330 // Symset variables. 00331 // ================= 00332 bool gap0bit[TMuiChannelId::kTwoPacksPerPlaneMax]; 00333 bool gap1bit[TMuiChannelId::kTwoPacksPerPlaneMax]; 00334 bool gap2bit[TMuiChannelId::kTwoPacksPerPlaneMax]; 00335 bool gap3bit[TMuiChannelId::kTwoPacksPerPlaneMax]; 00336 bool gap4bit[TMuiChannelId::kTwoPacksPerPlaneMax]; 00337 00338 // Loop over symsets; see if they contain a trigger road. 00339 // ===================================================== 00340 for (short symset = 0; symset < TMuiChannelId::kTwoPacksPerPlaneMax; symset++) 00341 { 00342 // Call the roadfinder, return bits that define tracking 00343 // status to each gap for each symset. 00344 // ===================================================== 00345 gap0bit[symset]=false; 00346 gap1bit[symset]=false; 00347 gap2bit[symset]=false; 00348 gap3bit[symset]=false; 00349 gap4bit[symset]=false; 00350 00351 //Only execute the road finder if there is a hit 00352 // in the (Note: middle of!) first two gaps 00353 if((*(_trigger_signal[symset][2])) 00354 ||(*(_trigger_signal[symset][10]))){ 00355 bool** p = _trigger_signal[symset]; 00356 gap0bit[symset]= *(_trigger_signal[symset][2]); 00357 00358 if( _mod_par->get_mode() == mMuiFastRoadFinderPar::SIMPLIFIED ) { 00359 simple_trigger_road_finder(p, 00360 gap1bit[symset], gap2bit[symset], 00361 gap3bit[symset], gap4bit[symset]); 00362 } 00363 else if ( _mod_par->get_mode() == mMuiFastRoadFinderPar::ORIGINAL ) { 00364 orig_trigger_road_finder(p, 00365 gap1bit[symset], gap2bit[symset], 00366 gap3bit[symset], gap4bit[symset]); 00367 } 00368 else { // unknown mode - shouldn't be possible 00369 MUIOO::TRACE("mMuiFastRoadFinder::calc_symset - unknown alg. mode selected"); 00370 } 00371 } // one of 1st two gaps hit. 00372 } // symset 00373 00374 float idxXoZ[TMuiChannelId::kTwoPacksPerPlaneMax]; 00375 for (short symset = 0; symset < TMuiChannelId::kTwoPacksPerPlaneMax; symset++) 00376 { 00377 idxXoZ[symset] = _idx_XoZ[arm][orient][symset]; 00378 } 00379 00380 // Now let's summarize the results of the symset calculations 00381 // This includes rejecting adjacent, duplicate tracks 00382 mui_trigger_edge_finder(TMuiChannelId::kTwoPacksPerPlaneMax, idxXoZ, 00383 gap0bit, gap1bit, gap2bit, gap3bit, gap4bit, 00384 arm, orient); 00385 } |
|
Find roads in one event's worth of data. Definition at line 71 of file mMuiFastRoadFinder.cxx. References _timer, find_tracks, init, init_done, set_interface_ptrs, and MUIOO::TRACE.
00072 { 00073 _timer.get()->restart(); 00074 try { 00075 // Reset IOC pointers 00076 // 00077 set_interface_ptrs(top_node); 00078 00079 if (!init_done) 00080 { 00081 init(); 00082 init_done = true; 00083 } 00084 // Try to reconstruct some tracks 00085 // 00086 find_tracks(); 00087 00088 } catch(std::exception& e) { 00089 MUIOO::TRACE(e.what()); 00090 return False; 00091 } 00092 _timer.get()->stop(); 00093 return 0; 00094 } |
|
Reconstruct tracks and fill road map Definition at line 186 of file mMuiFastRoadFinder.cxx. References _mod_par, _roadmap, _symsets, calc_symset, mui_symset::chisq, mui_symset::cos, mui_symset::depth, mui_symset::dof, mui_symset::gapbit, mMuiFastRoadFinderPar::get_depth_match, mMuiFastRoadFinderPar::get_min_depth, mMuiFastRoadFinderPar::get_min_slope, mMuiFastRoadFinderPar::get_mode, hit_to_logical, hit_to_logical_per_panel, TMuiRoadMapO::insert_new, mui_symset::nhit, NVIRT_PANELS, mMuiFastRoadFinderPar::ORIGINAL, mMuiFastRoadFinderPar::SIMPLIFIED, MUIOO::TRACE, mui_symset::x, mui_symset::y, and mui_symset::z. Referenced by event.
00187 { 00188 for (UShort_t arm = 0; arm < MUIOO::MAX_ARM; arm++) 00189 { 00190 for (UShort_t orient = 0; orient < MUIOO::MAX_ORIENTATION; orient++) 00191 { 00192 // diff in symset calc between original and simplified is hidden in 00193 // a call in calc_symset method. 00194 _symsets[arm][orient].clear(); 00195 00196 if( _mod_par->get_mode() == mMuiFastRoadFinderPar::SIMPLIFIED ) { 00197 hit_to_logical(arm, orient); // fill signal variables 00198 calc_symset(arm, orient); 00199 } 00200 else if ( _mod_par->get_mode() == mMuiFastRoadFinderPar::ORIGINAL ) { 00201 // loop over virtual panels 00202 for (UShort_t ip = 0; ip<NVIRT_PANELS; ip++) { 00203 hit_to_logical_per_panel(arm, orient, ip); // fill signal variables 00204 calc_symset(arm, orient); 00205 } 00206 } 00207 else { // unknown mode - shouldn't be possible 00208 MUIOO::TRACE("mMuiFastRoadFinder::find_tracks - unknown alg. mode selected"); 00209 } 00210 } 00211 00212 //Make 2D tracks of all 1D combinations/symsets for this arm 00213 unsigned int hid = 0; 00214 unsigned int vid = 0; 00215 int depth = 0; 00216 mui_symset hsymset, vsymset; 00217 00218 for(hid=0; hid<_symsets[arm][kHORIZ].size(); hid++) 00219 { 00220 for(vid=0; vid<_symsets[arm][kVERT].size(); vid++) 00221 { 00222 hsymset = _symsets[arm][kHORIZ][hid]; 00223 vsymset = _symsets[arm][kVERT][vid]; 00224 //Only construct if depth difference between orientations <= depthmatch 00225 if( abs(hsymset.depth - vsymset.depth) <= _mod_par->get_depth_match() ) 00226 { 00227 //The depth of the combination is the larger of the 1D depths 00228 if (hsymset.depth > vsymset.depth) 00229 { 00230 depth = hsymset.depth; 00231 } 00232 else 00233 { 00234 depth = vsymset.depth; 00235 } 00236 00237 // Note: maxmisshits cut and maxmisstotal cut based on gapbits are 00238 // not included. 00239 00240 //Calculate direction of 2D Road. These are slopes not cosines 00241 float cx1 = vsymset.cos; 00242 float cy1 = hsymset.cos; 00243 float invmag = 1.0/sqrt( cx1*cx1 + cy1*cy1 + 1 ); 00244 00245 float dx = cx1*invmag; 00246 float dy = cy1*invmag; 00247 float dz = invmag; 00248 00249 float slope = sqrt((dx*dx+dy*dy)/(dz*dz)); 00250 //float pmin = _mod_par->get_min_momentum(arm, depth)/invmag; 00251 00252 //Add the track to the list, if it passes cuts 00253 if( depth >= _mod_par->get_min_depth() && 00254 slope >= _mod_par->get_min_slope() ) 00255 { 00256 TMutFitPar fit2d; 00257 TMuiRoadMapO::iterator iRoad = _roadmap->insert_new(arm); 00258 TMuiRoadMapO::pointer cRoad = iRoad.current(); 00259 00260 // Things to be set for real road: 00261 // associated clusters are not really kept for now 00262 00263 // nhit, depth, freedom, chi_square, gapbit 00264 cRoad->get()->set_nhit(hsymset.nhit + vsymset.nhit); 00265 00266 cRoad->get()->set_depth(depth); 00267 00268 cRoad->get()->set_freedom(hsymset.dof + vsymset.dof); 00269 00270 cRoad->get()->set_gapbit(hsymset.gapbit | 00271 (vsymset.gapbit << MUIOO::MAX_PLANE)); 00272 00273 //Combine the FitPar of the 1D roads 00274 fit2d.set_x(vsymset.x); 00275 fit2d.set_y(hsymset.y); 00276 fit2d.set_z(hsymset.z); 00277 fit2d.set_dxdz(cx1); 00278 fit2d.set_dydz(cy1); 00279 fit2d.set_z_end(hsymset.z); 00280 fit2d.set_z_begin(hsymset.z); 00281 Float_t chisq = (hsymset.chisq * hsymset.dof + 00282 vsymset.chisq * vsymset.dof)/ 00283 (hsymset.dof + vsymset.dof); 00284 fit2d.set_chi_square(chisq); 00285 00286 cRoad->get()->set_fit_par(fit2d); 00287 // previously not set parameters 00288 cRoad->get()->set_road_quality(chisq); 00289 UShort_t gapmatch = hsymset.gapbit & 00290 vsymset.gapbit; 00291 if (gapmatch != 0) { 00292 cRoad->get()->set_max_hit_plane(2); 00293 } 00294 else { 00295 cRoad->get()->set_max_hit_plane(1); 00296 } 00297 } 00298 } // depth_match 00299 } // vid 00300 } // hid 00301 } // arm 00302 00303 return; 00304 } |
|
Definition at line 822 of file mMuiFastRoadFinder.cxx. References bsum, k0, l0, m0, m0c, m_0, n0, and o0. Referenced by orig_trigger_road_finder.
|
|
Definition at line 841 of file mMuiFastRoadFinder.cxx. References bsum, h1, i1, j1c, j_1, k1, k1c, k_1, l1, l1c, l_1, m0c, m1, m1c, m_0, m_1, musj1, n1, n1c, n_1, o1, o1c, o_1, p1, p1c, p_1, q1, and r1. Referenced by orig_trigger_road_finder.
00843 { 00844 00845 // These variables indicate whether a tube in the current gap is 00846 // pointed to by a tube in the previous gap. 00847 // Note: The way this is done is repetitious for gap1, but 00848 // I did it because it made it easier 00849 // for me to get the pattern for subsequent gaps. 00850 // ============================================================= 00851 bool j1m0 = m_0 && swi==3; bool j1m0c = m0c && swi==3; 00852 bool k1m0 = m_0 && swi>=2; bool k1m0c = m0c && swi>=2; 00853 bool l1m0 = m_0; bool l1m0c = m0c; 00854 bool m1m0 = m_0; bool m1m0c = m0c; 00855 bool n1m0 = m_0; bool n1m0c = m0c; 00856 bool o1m0 = m_0 && swi>=2; bool o1m0c = m0c && swi>=2; 00857 bool p1m0 = m_0 && swi==3; bool p1m0c = m0c && swi==3; 00858 00859 bool j1pre = j1m0; 00860 bool k1pre = k1m0; 00861 bool l1pre = l1m0; 00862 bool m1pre = true ; // Allow skipped gap0. 00863 bool n1pre = n1m0; 00864 bool o1pre = o1m0; 00865 bool p1pre = p1m0; 00866 00867 // Search for road in current gap. 00868 // =============================== 00869 j1c = *(p[musj1]) && j1pre; 00870 k1c = *(p[k1]) && k1pre; 00871 l1c = *(p[l1]) && l1pre; 00872 m1c = *(p[m1]) && m1pre; 00873 n1c = *(p[n1]) && n1pre; 00874 o1c = *(p[o1]) && o1pre; 00875 p1c = *(p[p1]) && p1pre; 00876 00877 *roadfound = j1c || k1c || l1c || m1c 00878 || n1c || o1c || p1c; 00879 00880 // Find shower size. 00881 // ================= 00882 static const short nInShower = 5; 00883 static const short nShowerSums = 7; 00884 bool st[nShowerSums+nInShower-1]; 00885 st[0] = *(p[h1]) && j1pre; 00886 st[1] = *(p[i1]) && k1pre; 00887 st[2] = *(p[musj1]) && l1pre; 00888 st[3] = *(p[k1]) && m1pre; 00889 st[4] = *(p[l1]) && m1pre; 00890 st[5] = *(p[m1]) && m1pre; 00891 st[6] = *(p[n1]) && m1pre; 00892 st[7] = *(p[o1]) && m1pre; 00893 st[8] = *(p[p1]) && n1pre; 00894 st[9] = *(p[q1]) && o1pre; 00895 st[10] = *(p[r1]) && p1pre; 00896 00897 *showermax = 0; 00898 for (short i = 0; i < nShowerSums; i++) { 00899 short shower = (short) bsum(&st[i],nInShower); 00900 if (shower > *showermax) 00901 *showermax = shower; 00902 } 00903 00904 // We need to find out if this gap was skipped. 00905 // The first step is to define variables which indicate 00906 // whether the set tubes on this gap which are projected 00907 // to by each tube on the previous gap are MT. 00908 // Note: The way this is done is repetitious for gap1, but 00909 // I did it because it made it easier 00910 // for me to get the pattern for subsequent gaps. 00911 // ========================================================== 00912 bool m0sl = *(p[l1]) || *(p[m1]) || *(p[n1]) || 00913 (swi == 2 && (*(p[k1]) || *(p[o1]))) || 00914 (swi == 3 && (*(p[musj1]) || *(p[p1]))); 00915 00916 // If a tube on the current gap is pointed to by a tube 00917 // the previous gap, then the current-gap tube's signal projects forward to 00918 // the next gap iff all tubes pointed to by the previous-gap tube are MT. 00919 // ======================================================================== 00920 bool j1m0skip1 = j1m0c && !m0sl; 00921 bool k1m0skip1 = k1m0c && !m0sl; 00922 bool l1m0skip1 = l1m0c && !m0sl; 00923 bool m1m0skip1 = m1m0c && !m0sl; 00924 bool n1m0skip1 = n1m0c && !m0sl; 00925 bool o1m0skip1 = o1m0c && !m0sl; 00926 bool p1m0skip1 = p1m0c && !m0sl; 00927 00928 bool j1skip1 = j1m0skip1; 00929 bool k1skip1 = k1m0skip1; 00930 bool l1skip1 = l1m0skip1; 00931 bool m1skip1 = m1m0skip1; 00932 bool n1skip1 = n1m0skip1; 00933 bool o1skip1 = o1m0skip1; 00934 bool p1skip1 = p1m0skip1; 00935 00936 // Projection to the next gap. 00937 // =========================== 00938 j_1 = j1c || j1skip1; 00939 k_1 = k1c || k1skip1; 00940 l_1 = l1c || l1skip1; 00941 m_1 = m1c || m1skip1; 00942 n_1 = n1c || n1skip1; 00943 o_1 = o1c || o1skip1; 00944 p_1 = p1c || p1skip1; 00945 00946 return; 00947 } |
|
Definition at line 952 of file mMuiFastRoadFinder.cxx. References bsum, e2, f2, g2, g2c, g_2, h2, h2c, h_2, i2, i2c, i_2, j1c, j2, j2c, j_1, j_2, k1c, k2, k2c, k_1, k_2, l1c, l2, l2c, l_1, l_2, m1c, m2, m2c, m_1, m_2, n1c, n2, n2c, n_1, n_2, o1c, o2, o2c, o_1, o_2, p1c, p2, p2c, p_1, p_2, q2, q2c, q_2, r2, r2c, r_2, s2, s2c, s_2, t2, and u2. Referenced by orig_trigger_road_finder.
00954 { 00955 00956 // These variables indicate whether a tube in this gap is 00957 // pointed to by a tube in the previous gap. 00958 // ====================================================== 00959 bool g2j1 = j_1 && swi==3; bool g2j1c = j1c && swi==3; 00960 bool h2j1 = j_1 && swi>=2; bool h2j1c = j1c && swi>=2; 00961 bool i2j1 = j_1; bool i2j1c = j1c; 00962 bool j2j1 = j_1; bool j2j1c = j1c; 00963 bool k2j1 = j_1; bool k2j1c = j1c; 00964 bool l2j1 = j_1 && swi>=2; bool l2j1c = j1c && swi>=2; 00965 bool m2j1 = j_1 && swi==3; bool m2j1c = j1c && swi==3; 00966 00967 bool h2k1 = k_1 && swi==3; bool h2k1c = k1c && swi==3; 00968 bool i2k1 = k_1 && swi>=2; bool i2k1c = k1c && swi>=2; 00969 bool j2k1 = k_1; bool j2k1c = k1c; 00970 bool k2k1 = k_1; bool k2k1c = k1c; 00971 bool l2k1 = k_1; bool l2k1c = k1c; 00972 bool m2k1 = k_1 && swi>=2; bool m2k1c = k1c && swi>=2; 00973 bool n2k1 = k_1 && swi==3; bool n2k1c = k1c && swi==3; 00974 00975 bool i2l1 = l_1 && swi==3; bool i2l1c = l1c && swi==3; 00976 bool j2l1 = l_1 && swi>=2; bool j2l1c = l1c && swi>=2; 00977 bool k2l1 = l_1; bool k2l1c = l1c; 00978 bool l2l1 = l_1; bool l2l1c = l1c; 00979 bool m2l1 = l_1; bool m2l1c = l1c; 00980 bool n2l1 = l_1 && swi>=2; bool n2l1c = l1c && swi>=2; 00981 bool o2l1 = l_1 && swi==3; bool o2l1c = l1c && swi==3; 00982 00983 bool j2m1 = m_1 && swi==3; bool j2m1c = m1c && swi==3; 00984 bool k2m1 = m_1 && swi>=2; bool k2m1c = m1c && swi>=2; 00985 bool l2m1 = m_1; bool l2m1c = m1c; 00986 bool m2m1 = m_1; bool m2m1c = m1c; 00987 bool n2m1 = m_1; bool n2m1c = m1c; 00988 bool o2m1 = m_1 && swi>=2; bool o2m1c = m1c && swi>=2; 00989 bool p2m1 = m_1 && swi==3; bool p2m1c = m1c && swi==3; 00990 00991 bool k2n1 = n_1 && swi==3; bool k2n1c = n1c && swi==3; 00992 bool l2n1 = n_1 && swi>=2; bool l2n1c = n1c && swi>=2; 00993 bool m2n1 = n_1; bool m2n1c = n1c; 00994 bool n2n1 = n_1; bool n2n1c = n1c; 00995 bool o2n1 = n_1; bool o2n1c = n1c; 00996 bool p2n1 = n_1 && swi>=2; bool p2n1c = n1c && swi>=2; 00997 bool q2n1 = n_1 && swi==3; bool q2n1c = n1c && swi==3; 00998 00999 bool l2o1 = o_1 && swi==3; bool l2o1c = o1c && swi==3; 01000 bool m2o1 = o_1 && swi>=2; bool m2o1c = o1c && swi>=2; 01001 bool n2o1 = o_1; bool n2o1c = o1c; 01002 bool o2o1 = o_1; bool o2o1c = o1c; 01003 bool p2o1 = o_1; bool p2o1c = o1c; 01004 bool q2o1 = o_1 && swi>=2; bool q2o1c = o1c && swi>=2; 01005 bool r2o1 = o_1 && swi==3; bool r2o1c = o1c && swi==3; 01006 01007 bool m2p1 = p_1 && swi==3; bool m2p1c = p1c && swi==3; 01008 bool n2p1 = p_1 && swi>=2; bool n2p1c = p1c && swi>=2; 01009 bool o2p1 = p_1; bool o2p1c = p1c; 01010 bool p2p1 = p_1; bool p2p1c = p1c; 01011 bool q2p1 = p_1; bool q2p1c = p1c; 01012 bool r2p1 = p_1 && swi>=2; bool r2p1c = p1c && swi>=2; 01013 bool s2p1 = p_1 && swi==3; bool s2p1c = p1c && swi==3; 01014 01015 bool g2pre = g2j1; 01016 bool h2pre = h2j1 || h2k1; 01017 bool i2pre = i2j1 || i2k1 || i2l1; 01018 bool j2pre = j2j1 || j2k1 || j2l1 || j2m1; 01019 bool k2pre = k2j1 || k2k1 || k2l1 || k2m1 || k2n1; 01020 bool l2pre = l2j1 || l2k1 || l2l1 || l2m1 || l2n1 || l2o1; 01021 bool m2pre = m2j1 || m2k1 || m2l1 || m2m1 || m2n1 || m2o1 || m2p1; 01022 bool n2pre = n2k1 || n2l1 || n2m1 || n2n1 || n2o1 || n2p1; 01023 bool o2pre = o2l1 || o2m1 || o2n1 || o2o1 || o2p1; 01024 bool p2pre = p2m1 || p2n1 || p2o1 || p2p1; 01025 bool q2pre = q2n1 || q2o1 || q2p1; 01026 bool r2pre = r2o1 || r2p1; 01027 bool s2pre = s2p1; 01028 01029 // Search for road in current gap. 01030 // =============================== 01031 g2c = *(p[g2]) && g2pre; 01032 h2c = *(p[h2]) && h2pre; 01033 i2c = *(p[i2]) && i2pre; 01034 j2c = *(p[j2]) && j2pre; 01035 k2c = *(p[k2]) && k2pre; 01036 l2c = *(p[l2]) && l2pre; 01037 m2c = *(p[m2]) && m2pre; 01038 n2c = *(p[n2]) && n2pre; 01039 o2c = *(p[o2]) && o2pre; 01040 p2c = *(p[p2]) && p2pre; 01041 q2c = *(p[q2]) && q2pre; 01042 r2c = *(p[r2]) && r2pre; 01043 s2c = *(p[s2]) && s2pre; 01044 01045 *roadfound = g2c || h2c || i2c || j2c || k2c || l2c || m2c 01046 || n2c || o2c || p2c || q2c || r2c || s2c; 01047 01048 // Find shower size. 01049 // ================= 01050 static const short nInShower = 5; 01051 static const short nShowerSums = 13; 01052 bool st[nShowerSums+nInShower-1]; 01053 st[0] = *(p[e2]) && g2pre; 01054 st[1] = *(p[f2]) && h2pre; 01055 st[2] = *(p[g2]) && i2pre; 01056 st[3] = *(p[h2]) && j2pre; 01057 st[4] = *(p[i2]) && k2pre; 01058 st[5] = *(p[j2]) && l2pre; 01059 st[6] = *(p[k2]) && m2pre; 01060 st[7] = *(p[l2]) && m2pre; 01061 st[8] = *(p[m2]) && m2pre; 01062 st[9] = *(p[n2]) && m2pre; 01063 st[10] = *(p[o2]) && m2pre; 01064 st[11] = *(p[p2]) && n2pre; 01065 st[12] = *(p[q2]) && o2pre; 01066 st[13] = *(p[r2]) && p2pre; 01067 st[14] = *(p[s2]) && q2pre; 01068 st[15] = *(p[t2]) && r2pre; 01069 st[16] = *(p[u2]) && s2pre; 01070 01071 *showermax = 0; 01072 for (short i = 0; i < nShowerSums; i++) { 01073 short shower = (short) bsum(&st[i],nInShower); 01074 if (shower > *showermax) 01075 *showermax = shower; 01076 } 01077 01078 // We need to find out if this gap was skipped. 01079 // The first step is to define variables which indicate 01080 // whether the set tubes on this gap which are projected 01081 // to by each tube on the previous gap are MT. 01082 // ===================================================== 01083 bool j1sl = *(p[i2]) || *(p[j2]) || *(p[k2]) || 01084 (swi == 2 && (*(p[h2]) || *(p[l2]))) || 01085 (swi == 3 && (*(p[g2]) || *(p[m2]))); 01086 01087 bool k1sl = *(p[j2]) || *(p[k2]) || *(p[l2]) || 01088 (swi == 2 && (*(p[i2]) || *(p[m2]))) || 01089 (swi == 3 && (*(p[h2]) || *(p[n2]))); 01090 01091 bool l1sl = *(p[k2]) || *(p[l2]) || *(p[m2]) || 01092 (swi == 2 && (*(p[j2]) || *(p[n2]))) || 01093 (swi == 3 && (*(p[i2]) || *(p[o2]))); 01094 01095 bool m1sl = *(p[l2]) || *(p[m2]) || *(p[n2]) || 01096 (swi == 2 && (*(p[k2]) || *(p[o2]))) || 01097 (swi == 3 && (*(p[j2]) || *(p[p2]))); 01098 01099 bool n1sl = *(p[m2]) || *(p[n2]) || *(p[o2]) || 01100 (swi == 2 && (*(p[l2]) || *(p[p2]))) || 01101 (swi == 3 && (*(p[k2]) || *(p[q2]))); 01102 01103 bool o1sl = *(p[n2]) || *(p[o2]) || *(p[p2]) || 01104 (swi == 2 && (*(p[m2]) || *(p[q2]))) || 01105 (swi == 3 && (*(p[l2]) || *(p[r2]))); 01106 01107 bool p1sl = *(p[o2]) || *(p[p2]) || *(p[q2]) || 01108 (swi == 2 && (*(p[n2]) || *(p[r2]))) || 01109 (swi == 3 && (*(p[m2]) || *(p[s2]))); 01110 01111 // If a tube on the current gap is pointed to by a tube 01112 // the previous gap, then the current-gap tube's signal projects forward to 01113 // the next gap iff all tubes pointed to by the previous-gap tube are MT. 01114 // ======================================================================== 01115 bool g2j1skip2 = g2j1c && !j1sl; 01116 bool h2j1skip2 = h2j1c && !j1sl; 01117 bool i2j1skip2 = i2j1c && !j1sl; 01118 bool j2j1skip2 = j2j1c && !j1sl; 01119 bool k2j1skip2 = k2j1c && !j1sl; 01120 bool l2j1skip2 = l2j1c && !j1sl; 01121 bool m2j1skip2 = m2j1c && !j1sl; 01122 01123 bool h2k1skip2 = h2k1c && !k1sl; 01124 bool i2k1skip2 = i2k1c && !k1sl; 01125 bool j2k1skip2 = j2k1c && !k1sl; 01126 bool k2k1skip2 = k2k1c && !k1sl; 01127 bool l2k1skip2 = l2k1c && !k1sl; 01128 bool m2k1skip2 = m2k1c && !k1sl; 01129 bool n2k1skip2 = n2k1c && !k1sl; 01130 01131 bool i2l1skip2 = i2l1c && !l1sl; 01132 bool j2l1skip2 = j2l1c && !l1sl; 01133 bool k2l1skip2 = k2l1c && !l1sl; 01134 bool l2l1skip2 = l2l1c && !l1sl; 01135 bool m2l1skip2 = m2l1c && !l1sl; 01136 bool n2l1skip2 = n2l1c && !l1sl; 01137 bool o2l1skip2 = o2l1c && !l1sl; 01138 01139 bool j2m1skip2 = j2m1c && !m1sl; 01140 bool k2m1skip2 = k2m1c && !m1sl; 01141 bool l2m1skip2 = l2m1c && !m1sl; 01142 bool m2m1skip2 = m2m1c && !m1sl; 01143 bool n2m1skip2 = n2m1c && !m1sl; 01144 bool o2m1skip2 = o2m1c && !m1sl; 01145 bool p2m1skip2 = p2m1c && !m1sl; 01146 01147 bool k2n1skip2 = k2n1c && !n1sl; 01148 bool l2n1skip2 = l2n1c && !n1sl; 01149 bool m2n1skip2 = m2n1c && !n1sl; 01150 bool n2n1skip2 = n2n1c && !n1sl; 01151 bool o2n1skip2 = o2n1c && !n1sl; 01152 bool p2n1skip2 = p2n1c && !n1sl; 01153 bool q2n1skip2 = q2n1c && !n1sl; 01154 01155 bool l2o1skip2 = l2o1c && !o1sl; 01156 bool m2o1skip2 = m2o1c && !o1sl; 01157 bool n2o1skip2 = n2o1c && !o1sl; 01158 bool o2o1skip2 = o2o1c && !o1sl; 01159 bool p2o1skip2 = p2o1c && !o1sl; 01160 bool q2o1skip2 = q2o1c && !o1sl; 01161 bool r2o1skip2 = r2o1c && !o1sl; 01162 01163 bool m2p1skip2 = m2p1c && !p1sl; 01164 bool n2p1skip2 = n2p1c && !p1sl; 01165 bool o2p1skip2 = o2p1c && !p1sl; 01166 bool p2p1skip2 = p2p1c && !p1sl; 01167 bool q2p1skip2 = q2p1c && !p1sl; 01168 bool r2p1skip2 = r2p1c && !p1sl; 01169 bool s2p1skip2 = s2p1c && !p1sl; 01170 01171 bool g2skip2 = g2j1skip2; 01172 bool h2skip2 = h2j1skip2 || h2k1skip2; 01173 bool i2skip2 = i2j1skip2 || i2k1skip2 || i2l1skip2; 01174 bool j2skip2 = j2j1skip2 || j2k1skip2 || j2l1skip2 || j2m1skip2; 01175 bool k2skip2 = k2j1skip2 || k2k1skip2 || k2l1skip2 || k2m1skip2 || k2n1skip2; 01176 bool l2skip2 = l2j1skip2 || l2k1skip2 || l2l1skip2 || l2m1skip2 || l2n1skip2 || l2o1skip2; 01177 bool m2skip2 = m2j1skip2 || m2k1skip2 || m2l1skip2 || m2m1skip2 || m2n1skip2 || m2o1skip2 || m2p1skip2; 01178 bool n2skip2 = n2k1skip2 || n2l1skip2 || n2m1skip2 || n2n1skip2 || n2o1skip2 || n2p1skip2; 01179 bool o2skip2 = o2l1skip2 || o2m1skip2 || o2n1skip2 || o2o1skip2 || o2p1skip2; 01180 bool p2skip2 = p2m1skip2 || p2n1skip2 || p2o1skip2 || p2p1skip2; 01181 bool q2skip2 = q2n1skip2 || q2o1skip2 || q2p1skip2; 01182 bool r2skip2 = r2o1skip2 || r2p1skip2; 01183 bool s2skip2 = s2p1skip2; 01184 01185 // Projection to the next gap. 01186 // =========================== 01187 g_2 = g2c || g2skip2; 01188 h_2 = h2c || h2skip2; 01189 i_2 = i2c || i2skip2; 01190 j_2 = j2c || j2skip2; 01191 k_2 = k2c || k2skip2; 01192 l_2 = l2c || l2skip2; 01193 m_2 = m2c || m2skip2; 01194 n_2 = n2c || n2skip2; 01195 o_2 = o2c || o2skip2; 01196 p_2 = p2c || p2skip2; 01197 q_2 = q2c || q2skip2; 01198 r_2 = r2c || r2skip2; 01199 s_2 = s2c || s2skip2; 01200 01201 return; 01202 } |
|
Definition at line 1208 of file mMuiFastRoadFinder.cxx. References b3, bsum, c3, d3, d3c, d_3, e3, e3c, e_3, f3, f3c, f_3, g2c, g3, g3c, g_2, g_3, h2c, h3, h3c, h_2, h_3, i2c, i3, i3c, i_2, i_3, j2c, j3, j3c, j_2, j_3, k2c, k3, k3c, k_2, k_3, l2c, l3, l3c, l_2, l_3, m2c, m3, m3c, m_2, m_3, n2c, n3, n3c, n_2, n_3, o2c, o3, o3c, o_2, o_3, p2c, p3, p3c, p_2, p_3, q2c, q3, q3c, q_2, q_3, r2c, r3, r3c, r_2, r_3, s2c, s3, s3c, s_2, s_3, t3, t3c, t_3, u3, u3c, u_3, v3, v3c, v_3, w3, and x3. Referenced by orig_trigger_road_finder.
01210 { 01211 01212 // These variables indicate whether a tube in this gap is 01213 // pointed to by a tube in the previous gap. 01214 // ====================================================== 01215 bool d3g2 = g_2 && swi==3; bool d3g2c = g2c && swi==3; 01216 bool e3g2 = g_2 && swi>=2; bool e3g2c = g2c && swi>=2; 01217 bool f3g2 = g_2; bool f3g2c = g2c; 01218 bool g3g2 = g_2; bool g3g2c = g2c; 01219 bool h3g2 = g_2; bool h3g2c = g2c; 01220 bool i3g2 = g_2 && swi>=2; bool i3g2c = g2c && swi>=2; 01221 bool j3g2 = g_2 && swi==3; bool j3g2c = g2c && swi==3; 01222 01223 bool e3h2 = h_2 && swi==3; bool e3h2c = h2c && swi==3; 01224 bool f3h2 = h_2 && swi>=2; bool f3h2c = h2c && swi>=2; 01225 bool g3h2 = h_2; bool g3h2c = h2c; 01226 bool h3h2 = h_2; bool h3h2c = h2c; 01227 bool i3h2 = h_2; bool i3h2c = h2c; 01228 bool j3h2 = h_2 && swi>=2; bool j3h2c = h2c && swi>=2; 01229 bool k3h2 = h_2 && swi==3; bool k3h2c = h2c && swi==3; 01230 01231 bool f3i2 = i_2 && swi==3; bool f3i2c = i2c && swi==3; 01232 bool g3i2 = i_2 && swi>=2; bool g3i2c = i2c && swi>=2; 01233 bool h3i2 = i_2; bool h3i2c = i2c; 01234 bool i3i2 = i_2; bool i3i2c = i2c; 01235 bool j3i2 = i_2; bool j3i2c = i2c; 01236 bool k3i2 = i_2 && swi>=2; bool k3i2c = i2c && swi>=2; 01237 bool l3i2 = i_2 && swi==3; bool l3i2c = i2c && swi==3; 01238 01239 bool g3j2 = j_2 && swi==3; bool g3j2c = j2c && swi==3; 01240 bool h3j2 = j_2 && swi>=2; bool h3j2c = j2c && swi>=2; 01241 bool i3j2 = j_2; bool i3j2c = j2c; 01242 bool j3j2 = j_2; bool j3j2c = j2c; 01243 bool k3j2 = j_2; bool k3j2c = j2c; 01244 bool l3j2 = j_2 && swi>=2; bool l3j2c = j2c && swi>=2; 01245 bool m3j2 = j_2 && swi==3; bool m3j2c = j2c && swi==3; 01246 01247 bool h3k2 = k_2 && swi==3; bool h3k2c = k2c && swi==3; 01248 bool i3k2 = k_2 && swi>=2; bool i3k2c = k2c && swi>=2; 01249 bool j3k2 = k_2; bool j3k2c = k2c; 01250 bool k3k2 = k_2; bool k3k2c = k2c; 01251 bool l3k2 = k_2; bool l3k2c = k2c; 01252 bool m3k2 = k_2 && swi>=2; bool m3k2c = k2c && swi>=2; 01253 bool n3k2 = k_2 && swi==3; bool n3k2c = k2c && swi==3; 01254 01255 bool i3l2 = l_2 && swi==3; bool i3l2c = l2c && swi==3; 01256 bool j3l2 = l_2 && swi>=2; bool j3l2c = l2c && swi>=2; 01257 bool k3l2 = l_2; bool k3l2c = l2c; 01258 bool l3l2 = l_2; bool l3l2c = l2c; 01259 bool m3l2 = l_2; bool m3l2c = l2c; 01260 bool n3l2 = l_2 && swi>=2; bool n3l2c = l2c && swi>=2; 01261 bool o3l2 = l_2 && swi==3; bool o3l2c = l2c && swi==3; 01262 01263 bool j3m2 = m_2 && swi==3; bool j3m2c = m2c && swi==3; 01264 bool k3m2 = m_2 && swi>=2; bool k3m2c = m2c && swi>=2; 01265 bool l3m2 = m_2; bool l3m2c = m2c; 01266 bool m3m2 = m_2; bool m3m2c = m2c; 01267 bool n3m2 = m_2; bool n3m2c = m2c; 01268 bool o3m2 = m_2 && swi>=2; bool o3m2c = m2c && swi>=2; 01269 bool p3m2 = m_2 && swi==3; bool p3m2c = m2c && swi==3; 01270 01271 bool k3n2 = n_2 && swi==3; bool k3n2c = n2c && swi==3; 01272 bool l3n2 = n_2 && swi>=2; bool l3n2c = n2c && swi>=2; 01273 bool m3n2 = n_2; bool m3n2c = n2c; 01274 bool n3n2 = n_2; bool n3n2c = n2c; 01275 bool o3n2 = n_2; bool o3n2c = n2c; 01276 bool p3n2 = n_2 && swi>=2; bool p3n2c = n2c && swi>=2; 01277 bool q3n2 = n_2 && swi==3; bool q3n2c = n2c && swi==3; 01278 01279 bool l3o2 = o_2 && swi==3; bool l3o2c = o2c && swi==3; 01280 bool m3o2 = o_2 && swi>=2; bool m3o2c = o2c && swi>=2; 01281 bool n3o2 = o_2; bool n3o2c = o2c; 01282 bool o3o2 = o_2; bool o3o2c = o2c; 01283 bool p3o2 = o_2; bool p3o2c = o2c; 01284 bool q3o2 = o_2 && swi>=2; bool q3o2c = o2c && swi>=2; 01285 bool r3o2 = o_2 && swi==3; bool r3o2c = o2c && swi==3; 01286 01287 bool m3p2 = p_2 && swi==3; bool m3p2c = p2c && swi==3; 01288 bool n3p2 = p_2 && swi>=2; bool n3p2c = p2c && swi>=2; 01289 bool o3p2 = p_2; bool o3p2c = p2c; 01290 bool p3p2 = p_2; bool p3p2c = p2c; 01291 bool q3p2 = p_2; bool q3p2c = p2c; 01292 bool r3p2 = p_2 && swi>=2; bool r3p2c = p2c && swi>=2; 01293 bool s3p2 = p_2 && swi==3; bool s3p2c = p2c && swi==3; 01294 01295 bool n3q2 = q_2 && swi==3; bool n3q2c = q2c && swi==3; 01296 bool o3q2 = q_2 && swi>=2; bool o3q2c = q2c && swi>=2; 01297 bool p3q2 = q_2; bool p3q2c = q2c; 01298 bool q3q2 = q_2; bool q3q2c = q2c; 01299 bool r3q2 = q_2; bool r3q2c = q2c; 01300 bool s3q2 = q_2 && swi>=2; bool s3q2c = q2c && swi>=2; 01301 bool t3q2 = q_2 && swi==3; bool t3q2c = q2c && swi==3; 01302 01303 bool o3r2 = r_2 && swi==3; bool o3r2c = r2c && swi==3; 01304 bool p3r2 = r_2 && swi>=2; bool p3r2c = r2c && swi>=2; 01305 bool q3r2 = r_2; bool q3r2c = r2c; 01306 bool r3r2 = r_2; bool r3r2c = r2c; 01307 bool s3r2 = r_2; bool s3r2c = r2c; 01308 bool t3r2 = r_2 && swi>=2; bool t3r2c = r2c && swi>=2; 01309 bool u3r2 = r_2 && swi==3; bool u3r2c = r2c && swi==3; 01310 01311 bool p3s2 = s_2 && swi==3; bool p3s2c = s2c && swi==3; 01312 bool q3s2 = s_2 && swi>=2; bool q3s2c = s2c && swi>=2; 01313 bool r3s2 = s_2; bool r3s2c = s2c; 01314 bool s3s2 = s_2; bool s3s2c = s2c; 01315 bool t3s2 = s_2; bool t3s2c = s2c; 01316 bool u3s2 = s_2 && swi>=2; bool u3s2c = s2c && swi>=2; 01317 bool v3s2 = s_2 && swi==3; bool v3s2c = s2c && swi==3; 01318 01319 bool d3pre = d3g2; 01320 bool e3pre = e3g2 || e3h2; 01321 bool f3pre = f3g2 || f3h2 || f3i2; 01322 bool g3pre = g3g2 || g3h2 || g3i2 || g3j2; 01323 bool h3pre = h3g2 || h3h2 || h3i2 || h3j2 || h3k2; 01324 bool i3pre = i3g2 || i3h2 || i3i2 || i3j2 || i3k2 || i3l2; 01325 bool j3pre = j3g2 || j3h2 || j3i2 || j3j2 || j3k2 || j3l2 || j3m2; 01326 bool k3pre = k3h2 || k3i2 || k3j2 || k3k2 || k3l2 || k3m2 || k3n2; 01327 bool l3pre = l3i2 || l3j2 || l3k2 || l3l2 || l3m2 || l3n2 || l3o2; 01328 bool m3pre = m3j2 || m3k2 || m3l2 || m3m2 || m3n2 || m3o2 || m3p2; 01329 bool n3pre = n3k2 || n3l2 || n3m2 || n3n2 || n3o2 || n3p2 || n3q2; 01330 bool o3pre = o3l2 || o3m2 || o3n2 || o3o2 || o3p2 || o3q2 || o3r2; 01331 bool p3pre = p3m2 || p3n2 || p3o2 || p3p2 || p3q2 || p3r2 || p3s2; 01332 bool q3pre = q3n2 || q3o2 || q3p2 || q3q2 || q3r2 || q3s2; 01333 bool r3pre = r3o2 || r3p2 || r3q2 || r3r2 || r3s2; 01334 bool s3pre = s3p2 || s3q2 || s3r2 || s3s2; 01335 bool t3pre = t3q2 || t3r2 || t3s2; 01336 bool u3pre = u3r2 || u3s2; 01337 bool v3pre = v3s2; 01338 01339 // Search for road in current gap. 01340 // =============================== 01341 d3c = *(p[d3]) && d3pre; 01342 e3c = *(p[e3]) && e3pre; 01343 f3c = *(p[f3]) && f3pre; 01344 g3c = *(p[g3]) && g3pre; 01345 h3c = *(p[h3]) && h3pre; 01346 i3c = *(p[i3]) && i3pre; 01347 j3c = *(p[j3]) && j3pre; 01348 k3c = *(p[k3]) && k3pre; 01349 l3c = *(p[l3]) && l3pre; 01350 m3c = *(p[m3]) && m3pre; 01351 n3c = *(p[n3]) && n3pre; 01352 o3c = *(p[o3]) && o3pre; 01353 p3c = *(p[p3]) && p3pre; 01354 q3c = *(p[q3]) && q3pre; 01355 r3c = *(p[r3]) && r3pre; 01356 s3c = *(p[s3]) && s3pre; 01357 t3c = *(p[t3]) && t3pre; 01358 u3c = *(p[u3]) && u3pre; 01359 v3c = *(p[v3]) && v3pre; 01360 01361 *roadfound = d3c || e3c || f3c || g3c || h3c || i3c || j3c || k3c || l3c || m3c 01362 || n3c || o3c || p3c || q3c || r3c || s3c || t3c || u3c || v3c; 01363 01364 // Find shower size. 01365 // ================= 01366 static const short nInShower = 5; 01367 static const short nShowerSums = 19; 01368 bool st[nShowerSums+nInShower-1]; 01369 st[0] = *(p[b3]) && d3pre; 01370 st[1] = *(p[c3]) && e3pre; 01371 st[2] = *(p[d3]) && f3pre; 01372 st[3] = *(p[e3]) && g3pre; 01373 st[4] = *(p[f3]) && h3pre; 01374 st[5] = *(p[g3]) && i3pre; 01375 st[6] = *(p[h3]) && j3pre; 01376 st[7] = *(p[i3]) && k3pre; 01377 st[8] = *(p[j3]) && l3pre; 01378 st[9] = *(p[k3]) && m3pre; 01379 st[10] = *(p[l3]) && m3pre; 01380 st[11] = *(p[m3]) && m3pre; 01381 st[12] = *(p[n3]) && m3pre; 01382 st[13] = *(p[o3]) && m3pre; 01383 st[14] = *(p[p3]) && n3pre; 01384 st[15] = *(p[q3]) && o3pre; 01385 st[16] = *(p[r3]) && p3pre; 01386 st[17] = *(p[s3]) && q3pre; 01387 st[18] = *(p[t3]) && r3pre; 01388 st[19] = *(p[u3]) && s3pre; 01389 st[20] = *(p[v3]) && t3pre; 01390 st[21] = *(p[w3]) && u3pre; 01391 st[22] = *(p[x3]) && v3pre; 01392 01393 *showermax = 0; 01394 for (short i = 0; i < nShowerSums; i++) { 01395 short shower = (short) bsum(&st[i], nInShower); 01396 if (shower > *showermax) 01397 *showermax = shower; 01398 } 01399 01400 // We need to find out if this gap was skipped. 01401 // The first step is to define variables which indicate 01402 // whether the set tubes on this gap which are projected 01403 // to by each tube on the previous gap are MT. 01404 // ===================================================== 01405 bool g2sl = *(p[f3]) || *(p[g3]) || *(p[h3]) || 01406 (swi == 2 && (*(p[e3]) || *(p[i3]))) || 01407 (swi == 3 && (*(p[d3]) || *(p[j3]))); 01408 01409 bool h2sl = *(p[g3]) || *(p[h3]) || *(p[i3]) || 01410 (swi == 2 && (*(p[f3]) || *(p[j3]))) || 01411 (swi == 3 && (*(p[e3]) || *(p[k3]))); 01412 01413 bool i2sl = *(p[h3]) || *(p[i3]) || *(p[j3]) || 01414 (swi == 2 && (*(p[g3]) || *(p[k3]))) || 01415 (swi == 3 && (*(p[f3]) || *(p[l3]))); 01416 01417 bool j2sl = *(p[i3]) || *(p[j3]) || *(p[k3]) || 01418 (swi == 2 && (*(p[h3]) || *(p[l3]))) || 01419 (swi == 3 && (*(p[g3]) || *(p[m3]))); 01420 01421 bool k2sl = *(p[j3]) || *(p[k3]) || *(p[l3]) || 01422 (swi == 2 && (*(p[i3]) || *(p[m3]))) || 01423 (swi == 3 && (*(p[h3]) || *(p[n3]))); 01424 01425 bool l2sl = *(p[k3]) || *(p[l3]) || *(p[m3]) || 01426 (swi == 2 && (*(p[j3]) || *(p[n3]))) || 01427 (swi == 3 && (*(p[i3]) || *(p[o3]))); 01428 01429 bool m2sl = *(p[l3]) || *(p[m3]) || *(p[n3]) || 01430 (swi == 2 && (*(p[k3]) || *(p[o3]))) || 01431 (swi == 3 && (*(p[j3]) || *(p[p3]))); 01432 01433 bool n2sl = *(p[m3]) || *(p[n3]) || *(p[o3]) || 01434 (swi == 2 && (*(p[l3]) || *(p[p3]))) || 01435 (swi == 3 && (*(p[k3]) || *(p[q3]))); 01436 01437 bool o2sl = *(p[n3]) || *(p[o3]) || *(p[p3]) || 01438 (swi == 2 && (*(p[m3]) || *(p[q3]))) || 01439 (swi == 3 && (*(p[l3]) || *(p[r3]))); 01440 01441 bool p2sl = *(p[o3]) || *(p[p3]) || *(p[q3]) || 01442 (swi == 2 && (*(p[n3]) || *(p[r3]))) || 01443 (swi == 3 && (*(p[m3]) || *(p[s3]))); 01444 01445 bool q2sl = *(p[p3]) || *(p[q3]) || *(p[r3]) || 01446 (swi == 2 && (*(p[o3]) || *(p[s3]))) || 01447 (swi == 3 && (*(p[n3]) || *(p[t3]))); 01448 01449 bool r2sl = *(p[q3]) || *(p[r3]) || *(p[s3]) || 01450 (swi == 2 && (*(p[p3]) || *(p[t3]))) || 01451 (swi == 3 && (*(p[o3]) || *(p[u3]))); 01452 01453 bool s2sl = *(p[r3]) || *(p[s3]) || *(p[t3]) || 01454 (swi == 2 && (*(p[q3]) || *(p[u3]))) || 01455 (swi == 3 && (*(p[p3]) || *(p[v3]))); 01456 01457 // If a tube on the current gap is pointed to by a tube 01458 // the previous gap, then the current-gap tube's signal projects forward to 01459 // the next gap iff all tubes pointed to by the previous-gap tube are MT. 01460 // ======================================================================== 01461 bool d3g2skip3 = d3g2c && !g2sl; 01462 bool e3g2skip3 = e3g2c && !g2sl; 01463 bool f3g2skip3 = f3g2c && !g2sl; 01464 bool g3g2skip3 = g3g2c && !g2sl; 01465 bool h3g2skip3 = h3g2c && !g2sl; 01466 bool i3g2skip3 = i3g2c && !g2sl; 01467 bool j3g2skip3 = j3g2c && !g2sl; 01468 01469 bool e3h2skip3 = e3h2c && !h2sl; 01470 bool f3h2skip3 = f3h2c && !h2sl; 01471 bool g3h2skip3 = g3h2c && !h2sl; 01472 bool h3h2skip3 = h3h2c && !h2sl; 01473 bool i3h2skip3 = i3h2c && !h2sl; 01474 bool j3h2skip3 = j3h2c && !h2sl; 01475 bool k3h2skip3 = k3h2c && !h2sl; 01476 01477 bool f3i2skip3 = f3i2c && !i2sl; 01478 bool g3i2skip3 = g3i2c && !i2sl; 01479 bool h3i2skip3 = h3i2c && !i2sl; 01480 bool i3i2skip3 = i3i2c && !i2sl; 01481 bool j3i2skip3 = j3i2c && !i2sl; 01482 bool k3i2skip3 = k3i2c && !i2sl; 01483 bool l3i2skip3 = l3i2c && !i2sl; 01484 01485 bool g3j2skip3 = g3j2c && !j2sl; 01486 bool h3j2skip3 = h3j2c && !j2sl; 01487 bool i3j2skip3 = i3j2c && !j2sl; 01488 bool j3j2skip3 = j3j2c && !j2sl; 01489 bool k3j2skip3 = k3j2c && !j2sl; 01490 bool l3j2skip3 = l3j2c && !j2sl; 01491 bool m3j2skip3 = m3j2c && !j2sl; 01492 01493 bool h3k2skip3 = h3k2c && !k2sl; 01494 bool i3k2skip3 = i3k2c && !k2sl; 01495 bool j3k2skip3 = j3k2c && !k2sl; 01496 bool k3k2skip3 = k3k2c && !k2sl; 01497 bool l3k2skip3 = l3k2c && !k2sl; 01498 bool m3k2skip3 = m3k2c && !k2sl; 01499 bool n3k2skip3 = n3k2c && !k2sl; 01500 01501 bool i3l2skip3 = i3l2c && !l2sl; 01502 bool j3l2skip3 = j3l2c && !l2sl; 01503 bool k3l2skip3 = k3l2c && !l2sl; 01504 bool l3l2skip3 = l3l2c && !l2sl; 01505 bool m3l2skip3 = m3l2c && !l2sl; 01506 bool n3l2skip3 = n3l2c && !l2sl; 01507 bool o3l2skip3 = o3l2c && !l2sl; 01508 01509 bool j3m2skip3 = j3m2c && !m2sl; 01510 bool k3m2skip3 = k3m2c && !m2sl; 01511 bool l3m2skip3 = l3m2c && !m2sl; 01512 bool m3m2skip3 = m3m2c && !m2sl; 01513 bool n3m2skip3 = n3m2c && !m2sl; 01514 bool o3m2skip3 = o3m2c && !m2sl; 01515 bool p3m2skip3 = p3m2c && !m2sl; 01516 01517 bool k3n2skip3 = k3n2c && !n2sl; 01518 bool l3n2skip3 = l3n2c && !n2sl; 01519 bool m3n2skip3 = m3n2c && !n2sl; 01520 bool n3n2skip3 = n3n2c && !n2sl; 01521 bool o3n2skip3 = o3n2c && !n2sl; 01522 bool p3n2skip3 = p3n2c && !n2sl; 01523 bool q3n2skip3 = q3n2c && !n2sl; 01524 01525 bool l3o2skip3 = l3o2c && !o2sl; 01526 bool m3o2skip3 = m3o2c && !o2sl; 01527 bool n3o2skip3 = n3o2c && !o2sl; 01528 bool o3o2skip3 = o3o2c && !o2sl; 01529 bool p3o2skip3 = p3o2c && !o2sl; 01530 bool q3o2skip3 = q3o2c && !o2sl; 01531 bool r3o2skip3 = r3o2c && !o2sl; 01532 01533 bool m3p2skip3 = m3p2c && !p2sl; 01534 bool n3p2skip3 = n3p2c && !p2sl; 01535 bool o3p2skip3 = o3p2c && !p2sl; 01536 bool p3p2skip3 = p3p2c && !p2sl; 01537 bool q3p2skip3 = q3p2c && !p2sl; 01538 bool r3p2skip3 = r3p2c && !p2sl; 01539 bool s3p2skip3 = s3p2c && !p2sl; 01540 01541 bool n3q2skip3 = n3q2c && !q2sl; 01542 bool o3q2skip3 = o3q2c && !q2sl; 01543 bool p3q2skip3 = p3q2c && !q2sl; 01544 bool q3q2skip3 = q3q2c && !q2sl; 01545 bool r3q2skip3 = r3q2c && !q2sl; 01546 bool s3q2skip3 = s3q2c && !q2sl; 01547 bool t3q2skip3 = t3q2c && !q2sl; 01548 01549 bool o3r2skip3 = o3r2c && !r2sl; 01550 bool p3r2skip3 = p3r2c && !r2sl; 01551 bool q3r2skip3 = q3r2c && !r2sl; 01552 bool r3r2skip3 = r3r2c && !r2sl; 01553 bool s3r2skip3 = s3r2c && !r2sl; 01554 bool t3r2skip3 = t3r2c && !r2sl; 01555 bool u3r2skip3 = u3r2c && !r2sl; 01556 01557 bool p3s2skip3 = p3s2c && !s2sl; 01558 bool q3s2skip3 = q3s2c && !s2sl; 01559 bool r3s2skip3 = r3s2c && !s2sl; 01560 bool s3s2skip3 = s3s2c && !s2sl; 01561 bool t3s2skip3 = t3s2c && !s2sl; 01562 bool u3s2skip3 = u3s2c && !s2sl; 01563 bool v3s2skip3 = v3s2c && !s2sl; 01564 01565 bool d3skip3 = d3g2skip3; 01566 bool e3skip3 = e3g2skip3 || e3h2skip3; 01567 bool f3skip3 = f3g2skip3 || f3h2skip3 || f3i2skip3; 01568 bool g3skip3 = g3g2skip3 || g3h2skip3 || g3i2skip3 || g3j2skip3; 01569 bool h3skip3 = h3g2skip3 || h3h2skip3 || h3i2skip3 || h3j2skip3 || h3k2skip3; 01570 bool i3skip3 = i3g2skip3 || i3h2skip3 || i3i2skip3 || i3j2skip3 || i3k2skip3 || i3l2skip3; 01571 bool j3skip3 = j3g2skip3 || j3h2skip3 || j3i2skip3 || j3j2skip3 || j3k2skip3 || j3l2skip3 || j3m2skip3; 01572 bool k3skip3 = k3h2skip3 || k3i2skip3 || k3j2skip3 || k3k2skip3 || k3l2skip3 || k3m2skip3 || k3n2skip3; 01573 bool l3skip3 = l3i2skip3 || l3j2skip3 || l3k2skip3 || l3l2skip3 || l3m2skip3 || l3n2skip3 || l3o2skip3; 01574 bool m3skip3 = m3j2skip3 || m3k2skip3 || m3l2skip3 || m3m2skip3 || m3n2skip3 || m3o2skip3 || m3p2skip3; 01575 bool n3skip3 = n3k2skip3 || n3l2skip3 || n3m2skip3 || n3n2skip3 || n3o2skip3 || n3p2skip3 || n3q2skip3; 01576 bool o3skip3 = o3l2skip3 || o3m2skip3 || o3n2skip3 || o3o2skip3 || o3p2skip3 || o3q2skip3 || o3r2skip3; 01577 bool p3skip3 = p3m2skip3 || p3n2skip3 || p3o2skip3 || p3p2skip3 || p3q2skip3 || p3r2skip3 || p3s2skip3; 01578 bool q3skip3 = q3n2skip3 || q3o2skip3 || q3p2skip3 || q3q2skip3 || q3r2skip3 || q3s2skip3; 01579 bool r3skip3 = r3o2skip3 || r3p2skip3 || r3q2skip3 || r3r2skip3 || r3s2skip3; 01580 bool s3skip3 = s3p2skip3 || s3q2skip3 || s3r2skip3 || s3s2skip3; 01581 bool t3skip3 = t3q2skip3 || t3r2skip3 || t3s2skip3; 01582 bool u3skip3 = u3r2skip3 || u3s2skip3; 01583 bool v3skip3 = v3s2skip3; 01584 01585 // Projection to the next gap. 01586 // =========================== 01587 d_3 = d3c || d3skip3; 01588 e_3 = e3c || e3skip3; 01589 f_3 = f3c || f3skip3; 01590 g_3 = g3c || g3skip3; 01591 h_3 = h3c || h3skip3; 01592 i_3 = i3c || i3skip3; 01593 j_3 = j3c || j3skip3; 01594 k_3 = k3c || k3skip3; 01595 l_3 = l3c || l3skip3; 01596 m_3 = m3c || m3skip3; 01597 n_3 = n3c || n3skip3; 01598 o_3 = o3c || o3skip3; 01599 p_3 = p3c || p3skip3; 01600 q_3 = q3c || q3skip3; 01601 r_3 = r3c || r3skip3; 01602 s_3 = s3c || s3skip3; 01603 t_3 = t3c || t3skip3; 01604 u_3 = u3c || u3skip3; 01605 v_3 = v3c || v3skip3; 01606 01607 return; 01608 } |
|
Definition at line 1614 of file mMuiFastRoadFinder.cxx. References a4, aa4, aaa4, b4, bsum, c4, d4, d_3, e4, e_3, f4, f_3, g4, g_3, h4, h_3, i4, i_3, j4, j_3, k4, k_3, l4, l_3, m4, m_3, n4, n_3, o4, o_3, p4, p_3, q4, q_3, r4, r_3, s4, s_3, t4, t_3, u4, u_3, v4, v_3, w4, x4, y4, z4, and zz4. Referenced by orig_trigger_road_finder.
01616 { 01617 01618 // These variables indicate whether a tube in this gap is 01619 // pointed to by a tube in the previous gap. 01620 // ====================================================== 01621 bool a4d3 = d_3 && swi==3; 01622 bool b4d3 = d_3 && swi>=2; 01623 bool c4d3 = d_3; 01624 bool d4d3 = d_3; 01625 bool e4d3 = d_3; 01626 bool f4d3 = d_3 && swi>=2; 01627 bool g4d3 = d_3 && swi==3; 01628 01629 bool b4e3 = e_3 && swi==3; 01630 bool c4e3 = e_3 && swi>=2; 01631 bool d4e3 = e_3; 01632 bool e4e3 = e_3; 01633 bool f4e3 = e_3; 01634 bool g4e3 = e_3 && swi>=2; 01635 bool h4e3 = e_3 && swi==3; 01636 01637 bool c4f3 = f_3 && swi==3; 01638 bool d4f3 = f_3 && swi>=2; 01639 bool e4f3 = f_3; 01640 bool f4f3 = f_3; 01641 bool g4f3 = f_3; 01642 bool h4f3 = f_3 && swi>=2; 01643 bool i4f3 = f_3 && swi==3; 01644 01645 bool d4g3 = g_3 && swi==3; 01646 bool e4g3 = g_3 && swi>=2; 01647 bool f4g3 = g_3; 01648 bool g4g3 = g_3; 01649 bool h4g3 = g_3; 01650 bool i4g3 = g_3 && swi>=2; 01651 bool j4g3 = g_3 && swi==3; 01652 01653 bool e4h3 = h_3 && swi==3; 01654 bool f4h3 = h_3 && swi>=2; 01655 bool g4h3 = h_3; 01656 bool h4h3 = h_3; 01657 bool i4h3 = h_3; 01658 bool j4h3 = h_3 && swi>=2; 01659 bool k4h3 = h_3 && swi==3; 01660 01661 bool f4i3 = i_3 && swi==3; 01662 bool g4i3 = i_3 && swi>=2; 01663 bool h4i3 = i_3; 01664 bool i4i3 = i_3; 01665 bool j4i3 = i_3; 01666 bool k4i3 = i_3 && swi>=2; 01667 bool l4i3 = i_3 && swi==3; 01668 01669 bool g4j3 = j_3 && swi==3; 01670 bool h4j3 = j_3 && swi>=2; 01671 bool i4j3 = j_3; 01672 bool j4j3 = j_3; 01673 bool k4j3 = j_3; 01674 bool l4j3 = j_3 && swi>=2; 01675 bool m4j3 = j_3 && swi==3; 01676 01677 bool h4k3 = k_3 && swi==3; 01678 bool i4k3 = k_3 && swi>=2; 01679 bool j4k3 = k_3; 01680 bool k4k3 = k_3; 01681 bool l4k3 = k_3; 01682 bool m4k3 = k_3 && swi>=2; 01683 bool n4k3 = k_3 && swi==3; 01684 01685 bool i4l3 = l_3 && swi==3; 01686 bool j4l3 = l_3 && swi>=2; 01687 bool k4l3 = l_3; 01688 bool l4l3 = l_3; 01689 bool m4l3 = l_3; 01690 bool n4l3 = l_3 && swi>=2; 01691 bool o4l3 = l_3 && swi==3; 01692 01693 bool j4m3 = m_3 && swi==3; 01694 bool k4m3 = m_3 && swi>=2; 01695 bool l4m3 = m_3; 01696 bool m4m3 = m_3; 01697 bool n4m3 = m_3; 01698 bool o4m3 = m_3 && swi>=2; 01699 bool p4m3 = m_3 && swi==3; 01700 01701 bool k4n3 = n_3 && swi==3; 01702 bool l4n3 = n_3 && swi>=2; 01703 bool m4n3 = n_3; 01704 bool n4n3 = n_3; 01705 bool o4n3 = n_3; 01706 bool p4n3 = n_3 && swi>=2; 01707 bool q4n3 = n_3 && swi==3; 01708 01709 bool l4o3 = o_3 && swi==3; 01710 bool m4o3 = o_3 && swi>=2; 01711 bool n4o3 = o_3; 01712 bool o4o3 = o_3; 01713 bool p4o3 = o_3; 01714 bool q4o3 = o_3 && swi>=2; 01715 bool r4o3 = o_3 && swi==3; 01716 01717 bool m4p3 = p_3 && swi==3; 01718 bool n4p3 = p_3 && swi>=2; 01719 bool o4p3 = p_3; 01720 bool p4p3 = p_3; 01721 bool q4p3 = p_3; 01722 bool r4p3 = p_3 && swi>=2; 01723 bool s4p3 = p_3 && swi==3; 01724 01725 bool n4q3 = q_3 && swi==3; 01726 bool o4q3 = q_3 && swi>=2; 01727 bool p4q3 = q_3; 01728 bool q4q3 = q_3; 01729 bool r4q3 = q_3; 01730 bool s4q3 = q_3 && swi>=2; 01731 bool t4q3 = q_3 && swi==3; 01732 01733 bool o4r3 = r_3 && swi==3; 01734 bool p4r3 = r_3 && swi>=2; 01735 bool q4r3 = r_3; 01736 bool r4r3 = r_3; 01737 bool s4r3 = r_3; 01738 bool t4r3 = r_3 && swi>=2; 01739 bool u4r3 = r_3 && swi==3; 01740 01741 bool p4s3 = s_3 && swi==3; 01742 bool q4s3 = s_3 && swi>=2; 01743 bool r4s3 = s_3; 01744 bool s4s3 = s_3; 01745 bool t4s3 = s_3; 01746 bool u4s3 = s_3 && swi>=2; 01747 bool v4s3 = s_3 && swi==3; 01748 01749 bool q4t3 = t_3 && swi==3; 01750 bool r4t3 = t_3 && swi>=2; 01751 bool s4t3 = t_3; 01752 bool t4t3 = t_3; 01753 bool u4t3 = t_3; 01754 bool v4t3 = t_3 && swi>=2; 01755 bool w4t3 = t_3 && swi==3; 01756 01757 bool r4u3 = u_3 && swi==3; 01758 bool s4u3 = u_3 && swi>=2; 01759 bool t4u3 = u_3; 01760 bool u4u3 = u_3; 01761 bool v4u3 = u_3; 01762 bool w4u3 = u_3 && swi>=2; 01763 bool x4u3 = u_3 && swi==3; 01764 01765 bool s4v3 = v_3 && swi==3; 01766 bool t4v3 = v_3 && swi>=2; 01767 bool u4v3 = v_3; 01768 bool v4v3 = v_3; 01769 bool w4v3 = v_3; 01770 bool x4v3 = v_3 && swi>=2; 01771 bool y4v3 = v_3 && swi==3; 01772 01773 bool a4pre = a4d3; 01774 bool b4pre = b4d3 || b4e3; 01775 bool c4pre = c4d3 || c4e3 || c4f3; 01776 bool d4pre = d4d3 || d4e3 || d4f3 || d4g3; 01777 bool e4pre = e4d3 || e4e3 || e4f3 || e4g3 || e4h3; 01778 bool f4pre = f4d3 || f4e3 || f4f3 || f4g3 || f4h3 || f4i3; 01779 bool g4pre = g4d3 || g4e3 || g4f3 || g4g3 || g4h3 || g4i3 || g4j3; 01780 bool h4pre = h4e3 || h4f3 || h4g3 || h4h3 || h4i3 || h4j3 || h4k3; 01781 bool i4pre = i4f3 || i4g3 || i4h3 || i4i3 || i4j3 || i4k3 || i4l3; 01782 bool j4pre = j4g3 || j4h3 || j4i3 || j4j3 || j4k3 || j4l3 || j4m3; 01783 bool k4pre = k4h3 || k4i3 || k4j3 || k4k3 || k4l3 || k4m3 || k4n3; 01784 bool l4pre = l4i3 || l4j3 || l4k3 || l4l3 || l4m3 || l4n3 || l4o3; 01785 bool m4pre = m4j3 || m4k3 || m4l3 || m4m3 || m4n3 || m4o3 || m4p3; 01786 bool n4pre = n4k3 || n4l3 || n4m3 || n4n3 || n4o3 || n4p3 || n4q3; 01787 bool o4pre = o4l3 || o4m3 || o4n3 || o4o3 || o4p3 || o4q3 || o4r3; 01788 bool p4pre = p4m3 || p4n3 || p4o3 || p4p3 || p4q3 || p4r3 || p4s3; 01789 bool q4pre = q4n3 || q4o3 || q4p3 || q4q3 || q4r3 || q4s3 || q4t3; 01790 bool r4pre = r4o3 || r4p3 || r4q3 || r4r3 || r4s3 || r4t3 || r4u3; 01791 bool s4pre = s4p3 || s4q3 || s4r3 || s4s3 || s4t3 || s4u3 || s4v3; 01792 bool t4pre = t4q3 || t4r3 || t4s3 || t4t3 || t4u3 || t4v3; 01793 bool u4pre = u4r3 || u4s3 || u4t3 || u4u3 || u4v3; 01794 bool v4pre = v4s3 || v4t3 || v4u3 || v4v3; 01795 bool w4pre = w4t3 || w4u3 || w4v3; 01796 bool x4pre = x4u3 || x4v3; 01797 bool y4pre = y4v3; 01798 01799 // Search for road in current gap. 01800 // =============================== 01801 bool a4c = *(p[a4]) && a4pre; 01802 bool b4c = *(p[b4]) && b4pre; 01803 bool c4c = *(p[c4]) && c4pre; 01804 bool d4c = *(p[d4]) && d4pre; 01805 bool e4c = *(p[e4]) && e4pre; 01806 bool f4c = *(p[f4]) && f4pre; 01807 bool g4c = *(p[g4]) && g4pre; 01808 bool h4c = *(p[h4]) && h4pre; 01809 bool i4c = *(p[i4]) && i4pre; 01810 bool j4c = *(p[j4]) && j4pre; 01811 bool k4c = *(p[k4]) && k4pre; 01812 bool l4c = *(p[l4]) && l4pre; 01813 bool m4c = *(p[m4]) && m4pre; 01814 bool n4c = *(p[n4]) && n4pre; 01815 bool o4c = *(p[o4]) && o4pre; 01816 bool p4c = *(p[p4]) && p4pre; 01817 bool q4c = *(p[q4]) && q4pre; 01818 bool r4c = *(p[r4]) && r4pre; 01819 bool s4c = *(p[s4]) && s4pre; 01820 bool t4c = *(p[t4]) && t4pre; 01821 bool u4c = *(p[u4]) && u4pre; 01822 bool v4c = *(p[v4]) && v4pre; 01823 bool w4c = *(p[w4]) && w4pre; 01824 bool x4c = *(p[x4]) && x4pre; 01825 bool y4c = *(p[y4]) && y4pre; 01826 01827 *roadfound = a4c || b4c || c4c || d4c || e4c || f4c || g4c || h4c || i4c || j4c || k4c || l4c || m4c 01828 || n4c || o4c || p4c || q4c || r4c || s4c || t4c || u4c || v4c || w4c || x4c || y4c; 01829 01830 // Find shower size. 01831 // ================= 01832 static const short nInShower = 5; 01833 static const short nShowerSums = 25; 01834 bool st[nShowerSums+nInShower-1]; 01835 st[0] = *(p[aaa4]) && a4pre; 01836 st[1] = *(p[aa4]) && b4pre; 01837 st[2] = *(p[a4]) && c4pre; 01838 st[3] = *(p[b4]) && d4pre; 01839 st[4] = *(p[c4]) && e4pre; 01840 st[5] = *(p[d4]) && f4pre; 01841 st[6] = *(p[e4]) && g4pre; 01842 st[7] = *(p[f4]) && h4pre; 01843 st[8] = *(p[g4]) && i4pre; 01844 st[9] = *(p[h4]) && j4pre; 01845 st[10] = *(p[i4]) && k4pre; 01846 st[11] = *(p[j4]) && l4pre; 01847 st[12] = *(p[k4]) && m4pre; 01848 st[13] = *(p[l4]) && m4pre; 01849 st[14] = *(p[m4]) && m4pre; 01850 st[15] = *(p[n4]) && m4pre; 01851 st[16] = *(p[o4]) && m4pre; 01852 st[17] = *(p[p4]) && n4pre; 01853 st[18] = *(p[q4]) && o4pre; 01854 st[19] = *(p[r4]) && p4pre; 01855 st[20] = *(p[s4]) && q4pre; 01856 st[21] = *(p[t4]) && r4pre; 01857 st[22] = *(p[u4]) && s4pre; 01858 st[23] = *(p[v4]) && t4pre; 01859 st[24] = *(p[w4]) && u4pre; 01860 st[25] = *(p[x4]) && v4pre; 01861 st[26] = *(p[y4]) && w4pre; 01862 st[27] = *(p[z4]) && x4pre; 01863 st[28] = *(p[zz4]) && y4pre; 01864 01865 *showermax = 0; 01866 for (short i = 0; i < nShowerSums; i++) { 01867 short shower = (short) bsum(&st[i], nInShower); 01868 if (shower > *showermax) 01869 *showermax = shower; 01870 } 01871 01872 return; 01873 } |
|
Fill logical variables for symset calculation Definition at line 307 of file mMuiFastRoadFinder.cxx. References _hitmap, _signal, _twopack_idx, and TMuiHitMapO::get. Referenced by find_tracks.
00308 { // first clear the signal array 00309 memset(_signal,false,sizeof(_signal)); 00310 00311 UShort_t idx; 00312 00313 TMuiHitMapO::iterator hit_iter = _hitmap->get(arm); 00314 while(TMuiHitMapO::pointer hit_ptr = hit_iter.next()) { 00315 if (hit_ptr->get()->get_orientation() == orient) { 00316 // right orientation selected 00317 00318 // here we should get the 'logical tube'/twopack value 00319 // Check this again !!! 00320 idx = _twopack_idx[arm][hit_ptr->get()->get_plane()][hit_ptr->get()->get_panel()][orient][hit_ptr->get()->get_twopack()]; 00321 00322 _signal[idx][hit_ptr->get()->get_plane()] = true; 00323 } 00324 } 00325 } |
|
Fill logical variables for symset calculation; using virtual panels : orig. algorithm Definition at line 389 of file mMuiFastRoadFinder.cxx. References _hitmap, _idx_XoZ, _signal, _twopack_idx, TMuiHitMapO::get, and NVIRT_PANELS. Referenced by find_tracks.
00391 { // first clear the signal array 00392 memset(_signal,false,sizeof(_signal)); 00393 00394 UShort_t idx; 00395 //We will populate hits per virtual panel which means. Panels: 00396 // 0 => Panel 0 00397 // 1 => Panel 0,1 00398 // 2 => Panel 1,2 00399 // 3 => Panel 2 00400 // 4 => Panel 3 00401 // 5 => Panel 3,4 00402 // 6 => Panel 4,5 00403 // 7 => Panel 5 00404 // In addition, we only want vertical tracks in panels 2,4 that have 00405 // slopes of appopriate sign. 00406 const short panel1[NVIRT_PANELS] = { 0, 1, 1, 2, 3, 4, 4, 5 }; 00407 const short panel2[NVIRT_PANELS] = { 0, 0, 2, 2, 3, 3, 5, 5 }; 00408 const float quadsign[NVIRT_PANELS] = { 1.0, 1.0, -1.0, -1.0, 00409 -1.0, -1.0, 1.0, 1.0 }; 00410 00411 TMuiHitMapO::iterator hit_iter = _hitmap->get(arm); 00412 while(TMuiHitMapO::pointer hit_ptr = hit_iter.next()) { 00413 if (hit_ptr->get()->get_orientation() == orient) { 00414 // right orientation selected 00415 00416 UShort_t hit_panel = hit_ptr->get()->get_panel(); 00417 idx = _twopack_idx[arm][hit_ptr->get()->get_plane()][hit_ptr->get()->get_panel()][orient][hit_ptr->get()->get_twopack()]; 00418 00419 float hitslope = _idx_XoZ[arm][orient][idx]; 00420 00421 if( (hit_panel==panel1[virt_panel] || hit_panel==panel2[virt_panel]) 00422 //Hit in virtual panel 00423 && ( (hit_ptr->get()->get_plane()>1) 00424 // Accept all hits deeper than gap 1 00425 || (orient==1 && hitslope*quadsign[virt_panel]>0.0 && 00426 hit_panel==panel1[virt_panel]) 00427 // Accept only Vertical with correct slope 00428 || (orient==0 && hit_panel==panel1[virt_panel]) 00429 ) ) { 00430 //cout<<"Accepted\n"; 00431 _signal[idx][hit_ptr->get()->get_plane()] = true; 00432 } 00433 } 00434 } 00435 } |
|
Do the necessary one-time intitialization Definition at line 36 of file mMuiFastRoadFinder.cxx. References _mod_par, _signal, _trigger_signal, falseSignal, mMuiFastRoadFinderPar::get_symset_logical_offset, mMuiFastRoadFinderPar::get_symset_plane, mMuiFastRoadFinderPar::MAX_SYMSET, read_idx_XoZ_map, and read_twopack_idx_map. Referenced by event.
00037 { 00038 // Initialize signal array to zero. 00039 // ================================ 00040 for (short logical = 0; logical < TMuiChannelId::kTwoPacksPerPlaneMax; logical++) { 00041 for (short gap = 0; gap < MUIOO::MAX_ARM; gap++) { 00042 _signal[logical][gap] = false; 00043 } 00044 } 00045 00046 // Location pointed to by all symset members that don't have an 00047 // actual tube to point to. 00048 // ============================================================ 00049 for (short symset = 0; symset < TMuiChannelId::kTwoPacksPerPlaneMax; 00050 symset++) { 00051 for (short i = 0; i < mMuiFastRoadFinderPar::MAX_SYMSET; i++) { 00052 _trigger_signal[symset][i] = &falseSignal; 00053 short logical = symset + _mod_par->get_symset_logical_offset(i); 00054 if (logical >= 0 && 00055 logical < TMuiChannelId::kTwoPacksPerPlaneMax) { 00056 short gap = _mod_par->get_symset_plane(i); 00057 _trigger_signal[symset][i] = &(_signal[logical][gap]); 00058 } 00059 } 00060 } 00061 // read the mapping files 00062 // hardcode in default filenames for now 00063 read_idx_XoZ_map("/phenix/workarea/silvermy/offline/packages/mui/wrk/lvl2cosines.adb"); 00064 read_twopack_idx_map("/phenix/workarea/silvermy/offline/packages/mui/wrk/muioomap.adb"); 00065 return 0; 00066 } |
|
Utility method for summarizing symset results Referenced by calc_symset. |
|
Do orig road finding for a given symset and fill gapbits Definition at line 702 of file mMuiFastRoadFinder.cxx. References _mod_par, bsum, gap0, gap1, gap2, gap3, gap4, mMuiFastRoadFinderPar::get_maxskip, mMuiFastRoadFinderPar::get_showercut, mMuiFastRoadFinderPar::get_swi, and m0. Referenced by calc_symset.
00705 { 00706 short showermax[5][5]; // 1st index is maxdepth, 2nd is gap. 00707 bool roadfound[5][5]; // 1st index is maxdepth, 2nd is gap. 00708 // Search gap 0 for a shower (same code no matter the max depth). 00709 // ============================================================== 00710 gap0(p, &showermax[0][0]); 00711 roadfound[1][0] = *(p[m0]); 00712 roadfound[2][0] = *(p[m0]); 00713 roadfound[3][0] = *(p[m0]); 00714 roadfound[4][0] = *(p[m0]); 00715 // Search gap 1 for road, shower with maxdepth=1 cuts. 00716 // =================================================== 00717 gap1(p, _mod_par->get_swi(1,1), &showermax[1][1], &roadfound[1][1]); 00718 00719 // Search gaps 1,2 for road, shower with maxdepth=2 cuts. 00720 // Gap 1 called again because of possible cut differences. 00721 // ======================================================= 00722 gap1(p, _mod_par->get_swi(2,1), &showermax[2][1], &roadfound[2][1]); 00723 gap2(p, _mod_par->get_swi(2,2), &showermax[2][2], &roadfound[2][2]); 00724 00725 // Search gaps 1,2,3 for road, shower with maxdepth=3 cuts. 00726 // Gap2 1,2 called again because of possible cut differences. 00727 // ========================================================== 00728 gap1(p, _mod_par->get_swi(3,1), &showermax[3][1], &roadfound[3][1]); 00729 gap2(p, _mod_par->get_swi(3,2), &showermax[3][2], &roadfound[3][2]); 00730 gap3(p, _mod_par->get_swi(3,3), &showermax[3][3], &roadfound[3][3]); 00731 00732 // Search gaps 1-4 for road, shower with maxdepth=4 cuts. 00733 // Gaps 1-3 called again because of possible cut differences. 00734 // ========================================================== 00735 gap1(p, _mod_par->get_swi(4,1), &showermax[4][1], &roadfound[4][1]); 00736 gap2(p, _mod_par->get_swi(4,2), &showermax[4][2], &roadfound[4][2]); 00737 gap3(p, _mod_par->get_swi(4,3), &showermax[4][3], &roadfound[4][3]); 00738 gap4(p, _mod_par->get_swi(4,4), &showermax[4][4], &roadfound[4][4]); 00739 00740 // We need to count the skipped gaps that were needed to generate 00741 // each track candidate. 00742 // ============================================================== 00743 int nskip[5][5]; // 1st index is maxdepth, 2nd is gap. 00744 00745 nskip[4][4] = 5 - bsum(&roadfound[4][0], 5); 00746 00747 nskip[3][3] = 4 - bsum(&roadfound[3][0], 4); 00748 nskip[4][3] = 4 - bsum(&roadfound[4][0], 4); 00749 00750 nskip[2][2] = 3 - bsum(&roadfound[2][0], 3); 00751 nskip[3][2] = 3 - bsum(&roadfound[3][0], 3); 00752 nskip[4][2] = 3 - bsum(&roadfound[4][0], 3); 00753 00754 nskip[1][1] = 2 - bsum(&roadfound[1][0], 2); 00755 nskip[2][1] = 2 - bsum(&roadfound[2][0], 2); 00756 nskip[3][1] = 2 - bsum(&roadfound[3][0], 2); 00757 nskip[4][1] = 2 - bsum(&roadfound[4][0], 2); 00758 00759 // Each maximum-depth=i candidate can find a road in any 00760 // gap j, for i>=j. Note that skipped gaps are handled in the 00761 // assignment of *gapibits below. 00762 // ========================================================== 00763 bool road[5]; 00764 00765 road[4] = roadfound[4][4] && (nskip[4][4] <= _mod_par->get_maxskip(4,4)); 00766 00767 road[3] = (roadfound[3][3] && (nskip[3][3] <= _mod_par->get_maxskip(3,3))) || 00768 (roadfound[4][3] && (nskip[4][3] <= _mod_par->get_maxskip(4,3))) ; 00769 00770 road[2] = (roadfound[2][2] && (nskip[2][2] <= _mod_par->get_maxskip(2,2))) || 00771 (roadfound[3][2] && (nskip[3][2] <= _mod_par->get_maxskip(3,2))) || 00772 (roadfound[4][2] && (nskip[4][2] <= _mod_par->get_maxskip(4,2))) ; 00773 00774 road[1] = (roadfound[1][1] && (nskip[1][1] <= _mod_par->get_maxskip(1,1))) || 00775 (roadfound[2][1] && (nskip[2][1] <= _mod_par->get_maxskip(2,1))) || 00776 (roadfound[3][1] && (nskip[3][1] <= _mod_par->get_maxskip(3,1))) || 00777 (roadfound[4][1] && (nskip[4][1] <= _mod_par->get_maxskip(4,1))); 00778 00779 // Conditions for setting showered bits: 00780 // 1. Kill any road candidate for which there is a more deeply 00781 // reconstructed road that showers. 00782 // 2. Don't negate a more deeply reconstructed track, except by 00783 // its own showermax cuts. 00784 // ============================================================= 00785 bool showered[5]; 00786 00787 showered[4] = showermax[0][0] > _mod_par->get_showercut(4,0) || 00788 showermax[4][1] > _mod_par->get_showercut(4,1) || 00789 showermax[4][2] > _mod_par->get_showercut(4,2) || 00790 showermax[4][3] > _mod_par->get_showercut(4,3) || 00791 showermax[4][4] > _mod_par->get_showercut(4,4); 00792 00793 showered[3] = showered[4] || 00794 showermax[0][0] > _mod_par->get_showercut(3,0) || 00795 showermax[3][1] > _mod_par->get_showercut(3,1) || 00796 showermax[3][2] > _mod_par->get_showercut(3,2) || 00797 showermax[3][3] > _mod_par->get_showercut(3,3); 00798 00799 showered[2] = showered[3] || 00800 showermax[0][0] > _mod_par->get_showercut(2,0) || 00801 showermax[2][1] > _mod_par->get_showercut(2,1) || 00802 showermax[2][2] > _mod_par->get_showercut(2,2); 00803 00804 showered[1] = showered[2] || 00805 showermax[0][0] > _mod_par->get_showercut(1,0) || 00806 showermax[1][1] > _mod_par->get_showercut(1,1); 00807 00808 // Return 4-bit value, the i^th bit indicates that a candidate made it 00809 // to the i^th gap w/o showering. 00810 // =================================================================== 00811 gap4bit = road[4] && !showered[4]; 00812 gap3bit = (road[3] && !showered[3]) || gap4bit; 00813 gap2bit = (road[2] && !showered[2]) || gap3bit; 00814 gap1bit = (road[1] && !showered[1]) || gap2bit; 00815 00816 return; 00817 } |
|
Read idx_XoZ mapping Definition at line 114 of file mMuiFastRoadFinder.cxx. References _idx_XoZ. Referenced by init.
00115 { 00116 // Read in Mui cosine/slope info from a file 00117 ifstream fin(filename); 00118 if (!fin) 00119 { 00120 cerr << PHWHERE << " - can't open " << filename 00121 << "for input" << endl; 00122 return; 00123 } 00124 int nlines = 0; 00125 00126 int idx = 0; 00127 int arm = 0; 00128 int orient = 0; 00129 float XoZ = 0.0; 00130 00131 // read from the file as long as we can 00132 while ( fin.good() ) 00133 { 00134 fin >> idx >> arm >> orient >> XoZ; 00135 00136 if (! fin.good() ) 00137 { 00138 break; 00139 } 00140 _idx_XoZ[arm][orient][idx] = XoZ; 00141 nlines++; 00142 } 00143 cout << PHWHERE << " XoZ nlines " << nlines << " read " << endl; 00144 return; 00145 } |
|
Read twopack_idx mapping Definition at line 149 of file mMuiFastRoadFinder.cxx. References _twopack_idx. Referenced by init.
00150 { 00151 // Read in Mui twopack->logical mapping from a file 00152 ifstream fin(filename); 00153 if (!fin) 00154 { 00155 cerr << PHWHERE << " - can't open " << filename 00156 << "for input" << endl; 00157 return; 00158 } 00159 int nlines = 0; 00160 00161 int arm = 0; 00162 int plane = 0; 00163 int panel = 0; 00164 int orient = 0; 00165 int twopack = 0; 00166 int idx = 0; 00167 00168 00169 // read from the file as long as we can 00170 while ( fin.good() ) 00171 { 00172 fin >> arm >> plane >> panel >> orient >> twopack >> idx; 00173 00174 if (! fin.good() ) 00175 { 00176 break; 00177 } 00178 _twopack_idx[arm][plane][panel][orient][twopack] = idx; 00179 nlines++; 00180 } 00181 cout << PHWHERE << " twopack-idx nlines " << nlines << " read " << endl; 00182 return; 00183 } |
|
Find all the necessary maps on the node tree. Definition at line 97 of file mMuiFastRoadFinder.cxx. References _hitmap, _mod_par, and _roadmap. Referenced by event.
00098 { 00099 // module runtime parameters 00100 _mod_par = TMutNode<mMuiFastRoadFinderPar>::find_node(top_node,"mMuiFastRoadFinderPar"); 00101 // dump parameter listing 00102 //_mod_par->print(); 00103 00104 //Find the TMuiRoadO IOC 00105 _roadmap = TMutNode<TMuiRoadMapO>::find_node(top_node,"TMuiRoadMapO"); 00106 00107 //Find the TMuiHitO IOC 00108 _hitmap = TMutNode<TMuiHitMapO>::find_node(top_node,"TMuiHitMapO"); 00109 00110 return; 00111 } |
|
Do simple road finding for a given symset and fill gapbits Definition at line 524 of file mMuiFastRoadFinder.cxx. References _mod_par, mMuiFastRoadFinderPar::get_min_valid_hits, mMuiFastRoadFinderPar::get_symset_middle, mMuiFastRoadFinderPar::get_symset_upper, i1, i2, i3, and i4. Referenced by calc_symset.
00527 { 00528 static const short search_width = 3; 00529 00530 // these are counters for the indices in the gaps 00531 short i0 = 0, i1 = 0, i2 = 0, i3 = 0, i4 = 0; 00532 // gap 0: 0- 4; m = 2, 5 numbers 00533 // gap 1: 5 + 0-10; m = 10-5 = 5, 11 numbers 00534 // gap 2: 16 + 0-16; m = 24-16 = 8, 17 numbers 00535 // gap 3: 33 + 0-22; m = 44-33 = 11, 23 numbers 00536 // gap 4: 56 + 0-28; m = 70-56 = 14, 29 numbers 00537 // this info is stored in the mMuiFastRoadFinderPar.h file 00538 00539 // negate the gapbits to start with 00540 gap1bit = false; 00541 gap2bit = false; 00542 gap3bit = false; 00543 gap4bit = false; 00544 short ngapsbest = 0; 00545 bool locgap0bit = false; 00546 bool locgap1bit = false; 00547 bool locgap2bit = false; 00548 bool locgap3bit = false; 00549 bool locgap4bit = false; 00550 bool candidateFound = false; 00551 00552 //--------------------------------------------------------------------- 00553 // The (software) algorithm works as follows: 00554 // loop over gap0 indices and see if we have something there or in gap1 00555 // for that index. 00556 // If so, we'll continue by looking at gaps 3 and 4. 00557 // we'll look X=3 wide in those last two gaps, i.e. -1,0,+1 + gap0-index 00558 // - i.e. use _mod_par->get_search_width() = 3; as default, to limit this 00559 // If we find something there also, we'll do the full OR between 00560 // -1,0,+1 + gap0-index in gaps 1 and 2 also. If the sum of these OR's 00561 // is larger or equal to 3, this is a validCandidate 00562 // - use const _mod_par->get_min_valid_hits() = 3; 00563 // we will then exit the search (gapbits should be filled properly) 00564 // 00565 // if we didn't find a valid candidate: set all gapbits to false 00566 // 00567 // New (Oct 31, 2003) implemented shallow check if no deep was found 00568 //--------------------------------------------------------------------- 00569 00570 i0 = 0; // start from the beginning 00571 short distFromMiddle; // help variable 00572 // start one below middle, by default 00573 short low_offset = 1; 00574 // go to one above middle 00575 // short high_offset = 1; 00576 // and search all 00577 short nsearch = search_width; 00578 int i; 00579 00580 while ( i0<=_mod_par->get_symset_upper(0) ) 00581 { 00582 distFromMiddle = i0 - _mod_par->get_symset_middle(0); // [-2,2]; 0 in the middle 00583 i1 = _mod_par->get_symset_middle(1) + distFromMiddle; // same index in gap1 00584 00585 if ( *(p[i0]) || *(p[i1]) ) 00586 { // ok, we have something in either gap 0 or 1 00587 // let's now get the OR's for gap 3 and 4. 00588 00589 // Now, go through all the gaps.. 00590 00591 // gap 0 00592 locgap0bit = *(p[i0]); 00593 00594 // gap 1 00595 i1 = _mod_par->get_symset_middle(1) + distFromMiddle - low_offset; 00596 locgap1bit = false; 00597 for (i = 0; i<nsearch; i++) 00598 { 00599 locgap1bit = locgap1bit || *(p[i1+i]); 00600 } 00601 00602 // gap 2 00603 i2 = _mod_par->get_symset_middle(2) + distFromMiddle - low_offset; 00604 locgap2bit = false; 00605 for (i = 0; i<nsearch; i++) 00606 { 00607 locgap2bit = locgap2bit || *(p[i2+i]); 00608 } 00609 00610 // gap 3 00611 i3 = _mod_par->get_symset_middle(3) + distFromMiddle - low_offset; 00612 locgap3bit = false; 00613 for (i = 0; i<nsearch; i++) 00614 { 00615 locgap3bit = locgap3bit || *(p[i3+i]); 00616 } 00617 00618 // gap 4 00619 i4 = _mod_par->get_symset_middle(4) + distFromMiddle - low_offset; 00620 locgap4bit = false; 00621 for (i = 0; i<nsearch; i++) 00622 { 00623 locgap4bit = locgap4bit || *(p[i4+i]); 00624 } 00625 00626 // Requirement for sheep/deep: 00627 // if we have something either gap 3 or gap 4, we'll do the full OR 00628 // for gaps 1 and 2 also 00629 if (locgap3bit || locgap4bit) 00630 { 00631 short ngapsum = 0; 00632 if (locgap0bit) ngapsum++; 00633 if (locgap1bit) ngapsum++; 00634 if (locgap2bit) ngapsum++; 00635 if (locgap3bit) ngapsum++; 00636 if (locgap4bit) ngapsum++; 00637 00638 if (ngapsum >=_mod_par->get_min_valid_hits()) 00639 { 00640 candidateFound = true; 00641 if (ngapsum > ngapsbest) 00642 { 00643 gap1bit = locgap1bit; 00644 gap2bit = locgap2bit; 00645 gap3bit = locgap3bit; 00646 gap4bit = locgap4bit; 00647 } // best so far 00648 } // ok 00649 } // fulfilled deep requirement 00650 else 00651 { // could still perhaps be accepted as shallow 00652 // nothing in gap3 or 4, but we could perhaps still have enough 00653 // in gap0,1,2 00654 short ngapsum = 0; 00655 if (locgap0bit) ngapsum++; 00656 if (locgap1bit) ngapsum++; 00657 if (locgap2bit) ngapsum++; 00658 if (ngapsum >=_mod_par->get_min_valid_hits()) 00659 { 00660 candidateFound = true; 00661 if (ngapsum > ngapsbest) 00662 { 00663 gap1bit = locgap1bit; 00664 gap2bit = locgap2bit; 00665 gap3bit = locgap3bit; 00666 gap4bit = locgap4bit; 00667 } // best so far 00668 } // ok 00669 } // shallow test 00670 } // something in gap 0 or 1 00671 i0++; 00672 } 00673 00674 // if we didn't find any candidate, we'll make sure that the 00675 // gapbits are all negated 00676 if (!candidateFound) 00677 { 00678 gap1bit = false; 00679 gap2bit = false; 00680 gap3bit = false; 00681 gap4bit = false; 00682 } 00683 00684 // Return 4-bit value, the i^th bit indicates that a candidate made it 00685 // to the i^th gap 00686 // What we need to do is thus just go thru the lower gaps and see if 00687 // higher gaps were already set 00688 // 00689 // Outcommented this overwriting for now: DS, July 31, 2003 00690 // 00691 /* 00692 gap3bit = gap3bit || gap4bit; 00693 gap2bit = gap2bit || gap3bit; 00694 gap1bit = gap1bit || gap2bit; 00695 */ 00696 00697 return; 00698 } |
|
Definition at line 125 of file mMuiFastRoadFinder.h. Referenced by hit_to_logical, hit_to_logical_per_panel, and set_interface_ptrs. |
|
Definition at line 116 of file mMuiFastRoadFinder.h. Referenced by calc_symset, hit_to_logical_per_panel, and read_idx_XoZ_map. |
|
parameter table and IOCs Definition at line 123 of file mMuiFastRoadFinder.h. Referenced by calc_symset, find_tracks, init, orig_trigger_road_finder, set_interface_ptrs, and simple_trigger_road_finder. |
|
Definition at line 124 of file mMuiFastRoadFinder.h. Referenced by find_tracks, and set_interface_ptrs. |
|
handy variables for symset calculation Definition at line 113 of file mMuiFastRoadFinder.h. Referenced by hit_to_logical, hit_to_logical_per_panel, and init. |
|
symset (1D) info Definition at line 120 of file mMuiFastRoadFinder.h. Referenced by find_tracks. |
|
Definition at line 126 of file mMuiFastRoadFinder.h. Referenced by event. |
|
Definition at line 114 of file mMuiFastRoadFinder.h. Referenced by calc_symset, and init. |
|
Definition at line 117 of file mMuiFastRoadFinder.h. Referenced by hit_to_logical, hit_to_logical_per_panel, and read_twopack_idx_map. |
|
Definition at line 44 of file mMuiFastRoadFinder.h. |