def __init__(self, calculation_parameters=ProjectionCalculationParameters()): super(CalculateProjectionSeries_popup, self).__init__() self.calculationParameters = calculation_parameters self.ui = CalculateProjectionSeries_Dialog.Ui_CalculateProjectionSeries_Dialog( ) self.ui.setupUi(self) self.setModal(True) import os from functools import partial self.calculationParameters.outputFilename = os.path.abspath( os.getcwd() + '/projections.mrc') self.ui.lineEdit_outputFilename.setText( self.calculationParameters.outputFilename) self.ui.lineEdit_phi.setText( toQString(str(self.calculationParameters.phi))) self.ui.lineEdit_psi.setText( toQString(str(self.calculationParameters.psi))) self.ui.lineEdit_thetaStart.setText( toQString(str(self.calculationParameters.thetaStart))) self.ui.lineEdit_thetaStep.setText( toQString(str(self.calculationParameters.thetaStep))) self.ui.lineEdit_thetaStop.setText( toQString(str(self.calculationParameters.thetaStop))) self.ui.lineEdit_angleFile.textEdited.connect( self.setAngleFilename_fromLineEdit) self.ui.btn_selectAngleFile.clicked.connect(self.selectAngleFile) self.ui.lineEdit_phi.textEdited.connect(self.setPhi) self.ui.lineEdit_psi.textEdited.connect(self.setPsi) self.ui.lineEdit_thetaStart.textEdited.connect(self.setThetaStart) self.ui.lineEdit_thetaStep.textEdited.connect(self.setThetaStep) self.ui.lineEdit_thetaStop.textEdited.connect(self.setThetaStop) self.ui.lineEdit_outputFilename.textEdited.connect( self.setOutputFilename) self.ui.checkBox_saveAngles.setChecked(True) self.ui.checkBox_saveAngles.toggled.connect(self.toggleSaveAngles) self.ui.buttonBox.button( QtWidgets.QDialogButtonBox.Ok).setText("Calculate Projections") self.ui.buttonBox.accepted.connect(partial(self.setStatus, 1)) # validations self.ui.lineEdit_phi.editingFinished.connect( partial(self.validateFloatFromLineEdit, self.ui.lineEdit_phi)) self.ui.lineEdit_psi.editingFinished.connect( partial(self.validateFloatFromLineEdit, self.ui.lineEdit_psi)) self.ui.lineEdit_thetaStart.editingFinished.connect( partial(self.validateFloatFromLineEdit, self.ui.lineEdit_thetaStart)) self.ui.lineEdit_thetaStep.editingFinished.connect( partial(self.validateFloatFromLineEdit, self.ui.lineEdit_thetaStep)) self.ui.lineEdit_thetaStop.editingFinished.connect( partial(self.validateFloatFromLineEdit, self.ui.lineEdit_thetaStop)) self.status = 0
def setAngleFilename_fromLineEdit(self): filename = self.ui.lineEdit_angleFile.text() if os.path.isfile(toString(filename)): self.calculationParameters.angleFilename = filename self.calculationParameters.angleFileProvided = True self.ui.lineEdit_angleFile.setText(toQString(filename)) self.disableAngleWidgets()
def selectAngleFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( QtWidgets.QFileDialog(), "Select File Containing Support", filter= "Euler Angles (*.txt *.mat);; MATLAB files (*.mat);;text files (*.txt);;All Files (*)" ) if filename: self.GENFIRE_ReconstructionParameters.setAngleFilename(filename) self.ui.lineEdit_angle.setText(toQString(filename))
def updateFilenames(self): import os base, file = os.path.split( toString(self.GENFIRE_ProjectionCalculator.calculationParameters. outputFilename)) self.ui.lineEdit_angle.setText( toQString( str(self.GENFIRE_ProjectionCalculator.calculationParameters. outputAngleFilename))) self.ui.lineEdit_angle.textChanged.emit(self.ui.lineEdit_angle.text()) self.ui.lineEdit_pj.setText( toQString( str(self.GENFIRE_ProjectionCalculator.calculationParameters. outputFilename))) self.ui.lineEdit_pj.textChanged.emit(self.ui.lineEdit_pj.text()) self.ui.lineEdit_results.setText(toQString(str(base + "/results.mrc"))) self.ui.lineEdit_results.textChanged.emit( self.ui.lineEdit_results.text())
def selectAngleFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( QtWidgets.QFileDialog(), "Select File Containing Angles", filter="txt files (*.txt);;All Files (*)") if filename: self.calculationParameters.angleFilename = filename self.calculationParameters.angleFileProvided = True self.ui.lineEdit_angleFile.setText(toQString(filename)) self.disableAngleWidgets()
def selectInitialObjectFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( QtWidgets.QFileDialog(), "Select File Containing Initial Object", filter= "Volume Files (*.mrc *.mat *.npy);; MATLAB files (*.mat);;MRC (*.mrc);;All Files (*)" ) if filename: self.GENFIRE_ReconstructionParameters.setInitialObjectFilename( filename) self.ui.lineEdit_io.setText(toQString(filename))
def selectSupportFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( QtWidgets.QFileDialog(), "Select File Containing Support", filter= "Volume Files (*.mrc *.mat *.npy);; MATLAB files (*.mat);;MRC (*.mrc);;All Files (*)" ) if filename: self.GENFIRE_ReconstructionParameters.setSupportFilename(filename) self.ui.lineEdit_support.setText(toQString(filename)) self.ui.checkBox_default_support.setChecked(False)
def __init__(self): self.modelFilename = toQString('') self.angleFilename = toQString('') self.outputFilename = toQString('') self.outputAngleFilename = toQString('') self.outputFilesFlag = False self.angleFileProvided = False self.modelFilenameProvided = False self.modelLoadedFlag = False self.writeAnglesFlag = True self.interpolator = None self.model = None self.ncOut = None self.phi = 0.0 self.theta = 0.0 self.thetaStart = 0.0 self.thetaStep = 3.0 self.thetaStop = 180.0 self.psi = 0.0 self.calculationMethod = "FFT"
def selectProjectionFile(self): filename, _ = QtWidgets.QFileDialog.getOpenFileName( QtWidgets.QFileDialog(), "Select File Containing Projections", filter= "Projection Stacks (*.mrc *.mat *.tif *.npy);; MATLAB files (*.mat);;TIFF images (*.tif *.tiff);;MRC (*.mrc);;All Files (*)" ) if filename: self.GENFIRE_ReconstructionParameters.setProjectionFilename( filename) self.ui.lineEdit_pj.setText(toQString(filename))
def setTextFromSlider(self, lineedit, value): lineedit.setText(toQString(value))
def __init__(self): ## Superclass constructor super(GenfireMainWindow, self).__init__() ## Initialize UI self.ui = GENFIRE_MainWindow.Ui_GENFIRE_MainWindow() self.ui.setupUi(self) ## Initialize Reconstruction Parameters self.GENFIRE_ReconstructionParameters = ReconstructionParameters() ## Initialize file paths in text boxes self.ui.lineEdit_results.setText( toQString(os.path.join(os.getcwd(), 'results.mrc'))) self.ui.lineEdit_support.setText(toQString(os.getcwd())) self.ui.lineEdit_pj.setText(toQString(os.getcwd())) self.ui.lineEdit_io.setText(toQString(os.getcwd())) self.ui.lineEdit_angle.setText(toQString(os.getcwd())) ## Push Buttons -- connect each to their main function and check if the reconstruction parameters are good each ## time a parameter is changed self.ui.btn_projections.clicked.connect(self.selectProjectionFile) self.ui.btn_projections.clicked.connect(self.checkParameters) self.ui.btn_angles.clicked.connect(self.selectAngleFile) self.ui.btn_angles.clicked.connect(self.checkParameters) self.ui.btn_support.clicked.connect(self.selectSupportFile) self.ui.btn_support.clicked.connect(self.checkParameters) self.ui.btn_io.clicked.connect(self.selectInitialObjectFile) self.ui.btn_io.clicked.connect(self.checkParameters) self.ui.btn_reconstruct.setEnabled(False) self.ui.btn_reconstruct.clicked.connect(self.startReconstruction) self.ui.btn_reconstruct.clicked.connect(self.checkParameters) self.ui.btn_reconstruct.setStyleSheet("background-color: rgb(221,0,0)") self.ui.btn_displayResults.clicked.connect(self.displayResults) ## Line Edits -- connect each to their main function and check if the reconstruction parameters are good each ## time a parameter is changed self.ui.lineEdit_pj.textChanged.connect( self.GENFIRE_ReconstructionParameters.setProjectionFilename) self.ui.lineEdit_pj.textChanged.connect(self.checkParameters) self.ui.lineEdit_angle.textChanged.connect( self.GENFIRE_ReconstructionParameters.setAngleFilename) self.ui.lineEdit_angle.textChanged.connect(self.checkParameters) self.ui.lineEdit_support.textChanged.connect( self.GENFIRE_ReconstructionParameters.setSupportFilename) self.ui.lineEdit_support.textChanged.connect(self.checkParameters) self.ui.lineEdit_io.textChanged.connect( self.GENFIRE_ReconstructionParameters.setInitialObjectFilename) self.ui.lineEdit_io.textChanged.connect(self.checkParameters) self.ui.lineEdit_results.textChanged.connect( self.GENFIRE_ReconstructionParameters.setResultsFilename) self.ui.lineEdit_results.textChanged.connect(self.checkParameters) self.ui.lineEdit_numIterations.setText(toQString("100")) self.ui.lineEdit_numIterations.textChanged.connect( self.safeSetNumIterations) self.ui.lineEdit_numIterations.textChanged.connect( self.checkParameters) self.ui.lineEdit_oversamplingRatio.setText(toQString("3")) self.ui.lineEdit_oversamplingRatio.textChanged.connect( self.safeSetOversamplingRatio) self.ui.lineEdit_oversamplingRatio.textChanged.connect( self.checkParameters) self.ui.lineEdit_interpolationCutoffDistance.setText(toQString("0.7")) self.ui.lineEdit_interpolationCutoffDistance.textChanged.connect( self.safeSetInterpDistance) self.ui.lineEdit_interpolationCutoffDistance.textChanged.connect( self.checkParameters) self.ui.lineEdit_io.setDisabled(True) self.ui.lineEdit_io.setStyleSheet("background-color: gray") ## Radio Buttons -- default is resolution extension suppression self.ui.radioButton_on.setChecked(True) self.ui.radioButton_on.toggled.connect( self.selectResolutionExtensionSuppressionState) self.ui.radioButton_off.toggled.connect( self.selectResolutionExtensionSuppressionState) self.ui.radioButton_extension.toggled.connect( self.selectResolutionExtensionSuppressionState) self.ui.radioButton_FFT.setChecked(True) self.ui.radioButton_DFT.toggled.connect(self.setGriddingMethod) self.ui.radioButton_FFT.toggled.connect(self.setGriddingMethod) ## Check Boxes self.ui.checkBox_rfree.setChecked(True) self.ui.checkBox_rfree.toggled.connect(self.calculateRfree) self.ui.checkBox_provide_io.toggled.connect(self.toggleSelectIO) self.ui.checkBox_default_support.toggled.connect( self.toggleUseDefaultSupport) self.ui.checkBox_default_support.setChecked(True) self.ui.checkBox_support_constraint.setChecked(True) self.ui.checkBox_positivity_constraint.setChecked(True) self.ui.checkBox_support_constraint.toggled.connect( self.toggleSupportConstraint) self.ui.checkBox_positivity_constraint.toggled.connect( self.togglePositivityConstraint) self.ui.checkBox_multiGridding.toggled.connect( self.toggleMultiGridding) self.ui.checkBox_resCircle.toggled.connect(self.toggleResCircle) self.ui.action_Create_Support.triggered.connect( self.launchProjectionCalculator) self.ui.action_Volume_Slicer.triggered.connect(self.launchVolumeSlicer)
def __init__(self, parent=None): super(ProjectionCalculator, self).__init__() self.ui = ProjectionCalculator_MainWindow.Ui_ProjectionCalculator() self.ui.setupUi(self) # buid the interface self.parent = parent self.calculationParameters = ProjectionCalculationParameters() self.ui.lineEdit_modelFile.setText(toQString(os.getcwd())) self.ui.lineEdit_modelFile.editingFinished.connect( self.setModelFilename_fromLineEdit) ## Push Buttons self.ui.btn_selectModel.clicked.connect(self.selectModelFile) ## Sliders self.ui.verticalSlider_phi.setValue(0) self.ui.verticalSlider_phi.setMinimum(0) self.ui.verticalSlider_phi.setMaximum(3600) self.ui.verticalSlider_phi.valueChanged.connect( self.setPhiLineEditValue) self.ui.verticalSlider_theta.setValue(0) self.ui.verticalSlider_theta.setMinimum(0) self.ui.verticalSlider_theta.setMaximum(3600) self.ui.verticalSlider_theta.valueChanged.connect( self.setThetaLineEditValue) self.ui.verticalSlider_psi.setValue(0) self.ui.verticalSlider_psi.setMinimum(0) self.ui.verticalSlider_psi.setMaximum(3600) self.ui.verticalSlider_psi.valueChanged.connect( self.setPsiLineEditValue) ## Line edits self.ui.lineEdit_phi.setText(toQString('0')) self.ui.lineEdit_theta.setText(toQString('0')) self.ui.lineEdit_psi.setText(toQString('0')) self.ui.lineEdit_phi.editingFinished.connect(self.setPhiSliderValue) self.ui.lineEdit_theta.editingFinished.connect( self.setThetaSliderValue) self.ui.lineEdit_psi.editingFinished.connect(self.setPsiSliderValue) self.calculateProjections_Dialog = CalculateProjectionSeries_popup( self.calculationParameters) self.ui.btn_go.clicked.connect(self.showDialog) self.calculateProjections_Dialog.ui.buttonBox.accepted.connect( self.readyToCalculateProjections) self.ui.btn_go.setEnabled(False) # Create figures for embedded plotting self.figure = plt.figure(3) self.figure.clf( ) # clear figure in case it was rendered somewhere else previously self.canvas = FigureCanvas(self.figure) self.navigationToolbar = NavigationToolbar(self.canvas, self) self.ui.verticalLayout_figure.addWidget(self.navigationToolbar) self.ui.verticalLayout_figure.addWidget(self.canvas) self.ax = self.figure.add_subplot(111) self.ax.axes.get_xaxis().set_visible(False) self.ax.axes.get_yaxis().set_visible(False) self.ui.btn_clearModel.clicked.connect(self.clearModel)
def setModelFilename(self, filename): self.calculationParameters.modelFilename = filename self.ui.lineEdit_modelFile.setText(toQString(filename)) self.loadModel(filename) self.displayFigure()
def setPsiLineEditValue(self, value): self.ui.lineEdit_psi.setText(toQString(float(value) / 10)) self.calculationParameters.psi = float(value) / 10 self.updateFigure()
def setThetaLineEditValue(self, value): self.ui.lineEdit_theta.setText(toQString(float(value) / 10)) self.calculationParameters.theta = float(value) / 10 self.updateFigure()