def update(self): '''Check to see if any more frames have appeared - if they have update myself and reset.''' from xia2.Applications.xia2setup import is_hd5f_name if is_hd5f_name(os.path.join(self._directory, self._template)): return images = find_matching_images(self._template, self._directory) if len(images) > len(self._images): self._images = images from xia2.Schema import load_imagesets imagesets = load_imagesets( self._template, self._directory, id_image=self._id_image, use_cache=False, reversephi=PhilIndex.params.xia2.settings.input.reverse_phi) max_images = 0 best_sweep = None for imageset in imagesets: scan = imageset.get_scan() if scan is None: continue if imageset.get_scan().get_num_images() > max_images: best_sweep = imageset self._imageset = best_sweep return
def _setup_from_image(self, image): """Configure myself from an image name.""" template, directory = image2template_directory(image) self._fp_matching_images = find_matching_images(template, directory) # trim this down to only allowed images... if self._fp_wedge: start, end = self._fp_wedge images = [] for j in self._fp_matching_images: if j < start or j > end: continue images.append(j) self._fp_matching_images = images from xia2.Schema import load_imagesets imagesets = load_imagesets( template, directory, image_range=(self._fp_matching_images[0], self._fp_matching_images[-1]), ) assert len(imagesets) == 1, "multiple imagesets match %s" % template imageset = imagesets[0] self._setup_from_imageset(imageset)
def update(self): '''Check to see if any more frames have appeared - if they have update myself and reset.''' images = find_matching_images(self._template, self._directory) if len(images) > len(self._images): self._images = images from xia2.Schema import load_imagesets imagesets = load_imagesets( self._template, self._directory, id_image=self._id_image, use_cache=False, reversephi=Flags.get_reversephi()) max_images = 0 best_sweep = None for imageset in imagesets: scan = imageset.get_scan() if scan is None: continue if imageset.get_scan().get_num_images() > max_images: best_sweep = imageset self._imageset = best_sweep return
def SweepFactory(template, directory, beam=None): """A factory which will return a list of sweep objects which match the input template and directory.""" sweeps = [] from xia2.Schema import load_imagesets imagesets = load_imagesets( template, directory, reversephi=PhilIndex.params.xia2.settings.input.reverse_phi) for imageset in imagesets: scan = imageset.get_scan() if scan is not None: sweeps.append( Sweep( template, directory, imageset=imageset, id_image=scan.get_image_range()[0], beam=beam, )) return sweeps
def SweepFactory(template, directory, beam = None): '''A factory which will return a list of sweep objects which match the input template and directory.''' sweeps = [] from xia2.Schema import load_imagesets imagesets = load_imagesets( template, directory, reversephi=Flags.get_reversephi()) for imageset in imagesets: scan = imageset.get_scan() if scan is not None: sweeps.append( Sweep(template, directory, imageset=imageset, id_image=scan.get_image_range()[0], beam=beam)) return sweeps
def _setup_from_image(self, image): '''Configure myself from an image name.''' template, directory = image2template_directory(image) self._fp_matching_images = find_matching_images(template, directory) # trim this down to only allowed images... if self._fp_wedge: start, end = self._fp_wedge images = [] for j in self._fp_matching_images: if j < start or j > end: continue images.append(j) self._fp_matching_images = images from xia2.Schema import load_imagesets imagesets = load_imagesets( template, directory, image_range=(self._fp_matching_images[0], self._fp_matching_images[-1])) assert len(imagesets) == 1, 'multiple imagesets match %s' % template imageset = imagesets[0] self._setup_from_imageset(imageset) return
def __init__(self, name, wavelength, sample, directory = None, image = None, beam = None, reversephi = False, distance = None, gain = 0.0, dmin = 0.0, dmax = 0.0, polarization = 0.0, frames_to_process = None, user_lattice = None, user_cell = None, epoch = 0, ice = False, excluded_regions = None): '''Create a new sweep named name, belonging to XWavelength object wavelength, representing the images in directory starting with image, with beam centre optionally defined.''' if excluded_regions is None: excluded_regions = [] # + check the wavelength is an XWavelength object # raise an exception if not... or not... if not wavelength.__class__.__name__ == 'XWavelength': pass # FIXME bug 2221 if DIRECTORY starts with ~/ or ~graeme (say) need to # interpret this properly - e.g. map it to a full PATH. directory = expand_path(directory) self._name = name self._wavelength = wavelength self._sample = sample self._directory = directory self._image = image self._reversephi = reversephi self._epoch = epoch self._user_lattice = user_lattice self._user_cell = user_cell self._header = { } self._resolution_high = dmin self._resolution_low = dmax self._ice = ice self._excluded_regions = excluded_regions self._imageset = None # FIXME in here also need to be able to accumulate the total # dose from all experimental measurements (complex) and provide # a _epoch_to_dose dictionary or some such... may be fiddly as # this will need to parse across multiple templates. c/f Bug # 2798 self._epoch_to_image = { } self._image_to_epoch = { } # to allow first, last image for processing to be # set... c/f integrater interface self._frames_to_process = frames_to_process # + derive template, list of images params = PhilIndex.get_python_object() if directory and image: self._template, self._directory = \ image2template_directory(os.path.join(directory, image)) from xia2.Schema import load_imagesets imagesets = load_imagesets( self._template, self._directory, image_range=self._frames_to_process, reversephi=(params.xia2.settings.input.reverse_phi or self._reversephi)) assert len(imagesets) == 1, "one imageset expected, %d found" % \ len(imagesets) self._imageset = copy.deepcopy(imagesets[0]) start, end = self._imageset.get_array_range() self._images = list(range(start+1, end+1)) # FIXME in here check that (1) the list of images is continuous # and (2) that all of the images are readable. This should also # take into account frames_to_process if set. if self._frames_to_process is None: self._frames_to_process = min(self._images), max(self._images) start, end = self._frames_to_process error = False if params.general.check_image_files_readable: for j in range(start, end + 1): image_name = self.get_imageset().get_path(j-start) if not j in self._images: Debug.write('image %s missing' %image_name) error = True continue if not os.access(image_name, os.R_OK): Debug.write('image %s unreadable' %image_name) error = True continue if error: raise RuntimeError, 'problem with sweep %s' % self._name # + read the image header information into here? # or don't I need it? it would be useful for checking # against wavelength.getWavelength() I guess to make # sure that the plumbing is all sound. # check that they match by closer than 0.0001A, if wavelength # is not None beam_ = self._imageset.get_beam() scan = self._imageset.get_scan() if wavelength is not None: # FIXME 29/NOV/06 if the wavelength wavelength value # is 0.0 then first set it to the header value - note # that this assumes that the header value is correct # (a reasonable assumption) if wavelength.get_wavelength() == 0.0: wavelength.set_wavelength(beam_.get_wavelength()) # FIXME 08/DEC/06 in here need to allow for the fact # that the wavelength in the image header could be wrong and # in fact it should be replaced with the input value - # through the user will need to be warned of this and # also everything using the FrameProcessor interface # will also have to respect this! if math.fabs(beam_.get_wavelength() - wavelength.get_wavelength()) > 0.0001: # format = 'wavelength for sweep %s does not ' + \ # 'match wavelength %s' # raise RuntimeError, format % \ # (name, wavelength.get_name()) format = 'Header wavelength for sweep %s different' + \ ' to assigned value (%4.2f vs. %4.2f)' Chatter.write(format % (name, beam_.get_wavelength(), wavelength.get_wavelength())) # also in here look at the image headers to see if we can # construct a mapping between exposure epoch and image ... images = [] if self._frames_to_process: start, end = self._frames_to_process for j in self._images: if j >= start and j <= end: images.append(j) else: images = self._images for j in images: epoch = scan.get_image_epoch(j) if epoch == 0.0: epoch = float(os.stat(self._imageset.get_path(j-images[0])).st_mtime) self._epoch_to_image[epoch] = j self._image_to_epoch[j] = epoch epochs = self._epoch_to_image.keys() Debug.write('Exposure epoch for sweep %s: %d %d' % \ (self._template, min(epochs), max(epochs))) self._input_imageset = copy.deepcopy(self._imageset) # + get the lattice - can this be a pointer, so that when # this object updates lattice it is globally-for-this-crystal # updated? The lattice included directly in here includes an # exact unit cell for data reduction, the crystal lattice # contains an approximate unit cell which should be # from the unit cells from all sweeps contained in the # XCrystal. FIXME should I be using a LatticeInfo object # in here? See what the Indexer interface produces. ALT: # just provide an Indexer implementation "hook". # See Headnote 001 above. See also _get_indexer, # _get_integrater below. self._indexer = None self._refiner = None self._integrater = None # I don't need this - it is equivalent to self.getWavelength( # ).getCrystal().getLattice() # self._crystal_lattice = None # this means that this module will have to present largely the # same interface as Indexer and Integrater so that the calls # can be appropriately forwarded. # finally configure the beam if set if beam is not None: from dxtbx.model.detector_helpers import set_mosflm_beam_centre try: set_mosflm_beam_centre(self.get_imageset().get_detector(), self.get_imageset().get_beam(), beam) except AssertionError, e: Debug.write('Error setting mosflm beam centre: %s' % e)
def __init__( self, name, wavelength, sample, directory=None, image=None, beam=None, reversephi=False, distance=None, gain=0.0, dmin=0.0, dmax=0.0, polarization=0.0, frames_to_process=None, user_lattice=None, user_cell=None, epoch=0, ice=False, excluded_regions=None, ): """Create a new sweep named name, belonging to XWavelength object wavelength, representing the images in directory starting with image, with beam centre optionally defined.""" if excluded_regions is None: excluded_regions = [] # FIXME bug 2221 if DIRECTORY starts with ~/ or ~graeme (say) need to # interpret this properly - e.g. map it to a full PATH. directory = expand_path(directory) self._name = name self._wavelength = wavelength self.sample = sample self._directory = directory self._image = image self._reversephi = reversephi self._epoch = epoch self._user_lattice = user_lattice self._user_cell = user_cell self._header = {} self._resolution_high = dmin self._resolution_low = dmax self._ice = ice self._excluded_regions = excluded_regions self._imageset = None # FIXME in here also need to be able to accumulate the total # dose from all experimental measurements (complex) and provide # a _epoch_to_dose dictionary or some such... may be fiddly as # this will need to parse across multiple templates. c/f Bug # 2798 self._epoch_to_image = {} self._image_to_epoch = {} # to allow first, last image for processing to be # set... c/f integrater interface self._frames_to_process = frames_to_process # + derive template, list of images params = PhilIndex.get_python_object() if directory and image: self._template, self._directory = image2template_directory( os.path.join(directory, image)) from xia2.Schema import load_imagesets imagesets = load_imagesets( self._template, self._directory, image_range=self._frames_to_process, reversephi=(params.xia2.settings.input.reverse_phi or self._reversephi), ) assert len( imagesets ) == 1, "one imageset expected, %d found" % len(imagesets) self._imageset = copy.deepcopy(imagesets[0]) start, end = self._imageset.get_array_range() self._images = list(range(start + 1, end + 1)) # FIXME in here check that (1) the list of images is continuous # and (2) that all of the images are readable. This should also # take into account frames_to_process if set. if self._frames_to_process is None: self._frames_to_process = min(self._images), max(self._images) start, end = self._frames_to_process error = False if params.general.check_image_files_readable: for j in range(start, end + 1): if j not in self._images: logger.debug("image %i missing for %s" % (j, self.get_imageset().get_template())) error = True continue image_name = self.get_imageset().get_path(j - start) if not os.access(image_name, os.R_OK): logger.debug("image %s unreadable" % image_name) error = True continue if error: raise RuntimeError("problem with sweep %s" % self._name) beam_ = self._imageset.get_beam() scan = self._imageset.get_scan() if wavelength is not None: # If the wavelength value is 0.0 then first set it to the header # value - note that this assumes that the header value is correct # (a reasonable assumption) if wavelength.get_wavelength() == 0.0: wavelength.set_wavelength(beam_.get_wavelength()) # FIXME 08/DEC/06 in here need to allow for the fact # that the wavelength in the image header could be wrong and # in fact it should be replaced with the input value - # through the user will need to be warned of this and # also everything using the FrameProcessor interface # will also have to respect this! if (math.fabs(beam_.get_wavelength() - wavelength.get_wavelength()) > 0.0001): logger.info( "Header wavelength for sweep %s different" " to assigned value (%4.2f vs. %4.2f)", name, beam_.get_wavelength(), wavelength.get_wavelength(), ) # also in here look at the image headers to see if we can # construct a mapping between exposure epoch and image ... images = [] if self._frames_to_process: start, end = self._frames_to_process for j in self._images: if j >= start and j <= end: images.append(j) else: images = self._images for j in images: epoch = scan.get_image_epoch(j) if epoch == 0.0: epoch = float( os.stat(self._imageset.get_path(j - images[0])).st_mtime) self._epoch_to_image[epoch] = j self._image_to_epoch[j] = epoch epochs = self._epoch_to_image logger.debug("Exposure epoch for sweep %s: %d %d" % (self._template, min(epochs), max(epochs))) self._input_imageset = copy.deepcopy(self._imageset) # + get the lattice - can this be a pointer, so that when # this object updates lattice it is globally-for-this-crystal # updated? The lattice included directly in here includes an # exact unit cell for data reduction, the crystal lattice # contains an approximate unit cell which should be # from the unit cells from all sweeps contained in the # XCrystal. FIXME should I be using a LatticeInfo object # in here? See what the Indexer interface produces. ALT: # just provide an Indexer implementation "hook". # See Headnote 001 above. See also _get_indexer, # _get_integrater below. self._indexer = None self._refiner = None self._integrater = None # I don't need this - it is equivalent to self.getWavelength( # ).getCrystal().getLattice() # self._crystal_lattice = None # this means that this module will have to present largely the # same interface as Indexer and Integrater so that the calls # can be appropriately forwarded. # finally configure the beam if set if beam is not None: from dxtbx.model.detector_helpers import set_mosflm_beam_centre try: set_mosflm_beam_centre( self.get_imageset().get_detector(), self.get_imageset().get_beam(), beam, ) except AssertionError as e: logger.debug("Error setting mosflm beam centre: %s" % e) self._beam_centre = beam self._distance = distance self._gain = gain self._polarization = polarization self._add_detector_identification_to_cif()