Exemplo n.º 1
0
    def generate_report(self):
        """Generates html and pdf report"""
        html_filename = os.path.join(self.test_directory,
                                     self.test_filename) + ".html"
        pdf_filename = os.path.join(self.test_directory,
                                    self.test_filename) + ".pdf"
        archive_filename = os.path.join(\
           self.test_directory,
           datetime.now().strftime("%Y_%m_%d_%H") + "_" + \
           self.test_filename)

        try:
            output_file = open(html_filename, "w")
            output_file.write(SimpleHTML.create_html_start(\
                "Beamline test summary"))
            output_file.write("<h1>Beamline %s Test results</h1>" % \
                              self.beamline_name)
            output_file.write("<h2>Executed tests:</h2>")
            table_cells = []
            for test in self.results_list:
                table_cells.append(\
                  ["bgcolor=%s" % TEST_COLORS_TABLE[test["result_bit"]],
                   "<a href=#%s>%s</a>" % \
                   (test["short_name"], test["full_name"]),
                   test["result_short"],
                   test["start_time"],
                   test["end_time"]])

            table_rec = SimpleHTML.create_table(\
                ["Name", "Result", "Start time", "End time"],
                table_cells)
            for row in table_rec:
                output_file.write(row)
            output_file.write("\n<hr>\n")

            for test_result in self.results_html_list:
                output_file.write(test_result + "\n")

            output_file.write(SimpleHTML.create_html_end())
            output_file.close()

            self.emit("htmlGenerated", html_filename)
            logging.getLogger("HWR").info(\
               "BeamlineTest: Test result written in file %s" % \
               html_filename)
        except:
            logging.getLogger("HWR").error(\
               "BeamlineTest: Unable to generate html report file %s" % \
               html_filename)

        try:
            pdfkit.from_url(html_filename, pdf_filename)
            logging.getLogger("GUI").info(\
               "PDF report %s generated" % pdf_filename)
        except:
            logging.getLogger("HWR").error(\
               "BeamlineTest: Unable to generate pdf report file %s" % \
               pdf_filename)

        self.emit('testFinished', html_filename)
    def test_summary(self):
        """
        Descript. :
        """
        result = {}
        result["result_bit"] = True
        result["result_details"] = []
        table_cells = []

        for tine_prop in self['tine_props']:
            prop_names = eval(tine_prop.getProperty("prop_names"))
            if isinstance(prop_names, str):
                cell_str_list = []
                cell_str_list.append(tine_prop.getProperty("prop_device"))
                cell_str_list.append(prop_names)
                cell_str_list.append(str(tine.get(tine_prop.getProperty("prop_device"), prop_names)))
                table_cells.append(cell_str_list)
            else:
                for index, property_name in enumerate(prop_names):
                    cell_str_list = []
                    if index == 0:
                        cell_str_list.append(tine_prop.getProperty("prop_device"))
                    else:
                        cell_str_list.append("")
                    cell_str_list.append(property_name)
                    cell_str_list.append(str(tine.get(tine_prop.getProperty("prop_device"), property_name)))
                    table_cells.append(cell_str_list)                    
 
        result["result_details"] = SimpleHTML.create_table(\
             ["Context/Server/Device", "Property", "Value"],
             table_cells)
        self.ready_event.set()
        return result
    def test_focusing(self): 
        result = {}
        result["result_details"] = []

        active_mode, beam_size = self.get_focus_mode()
        if active_mode is None:
            result["result_bit"] = False
            result["result_short"] = "No focusing mode detected"
        else:
            result["result_bit"] = True
            result["result_short"] = "%s mode detected" % active_mode

        focus_modes = self.get_focus_mode_names()
        focus_motors_list = self.get_focus_motors()

        table_cells = []
        if focus_motors_list:
            for motor in focus_motors_list:
                table_row = []
                table_row.append(motor['motorName'])
                for focus_mode in focus_modes:
                    res = (focus_mode in motor['focMode'])
                    table_row.append("<td bgcolor=%s>%.3f/%.3f</td>" % (\
                         TEST_COLORS_TABLE[res],
                         motor['focusingModes'][focus_mode], 
                         motor['position']))                        
                table_cells.append(table_row)
        
        focus_modes = ["Motors"] + list(focus_modes)
        result["result_details"] = SimpleHTML.create_table(\
              focus_modes, table_cells)
        self.ready_event.set()
        return result
    def test_summary(self):
        result = {}
        result["result_bit"] = True
        result["result_details"] = []
        table_cells = []

        for tine_prop in self['tine_props']:
            prop_names = eval(tine_prop.getProperty("prop_names"))
            if isinstance(prop_names, str):
                cell_str_list = []
                cell_str_list.append(tine_prop.getProperty("prop_device"))
                cell_str_list.append(prop_names)
                cell_str_list.append(str(tine.get(tine_prop.getProperty("prop_device"), prop_names)))
                table_cells.append(cell_str_list)
            else:
                for index, property_name in enumerate(prop_names):
                    cell_str_list = []
                    if index == 0:
                        cell_str_list.append(tine_prop.getProperty("prop_device"))
                    else:
                        cell_str_list.append("")
                    cell_str_list.append(property_name)
                    cell_str_list.append(str(tine.get(tine_prop.getProperty("prop_device"), property_name)))
                    table_cells.append(cell_str_list)                    
 
        result["result_details"] = SimpleHTML.create_table(\
             ["Context/Server/Device", "Property", "Value"],
             table_cells)
        self.ready_event.set()
        return result
    def generate_html_report(self, test_list):
        """
        Descript. :
        """
        html_filename = os.path.join(\
           self.test_directory,
           self.test_filename)
        archive_filename = os.path.join(\
           self.test_directory,
           datetime.now().strftime("%Y_%m_%d_%H") + "_" + \
           self.test_filename)

        try:
            output_file = open(html_filename, "w") 
            output_file.write(SimpleHTML.create_html_start("Beamline test summary"))
            output_file.write("<h1>Beamline %s Test results</h1>" % self.beamline_name)

            output_file.write("<h2>Executed tests:</h2>")
            table_cells = []
            for test in self.results_list:
                table_cells.append(["bgcolor=%s" % TEST_COLORS_TABLE[test["result_bit"]],
                                   "<a href=#%s>%s</a>" % (test["short_name"], test["full_name"]), 
                                   test["result_short"],
                                   test["start_time"],
                                   test["end_time"]])
           
            table_rec = SimpleHTML.create_table(\
                ["Name", "Result", "Start time", "End time"], 
                table_cells)
            for row in table_rec:
                output_file.write(row)
            output_file.write("\n<hr>\n")
         
            for test_result in self.results_html_list:
                output_file.write(test_result + "\n")
      
            output_file.write(SimpleHTML.create_html_end())
            output_file.close()
 
            self.emit("htmlGenerated", html_filename)
            logging.getLogger("HWR").info(\
               "BeamlineTest: Test result written in file %s" % html_filename)
        except:
            logging.getLogger("HWR").error(\
               "BeamlineTest: Unable to generate html report file %s" % html_filename)

        try: 
            output_file = open(html_filename, "r")
            archive_file = open(archive_filename, "w")

            for line in output_file.readlines():
                archive_file.write(line)
            output_file.close()
            archive_file.close()

            logging.getLogger("HWR").info("Archive file :%s generated" % archive_filename)
        except:
            logging.getLogger("HWR").error(\
              "BeamlineTest: Unable to generate html report file %s" % archive_filename)
Exemplo n.º 6
0
    def test_com(self):
        """Test communication (ping) with beamline devices"""
        result = {}
        table_header = [
            "Replied", "DNS name", "IP address", "Location", "MAC address",
            "Details"
        ]
        table_cells = []
        failed_count = 0
        for row, device in enumerate(self.devices_list):
            msg = "Pinging %s at %s" % (device[0], device[1])
            logging.getLogger("HWR").debug("BeamlineTest: %s" % msg)
            device_result = ["bgcolor=#FFCCCC", "False"] + device
            try:
                ping_result = os.system("ping -W 2 -c 2 " + device[1]) == 0
                device_result[0] = "bgcolor=%s" % \
                                   TEST_COLORS_TABLE[ping_result]
                device_result[1] = str(ping_result)
            except:
                ping_result = False
            table_cells.append(device_result)

            if not ping_result:
                failed_count += 1
            progress_info = {
                "progress_total": len(self.devices_list),
                "progress_msg": msg
            }
            self.emit("testProgress", (row, progress_info))

        result["result_details"] = \
            SimpleHTML.create_table(table_header, table_cells)

        if failed_count == 0:
            result["result_short"] = "Test passed (got reply from all devices)"
            result["result_bit"] = True
        else:
            result["result_short"] = \
                "Test failed: %d devices from %d did not replied)" % \
                (failed_count, len(self.devices_list))
            result["result_bit"] = False

        self.ready_event.set()

        return result
    def test_com(self):
        """
        Descript. :
        """
        result = {} 
        table_header = ["Replied", "DNS name", "IP address", "Location",
                        "MAC address", "Details"] 
        table_cells = []
        failed_count = 0
        for row, device in enumerate(self.devices_list):
            msg = "Pinging %s at %s" % (device[0], device[1])
            logging.getLogger("HWR").debug("BeamlineTest: %s" % msg)
            device_result = ["bgcolor=#FFCCCC" , "False"] + device
            try:
                ping_result = os.system("ping -W 2 -c 2 " + device[1]) == 0
                device_result[0] = "bgcolor=%s" % TEST_COLORS_TABLE[ping_result]
                device_result[1] = str(ping_result)
            except:
                ping_result = False
            table_cells.append(device_result) 

            if not ping_result:
                failed_count += 1
            progress_info = {"progress_total": len(self.devices_list),
                             "progress_msg": msg}
            self.emit("testProgress", (row, progress_info))

        result["result_details"] = SimpleHTML.create_table(table_header, table_cells)

        if failed_count == 0:
            result["result_short"] = "Test passed (got reply from all devices)"
            result["result_bit"] = True
        else:
            result["result_short"] = "Test failed (%d devices from %d did not replied)" % \
                  (failed_count, len(self.devices_list))
            result["result_bit"] = False
        self.ready_event.set()
        return result
Exemplo n.º 8
0
    def test_measure_intensity(self):
        """Measures intensity and generates report"""
        result = {}
        result["result_bit"] = True
        result["result_details"] = []

        current_phase = self.bl_hwobj.diffractometer_hwobj.current_phase

        # 1. close guillotine and fast shutter -------------------------------
        self.bl_hwobj.collect_hwobj.close_guillotine(wait=True)
        self.bl_hwobj.fast_shutter_hwobj.closeShutter(wait=True)
        gevent.sleep(0.1)

        #2. move back light in, check beamstop position ----------------------
        self.bl_hwobj.back_light_hwobj.move_in()

        beamstop_position = self.bl_hwobj.beamstop_hwobj.get_position()
        if beamstop_position == "BEAM":
            self.bl_hwobj.beamstop_hwobj.set_position("OFF")
            self.bl_hwobj.diffractometer_hwobj.wait_device_ready(30)

        #3. check scintillator position --------------------------------------
        scintillator_position = self.bl_hwobj.\
            diffractometer_hwobj.get_scintillator_position()
        if scintillator_position == "SCINTILLATOR":
            #TODO add state change when scintillator position changed
            self.bl_hwobj.diffractometer_hwobj.\
                 set_scintillator_position("PHOTODIODE")
            gevent.sleep(1)
            self.bl_hwobj.diffractometer_hwobj.\
                 wait_device_ready(30)

        #5. open the fast shutter --------------------------------------------
        self.bl_hwobj.fast_shutter_hwobj.openShutter(wait=True)
        gevent.sleep(0.3)

        #6. measure mean intensity
        self.ampl_chan_index = 0

        if True:
            intens_value = self.chan_intens_mean.getValue()
            intens_range_now = self.chan_intens_range.getValue()
            for intens_range in self.intensity_ranges:
                if intens_range['index'] is intens_range_now:
                    self.intensity_value = intens_value[self.ampl_chan_index] - \
                                           intens_range['offset']
                    break

        #7. close the fast shutter -------------------------------------------
        self.bl_hwobj.fast_shutter_hwobj.closeShutter(wait=True)

        # 7/7 set back original phase ----------------------------------------
        self.bl_hwobj.diffractometer_hwobj.set_phase(current_phase)

        #8. Calculate --------------------------------------------------------
        energy = self.bl_hwobj._get_energy()
        detector_distance = self.bl_hwobj.detector_hwobj.get_distance()
        beam_size = self.bl_hwobj.collect_hwobj.get_beam_size()
        transmission = self.bl_hwobj.transmission_hwobj.getAttFactor()

        result["result_details"].append("Energy: %.4f keV<br>" % energy)
        result["result_details"].append("Detector distance: %.2f mm<br>" % \
                                        detector_distance)
        result["result_details"].append("Beam size %.2f x %.2f mm<br>" % \
                                        (beam_size[0], beam_size[1]))
        result["result_details"].append("Transmission %.2f%%<br><br>" % \
                                        transmission)

        meas_item = [
            datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            "%.4f" % energy,
            "%.2f" % detector_distance,
            "%.2f x %.2f" % (beam_size[0], beam_size[1]),
            "%.2f" % transmission
        ]

        air_trsm = numpy.exp(-self.air_absorption_coeff_per_meter(energy) * \
             detector_distance / 1000.0)
        carb_trsm = self.carbon_window_transmission(energy)
        flux = 0.624151 * 1e16 * self.intensity_value / \
               self.diode_calibration_amp_per_watt(energy) / \
               energy / air_trsm / carb_trsm

        #GB correcting diode misscalibration!!!
        flux = flux * 1.8

        dose_rate = 1e-3 * 1e-14 * self.dose_rate_per_10to14_ph_per_mmsq(energy) * \
               flux / beam_size[0] / beam_size[1]

        self.bl_hwobj.collect_hwobj.machine_info_hwobj.\
           set_flux(flux, self.bl_hwobj.beam_info_hwobj.get_beam_info())

        msg = "Intensity = %1.1e A" % self.intensity_value
        result["result_details"].append(msg + "<br>")
        logging.getLogger("user_level_log").info(msg)
        result["result_short"] = msg
        meas_item.append("%1.1e" % self.intensity_value)

        msg = "Flux = %1.1e photon/s" % flux
        result["result_details"].append(msg + "<br>")
        logging.getLogger("user_level_log").info(msg)
        result["result_short"] = msg
        meas_item.append("%1.1e" % flux)

        msg = "Dose rate =  %1.1e KGy/s" % dose_rate
        result["result_details"].append(msg + "<br>")
        logging.getLogger("user_level_log").info(msg)
        meas_item.append("%1.1e" % dose_rate)

        msg = "Time to reach 20 MGy = %d s = %d frames " % \
              (20000. / dose_rate, int(25 * 20000. / dose_rate))
        result["result_details"].append(msg + "<br><br>")
        logging.getLogger("user_level_log").info(msg)
        meas_item.append("%d, %d frames" % \
              (20000. / dose_rate, int(25 * 20000. / dose_rate)))

        self.intensity_measurements.insert(0, meas_item)
        result["result_details"].extend(SimpleHTML.create_table(\
             ["Time", "Energy (keV)", "Detector distance (mm)",
              "Beam size (mm)", "Transmission (%%)", "Intensity (A)",
              "Flux (photons/s)", "Dose rate (KGy/s)",
              "Time to reach 20 MGy (sec, frames)"],
             self.intensity_measurements))

        self.ready_event.set()

        return result
    def test_measure_intensity(self):
        """
        """
        result = {}
        result["result_bit"] = True
        result["result_details"] = []

        current_phase = self.bl_hwobj.diffractometer_hwobj.current_phase 

        # 1. close guillotine and fast shutter --------------------------------
        self.bl_hwobj.collect_hwobj.close_guillotine(wait=True)
        self.bl_hwobj.fast_shutter_hwobj.closeShutter(wait=True)
        gevent.sleep(0.1)        

        #2. move back light in, check beamstop position -----------------------
        self.bl_hwobj.back_light_hwobj.move_in()

        beamstop_position = self.bl_hwobj.beamstop_hwobj.get_position()
        if beamstop_position == "BEAM":
            self.bl_hwobj.beamstop_hwobj.set_position("OFF") 
            self.bl_hwobj.diffractometer_hwobj.wait_device_ready(30)

        #3. check scintillator position --------------------------------------
        scintillator_position = self.bl_hwobj.\
            diffractometer_hwobj.get_scintillator_position() 
        if scintillator_position == "SCINTILLATOR":
            self.bl_hwobj.diffractometer_hwobj.\
                 set_scintillator_position("PHOTODIODE")
            self.bl_hwobj.diffractometer_hwobj.\
                 wait_device_ready(30)

        #5. open the fast shutter --------------------------------------------
        self.bl_hwobj.fast_shutter_hwobj.openShutter(wait=True)
        gevent.sleep(0.3)

        #6. measure mean intensity
        self.ampl_chan_index = 0

        if True:
            intens_value = self.chan_intens_mean.getValue()  
            intens_range_now = self.chan_intens_range.getValue()
            for intens_range in self.intensity_ranges:
                if intens_range['index'] is intens_range_now:
                    self.intensity_value = intens_value[self.ampl_chan_index] - intens_range['offset']
                    break
        
        #7. close the fast shutter -------------------------------------------
        self.bl_hwobj.fast_shutter_hwobj.closeShutter(wait=True)

        # 7/7 set back original phase ----------------------------------------
        self.bl_hwobj.diffractometer_hwobj.set_phase(current_phase)
        
        #8. Calculate --------------------------------------------------------  
        energy = self.bl_hwobj._get_energy()
        detector_distance = self.bl_hwobj.detector_hwobj.get_distance()
        beam_size = self.bl_hwobj.collect_hwobj.get_beam_size()
        transmission = self.bl_hwobj.transmission_hwobj.getAttFactor()

        result["result_details"].append("Energy: %.4f keV<br>" % energy)
        result["result_details"].append("Detector distance: %.2f mm<br>" % \
              detector_distance)
        result["result_details"].append("Beam size %.2f x %.2f mm<br>" % \
              (beam_size[0], beam_size[1]))
        result["result_details"].append("Transmission %.2f%%<br><br>" % \
              transmission)

        meas_item = [datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                     "%.4f" % energy,
                     "%.2f" % detector_distance, 
                     "%.2f x %.2f" % (beam_size[0], beam_size[1]), 
                     "%.2f" % transmission]

        air_trsm =  numpy.exp(-self.air_absorption_coeff_per_meter(energy) * \
             detector_distance / 1000.0)
        carb_trsm = self.carbon_window_transmission(energy)
        flux = 0.624151 * 1e16 * self.intensity_value / \
               self.diode_calibration_amp_per_watt(energy) / \
               energy / air_trsm / carb_trsm
        dose_rate = 1e-3 * 1e-14 * self.dose_rate_per_10to14_ph_per_mmsq(energy) * \
               flux / beam_size[0] / beam_size[1]  

        self.bl_hwobj.collect_hwobj.machine_info_hwobj.set_flux(flux)

        msg = "Flux = %1.1e photon/s" % flux
        result["result_details"].append(msg + "<br>")
        logging.getLogger("user_level_log").info(msg)
        result["result_short"] = msg
        meas_item.append("%1.1e" % flux)

        msg = "Dose rate =  %1.1e KGy/s" % dose_rate
        result["result_details"].append(msg + "<br>")
        logging.getLogger("user_level_log").info(msg)
        meas_item.append("%1.1e" % dose_rate)

        msg = "Time to reach 20 MGy = %d s = %d frames " % \
              (20000. / dose_rate, int(25 * 20000. / dose_rate))
        result["result_details"].append(msg + "<br><br>")
        logging.getLogger("user_level_log").info(msg)
        meas_item.append("%1.1e s, %d frames" % \
              (20000. / dose_rate, int(25 * 20000. / dose_rate)))

        self.intensity_measurements.insert(0, meas_item)
        result["result_details"].extend(SimpleHTML.create_table(\
             ["Time", "Energy (keV)", "Detector distance (mm)", "Beam size (mm)",
              "Transmission (%%)", "Flux (photons/s)", "Dose rate (KGy/s)",
              "Time to reach 20 MGy (sec, frames)"], self.intensity_measurements))

        self.ready_event.set()
        return result