def _detector(self, index=None): from PSCalib.SegGeometryStore import sgs from xfel.cftbx.detector.cspad_cbf_tbx import basis_from_geo run = self.get_run_from_index(index) if run.run() in self._cached_detector: return self._cached_detector[run.run()] if index is None: index = 0 self._env = self._ds.env() assert len(self.params.detector_address) == 1 self._det = psana.Detector(self.params.detector_address[0], self._env) geom = self._det.pyda.geoaccess(self._get_event(index).run()) pixel_size = (self._det.pixel_size(self._get_event(index)) / 1000.0 ) # convert to mm d = Detector() pg0 = d.hierarchy() # first deal with D0 det_num = 0 root = geom.get_top_geo() root_basis = basis_from_geo(root) while len(root.get_list_of_children()) == 1: sub = root.get_list_of_children()[0] sub_basis = basis_from_geo(sub) root = sub root_basis = root_basis * sub_basis t = root_basis.translation root_basis.translation = col((t[0], t[1], -t[2])) origin = col((root_basis * col((0, 0, 0, 1)))[0:3]) fast = col((root_basis * col((1, 0, 0, 1)))[0:3]) - origin slow = col((root_basis * col((0, 1, 0, 1)))[0:3]) - origin pg0.set_local_frame(fast.elems, slow.elems, origin.elems) pg0.set_name("D%d" % (det_num)) # Now deal with modules for module_num in range(len(root.get_list_of_children())): module = root.get_list_of_children()[module_num] module_basis = basis_from_geo(module) origin = col((module_basis * col((0, 0, 0, 1)))[0:3]) fast = col((module_basis * col((1, 0, 0, 1)))[0:3]) - origin slow = col((module_basis * col((0, 1, 0, 1)))[0:3]) - origin pg1 = pg0.add_group() pg1.set_local_frame(fast.elems, slow.elems, origin.elems) pg1.set_name("D%dM%d" % (det_num, module_num)) # Read the known layout of the Jungfrau 2x4 module sg = sgs.Create(segname=module.oname) xx, yy = sg.get_seg_xy_maps_um() xx = xx / 1000 yy = yy / 1000 # Now deal with ASICs for asic_num in range(8): val = "ARRAY_D0M%dA%d" % (module_num, asic_num) dim_slow = xx.shape[0] dim_fast = xx.shape[1] sensor_id = asic_num // 4 # There are 2X4 asics per module asic_in_sensor_id = asic_num % 4 # this number will be 0,1,2 or 3 id_slow = sensor_id * (dim_slow // 2) id_fast = asic_in_sensor_id * (dim_fast // 4) origin = col((xx[id_slow][id_fast], yy[id_slow][id_fast], 0)) fp = col( (xx[id_slow][id_fast + 1], yy[id_slow][id_fast + 1], 0)) sp = col( (xx[id_slow + 1][id_fast], yy[id_slow + 1][id_fast], 0)) fast = (fp - origin).normalize() slow = (sp - origin).normalize() p = pg1.add_panel() p.set_local_frame(fast.elems, slow.elems, origin.elems) p.set_pixel_size((pixel_size, pixel_size)) p.set_trusted_range((-10, 2e6)) p.set_name(val) thickness, material = 0.32, "Si" p.set_thickness(thickness) # mm p.set_material(material) # Compute the attenuation coefficient. # This will fail for undefined composite materials # mu_at_angstrom returns cm^-1, but need mu in mm^-1 table = attenuation_coefficient.get_table(material) wavelength = self.get_beam(index).get_wavelength() mu = table.mu_at_angstrom(wavelength) / 10.0 p.set_mu(mu) p.set_px_mm_strategy( ParallaxCorrectedPxMmStrategy(mu, thickness)) if (self.params.jungfrau.use_big_pixels and os.environ.get("DONT_USE_BIG_PIXELS_JUNGFRAU") is None): p.set_image_size((1030, 514)) break else: p.set_image_size((dim_fast // 4, dim_slow // 2)) if (self.params.jungfrau.use_big_pixels and os.environ.get("DONT_USE_BIG_PIXELS_JUNGFRAU") is None): assert len(d) == 8 self._cached_detector[run.run()] = d return d
p3 = col((x1,y2,0)) v1 = p1-p0 v2 = p3-p0 vcen = ((v2/2) + (v1/2)) + p0 ax.add_patch(Polygon((p0[0:2],p1[0:2],p2[0:2],p3[0:2]), closed=True, color='green', fill=False, hatch='/')) ax.annotate("%d"%(int(PANEL)), vcen[0:2]) ax.set_xlim((0, 2000)) ax.set_ylim((0, 2000)) ax.set_ylim(ax.get_ylim()[::-1]) else: from xfel.cftbx.detector.cspad_cbf_tbx import basis_from_geo root = geometry.get_top_geo() root_basis = basis_from_geo(root) # get pixel mappings to real space. x, y, z = geometry.get_pixel_coords() assert x.shape == y.shape == z.shape if len(x.shape) == 6: x = x.reshape(x.shape[2:6]) y = y.reshape(y.shape[2:6]) z = z.reshape(z.shape[2:6]) elif len(x.shape) == 5: x = x.reshape(x.shape[1:5]) y = y.reshape(y.shape[1:5]) z = z.reshape(z.shape[1:5]) else: assert len(x.shape) == 4 sensor_slow = x.shape[2]
def _detector(self, index=None): from PSCalib.SegGeometryStore import sgs from xfel.cftbx.detector.cspad_cbf_tbx import basis_from_geo run = self.get_run_from_index(index) if run.run() in self._cached_detector: return self._cached_detector[run.run()] if index is None: index = 0 assert len(self.params.detector_address) == 1 wavelength = self.get_beam(index).get_wavelength() det = self._get_psana_detector(run) geom = det.pyda.geoaccess(self._get_event(index).run()) pixel_size = det.pixel_size(self._get_event(index)) / 1000.0 # convert to mm d = Detector() pg0 = d.hierarchy() # first deal with D0 det_num = 0 root = geom.get_top_geo() root_basis = basis_from_geo(root) while len(root.get_list_of_children()) == 1: sub = root.get_list_of_children()[0] sub_basis = basis_from_geo(sub) root = sub root_basis = root_basis * sub_basis t = root_basis.translation root_basis.translation = col((t[0], t[1], -abs(t[2]))) origin = col((root_basis * col((0, 0, 0, 1)))[0:3]) fast = col((root_basis * col((1, 0, 0, 1)))[0:3]) - origin slow = col((root_basis * col((0, 1, 0, 1)))[0:3]) - origin pg0.set_local_frame(fast.elems, slow.elems, origin.elems) pg0.set_name("D%d" % (det_num)) # Modules next for module_num in range(len(root.get_list_of_children())): pg1 = pg0.add_group() module = root.get_list_of_children()[module_num] module_basis = basis_from_geo(module) origin = col((module_basis * col((0, 0, 0, 1)))[0:3]) fast = col((module_basis * col((1, 0, 0, 1)))[0:3]) - origin slow = col((module_basis * col((0, 1, 0, 1)))[0:3]) - origin pg1.set_local_frame(fast.elems, slow.elems, origin.elems) pg1.set_name("D%dM%d" % (det_num, module_num)) # Read the known layout of the Epix 2x2 module sg = sgs.Create(segname=module.oname) xx, yy = sg.get_seg_xy_maps_um() xx = xx / 1000 yy = yy / 1000 # Now deal with ASICs for asic_num in range(4): val = "ARRAY_D0M%dA%d" % (module_num, asic_num) p = pg1.add_panel() dim_slow = xx.shape[0] dim_fast = xx.shape[1] sensor_id = asic_num // 2 # There are 2X2 asics per module asic_in_sensor_id = asic_num % 2 # this number will be 0 or 1 id_slow = sensor_id * (dim_slow // 2) id_fast = asic_in_sensor_id * (dim_fast // 2) origin = col((xx[id_slow][id_fast], yy[id_slow][id_fast], 0)) fp = col((xx[id_slow][id_fast + 1], yy[id_slow][id_fast + 1], 0)) sp = col((xx[id_slow + 1][id_fast], yy[id_slow + 1][id_fast], 0)) fast = (fp - origin).normalize() slow = (sp - origin).normalize() p.set_local_frame(fast.elems, slow.elems, origin.elems) p.set_pixel_size((pixel_size, pixel_size)) p.set_image_size((dim_fast // 2, dim_slow // 2)) p.set_trusted_range((-1, 2e6)) p.set_gain(factor_kev_angstrom / wavelength) p.set_name(val) self._cached_detector[run.run()] = d return d