Beispiel #1
0
 def login(self):
     login_dialog = Login(self.login_parameters)
     if login_dialog.exec_() != QDialog.Accepted:
         self.exit()
     else:
         self.file_writer_group.root_dir_entry.setText(
             self.login_parameters['expdir'])
         td = date.today()
         tdstr = "{}.{}.{}".format(td.year, td.month, td.day)
         logfname = os.path.join(self.login_parameters['expdir'],
                                 'exp-log-' + tdstr + '.log')
         if self.login_parameters.has_key('project'):
             logfname = os.path.join(
                 self.login_parameters['expdir'],
                 '{}-log-{}-{}.log'.format(self.login_parameters['project'],
                                           self.login_parameters['bl'],
                                           tdstr))
         try:
             open(logfname, 'a').close()
         except:
             warning_message('Cannot create log file')
         self._log = log
         self._log.log_to_file(logfname, logging.DEBUG)
         self.log = self._log.get_module_logger(__name__)
         self.log.info("Start gui.py")
         # add motors automatically on start
         self.motor_control_group.connect_hor_mot_button.animateClick()
         self.motor_control_group.connect_vert_mot_button.animateClick()
         self.motor_control_group.connect_CT_mot_button.animateClick()
         self.motor_control_group.connect_shutter_button.animateClick()
Beispiel #2
0
 def check_data_overwrite(self):
     if self.file_writer_group.isChecked():
         if os.path.exists(os.path.join( \
                 self.file_writer_group.root_dir, \
                 self.file_writer_group.ctsetname.format(1))):
             warning_message("Output directory exists. \n"
                             "Change root dir or name pattern"
                             "and start again")
             self.abort()
Beispiel #3
0
    def select_log_file_func(self):
        f, fext = self.QFD.getSaveFileName(self, 'Select file',
                                           self.file_writer_group.root_dir,
                                           "log files (*.log)")
        if f == '':
            warning_message('Select file')
            return

        # use logging from EDC
        self._log.log_to_file(f + '.log', logging.DEBUG)
        self.log = self._log.get_module_logger(__name__)

        return
Beispiel #4
0
 def validate_velocity(self):
     #taken from concert/imaging.py by T. Farago
     # every pixel of the frame rotates no more than one pixel per rotation step
     tomo_ang_step = np.arctan(2.0 / self.camera_controls_group.roi_width)
     #minimum number of projections in order to provide enough
     #data points for every distance from the axis of rotation
     tomo_proj_num = int(np.ceil(np.pi / tomo_ang_step))
     # speed at which motion blur will exceed one pixel
     tomo_max_rot_velo = tomo_ang_step * self.camera_controls_group.fps
     velocity = self.scan_controls_group.inner_range / \
         (self.scan_controls_group.inner_steps / self.camera_controls_group.fps)
     if velocity > tomo_max_rot_velo:
         warning_message(
             "Rotation speed is too large for this ROI width.\n"
             "Consider increasing exposure time or num of projections to avoid blurring.\n"
             "Experiment will continue.")
Beispiel #5
0
 def dead_time(self):
     try:
         x = float(self.delay_entry.text())
     except ValueError:
         warning_message(
             "{:}".format("Dead time must be a non-negative number"))
         x = 0
         self.delay_entry.setText('0')
         self.all_cam_params_correct = False
     if x < 0:
         warning_message(
             "{:}".format("Dead time must be a non-negative number"))
         x = 0
         self.delay_entry.setText('0')
         self.all_cam_params_correct = False
     return x
Beispiel #6
0
 def fps(self):
     try:
         x = float(self.fps_entry.text())
     except ValueError:
         warning_message("{:}".format(
             "FPS a positive number. Setting FPS based on exp. time"))
         x = self.relate_fps_to_exptime()
     if x < 0:
         error_message("{:}".format("FPS must be positive"))
         self.all_cam_params_correct = False
     if self.camera_model_label.text() == 'PCO Dimax':
         if x < 25:
             warning_message(
                 "{:}".format("Dimax FPS must be greater than 25"))
             x = 25
         if self.trig_mode == "EXTERNAL" and \
                 int(x) < int(1000.0 / (self.exp_time + self.dead_time)):
             warning_message("{:}".format(
                 "Dimax FPS must be greater than frequency of external triggers"
             ))
             x = int(1000.0 / self.exp_time)
     # if self.camera_model_label.text() == 'PCO Edge' and (x > 100):
     #     error_message("{:}".format("PCO Edge max FPS is 100"))
     #     self.all_cam_params_correct = False
     # if int(x) < int(1000.0 / (self.exp_time + self.dead_time)): #because of round of errors
     #     #warning_message("FPS [Hz] cannot exceed 1/exp.time[s]; setting fps=1/exp.time")
     #     self.relate_fps_to_exptime()
     elif self.trig_mode == "EXTERNAL":
         x = self.relate_fps_to_exptime()
     self.fps_entry.setText("{:.02f}".format(x))
     return x
Beispiel #7
0
    def load_from_yaml(self):
        fname, _ = QFileDialog.getOpenFileName(
            self, "Select yaml file with BMITgui params",
            self.file_writer_group.root_dir, "Python Files (*.yaml)")

        if fname == '':
            warning_message('Select the file')
            return

        with open(fname) as f:
            p = yaml.load(f, Loader=yaml.FullLoader)

        if p['Camera'][
                'Model'] != self.camera_controls_group.camera_model_label.text(
                ):
            error_message('Selected params file is for different camera')
            return

        try:  ####### CAMERA  #######
            self.camera_controls_group.ttl_scan.setChecked(
                p['Camera']['External camera'])
            self.camera_controls_group.exposure_entry.setText(
                str(p['Camera']['Exposure time']))
            self.camera_controls_group.fps_entry.setText(
                str(p['Camera']['FPS']))
            self.camera_controls_group.roi_y0_entry.setText(
                str(p['Camera']['ROI first column']))
            self.camera_controls_group.roi_width_entry.setText(
                str(p['Camera']['ROI width']))
            self.camera_controls_group.roi_x0_entry.setText(
                str(p['Camera']['ROI first row']))
            self.camera_controls_group.roi_height_entry.setText(
                str(p['Camera']['ROI height']))
            tmp = self.camera_controls_group.buffered_entry.findText(
                str(p['Camera']['Buffered']))
            self.camera_controls_group.buffered_entry.setCurrentIndex(tmp)
            self.camera_controls_group.n_buffers_entry.setText(
                str(p['Camera']['Number of buffers']))
            tmp = self.camera_controls_group.trigger_entry.findText(
                p['Camera']['Trigger'])
            self.camera_controls_group.delay_entry.setText(
                str(p['Camera']['Dead time']))
            self.camera_controls_group.trigger_entry.setCurrentIndex(tmp)
            tmp = self.camera_controls_group.sensor_pix_rate_entry.\
                findText(p['Camera']['Sensor clocking'])
            self.camera_controls_group.sensor_pix_rate_entry.setCurrentIndex(
                tmp)
            self.camera_controls_group.time_stamp.setChecked(
                p['Camera']['Time stamp'])
        except:
            warning_message('Cannot enter all camera parameters correctly')
        try:  ####### Scans' settings #######
            tmp = self.scan_controls_group.outer_loop_motor.\
                findText(p['Outer loop']['Motor'])
            self.scan_controls_group.outer_loop_motor.setCurrentIndex(tmp)
            self.scan_controls_group.outer_loop_start_entry.setText(
                str(p['Outer loop']['Start']))
            self.scan_controls_group.outer_loop_steps_entry.setText(
                str(p['Outer loop']['Steps']))
            self.scan_controls_group.outer_loop_range_entry.setText(
                str(p['Outer loop']['Range']))
            self.scan_controls_group.outer_loop_flats_0.setChecked(
                p['Outer loop']['Flats before'])
            self.scan_controls_group.outer_loop_flats_1.setChecked(
                p['Outer loop']['Flats after'])
            tmp = self.scan_controls_group.inner_loop_motor. \
                findText(p['Inner loop']['Motor'])
            self.scan_controls_group.inner_loop_motor.setCurrentIndex(tmp)
            self.scan_controls_group.inner_loop_start_entry.setText(
                str(p['Inner loop']['Start']))
            self.scan_controls_group.inner_loop_steps_entry.setText(
                str(p['Inner loop']['Steps']))
            self.scan_controls_group.inner_loop_range_entry.setText(
                str(p['Inner loop']['Range']))
            self.scan_controls_group.inner_loop_flats_0.setChecked(
                p['Inner loop']['Flats before'])
            self.scan_controls_group.inner_loop_flats_1.setChecked(
                p['Inner loop']['Flats after'])
            self.scan_controls_group.readout_intheend.setChecked(
                p['Readout in the end']['Readout in the end'])
        except:
            warning_message('Cannot enter scan parameters correctly')
        try:  ####### FFC settings #######
            tmp = self.ffc_controls_group.motor_options_entry.findText(
                p['FFC']['Motor'])
            self.ffc_controls_group.motor_options_entry.setCurrentIndex(tmp)
            self.ffc_controls_group.radio_position_entry.setText(
                p['FFC']['Radio position'])
            self.ffc_controls_group.flat_position_entry.setText(
                p['FFC']['Flat position'])
            self.ffc_controls_group.numflats_entry.setText(
                str(p['FFC']['Num flats']))
            self.ffc_controls_group.numdarks_entry.setText(
                str(p['FFC']['Num darks']))
        except:
            warning_message('Cannot enter flat-field parameters correctly')
        try:  ##### FILE WRITER ########
            self.file_writer_group.setChecked(p['Writer']['Enabled'])
            self.file_writer_group.root_dir_entry.setText(
                p['Writer']['Data dir'])
            self.file_writer_group.ctset_fmt_entry.setText(
                p['Writer']['CT scan name'])
            self.file_writer_group.dsetname_entry.setText(
                p['Writer']['Filename'])
            self.file_writer_group.bigtiff_checkbox.setChecked(
                p['Writer']['Big tiffs'])
            self.file_writer_group.separate_scans_checkbox.setChecked(
                p['Writer']['Separate scans'])
        except:
            warning_message('Cannot enter file-writer settings correctly')
Beispiel #8
0
    def dump2yaml(self):

        f, fext = self.QFD.getSaveFileName(self, 'Select file',
                                           self.file_writer_group.root_dir,
                                           "YAML files (*.yaml)")
        if f == '':
            warning_message('Select file')
            return
        params = {
            "Camera": {
                'Model':
                self.camera_controls_group.camera_model_label.text(),
                'External camera':
                self.camera_controls_group.ttl_scan.isChecked(),
                'Exposure time':
                self.camera_controls_group.exp_time,
                'Dead time':
                self.camera_controls_group.dead_time,
                'FPS':
                self.camera_controls_group.fps,
                'ROI first row':
                self.camera_controls_group.roi_x0,
                'ROI width':
                self.camera_controls_group.roi_width,
                'ROI first column':
                self.camera_controls_group.roi_y0,
                'ROI height':
                self.camera_controls_group.roi_height,
                'Buffered':
                self.camera_controls_group.buffered_entry.currentText(),
                'Number of buffers':
                self.camera_controls_group.buffnum,
                'Trigger':
                self.camera_controls_group.trig_mode,
                'Sensor clocking':
                self.camera_controls_group.sensor_pix_rate_entry.currentText(),
                'Time stamp':
                self.camera_controls_group.time_stamp.isChecked()
            },
            "Positions": {
                'CT stage': self.motor_control_group.CT_mot_pos_move.value(),
                'Vertical': self.motor_control_group.vert_mot_pos_move.value(),
                'Horizontal':
                self.motor_control_group.hor_mot_pos_move.value()
            },
            "Outer loop": {
                'Motor':
                self.scan_controls_group.outer_loop_motor.currentText(),
                'Start':
                self.scan_controls_group.outer_loop_start_entry.text(),
                'Steps':
                self.scan_controls_group.outer_loop_steps_entry.text(),
                'Range':
                self.scan_controls_group.outer_loop_range_entry.text(),
                'Flats before': self.scan_controls_group.ffc_before_outer,
                'Flats after': self.scan_controls_group.ffc_after_outer
            },
            "Inner loop": {
                'Motor':
                self.scan_controls_group.inner_loop_motor.currentText(),
                'Start':
                self.scan_controls_group.inner_loop_start_entry.text(),
                'Steps':
                self.scan_controls_group.inner_loop_steps_entry.text(),
                'Range':
                self.scan_controls_group.inner_loop_range_entry.text(),
                'Flats before': self.scan_controls_group.ffc_before,
                'Flats after': self.scan_controls_group.ffc_after
            },
            "Readout in the end": {
                'Readout in the end':
                self.scan_controls_group.readout_intheend.isChecked()
            },
            "FFC": {
                'Motor':
                self.ffc_controls_group.flat_motor,
                'Radio position':
                self.ffc_controls_group.radio_position_entry.text(),
                'Flat position':
                self.ffc_controls_group.flat_position_entry.text(),
                'Num flats':
                self.ffc_controls_group.num_flats,
                'Num darks':
                self.ffc_controls_group.num_darks
            },
            "Writer": {
                'Enabled': self.file_writer_group.isChecked(),
                'Data dir': self.file_writer_group.root_dir,
                'CT scan name': self.file_writer_group.ctsetname,
                'Filename': self.file_writer_group.dsetname,
                'Big tiffs': self.file_writer_group.bigtiff,
                'Separate scans': self.file_writer_group.separate_scans
            }
        }

        def my_unicode_repr(data):
            return self.represent_str(data.encode('utf-8'))

        yaml.representer.Representer.add_representer(unicode, my_unicode_repr)

        with open(f + '.yaml', 'w') as f:
            yaml.safe_dump(params,
                           f,
                           allow_unicode=True,
                           default_flow_style=False)
Beispiel #9
0
 def pix_rate(self):
     try:
         return int(self.sensor_pix_rate_entry.currentText())
     except:
         warning_message('Can not get read-out rate')