Example #1
0
 def setup_raw_data_analysis(self):
     self.interpreters = []
     self.hits = []
     for _ in range(self.n_modules):
         interpreter = PyDataInterpreter()
         interpreter.create_empty_event_hits(True)
         interpreter.set_trigger_data_format(1)
         interpreter.align_at_trigger(True)
         interpreter.set_warning_output(False)
         interpreter.set_FEI4B(True)
         self.interpreters.append(interpreter)
         self.hits.append(np.ascontiguousarray(np.empty(shape=(0,),dtype = self.multi_chip_event_dtype,order='C')))
Example #2
0
 def test_hit_histograming(self):
     raw_data = np.array([67307647, 67645759, 67660079, 67541711, 67718111, 67913663, 67914223, 67847647, 67978655, 68081199, 68219119, 68219487, 68425615, 68311343, 68490719, 68373295, 68553519, 68693039, 68573503, 68709951, 68717058, 68734735, 68604719, 68753999, 68761151, 68847327, 69014799, 69079791, 69211359, 69221055, 69279567, 69499247, 69773183, 69788527, 69998559, 69868559, 69872655, 70003599, 69902527, 70274575, 70321471, 70429983, 70563295, 70574959, 70447631, 70584591, 70783023, 71091999, 70972687, 70985087, 71214815, 71382623, 71609135, 71643519, 71720527, 71897695, 72167199, 72040047, 72264927, 72423983, 77471983, 77602863, 77604383, 77485295, 77616415, 77618927, 77619231, 77639983, 77655871, 77544159, 77548303, 77338399, 77345567, 77346287, 77360399, 77255407, 77386211, 77268287, 77279215, 77409599, 77075983, 76951903, 76980527, 77117023, 76991055, 77011007, 77148127, 77148815, 76827167, 76700031, 76868895, 76758575, 76889567, 76558303, 76429599, 76584783, 76468191, 76610943, 76613743, 76620879, 76629375, 76285999, 76321908, 76194319, 76205599, 76233759, 76065391, 76075839, 76093759, 75801311, 75826319, 75829215, 75699231, 75403887, 75565039, 75439135, 75111711, 75115151, 75251487, 75258399, 75138015, 75303471, 74974111, 74868559, 75030047, 75050079, 74714591, 74722847, 74595103, 74649935, 74656815, 74796511, 74455519, 74391519, 74402607, 74534383, 74189695, 74064911, 74246271, 74116063, 74248719, 74133119, 73935183, 73941087, 73811295, 73663583, 73743423, 73449647, 73453391, 73323743, 73343471, 73474159, 73345087, 73206751, 72899295, 72958559, 72828447, 72542623, 82383232, 67374687, 67503967, 67766575, 68179999, 68052847, 68198239, 68104495, 68235759, 68238223, 68472415, 68490463, 68501279, 68621071, 68623903, 68821791, 68988639, 68864047, 69003183, 68876015, 69007423, 68891407, 69267743, 69272367, 69159567, 69666911, 69684447, 70003247, 70018895, 69898927, 69938543, 69942031, 70198863, 70339919, 70587455, 70462783, 70597679, 70796399, 70800015, 70703887, 71121183, 71323151, 71243535, 71578703, 71467695, 71622879, 71629359, 71831264, 71836511, 71710319, 71992943, 72353855, 72355039, 77606628, 77608287, 77622047, 77510223, 77653263, 77664319, 77546223, 77677471, 77549375, 77213519, 77219551, 77232207, 77234991, 77366511, 77373791, 77389647, 77404383, 77070655, 77087199, 76956975, 76996431, 77009183, 77015327, 76683567, 76840351, 76862255, 76888804, 76548975, 76554767, 76427087, 76560159, 76451967, 76456847, 76468015, 76627295, 76352831, 76354863, 76365887, 75923999, 76074175, 75955439, 76086063, 75774239, 75781535, 75792671, 75662111, 75793647, 75797167, 75827023, 75696543, 75390527, 75522031, 75533663, 75541775, 75432255, 75571535, 75115535, 75247999, 75145197, 75151391, 75160799, 74974991, 74852831, 74871839, 74882783, 75023199, 74896943, 75028767, 75046431, 74922463, 74725711, 74621199, 74658623, 74663183, 74336383, 74484559, 74364526, 74370287, 74370639, 74517983, 74393615, 74205471, 74217359, 74227263, 74231727, 74102559, 74237999, 74248735, 73953599, 73868591, 74000703, 74002975, 73877295, 73664910, 73695967, 73704751, 73579583, 73582639, 73719055, 73405998, 73448207, 73481951, 73008831, 73175087, 73044495, 73058863, 73194895, 73197919, 73093151, 72895567, 72918543, 72947039, 72957919, 82383481, 67392015, 67303135, 67312799, 67318303, 67453727, 67454767, 67634719, 67645887, 67717391, 67914111, 67947919, 67818463, 68052959, 68097215, 68500543, 68711909, 68584735, 68726975, 68741679, 68615471, 68750559, 68755487, 68629311, 68764687, 68765648, 68990175, 69022959, 69023727, 69217327, 69547327, 69665839, 69809983, 69814815, 70006831, 70037807, 70055951, 70068511, 70184031, 70323999, 70334687, 70566095, 70588751, 70723935, 71049695, 70952031, 71084831, 71376863, 71256287, 71611039, 71487727, 71618591, 71623999, 71514239, 71891231, 71897327, 71897663, 72036783, 72391487, 77604975, 77608163, 77621327, 77501983, 77635039, 77646559, 77654671, 77655695, 77546543, 77678383, 77345471, 77224735, 77375519, 77385519, 77393967, 76944399, 76975663, 77114628, 77115231, 77127525, 77142959, 76677423, 76699967, 76722287, 76857647, 76739039, 76883567, 76891615, 76453343, 76584335, 76590623, 76594607, 76600031, 76611167, 76617743, 76622303, 76285999, 76329231, 76335839, 76348175, 76350351, 76356783, 75910383, 75639343, 75787615, 75660079, 75796895, 75797615, 75692559, 75827999, 75833487, 75836479, 75518943, 75568143, 75278943, 75290271, 75297903, 75309391, 75312479, 75315119, 74852223, 74987055, 74858047, 74992943, 74875439, 75008031, 74885407, 75027743, 75055583, 74927839, 74738719, 74629087, 74767391, 74779295, 74789343, 74791247, 74323183, 74454239, 74349455, 74364751, 74516047, 74528559, 74192207, 74201535, 74084367, 74220511, 74109039, 74263263, 74133215, 73807119, 73945313, 73868148, 74001631, 73536815, 73684815, 73711439, 73275407, 73408799, 73052767, 73190975, 73209823, 72788271, 72960607, 72487647, 82383730, 67407151, 67415583, 67322127, 67523871, 67700959, 67583039, 67905375, 67793199, 68159583, 68237791, 68306479, 68492399], np.uint32)
     interpreter = PyDataInterpreter()
     histograming = PyDataHistograming()
     interpreter.set_trig_count(1)
     interpreter.set_warning_output(False)
     histograming.set_no_scan_parameter()
     histograming.create_occupancy_hist(True)
     interpreter.interpret_raw_data(raw_data)
     interpreter.store_event()
     histograming.add_hits(interpreter.get_hits())
     occ_hist_cpp = histograming.get_occupancy()[:, :, 0]
     col_arr, row_arr = convert_data_array(raw_data, filter_func=is_data_record, converter_func=get_col_row_array_from_data_record_array)
     occ_hist_python, _, _ = np.histogram2d(col_arr, row_arr, bins=(80, 336), range=[[1, 80], [1, 336]])
     self.assertTrue(np.all(occ_hist_cpp == occ_hist_python))
 def setup_raw_data_analysis(self):
     self.interpreter = PyDataInterpreter()
     self.histogram = PyDataHistograming()
     self.interpreter.set_warning_output(False)
     self.histogram.set_no_scan_parameter()
     self.histogram.create_occupancy_hist(True)
     self.histogram.create_rel_bcid_hist(True)
     self.histogram.create_tot_hist(True)
     self.histogram.create_tdc_hist(True)
     try:
         self.histogram.create_tdc_distance_hist(True)
         self.interpreter.use_tdc_trigger_time_stamp(True)
     except AttributeError:
         self.has_tdc_distance = False
     else:
         self.has_tdc_distance = True
    def configure(self):
        if self.trig_count == 0:
            self.consecutive_lvl1 = (2 ** self.register.global_registers['Trig_Count']['bitlength'])
        else:
            self.consecutive_lvl1 = self.trig_count
        self.abs_occ_limit = int(self.occupancy_limit * self.n_triggers * self.consecutive_lvl1)
        if self.abs_occ_limit <= 0:
            logging.info('Any noise hit will lead to an increased pixel threshold.')
        else:
            logging.info('The pixel threshold of any pixel with an occpancy >%d will be increased' % self.abs_occ_limit)
            

        commands = []
        commands.extend(self.register.get_commands("ConfMode"))
        # TDAC
        tdac_max = 2 ** self.register.pixel_registers['TDAC']['bitlength'] - 1
        self.register.set_pixel_register_value("TDAC", tdac_max)
        commands.extend(self.register.get_commands("WrFrontEnd", same_mask_for_all_dc=False, name="TDAC"))
        mask = make_box_pixel_mask_from_col_row(column=self.col_span, row=self.row_span)
        # Enable
        if self.use_enable_mask:
            self.register.set_pixel_register_value("Enable", np.logical_and(mask, self.register.get_pixel_register_value("Enable")))
        else:
            self.register.set_pixel_register_value("Enable", mask)
        commands.extend(self.register.get_commands("WrFrontEnd", same_mask_for_all_dc=False, name="Enable"))
        # Imon
        self.register.set_pixel_register_value('Imon', 1)
        commands.extend(self.register.get_commands("WrFrontEnd", same_mask_for_all_dc=True, name='Imon'))
        # C_High
        self.register.set_pixel_register_value('C_High', 0)
        commands.extend(self.register.get_commands("WrFrontEnd", same_mask_for_all_dc=True, name='C_High'))
        # C_Low
        self.register.set_pixel_register_value('C_Low', 0)
        commands.extend(self.register.get_commands("WrFrontEnd", same_mask_for_all_dc=True, name='C_Low'))
        # Registers
#         self.register.set_global_register_value("Trig_Lat", self.trigger_latency)  # set trigger latency
        self.register.set_global_register_value("Trig_Count", self.trig_count)  # set number of consecutive triggers
        commands.extend(self.register.get_commands("WrRegister", name=["Trig_Count"]))
        commands.extend(self.register.get_commands("RunMode"))
        self.register_utils.send_commands(commands)

        self.interpreter = PyDataInterpreter()
        self.histogram = PyDataHistograming()
        self.interpreter.set_trig_count(self.trig_count)
        self.interpreter.set_warning_output(False)
        self.histogram.set_no_scan_parameter()
        self.histogram.create_occupancy_hist(True)
Example #5
0
 def test_libraries_stability(self):  # calls 50 times the constructor and destructor to check the libraries
     for _ in range(50):
         interpreter = PyDataInterpreter()
         histogram = PyDataHistograming()
         del interpreter
         del histogram
Example #6
0
 def setUpClass(self):
     self.interpreter = PyDataInterpreter()
     self.histogram = PyDataHistograming()
Example #7
0
 def setup_interpretation(self):
     self.interpreter = PyDataInterpreter()
     self.interpreter.set_warning_output(False)
Example #8
0
    def _module_worker(self,socket_addr, moduleID, send_end):
        '''one worker for each FE chip, since RAW data comes from FIFO separated by moduleID.
           It is necessary to instantiate zmq.Context() in calling method. Otherwise it has no acces when called as multiprocessing.process.
        '''
        context = zmq.Context()
        socket_pull = context.socket(zmq.PULL)  # subscriber
#         socket_pull.setsockopt(zmq.SUBSCRIBE, '')  # do not filter any data needed for PUB/SUB but not for PUSH/PULL
        socket_pull.bind(socket_addr)
        self.logger.info("Worker %s started, socket %s" % (moduleID, socket_addr))
        hit_array = np.zeros(shape=(0,),dtype = self.multi_chip_event_dtype,order='C')
        counter = 0
        interpreter = PyDataInterpreter()
        interpreter.create_empty_event_hits(True)
        interpreter.set_trigger_data_format(1)
        interpreter.align_at_trigger(True)
        interpreter.set_warning_output(False)
        interpreter.set_FEI4B(True)
        
        while not self._stop_readout.wait(0.01) :  # use wait(), do not block here
            if self.worker_reset_flag.is_set() and not self.worker_reset_finished[moduleID].is_set():
                with self.reset_lock:
                    interpreter.reset()
                    self.logger.info("Resetting worker %s" % (moduleID))
                    self.worker_reset_finished[moduleID].set()
            if self.EoS_flag.is_set() and not self.worker_finished_flags[moduleID].is_set(): # EoS_flag is set in run_control after reception of EoS command 
                while counter < 3:
                    self.dummy_flag.wait(0.03)
                    try:
                        meta_data = socket_pull.recv_json(flags=zmq.NOBLOCK)
                    except zmq.Again:
                        pass
                    else:
                        name = meta_data.pop('name')
                        if name == 'ReadoutData':
                            data = socket_pull.recv()
                            # reconstruct numpy array
                            buf = buffer(data)
                            dtype = meta_data.pop('dtype')
                            shape = meta_data.pop('shape')
                            data_array = np.frombuffer(buf, dtype=dtype).reshape(shape)
                            
                            interpreter.interpret_raw_data(data_array)
        #                     self.analyze_raw_data(raw_data=np.ascontiguousarray(data_array), module=moduleID)
                            # build new array with moduleID, take only necessary data
                            hits = interpreter.get_hits()
        #                     hits = self.interpreters[moduleID].get_hits()
                            module_hits = np.zeros(shape=(hits.shape[0],),dtype = self.multi_chip_event_dtype, order = 'C')
                            module_hits['event_number'] = hits['event_number']
                            module_hits['trigger_number'] = hits['trigger_number']
                            module_hits['trigger_time_stamp'] = hits['trigger_time_stamp']
                            module_hits['relative_BCID'] = hits['relative_BCID']
                            module_hits['column'] = hits['column']
                            module_hits['row'] = hits['row']
                            module_hits['tot'] = hits['tot']
                            module_hits['moduleID'] = moduleID
                            
                            hit_array = np.concatenate((hit_array,module_hits))
                    
                    counter +=1

#                 if hit_array.shape[0] > 0:
#                     self.logger.info("hit array shape worker %s before store event" % moduleID, hit_array.shape)
#                     self.logger.info("hit array worker %s last entry before store event" % moduleID, hit_array[-1])
                
#                 interpreter.store_event()
#                   
#                 hits = interpreter.get_hits()
#  
#                 module_hits = np.zeros(shape=(hits.shape[0],),dtype = self.multi_chip_event_dtype, order = 'C')
#                 module_hits['event_number'] = hits['event_number']
#                 module_hits['trigger_number'] = hits['trigger_number']
#                 module_hits['trigger_time_stamp'] = hits['trigger_time_stamp']
#                 module_hits['relative_BCID'] = hits['relative_BCID']
#                 module_hits['column'] = hits['column']
#                 module_hits['row'] = hits['row']
#                 module_hits['tot'] = hits['tot']
#                 module_hits['moduleID'] = moduleID
#                 # append chunk to hit array
#                 hit_array = np.concatenate((hit_array,module_hits))
                
#                 if hit_array.shape[0] > 0:
#                     self.logger.info("hit array shape worker %s " % moduleID, hit_array.shape)
#                     self.logger.info("hit array worker %s last entry" % moduleID, hit_array[-1])
                self.send_data_flag[moduleID].set()
                
                if hit_array.shape[0] > 0 and self.n_spills.value > 1:
                    hit_array2 = hit_array[np.where(hit_array['event_number'] != hit_array[0]['event_number'])]
                    send_array = hit_array2.copy()
                else:
                    send_array = hit_array.copy()
                send_end.send(send_array) 
                
#                 send_array = hit_array.copy()
#                 send_end.send(hit_array) 
                self.worker_finished_flags[moduleID].set()
                self.logger.info("Worker %s finished, received %s hits" % (moduleID , hit_array.shape))
                hit_array = np.zeros(shape=(0,),dtype = self.multi_chip_event_dtype,order='C')
                counter = 0
            try:
                meta_data = socket_pull.recv_json(flags=zmq.NOBLOCK)
            except zmq.Again:
                pass
            else:
                name = meta_data.pop('name')
                if name == 'ReadoutData':
                    data = socket_pull.recv()
                    # reconstruct numpy array
                    buf = buffer(data)
                    dtype = meta_data.pop('dtype')
                    shape = meta_data.pop('shape')
                    data_array = np.frombuffer(buf, dtype=dtype).reshape(shape)
                    
                    interpreter.interpret_raw_data(data_array)
#                     self.analyze_raw_data(raw_data=np.ascontiguousarray(data_array), module=moduleID)
                    # build new array with moduleID, take only necessary data
                    hits = interpreter.get_hits()
#                     hits = self.interpreters[moduleID].get_hits()
                    module_hits = np.zeros(shape=(hits.shape[0],),dtype = self.multi_chip_event_dtype, order = 'C')
                    module_hits['event_number'] = hits['event_number']
                    module_hits['trigger_number'] = hits['trigger_number']
                    module_hits['trigger_time_stamp'] = hits['trigger_time_stamp']
                    module_hits['relative_BCID'] = hits['relative_BCID']
                    module_hits['column'] = hits['column']
                    module_hits['row'] = hits['row']
                    module_hits['tot'] = hits['tot']
                    module_hits['moduleID'] = moduleID
                    # append chunk to hit array
#                     hit_array = np.r_[hit_array,module_hits]
                    hit_array = np.concatenate((hit_array,module_hits))