def get_mask(self, detector, scan_angle): shadow_boundary = self.project_extrema(detector, scan_angle) from dials.util import mask_untrusted_polygon mask = [flex.bool(flex.grid(reversed(p.get_image_size())), True) for p in detector] for panel_id in range(len(detector)): if shadow_boundary[panel_id].size() > 3: mask_untrusted_polygon(mask[panel_id], shadow_boundary[panel_id]) return mask
def get_mask(self, detector, scan_angle): shadow_boundary = self.project_extrema(detector, scan_angle) from dials.util import mask_untrusted_polygon mask = [ flex.bool(flex.grid(reversed(p.get_image_size())), True) for p in detector ] for panel_id in range(len(detector)): if shadow_boundary[panel_id].size() > 3: mask_untrusted_polygon(mask[panel_id], shadow_boundary[panel_id]) return mask
def generate(self, imageset): ''' Generate the mask. ''' from dials.util import ResolutionMaskGenerator from dials.util import mask_untrusted_rectangle from dials.util import mask_untrusted_circle from dials.util import mask_untrusted_polygon from dials.util import mask_untrusted_resolution_range from dials.array_family import flex from math import floor, ceil # Get the detector and beam detector = imageset.get_detector() beam = imageset.get_beam() # Get the first image image = imageset.get_raw_data(0) assert (len(detector) == len(image)) # Create the mask for each image masks = [] for index, (im, panel) in enumerate(zip(image, detector)): # The image width height height, width = im.all() # Create the basic mask from the trusted range if self.params.use_trusted_range: low, high = panel.get_trusted_range() imd = im.as_double() mask = (imd > low) & (imd < high) else: mask = flex.bool(flex.grid(im.all()), True) # Add a border around the image if self.params.border > 0: logger.info("Generating border mask:") logger.info(" border = %d" % self.params.border) border = self.params.border height, width = mask.all() borderx = flex.bool(flex.grid(border, width), False) bordery = flex.bool(flex.grid(height, border), False) mask[0:border, :] = borderx mask[-border:, :] = borderx mask[:, 0:border] = bordery mask[:, -border:] = bordery # Apply the untrusted regions for region in self.params.untrusted: if region.panel == index: if region.circle is not None: xc, yc, radius = region.circle logger.info("Generating circle mask:") logger.info(" panel = %d" % region.panel) logger.info(" xc = %d" % xc) logger.info(" yc = %d" % yc) logger.info(" radius = %d" % radius) mask_untrusted_circle(mask, xc, yc, radius) if region.rectangle is not None: x0, x1, y0, y1 = region.rectangle logger.info("Generating rectangle mask:") logger.info(" panel = %d" % region.panel) logger.info(" x0 = %d" % x0) logger.info(" y0 = %d" % y0) logger.info(" x1 = %d" % x1) logger.info(" y1 = %d" % y1) mask_untrusted_rectangle(mask, x0, x1, y0, y1) if region.polygon is not None: assert len(region.polygon ) % 2 == 0, "Polygon must contain 2D coords" vertices = [] for i in range(int(len(region.polygon) / 2)): x = region.polygon[2 * i] y = region.polygon[2 * i + 1] vertices.append((x, y)) polygon = flex.vec2_double(vertices) logger.info("Generating polygon mask:") logger.info(" panel = %d" % region.panel) for vertex in vertices: logger.info(" coord = (%d, %d)" % (vertex)) mask_untrusted_polygon(mask, polygon) # Create the resolution mask generator class ResolutionMaskGeneratorGetter(object): def __init__(self, beam, panel): self.beam = beam self.panel = panel self.result = None def __call__(self): if self.result is None: self.result = ResolutionMaskGenerator(beam, panel) return self.result get_resolution_mask_generator = ResolutionMaskGeneratorGetter( beam, panel) # Generate high and low resolution masks if self.params.d_min is not None: logger.info("Generating high resolution mask:") logger.info(" d_min = %f" % self.params.d_min) get_resolution_mask_generator().apply(mask, 0, self.params.d_min) if self.params.d_max is not None: logger.info("Generating low resolution mask:") logger.info(" d_max = %f" % self.params.d_max) d_min = self.params.d_max d_max = max(d_min + 1, 1e9) get_resolution_mask_generator().apply(mask, d_min, d_max) # Mask out the resolution range for drange in self.params.resolution_range: d_min = min(drange) d_max = max(drange) assert d_min < d_max, "d_min must be < d_max" logger.info("Generating resolution range mask:") logger.info(" d_min = %f" % d_min) logger.info(" d_max = %f" % d_max) get_resolution_mask_generator().apply(mask, d_min, d_max) # Mask out the resolution ranges for the ice rings for drange in generate_ice_ring_resolution_ranges( beam, panel, self.params.ice_rings): d_min = min(drange) d_max = max(drange) assert d_min < d_max, "d_min must be < d_max" logger.info("Generating ice ring mask:") logger.info(" d_min = %f" % d_min) logger.info(" d_max = %f" % d_max) get_resolution_mask_generator().apply(mask, d_min, d_max) # Add to the list masks.append(mask) # Return the mask return tuple(masks)
def generate(self, imageset): ''' Generate the mask. ''' from dials.util import ResolutionMaskGenerator from dials.util import mask_untrusted_rectangle from dials.util import mask_untrusted_circle from dials.util import mask_untrusted_polygon from dials.util import mask_untrusted_resolution_range from dials.array_family import flex from math import floor, ceil # Get the detector and beam detector = imageset.get_detector() beam = imageset.get_beam() # Get the first image image = imageset.get_raw_data(0) assert(len(detector) == len(image)) # Create the mask for each image masks = [] for index, (im, panel) in enumerate(zip(image, detector)): # The image width height height, width = im.all() # Create the basic mask from the trusted range if self.params.use_trusted_range: low, high = panel.get_trusted_range() imd = im.as_double() mask = (imd > low) & (imd < high) else: mask = flex.bool(flex.grid(im.all()), True) # Add a border around the image if self.params.border > 0: logger.info("Generating border mask:") logger.info(" border = %d" % self.params.border) border = self.params.border height, width = mask.all() borderx = flex.bool(flex.grid(border, width), False) bordery = flex.bool(flex.grid(height, border), False) mask[0:border,:] = borderx mask[-border:,:] = borderx mask[:,0:border] = bordery mask[:,-border:] = bordery # Apply the untrusted regions for region in self.params.untrusted: if region.panel == index: if region.circle is not None: xc, yc, radius = region.circle logger.info("Generating circle mask:") logger.info(" panel = %d" % region.panel) logger.info(" xc = %d" % xc) logger.info(" yc = %d" % yc) logger.info(" radius = %d" % radius) mask_untrusted_circle(mask, xc, yc, radius) if region.rectangle is not None: x0, x1, y0, y1 = region.rectangle logger.info("Generating rectangle mask:") logger.info(" panel = %d" % region.panel) logger.info(" x0 = %d" % x0) logger.info(" y0 = %d" % y0) logger.info(" x1 = %d" % x1) logger.info(" y1 = %d" % y1) mask_untrusted_rectangle(mask, x0, x1, y0, y1) if region.polygon is not None: assert len(region.polygon) % 2 == 0, "Polygon must contain 2D coords" vertices = [] for i in range(int(len(region.polygon)/2)): x = region.polygon[2*i] y = region.polygon[2*i+1] vertices.append((x,y)) polygon = flex.vec2_double(vertices) logger.info("Generating polygon mask:") logger.info(" panel = %d" % region.panel) for vertex in vertices: logger.info(" coord = (%d, %d)" % (vertex)) mask_untrusted_polygon(mask, polygon) # Create the resolution mask generator class ResolutionMaskGeneratorGetter(object): def __init__(self, beam, panel): self.beam = beam self.panel = panel self.result = None def __call__(self): if self.result is None: self.result = ResolutionMaskGenerator(beam, panel) return self.result get_resolution_mask_generator = ResolutionMaskGeneratorGetter(beam, panel) # Generate high and low resolution masks if self.params.d_min is not None: logger.info("Generating high resolution mask:") logger.info(" d_min = %f" % self.params.d_min) get_resolution_mask_generator().apply(mask, 0, self.params.d_min) if self.params.d_max is not None: logger.info("Generating low resolution mask:") logger.info(" d_max = %f" % self.params.d_max) d_min = self.params.d_max d_max = max(d_min + 1, 1e9) get_resolution_mask_generator().apply(mask, d_min, d_max) # Mask out the resolution range for drange in self.params.resolution_range: d_min=min(drange) d_max=max(drange) assert d_min < d_max, "d_min must be < d_max" logger.info("Generating resolution range mask:") logger.info(" d_min = %f" % d_min) logger.info(" d_max = %f" % d_max) get_resolution_mask_generator().apply(mask, d_min, d_max) # Mask out the resolution ranges for the ice rings for drange in generate_ice_ring_resolution_ranges( beam, panel, self.params.ice_rings): d_min=min(drange) d_max=max(drange) assert d_min < d_max, "d_min must be < d_max" logger.info("Generating ice ring mask:") logger.info(" d_min = %f" % d_min) logger.info(" d_max = %f" % d_max) get_resolution_mask_generator().apply(mask, d_min, d_max) # Add to the list masks.append(mask) # Return the mask return tuple(masks)