#include <mMuiBLTEmulator.h>
Public Types | |
enum | { max_arm = 2, max_quad = 4, max_plane = 4, max_orientation = 2, DEEP_ROAD = 2, SHALLOW_ROAD = 1, DEEP_DEEP = 16, DEEP_SHALLOW = 8, SINGLE_DEEP = 4, SHALLOW_SHALLOW = 2, SINGLE_SHALLOW = 1, mlu_address_max = 4096, max_fem = 2, word_per_fem = 120 } |
Public Methods | |
mMuiBLTEmulator () | |
~mMuiBLTEmulator () | |
virtual PHBoolean | event (PHCompositeNode *) |
void | initialize (int runno) |
bool | read_mlu_data (int *mlu_data_d, char *mlu_data_file) |
Private Methods | |
void | get_raw_data () |
void | get_hits () |
void | raw_to_trigpattern () |
int | decision_event (int arm) |
int | decision_mlu (int arm) |
int | quad_fire (int *quad_trig_pattern, int *mlu_data) |
void | set_interface_ptrs (PHCompositeNode *top_node) |
void | fill_map () |
int | get_non_used_plane () |
void | set_non_used_plane (int plane) |
void | check_blt () |
void | dump_reco_blt (int arm) |
bool | is_reco_2D (int arm) |
bool | is_reco_1D1S (int arm) |
bool | is_reco_1D (int arm, int quad) |
bool | is_reco_1S (int arm, int quad) |
int | get_quad (float x, float y, float z) |
Private Attributes | |
const mMuiBLTEmulatorPar * | _mod_par |
TMuiHitMapO * | _hit_map |
TMuiPseudoBLTMapO * | _blt_map |
Event * | _event |
long | word [max_arm][max_fem][word_per_fem] |
int | mlu_data_s [mlu_address_max] |
int | mlu_data_d [mlu_address_max] |
int | _non_used_plane |
int | trig_pattern [max_arm][max_quad][max_plane] |
int | trig_accept [max_arm][max_quad] |
int | init_done |
PHTimer | _timer |
Object | Description :: this is a translation from Hiroki's emulator ( offline/packages/mui/mMuiPseudoTrigger), I (chun zhang) am trying to keep it as untouched as possible, ie. do not blame me for anything. | Privilege |
const mMuiBLTEmulatorPar* | Parameter Table | immutable |
TMuiHitMapO* | Parameter Table | immutable |
TMuiPseudoBLTMapO* | Parameter Table | immutable
|
Definition at line 51 of file mMuiBLTEmulator.h.
|
Definition at line 55 of file mMuiBLTEmulator.h.
00056 { 00057 max_arm =2, 00058 max_quad = 4, 00059 max_plane = 4, 00060 max_orientation = 2, 00061 00062 DEEP_ROAD = 2, 00063 SHALLOW_ROAD = 1, 00064 00065 DEEP_DEEP = 16, 00066 DEEP_SHALLOW = 8, 00067 SINGLE_DEEP = 4, 00068 SHALLOW_SHALLOW = 2, 00069 SINGLE_SHALLOW = 1, 00070 00071 mlu_address_max = 4096, 00072 max_fem = 2, 00073 word_per_fem = 120 00074 }; |
|
Definition at line 62 of file mMuiBLTEmulator.cxx.
00062 { } |
|
Definition at line 785 of file mMuiBLTEmulator.cxx. References _blt_map, _hit_map, dump_reco_blt, TMuiPseudoBLTMapO::get, is_reco_1D1S, and is_reco_2D. Referenced by event.
00785 { 00786 00787 // define a flag for debug. 00788 // 00789 int check_flag = 0; 00790 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00791 TMuiPseudoBLTMapO::const_iterator blt_iter = _blt_map->get(iarm); 00792 while(TMuiPseudoBLTMapO::const_pointer blt_ptr = blt_iter.next()){ 00793 if(blt_ptr->get()->is_2D_fired()!=is_reco_2D(iarm)) { 00794 check_flag = 1; 00795 std::cout << " 2D trigger shows inconsistent " << std::endl; 00796 dump_reco_blt(iarm); 00797 blt_ptr->get()->print(); 00798 _hit_map->print(); 00799 } else if(blt_ptr->get()->is_1D1S_fired()!=is_reco_1D1S(iarm)) { 00800 check_flag = 1; 00801 std::cout << " 1D1S trigger shows inconsistent " << std::endl; 00802 dump_reco_blt(iarm); 00803 blt_ptr->get()->print(); 00804 _hit_map->print(); 00805 } 00806 } 00807 } 00808 } |
|
Definition at line 284 of file mMuiBLTEmulator.cxx. References decision_mlu, DEEP_ROAD, max_quad, mlu_data_d, mlu_data_s, quad_fire, SHALLOW_ROAD, trig_accept, and trig_pattern. Referenced by fill_map.
00284 { 00285 00286 // Copy of Hiroki's code, modification I made is 00287 // having arm as an input to handle both arm 00288 00289 int trig_pattern_arm[max_quad][MUIOO::MAX_PLANE-1]; 00290 00291 for(int iquad = 0; iquad < max_quad; iquad++) { 00292 for(int iplane = 0; iplane < MUIOO::MAX_PLANE-1; iplane++) { 00293 trig_pattern_arm[iquad][iplane] = trig_pattern[arm][iquad][iplane]; 00294 } 00295 } 00296 00297 for( int quad = 0; quad<max_quad; quad++ ){ 00298 trig_accept[arm][quad] = 0; 00299 } 00300 00301 for ( int quad = 0; quad<max_quad; quad++ ) { 00302 if ( quad_fire( trig_pattern_arm[quad], mlu_data_d ) == 1 ) { 00303 trig_accept[arm][quad] = DEEP_ROAD; 00304 } 00305 else if ( quad_fire( trig_pattern_arm[quad], mlu_data_s ) == 1 ) { 00306 trig_accept[arm][quad] = SHALLOW_ROAD; 00307 } 00308 } 00309 return decision_mlu(arm); 00310 } |
|
Definition at line 341 of file mMuiBLTEmulator.cxx. References DEEP_DEEP, DEEP_ROAD, DEEP_SHALLOW, max_quad, SHALLOW_ROAD, SHALLOW_SHALLOW, SINGLE_DEEP, SINGLE_SHALLOW, and trig_accept. Referenced by decision_event.
00341 { 00342 00343 // copy from hiroki's code, just take out 'cout' 00344 // 00345 00346 short shallow = 0; 00347 short deep = 0; 00348 00349 int exclusive_switch = 0; 00350 // if this is 1, all five bits are excusive. 00351 00352 for( int quad = 0; quad<max_quad; quad++ ) { 00353 if ( trig_accept[arm][quad] > 0 ) { 00354 if ( trig_accept[arm][quad] == DEEP_ROAD ) { 00355 deep++; 00356 } else if ( trig_accept[arm][quad] == SHALLOW_ROAD ) { 00357 shallow++; 00358 } 00359 } 00360 } 00361 00362 if ( deep >= 2 ) { 00363 if( exclusive_switch == 1 ) { 00364 return DEEP_DEEP; 00365 } 00366 else { 00367 return DEEP_DEEP + DEEP_SHALLOW + SHALLOW_SHALLOW + 00368 SINGLE_DEEP + SINGLE_SHALLOW; 00369 } 00370 } else if ( deep == 1 && shallow >= 1 ) { 00371 if( exclusive_switch == 1 ) { 00372 return DEEP_SHALLOW; 00373 } else { 00374 return DEEP_SHALLOW + SHALLOW_SHALLOW + SINGLE_DEEP + SINGLE_SHALLOW; 00375 } 00376 } else if ( deep == 1 ) { 00377 if( exclusive_switch == 1 ) { 00378 return SINGLE_DEEP; 00379 } else { 00380 return SINGLE_DEEP + SINGLE_SHALLOW; 00381 } 00382 } 00383 else if ( shallow >= 2 ) { 00384 if( exclusive_switch == 1 ) { 00385 return SHALLOW_SHALLOW; 00386 } else { 00387 return SHALLOW_SHALLOW + SINGLE_SHALLOW; 00388 } 00389 } 00390 else if ( shallow == 1 ) { 00391 return SINGLE_SHALLOW; 00392 } else { 00393 return 0; 00394 } 00395 } |
|
Definition at line 810 of file mMuiBLTEmulator.cxx. References is_reco_1D, is_reco_1D1S, is_reco_1S, and is_reco_2D. Referenced by check_blt.
00810 { 00811 00812 std::cout << " check on arm : " << arm << " :: " <<std::endl; 00813 std::cout << " reco trigger check from mMuiBLTEmulator " << std::endl; 00814 std::cout << " is_reco_2D:: " << is_reco_2D(arm) << std::endl; 00815 std::cout << " is_reco_1D1S:: " << is_reco_1D1S(arm) << std::endl; 00816 std::cout << " is_reco_1D quad0:: " << is_reco_1D(arm, 0) << std::endl; 00817 std::cout << " is_reco_1D quad1:: " << is_reco_1D(arm, 1) << std::endl; 00818 std::cout << " is_reco_1D quad2:: " << is_reco_1D(arm, 2) << std::endl; 00819 std::cout << " is_reco_1D quad3:: " << is_reco_1D(arm, 3) << std::endl; 00820 std::cout << " is_reco_1S quad0:: " << is_reco_1S(arm, 0) << std::endl; 00821 std::cout << " is_reco_1S quad1:: " << is_reco_1S(arm, 1) << std::endl; 00822 std::cout << " is_reco_1S quad2:: " << is_reco_1S(arm, 2) << std::endl; 00823 std::cout << " is_reco_1S quad3:: " << is_reco_1S(arm, 3) << std::endl; 00824 } |
|
Definition at line 66 of file mMuiBLTEmulator.cxx. References _mod_par, _timer, check_blt, fill_map, mMuiBLTEmulatorPar::FROMDST, mMuiBLTEmulatorPar::FROMPRDF, mMuiBLTEmulatorPar::get_debug_flag, get_hits, mMuiBLTEmulatorPar::get_mode, get_raw_data, raw_to_trigpattern, and set_interface_ptrs.
00067 { 00068 00069 _timer.restart(); 00070 00071 try { 00072 00073 // Reset IOC pointers 00074 // 00075 set_interface_ptrs(top_node); 00076 // do the initialization for first event. 00077 // 00078 // if(!init_done) initialize(); 00079 00080 // collects all the raw hits/hits information. 00081 // 00082 if(_mod_par->get_mode()==mMuiBLTEmulatorPar::FROMPRDF) get_raw_data(); 00083 if(_mod_par->get_mode()==mMuiBLTEmulatorPar::FROMDST) get_hits(); 00084 // transfer the hit to trigger primary format. 00085 // 00086 raw_to_trigpattern(); 00087 // Fill trigger decisions into pseudo-trigger map. 00088 // 00089 fill_map(); 00090 // check blt emualtor according to the hit information. 00091 // 00092 if(_mod_par->get_debug_flag()==1) check_blt(); 00093 } catch(std::exception& e) { 00094 MUTOO::TRACE(e.what()); 00095 return False; 00096 } 00097 00098 // Timer 00099 // 00100 _timer.print(); 00101 return True; 00102 } |
|
Definition at line 398 of file mMuiBLTEmulator.cxx. References _blt_map, decision_event, DEEP_DEEP, DEEP_ROAD, DEEP_SHALLOW, TMuiPseudoBLTMapO::insert_new, is_reco_1D, is_reco_1D1S, is_reco_1S, is_reco_2D, max_quad, SHALLOW_ROAD, and trig_accept. Referenced by event.
00398 { 00399 00400 // Take the output from emulator, fill pseudo-BLT map. 00401 // 00402 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00403 TMuiPseudoBLTMapO::iterator blt_iter = _blt_map->insert_new(iarm); 00404 int pseudoblt_bit = decision_event(iarm); 00405 if( (pseudoblt_bit & DEEP_DEEP) != 0 ) blt_iter->get()->fire_2D(); 00406 if( (pseudoblt_bit & DEEP_SHALLOW) != 0 ) blt_iter->get()->fire_1D1S(); 00407 for(int iquad = 0; iquad < max_quad; iquad++) { 00408 if(trig_accept[iarm][iquad]==DEEP_ROAD) { 00409 blt_iter->get()->fire_1D(iquad); 00410 blt_iter->get()->fire_1S(iquad); 00411 } else if(trig_accept[iarm][iquad]==SHALLOW_ROAD) { 00412 blt_iter->get()->fire_1S(iquad); 00413 } 00414 } 00415 if(is_reco_2D(iarm)) blt_iter->get()->fire_reco_2D(); 00416 if(is_reco_1D1S(iarm)) blt_iter->get()->fire_reco_1D1S(); 00417 for(int iquad = 0; iquad < max_quad; iquad++) { 00418 if(is_reco_1D(iarm,iquad)) blt_iter->get()->fire_reco_1D(iquad); 00419 if(is_reco_1S(iarm,iquad)) blt_iter->get()->fire_reco_1S(iquad); 00420 } 00421 } 00422 } |
|
Definition at line 127 of file mMuiBLTEmulator.cxx. References _hit_map, and word. Referenced by event.
00127 { 00128 // Loop through mui hit map, fill word array 00129 // muioo hit is organized by (arm, plane, panel, orientation, twopack), 00130 // but word array is organized by FEM address and every word uses its 00131 // low 16 bits to store 16 twopacks, we need to map muioo hit into 00132 // low 16 bits of each word in word array. This transform is taken care by 00133 // TMuiChannelId and TMuiAddressTable::Table()->HardwareAddress(TMuiChannelId). 00134 // Here I just call them. 00135 // 00136 00137 // clear word array for each event. 00138 // 00139 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++){ 00140 for(int iorient = 0; iorient < MUIOO::MAX_ORIENTATION; iorient++) { 00141 for(int iword = 0; iword < MUIOO::kWordsPerFEM; iword++) { 00142 word[iarm][iorient][iword] = 0; 00143 } 00144 } 00145 } 00146 00147 TMuiHitMapO::const_iterator hit_iter = _hit_map->range(); 00148 while(TMuiHitMapO::const_pointer hit_ptr = hit_iter.next()){ 00149 EOrient_t orientation = kVERT; 00150 if(hit_ptr->get()->get_orientation()==0) orientation = kHORIZ; 00151 00152 TMuiChannelId muichannel(hit_ptr->get()->get_arm(), 00153 hit_ptr->get()->get_plane(), 00154 hit_ptr->get()->get_panel(), 00155 orientation, 00156 hit_ptr->get()->get_twopack()); 00157 TMuiReadoutID hardware = TMuiAddressTable::Table()->HardwareAddress(muichannel); 00158 int iword = hardware.ROC()*MUIOO::kWordsPerROC+hardware.Word(); 00159 int ibit = hardware.Channel(); 00160 00161 word[hit_ptr->get()->get_arm()][hit_ptr->get()->get_orientation()][iword] |= (0x01<<ibit); 00162 } 00163 } |
|
Definition at line 120 of file mMuiBLTEmulator.h. References _non_used_plane. Referenced by initialize, and raw_to_trigpattern.
00120 { return _non_used_plane;} |
|
Definition at line 774 of file mMuiBLTEmulator.cxx. Referenced by is_reco_1D, and is_reco_1S.
00774 { 00775 00776 if( x>= 0 && y >= 0 ) return 3; 00777 if( x>= 0 && y <= 0 ) return 1; 00778 if( x<= 0 && y >= 0 ) return 2; 00779 if( x<= 0 && y <= 0 ) return 0; 00780 00781 // not reached 00782 return -1; 00783 } |
|
Definition at line 105 of file mMuiBLTEmulator.cxx. References _event, max_arm, and word. Referenced by event.
00105 { 00106 // get raw data from event_node. then store it into 00107 // arry word[arm][orientation][iword]. 00108 // Tatally there are 120 words per orientation, and the low 16 bits 00109 // in each word represents 16 twopacks. 00110 // 00111 Packet* p; 00112 static const int id_base[max_arm] = {12001, 12003}; // for South and North 00113 00114 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00115 for(int iorient = 0; iorient < MUIOO::MAX_ORIENTATION; iorient++) { 00116 int pack_id = id_base[iarm] + iorient; 00117 if((p=_event->getPacket(pack_id))!=0) { 00118 for(int iword = 0; iword < MUIOO::kWordsPerFEM; iword++) { 00119 word[iarm][iorient][iword] = p->iValue(iword); 00120 } 00121 delete p; 00122 } 00123 } 00124 } 00125 } |
|
Definition at line 444 of file mMuiBLTEmulator.cxx. References _mod_par, mMuiBLTEmulatorPar::get_mlu_map, get_non_used_plane, init_done, mlu_address_max, mlu_data_d, mlu_data_s, read_mlu_data, and set_non_used_plane.
00444 { 00445 00446 // initialize of non_used_plane 00447 const int nup_max = 3; // non_used_plane 00448 int nup_begin[nup_max]; 00449 int nup_end[nup_max]; 00450 int nup[nup_max]; 00451 00452 int init_done = 0; 00453 00454 nup_begin[0] = 35758; 00455 nup[0] = 1; 00456 nup_end[0] = 40655; // end of Run-2 00457 nup_begin[1] = 40656; // It is not certain when it changed? 00458 nup[1] = 2; 00459 nup_end[1] = 71869; 00460 nup_begin[2] = 71870; // Nobu 00461 nup[2] = 4; 00462 nup_end[2] = 9999999; // current configuration 00463 00464 // int runNumber= 0; 00465 //if(_event) { 00466 // runNumber = _event->getRunNumber(); 00467 //} else { 00468 // recoConsts* rc = recoConsts::instance(); 00469 // runNumber = rc->get_IntFlag("RUNNUMBER",80312); 00470 // cout << " mMuiBLTEmulator :: the runNumber we get from this analysis is " << runNumber << endl; 00471 // } 00472 00473 int nup_found = 0; 00474 for ( int nup_set = 0; nup_set < nup_max; nup_set++ ) { 00475 if ( runNumber >= nup_begin[nup_set] && 00476 runNumber <= nup_end[nup_set] ) { 00477 set_non_used_plane(nup[nup_set]); 00478 nup_found = 1; 00479 cout << " mMuiPsedoTrigger Non_Used_Plane was set to " 00480 << get_non_used_plane() << endl; 00481 } 00482 } 00483 if( !nup_found ) { 00484 cout << " mMuiPsedoTrigger Non_Used_Plane was not found for Run " 00485 << runNumber << endl; 00486 cout << " Default value " << get_non_used_plane() << " will be used " << endl; 00487 } 00488 00489 //Let's see if the database contains a time stamp for this run number, 00490 // if so we'll try to get the map from the database. 00491 init_done = -1; 00492 bool db_init_done = false; 00493 RunToTimeObjy runTime; 00494 PHTimeStamp *beginTime = runTime.getBeginTime(runNumber); 00495 if (beginTime) 00496 { 00497 PdbBankManager *bankManager = PdbObjyBankManager::instance(); 00498 PdbApplication *application = bankManager->getApplication(); 00499 if (application->startRead()) { 00500 PdbMuiTriggerMLU *achan; 00501 PdbBankID shortbankID("*.calib.mui.muitriggermlu"); 00502 shortbankID.setInternalValue(0); //Shallow MLU will be 0 00503 PdbCalBank* shortBank = 00504 bankManager->fetchBank("PdbMuiTriggerMLUBank",shortbankID,"calib.mui.muitriggermlu",runNumber); 00505 //We are good to go! 00506 //First the shallow 00507 if(shortBank > 0) 00508 { 00509 shortBank->print(); 00510 PdbMuiTriggerMLU *achan; 00511 if(shortBank->getLength()<=mlu_address_max){ 00512 for(unsigned int wordid = 0; wordid < shortBank->getLength(); wordid++) 00513 { 00514 achan = (PdbMuiTriggerMLU*)&(shortBank->getEntry(wordid)); 00515 mlu_data_s[wordid]=achan->MLUword(); 00516 } 00517 db_init_done = true; 00518 } 00519 else 00520 { 00521 cout << PHWHERE << "More data in database than expected."<<endl; 00522 db_init_done = false; 00523 } 00524 delete shortBank; 00525 } 00526 else 00527 { 00528 cout << PHWHERE << "Map wasn't found in database."<<endl; 00529 } 00530 PdbBankID deepbankID("*.calib.mui.muitriggermlu"); 00531 deepbankID.setInternalValue(1); //Deep MLU will be 1 00532 PdbCalBank* deepBank = 00533 bankManager->fetchBank("PdbMuiTriggerMLUBank",deepbankID,"calib.mui.muitriggermlu",runNumber); 00534 if(deepBank > 0) 00535 { 00536 deepBank->print(); 00537 //Now the deep 00538 if(deepBank->getLength()<=mlu_address_max){ 00539 for(unsigned int wordid = 0; wordid < deepBank->getLength(); wordid++) 00540 { 00541 achan = (PdbMuiTriggerMLU*)&(deepBank->getEntry(wordid)); 00542 mlu_data_d[wordid]=achan->MLUword(); 00543 } 00544 db_init_done = true; 00545 delete deepBank; 00546 } 00547 else 00548 { 00549 cout << PHWHERE << "More data in database than expected."<<endl; 00550 db_init_done = false; 00551 } 00552 } 00553 else 00554 { 00555 cout << PHWHERE << "Map wasn't found in database."<< endl; 00556 } 00557 00558 application->commit(); 00559 } 00560 else 00561 { 00562 cout << PHWHERE << "Failed to start application for update" << endl; 00563 } 00564 delete beginTime; 00565 } 00566 if(db_init_done) 00567 { 00568 init_done = 1; 00569 return ; 00570 } 00571 else 00572 { 00573 cout<< PHWHERE << "Map not found in database will try local files."<< endl; 00574 } 00575 00576 int map_select = _mod_par->get_mlu_map(); 00577 char* mlu_file_d; 00578 char* mlu_file_d1 = "mui_pseudotrigmap_deep_mh1.dat"; 00579 char* mlu_file_d2 = "mui_pseudotrigmap_deep_mh2.dat"; 00580 // MLU data file for deep roads 00581 char* mlu_file_s = "mui_pseudotrigmap_shallow.dat"; 00582 int run_pp_begin = 35758; 00583 int run_change_deep = 38189; 00584 int run_pp_end = 40655; 00585 00586 if( map_select == 1 || map_select == 0 && ( (runNumber >= run_pp_begin) && (runNumber < run_change_deep) ) ) { 00587 mlu_file_d = mlu_file_d1; 00588 } 00589 else if( (map_select == 2 ) || map_select == 0 && ( (runNumber >= run_change_deep) && (runNumber <= run_pp_end) ) ) { 00590 mlu_file_d = mlu_file_d2; 00591 } 00592 else { 00593 cout << " mMuiPseudoTrigger: This is not pp Run2 or simulation" << endl; 00594 cout << " No MLU map was read" << endl; 00595 return; 00596 } 00597 00598 if( read_mlu_data( mlu_data_d, mlu_file_d ) ) { 00599 cout << "mMuiPsedoTrigger; MLU data for deep roads " 00600 << mlu_file_d << " was read" << endl; 00601 } 00602 else { 00603 return; 00604 } 00605 00606 if( read_mlu_data( mlu_data_s, mlu_file_s ) ) { 00607 cout << "mMuiPsedoTrigger; MLU data for shallow roads " 00608 << mlu_file_s << " was read" << endl; 00609 } 00610 else { 00611 return; 00612 } 00613 00614 init_done = 1; 00615 } |
|
Definition at line 669 of file mMuiBLTEmulator.cxx. References _hit_map, TMuiHitMapO::get, and get_quad. Referenced by dump_reco_blt, fill_map, is_reco_1D1S, and is_reco_2D.
00669 { 00670 00671 int nhit_quad = 0; 00672 00673 for(int iplane = 0; iplane < MUIOO::MAX_PLANE-1; iplane++) { 00674 for(int iorient = 0; iorient < MUIOO::MAX_ORIENTATION; iorient++){ 00675 int find_flag = 0; 00676 for(int ipanel = 0; ipanel < MUIOO::MAX_PANEL; ipanel++) { 00677 TMuiHitMapO::const_iterator mui_hit_iter = _hit_map->get(arm,iplane,ipanel,iorient); 00678 while(TMuiHitMapO::const_pointer mui_hit_ptr = mui_hit_iter.next()){ 00679 TMuiMCHitMapO::const_key_iterator mc_hit_iter = mui_hit_ptr->get()->get_associated<TMuiMCHitO>(); 00680 while(TMuiMCHitMapO::const_pointer mc_hit_ptr = mc_hit_iter.next()) { 00681 // if the hit is in big panel( 0, 2, 3, 5) we can decide it's quadrant directly, 00682 // if the hit is in small panel(1, 4) and on horizental plane, it contributes to 00683 // both left and right quadrants, if the hit is in small panel and verticle plane, 00684 // we have to relay on mchit x/y position to decide the quadrant. 00685 // 00686 int iquad = -1; 00687 00688 if(ipanel == 3 ||(ipanel == 4 && iorient == 0) ) { 00689 iquad = 0; 00690 if(quad==iquad) find_flag = 1; 00691 } 00692 if(ipanel == 5 ||(ipanel == 4 && iorient == 0)) { 00693 iquad = 1; 00694 if(quad==iquad) find_flag = 1; 00695 } 00696 if(ipanel == 2 ||(ipanel == 1 && iorient == 0)) { 00697 iquad = 2; 00698 if(quad==iquad) find_flag = 1; 00699 } 00700 if(ipanel == 0 ||(ipanel == 1 && iorient == 0)) { 00701 iquad = 3; 00702 if(quad==iquad) find_flag = 1; 00703 } 00704 if(iorient == 1 && (ipanel==4||ipanel==1)){ 00705 iquad = get_quad(mc_hit_ptr->get()->get_x(), 00706 mc_hit_ptr->get()->get_y(), 00707 mc_hit_ptr->get()->get_z()); 00708 if(quad==iquad) find_flag = 1; 00709 } 00710 } 00711 } 00712 } 00713 if(find_flag) nhit_quad++; 00714 } 00715 } 00716 if(nhit_quad >=7 ) return true; 00717 00718 return false; 00719 } |
|
Definition at line 657 of file mMuiBLTEmulator.cxx. References is_reco_1D, and is_reco_1S. Referenced by check_blt, dump_reco_blt, and fill_map.
00657 { 00658 for(int iquad1 = 0; iquad1 < 4; iquad1++) { 00659 if(is_reco_1D(arm, iquad1)) { 00660 for(int iquad2=0; iquad2<4; iquad2++) { 00661 if(iquad2==iquad1) continue; 00662 if(is_reco_1D(arm,iquad2) || is_reco_1S(arm,iquad2)) return true; 00663 } 00664 } 00665 } 00666 return false; 00667 } |
|
Definition at line 721 of file mMuiBLTEmulator.cxx. References _hit_map, TMuiHitMapO::get, and get_quad. Referenced by dump_reco_blt, fill_map, and is_reco_1D1S.
00721 { 00722 00723 int nhit_quad = 0; 00724 00725 for(int iplane = 0; iplane < MUIOO::MAX_PLANE-3; iplane++) { 00726 for(int iorient = 0; iorient < MUIOO::MAX_ORIENTATION; iorient++){ 00727 int find_flag = 0; 00728 for(int ipanel = 0; ipanel < MUIOO::MAX_PANEL; ipanel++) { 00729 TMuiHitMapO::const_iterator mui_hit_iter = _hit_map->get(arm,iplane,ipanel,iorient); 00730 while(TMuiHitMapO::const_pointer mui_hit_ptr = mui_hit_iter.next()){ 00731 TMuiMCHitMapO::const_key_iterator mc_hit_iter = mui_hit_ptr->get()->get_associated<TMuiMCHitO>(); 00732 while(TMuiMCHitMapO::const_pointer mc_hit_ptr = mc_hit_iter.next()) { 00733 // if the hit is in big panel( 0, 2, 3, 5) we can decide it's quadrant directly, 00734 // if the hit is in small panel(1, 4) and on horizental plane, it contributes to 00735 // both left and right quadrants, if the hit is in small panel and verticle plane, 00736 // we have to relay on mchit x/y position to decide the quadrant. 00737 // 00738 int iquad = -1; 00739 if(ipanel == 3 ||(ipanel == 4 && iorient == 0) ) { 00740 iquad = 0; 00741 if(quad==iquad) find_flag = 1; 00742 } 00743 if(ipanel == 5 ||(ipanel == 4 && iorient == 0)) { 00744 iquad = 1; 00745 if(quad==iquad) find_flag = 1; 00746 } 00747 if(ipanel == 2 ||(ipanel == 1 && iorient == 0)) { 00748 iquad = 2; 00749 if(quad==iquad) find_flag = 1; 00750 } 00751 if(ipanel == 0 ||(ipanel == 1 && iorient == 0)) { 00752 iquad = 3; 00753 if(quad==iquad) find_flag = 1; 00754 } 00755 if(iorient == 1 && (ipanel==4||ipanel==1)) { 00756 iquad = get_quad(mc_hit_ptr->get()->get_x(), 00757 mc_hit_ptr->get()->get_y(), 00758 mc_hit_ptr->get()->get_z()); 00759 if(quad==iquad) find_flag = 1; 00760 } 00761 } 00762 } 00763 } 00764 if(find_flag) nhit_quad++; 00765 } 00766 } 00767 00768 if(nhit_quad >=3 ) return true; 00769 00770 return false; 00771 } |
|
Definition at line 644 of file mMuiBLTEmulator.cxx. References is_reco_1D. Referenced by check_blt, dump_reco_blt, and fill_map.
00644 { 00645 00646 for(int iquad1 = 0; iquad1 < 4; iquad1++) { 00647 if(is_reco_1D(arm, iquad1)) { 00648 for(int iquad2=0; iquad2<4; iquad2++) { 00649 if(iquad2==iquad1) continue; 00650 if(is_reco_1D(arm,iquad2)) return true; 00651 } 00652 } 00653 } 00654 return false; 00655 } |
|
Referenced by decision_event. |
|
Definition at line 165 of file mMuiBLTEmulator.cxx. References get_non_used_plane, max_quad, trig_pattern, and word. Referenced by event.
00165 { 00166 00167 // This whole piece is taken directly from Hiroki's code without any changes. Except for 00168 // using three/four dimension array to handle two arm at the same time. I was very careful about 00169 // this little change. 00170 // 00171 00172 // convert FEM word[iarm(0-1)][ifem(0-1)][word 0-119](0-0xffff) to trig_pattern[iarm(0-1)][quad(0-3)][plane(0-3)](0-15) 00173 00174 const int max_sector = 8; 00175 int trig_bit[MUIOO::NumberOfArms][MUIOO::MAX_ORIENTATION][MUIOO::MAX_PLANE-1][max_sector]; 00176 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00177 for ( int iorient = 0; iorient<MUIOO::MAX_ORIENTATION; iorient++ ) { 00178 for ( int iplane = 0; iplane<MUIOO::MAX_PLANE-1; iplane++ ){ 00179 for ( int k = 0; k<max_sector; k++ ) { 00180 trig_bit[iarm][iorient][iplane][k] = 0; 00181 } 00182 } 00183 } 00184 } 00185 00186 // use lower 16 bits of each word 00187 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00188 for( int iorient = 0; iorient<MUIOO::MAX_ORIENTATION; iorient++ ) { 00189 for ( int iword = 0; iword<MUIOO::kWordsPerFEM; iword++ ) { 00190 word[iarm][iorient][iword] = word[iarm][iorient][iword] & 0xffff; 00191 } 00192 } 00193 } 00194 // word -> trig_bit 00195 00196 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00197 int plane_new = 0; 00198 for ( int plane = 0; plane<MUIOO::MAX_PLANE; plane++ ) { 00199 // There are 5 planes int word[][][], but only 4 planes in trig_bit[][][] 00200 if ( plane != get_non_used_plane()) { 00201 for ( int sector = 0; sector<max_sector; sector++ ) { 00202 if ( sector % 2 == 0 ) { 00203 trig_bit[iarm][ 0 ][ plane_new ][ sector ] = 00204 word[iarm][ 0 ][ plane*24 + sector*3 + 0 ] 00205 + word[iarm][ 0 ][ plane*24 + sector*3 + 1 ] 00206 + word[iarm][ 0 ][ plane*24 + sector*3 + 2 ] 00207 + word[iarm][ 0 ][ plane*24 + sector*3 + 3 ] ; 00208 } 00209 else { 00210 trig_bit[iarm][ 0 ][ plane_new ][ sector ] = 00211 word[iarm][ 0 ][ plane*24 + (sector-1)*3 + 2 ] 00212 + word[iarm][ 0 ][ plane*24 + (sector-1)*3 + 3 ] 00213 + word[iarm][ 0 ][ plane*24 + (sector-1)*3 + 4 ] 00214 + word[iarm][ 0 ][ plane*24 + (sector-1)*3 + 5 ]; 00215 } 00216 for ( int iword = 0; iword<3; iword++ ) { 00217 trig_bit[iarm][ 1 ][ plane_new ][ sector ] 00218 += word[iarm][ 1 ][ plane*24 + sector*3 + iword ]; 00219 } 00220 } 00221 plane_new++; 00222 } 00223 } 00224 } 00225 // take "OR" 00226 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00227 for ( int iorient = 0; iorient < MUIOO::MAX_ORIENTATION; iorient++){ // orientation 00228 for ( int iplane = 0; iplane < MUIOO::MAX_PLANE-1; iplane++ ){ // plane 00229 for ( int k = 0; k<max_sector; k++ ) { //sector 00230 if ( trig_bit[iarm][iorient][iplane][k] != 0 ) { 00231 trig_bit[iarm][iorient][iplane][k] = 1; 00232 } 00233 } 00234 } 00235 } 00236 } 00237 // trig_bit -> trig_pattern 00238 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00239 for ( int iquad = 0; iquad<max_quad; iquad++ ) { 00240 for ( int iplane = 0; iplane < MUIOO::MAX_PLANE-1; iplane++ ){ // plane 00241 trig_pattern[iarm][iquad][iplane] = 0; 00242 } 00243 } 00244 } 00245 00246 // Chun :: horizental and vertial planes have different sector configuration. 00247 // horizental :: sector 6 4 2 0 quadrant 3 1 00248 // 00249 // 00250 // 7 5 3 1 4 2 00251 // 00252 // vertical :: sector 1 0 quadrant 3 1 00253 // 3 2 00254 // 5 4 00255 // 7 6 4 2 00256 // 00257 for(int iarm = 0; iarm < MUIOO::NumberOfArms; iarm++) { 00258 for( int plane = 0; plane<MUIOO::MAX_PLANE-1; plane++ ){ 00259 trig_pattern[iarm][0][plane] 00260 += trig_bit[iarm][0][plane][0] * (int)pow( 2.0, 1 ) 00261 + trig_bit[iarm][0][plane][2] * (int)pow( 2.0, 0 ) 00262 + trig_bit[iarm][1][plane][0] * (int)pow( 2.0, 3 ) 00263 + trig_bit[iarm][1][plane][2] * (int)pow( 2.0, 2 ); 00264 trig_pattern[iarm][1][plane] 00265 += trig_bit[iarm][0][plane][1] * (int)pow( 2.0, 1 ) 00266 + trig_bit[iarm][0][plane][3] * (int)pow( 2.0, 0 ) 00267 + trig_bit[iarm][1][plane][4] * (int)pow( 2.0, 2 ) 00268 + trig_bit[iarm][1][plane][6] * (int)pow( 2.0, 3 ); 00269 trig_pattern[iarm][2][plane] 00270 += trig_bit[iarm][0][plane][4] * (int)pow( 2.0, 0 ) 00271 + trig_bit[iarm][0][plane][6] * (int)pow( 2.0, 1 ) 00272 + trig_bit[iarm][1][plane][1] * (int)pow( 2.0, 3 ) 00273 + trig_bit[iarm][1][plane][3] * (int)pow( 2.0, 2 ); 00274 trig_pattern[iarm][3][plane] 00275 += trig_bit[iarm][0][plane][5] * (int)pow( 2.0, 0 ) 00276 + trig_bit[iarm][0][plane][7] * (int)pow( 2.0, 1 ) 00277 + trig_bit[iarm][1][plane][5] * (int)pow( 2.0, 2 ) 00278 + trig_bit[iarm][1][plane][7] * (int)pow( 2.0, 3 ); 00279 } 00280 } 00281 } |
|
Definition at line 617 of file mMuiBLTEmulator.cxx. References mlu_address_max. Referenced by initialize.
00617 { 00618 00619 for ( int i = 0; i<mlu_address_max; i++ ) { 00620 mlu_word[i] = 0; 00621 } 00622 00623 FILE* fp; 00624 if ( !( fp = fopen( mlu_data_file, "r" ))) { 00625 printf(" mMuiPseudoTrigger: Input file '%s' can not be opened\n",mlu_data_file); 00626 return False; 00627 } 00628 int scan_data; 00629 for ( int i = 0; i<mlu_address_max; i++ ) { 00630 if ( fscanf( fp, "%x\n", &scan_data ) != EOF ) { 00631 mlu_word[i] = scan_data; 00632 } 00633 else { 00634 printf(" mMuiPseudoTrigger: unable to read %d th line of '%s'\n", i, mlu_data_file); 00635 return False; 00636 } 00637 } 00638 fclose( fp ); 00639 00640 return True; 00641 00642 } |
|
Reset IOC and external interface pointers Definition at line 426 of file mMuiBLTEmulator.cxx. References _blt_map, _event, _hit_map, _mod_par, mMuiBLTEmulatorPar::FROMDST, mMuiBLTEmulatorPar::FROMPRDF, and mMuiBLTEmulatorPar::get_mode. Referenced by event.
00426 { 00427 // module runtime parameters 00428 // 00429 _mod_par = TMutNode<mMuiBLTEmulatorPar>::find_node(top_node,"mMuiBLTEmulatorPar"); 00430 // interface map 00431 // 00432 _blt_map = TMutNode<TMuiPseudoBLTMapO>::find_node(top_node,"TMuiPseudoBLTMapO"); 00433 00434 if(_mod_par->get_mode()==mMuiBLTEmulatorPar::FROMPRDF){ 00435 _event = TMutNode<Event>::find_node(top_node,"PRDF"); 00436 _hit_map = 0; 00437 } 00438 if(_mod_par->get_mode()==mMuiBLTEmulatorPar::FROMDST){ 00439 _event = 0; 00440 _hit_map = TMutNode<TMuiHitMapO>::find_node(top_node,"TMuiHitMapO"); 00441 } 00442 } |
|
Definition at line 123 of file mMuiBLTEmulator.h. References _non_used_plane. Referenced by initialize.
00123 { _non_used_plane = plane;} |
|
Definition at line 159 of file mMuiBLTEmulator.h. Referenced by check_blt, fill_map, and set_interface_ptrs. |
|
Definition at line 160 of file mMuiBLTEmulator.h. Referenced by get_raw_data, and set_interface_ptrs. |
|
Definition at line 158 of file mMuiBLTEmulator.h. Referenced by check_blt, get_hits, is_reco_1D, is_reco_1S, and set_interface_ptrs. |
|
Definition at line 157 of file mMuiBLTEmulator.h. Referenced by event, initialize, and set_interface_ptrs. |
|
Definition at line 169 of file mMuiBLTEmulator.h. Referenced by get_non_used_plane, mMuiBLTEmulator, and set_non_used_plane. |
|
Definition at line 181 of file mMuiBLTEmulator.h. Referenced by event. |
|
Definition at line 177 of file mMuiBLTEmulator.h. Referenced by initialize, and mMuiBLTEmulator. |
|
Definition at line 167 of file mMuiBLTEmulator.h. Referenced by decision_event, and initialize. |
|
Definition at line 165 of file mMuiBLTEmulator.h. Referenced by decision_event, and initialize. |
|
Definition at line 173 of file mMuiBLTEmulator.h. Referenced by decision_event, decision_mlu, and fill_map. |
|
Definition at line 171 of file mMuiBLTEmulator.h. Referenced by decision_event, and raw_to_trigpattern. |
|
Definition at line 163 of file mMuiBLTEmulator.h. Referenced by get_hits, get_raw_data, and raw_to_trigpattern. |