From 985aaeaeef3323ce715a0cca6a21e465e8ae9bd0 Mon Sep 17 00:00:00 2001 From: Jenny Fothergill Date: Tue, 26 Oct 2021 15:47:39 -0600 Subject: [PATCH 1/3] Add rotation of diffraction pattern from camera.up --- gixstapose/diffractometer.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gixstapose/diffractometer.py b/gixstapose/diffractometer.py index 1a644f5..a8f16a0 100644 --- a/gixstapose/diffractometer.py +++ b/gixstapose/diffractometer.py @@ -6,6 +6,7 @@ from scipy.interpolate import RectBivariateSpline from scipy.ndimage.interpolation import affine_transform from scipy.ndimage.fourier import fourier_gaussian +from scipy.ndimage import rotate class Diffractometer: @@ -240,8 +241,7 @@ def shear_back(self, img, inv_shear): def diffract_from_camera(self, camera): - """ - 2D FFT to get diffraction pattern from intensity matrix. + """2D FFT to get diffraction pattern from intensity matrix. Parameters ---------- @@ -255,7 +255,14 @@ def diffract_from_camera(self, camera): diffraction pattern """ rot = camera_to_rot(camera) - return self.diffract(rot.T) + up_ang = self.ang_up(camera.up) + dp = self.diffract(rot.T) + return rotate(dp, up_ang, reshape=False, cval=np.log10(self.bot), order=1) + + def ang_up(self, new_up): + """Calculate angle of rotation from [0,1,0] + """ + return np.rad2deg(get_angle([0,1,0], new_up)) def diffract(self, rot, cutout=True): From 7744874632d56360615af418e6bd5b957e9f861c Mon Sep 17 00:00:00 2001 From: Jenny Fothergill Date: Tue, 26 Oct 2021 16:36:01 -0600 Subject: [PATCH 2/3] Add buttons to rotate the camera by 5 degrees --- gixstapose/main.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/gixstapose/main.py b/gixstapose/main.py index d58a051..735a285 100644 --- a/gixstapose/main.py +++ b/gixstapose/main.py @@ -119,20 +119,30 @@ def createGridLayout(self): self.button111.setMaximumSize(QSize(100,40)) botlayout.addWidget(self.button111, 0, 3, 2, 1) + self.button_zplus = QPushButton(u"rotate +5\N{DEGREE SIGN}") + self.button_zplus.setMaximumSize(QSize(100,40)) + botlayout.addWidget(self.button_zplus, 0, 4, 2, 1) + + self.button_zminus = QPushButton("rotate -5\N{DEGREE SIGN}") + self.button_zminus.setMaximumSize(QSize(100,40)) + botlayout.addWidget(self.button_zminus, 0, 5, 2, 1) + # Connect buttons to moving the camera # thanks to this wonderful answer # https://stackoverflow.com/a/57167056/11969403 self.button100.clicked.connect(lambda: self.move_camera((1,0,0))) self.button110.clicked.connect(lambda: self.move_camera((1,1,0))) self.button111.clicked.connect(lambda: self.move_camera((1,1,1))) + self.button_zplus.clicked.connect(lambda: self.rotate_camera(5)) + self.button_zminus.clicked.connect(lambda: self.rotate_camera(-5)) # Add space between buttons and slider - botlayout.setColumnMinimumWidth(4,350) + botlayout.setColumnMinimumWidth(6, 150) # Zoom slider zlabel = QLabel("Zoom") zlabel.setAlignment(Qt.AlignCenter) - botlayout.addWidget(zlabel, 0, 5) + botlayout.addWidget(zlabel, 0, 7) self.zooms = [i for i in range(1, self.d.N) if self.d.N % i == 0] self.zoomslider = QSlider(Qt.Horizontal) @@ -141,9 +151,9 @@ def createGridLayout(self): self.zoomslider.setValue(self.zooms.index(self.d.zoom)) self.zoomslider.valueChanged.connect(self.change_zoom) self.zoomslider.setMaximumSize(QSize(600,30)) - botlayout.addWidget(self.zoomslider, 1, 5) + botlayout.addWidget(self.zoomslider, 1, 7) - botlayout.setColumnMinimumWidth(6,50) + botlayout.setColumnMinimumWidth(8,50) self.bothorizontalGroupBox.setLayout(botlayout) @@ -206,6 +216,7 @@ def plot_diffract(self, camera): # diffraction pattern self.dp = self.d.diffract_from_camera(camera) + self.diffract_ax.imshow(self.dp, cmap="jet") self.diffract_ax.figure.canvas.draw() self.repaint() @@ -216,6 +227,20 @@ def move_camera(self, pos): self.view._start_rendering() self.view.update() + def rotate_camera(self, angle_deg): + angle_rad = np.deg2rad(-angle_deg) + + r_mat = np.array( + [[np.cos(angle_rad), -np.sin(angle_rad), 0], + [np.sin(angle_rad), np.cos(angle_rad), 0], + [0, 0, 1]] + ) + + self.view.scene.camera.up = self.view.scene.camera.up.dot(r_mat) + #self.repaint() + self.view._start_rendering() + self.view.update() + def camera_from_pos(pos): camera = fresnel.camera.Orthographic( position=pos, look_at=(0,0,0), up=(0,0,1), height=1.5 From 42713f66f2a1ba2d2a28bd6b228eba1d2d99e5f0 Mon Sep 17 00:00:00 2001 From: Jenny Fothergill Date: Wed, 27 Oct 2021 12:57:21 -0600 Subject: [PATCH 3/3] remove negative sign --- gixstapose/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gixstapose/main.py b/gixstapose/main.py index 735a285..623c2a6 100644 --- a/gixstapose/main.py +++ b/gixstapose/main.py @@ -228,7 +228,7 @@ def move_camera(self, pos): self.view.update() def rotate_camera(self, angle_deg): - angle_rad = np.deg2rad(-angle_deg) + angle_rad = np.deg2rad(angle_deg) r_mat = np.array( [[np.cos(angle_rad), -np.sin(angle_rad), 0],