コード例 #1
0
ファイル: masking.py プロジェクト: dials/dials
 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
コード例 #2
0
ファイル: masking.py プロジェクト: hackerlank/dials
 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
コード例 #3
0
ファイル: masking.py プロジェクト: hackerlank/dials
    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)
コード例 #4
0
ファイル: masking.py プロジェクト: dials/dials
  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)