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)
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
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