def run(self, ignore_errors=False):
            """Run idxref."""

            # image_header = self.get_header()

            ## crank through the header dictionary and replace incorrect
            ## information with updated values through the indexer
            ## interface if available...

            ## need to add distance, wavelength - that should be enough...

            # if self.get_distance():
            # image_header['distance'] = self.get_distance()

            # if self.get_wavelength():
            # image_header['wavelength'] = self.get_wavelength()

            # if self.get_two_theta():
            # image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(
                self.get_imageset(),
                refined_beam_vector=self._refined_beam_vector,
                refined_rotation_axis=self._refined_rotation_axis,
                refined_distance=self._refined_distance,
            )

            xds_inp = open(os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=IDXREF\n")
            xds_inp.write("MAXIMUM_NUMBER_OF_PROCESSORS=%d\n" % self._parallel)

            # FIXME this needs to be calculated from the beam centre...

            if self._refined_origin:
                xds_inp.write("ORGX=%f ORGY=%f\n" % tuple(self._refined_origin))
            else:
                xds_inp.write("ORGX=%f ORGY=%f\n" % tuple(self._org))

            # FIXME in here make sure sweep is wider than 5 degrees
            # before specifying AXIS: if <= 5 degrees replace AXIS with
            # nothing - base this on the maximum possible angular separation

            min_frame = self._spot_range[0][0]
            max_frame = self._spot_range[-1][1]

            refine_params = [p for p in self._params.refine]

            phi_width = self.get_phi_width()
            if "AXIS" in refine_params and (max_frame - min_frame) * phi_width < 5.0:
                refine_params.remove("AXIS")

            xds_inp.write("REFINE(IDXREF)=%s\n" % " ".join(refine_params))

            if self._starting_frame and self._starting_angle:
                xds_inp.write("STARTING_FRAME=%d\n" % self._starting_frame)
                xds_inp.write("STARTING_ANGLE=%f\n" % self._starting_angle)

            # FIXME this looks like a potential bug - what will
            # happen if the input lattice has not been set??
            if self._indxr_input_cell:
                self._cell = self._indxr_input_cell
            if self._indxr_input_lattice:
                self._symm = lattice_to_spacegroup_number(self._indxr_input_lattice)

            if self._cell:
                xds_inp.write("SPACE_GROUP_NUMBER=%d\n" % self._symm)
                cell_format = "%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f"
                xds_inp.write("UNIT_CELL_CONSTANTS=%s\n" % cell_format % self._cell)

            if self._a_axis:
                xds_inp.write("UNIT_CELL_A-AXIS=%.2f %.2f %.2f\n" % tuple(self._a_axis))

            if self._b_axis:
                xds_inp.write("UNIT_CELL_B-AXIS=%.2f %.2f %.2f\n" % tuple(self._b_axis))

            if self._c_axis:
                xds_inp.write("UNIT_CELL_C-AXIS=%.2f %.2f %.2f\n" % tuple(self._c_axis))

            for record in header:
                xds_inp.write("%s\n" % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template())
            )

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)
            for spot_range in self._spot_range:
                xds_inp.write("SPOT_RANGE=%d %d\n" % spot_range)
            xds_inp.write("BACKGROUND_RANGE=%d %d\n" % self._background_range)

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(
                    self.get_working_directory(), "%d_IDXREF.INP" % self.get_xpid()
                ),
            )

            # write the input data files...
            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())
            if not ignore_errors:
                xds_check_error(self.get_all_output())

            # If xds_check_error detects any errors it will raise an exception
            # The caller can then continue using the run_continue_from_error()
            # function. If XDS does not throw any errors we just plow on.

            return self.continue_from_error()
示例#2
0
        def run(self):
            """Run xycorr."""

            # image_header = self.get_header()

            # crank through the header dictionary and replace incorrect
            # information with updated values through the indexer
            # interface if available...

            # need to add distance, wavelength - that should be enough...

            # if self.get_distance():
            # image_header['distance'] = self.get_distance()

            # if self.get_wavelength():
            # image_header['wavelength'] = self.get_wavelength()

            # if self.get_two_theta():
            # image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(self.get_imageset())

            from xia2.Handlers.Phil import PhilIndex

            xds_params = PhilIndex.params.xia2.settings.xds

            xds_inp = open(
                os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=XYCORR\n")

            for record in header:
                xds_inp.write("%s\n" % record)

            if xds_params.geometry_x and xds_params.geometry_y:
                xds_inp.write("X-GEO_CORR=%s\n" % xds_params.geometry_x)
                xds_inp.write("Y-GEO_CORR=%s\n" % xds_params.geometry_y)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template()))

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)
            for spot_range in self._spot_range:
                xds_inp.write("SPOT_RANGE=%d %d\n" % spot_range)
            xds_inp.write("BACKGROUND_RANGE=%d %d\n" % self._background_range)

            xds_inp.write("ORGX=%f ORGY=%f\n" % tuple(self._org))
            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(self.get_working_directory(),
                             "%d_XYCORR.INP" % self.get_xpid()),
            )

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())

            # check the status
            xds_check_error(self.get_all_output())

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XYCORR.LP"),
                os.path.join(self.get_working_directory(),
                             "%d_XYCORR.LP" % self.get_xpid()),
            )

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file)

            return
示例#3
0
        def run(self):
            """Run init."""

            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(
                os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=INIT\n")

            for record in header:
                xds_inp.write("%s\n" % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template()))

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            lib_str = find_hdf5_lib(
                os.path.join(self.get_directory(), self.get_template()))
            if lib_str:
                xds_inp.write(lib_str)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)
            for spot_range in self._spot_range:
                xds_inp.write("SPOT_RANGE=%d %d\n" % spot_range)
            xds_inp.write("BACKGROUND_RANGE=%d %d\n" % self._background_range)

            if self._params.fix_scale:
                if _running_xds_version() >= 20130330:
                    xds_inp.write("DATA_RANGE_FIXED_SCALE_FACTOR= %d %d 1\n" %
                                  self._data_range)
                else:
                    xds_inp.write("FIXED_SCALE_FACTOR=TRUE\n")

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(self.get_working_directory(),
                             "%d_INIT.INP" % self.get_xpid()),
            )

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())

            # check the job status here

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "INIT.LP"),
                os.path.join(self.get_working_directory(),
                             "%d_INIT.LP" % self.get_xpid()),
            )

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file)

            return
示例#4
0
        def run(self):
            '''Run correct.'''

            # this is ok...
            # if not self._cell:
            # raise RuntimeError('cell not set')
            # if not self._spacegroup_number:
            # raise RuntimeError('spacegroup not set')

            #image_header = self.get_header()

            ## crank through the header dictionary and replace incorrect
            ## information with updated values through the indexer
            ## interface if available...

            ## need to add distance, wavelength - that should be enough...

            #if self.get_distance():
            #image_header['distance'] = self.get_distance()

            #if self.get_wavelength():
            #image_header['wavelength'] = self.get_wavelength()

            #if self.get_two_theta():
            #image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(
                os.path.join(self.get_working_directory(), 'XDS.INP'), 'w')

            # what are we doing?
            xds_inp.write('JOB=CORRECT\n')
            xds_inp.write('MAXIMUM_NUMBER_OF_PROCESSORS=%d\n' % \
                          self._parallel)

            # check to see if we are excluding ice rings
            if self._ice != 0:
                Debug.write('Excluding ice rings')

                for record in open(
                        os.path.abspath(
                            os.path.join(os.path.dirname(__file__), '..', '..',
                                         'Data',
                                         'ice-rings.dat'))).readlines():

                    resol = tuple(map(float, record.split()[:2]))

                    xds_inp.write('EXCLUDE_RESOLUTION_RANGE= %.2f %.2f\n' % \
                                  resol)

            # exclude requested resolution ranges
            if self._excluded_regions:
                Debug.write('Excluding regions: %s' %
                            repr(self._excluded_regions))

                for upper, lower in self._excluded_regions:
                    xds_inp.write('EXCLUDE_RESOLUTION_RANGE= %.2f %.2f\n' % \
                                   (upper, lower))

            # postrefine everything to give better values to the
            # next INTEGRATE run
            xds_inp.write('REFINE(CORRECT)=%s\n' %
                          ' '.join(self._params.refine))

            if self._polarization > 0.0:
                xds_inp.write('FRACTION_OF_POLARIZATION=%.2f\n' % \
                              self._polarization)

            if self._params.air is not None:
                xds_inp.write('AIR=%f' % self._params.air)

            for record in header:
                xds_inp.write('%s\n' % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template()))

            record = 'NAME_TEMPLATE_OF_DATA_FRAMES=%s\n' % \
                     name_template

            xds_inp.write(record)

            xds_inp.write('DATA_RANGE=%d %d\n' % self._data_range)
            # xds_inp.write('MINIMUM_ZETA=0.1\n')
            # include the resolution range, perhaps
            if self._resolution_high or self._resolution_low:
                xds_inp.write('INCLUDE_RESOLUTION_RANGE=%.2f %.2f\n' % \
                              (self._resolution_low, self._resolution_high))

            if self._anomalous:
                xds_inp.write('FRIEDEL\'S_LAW=FALSE\n')
                xds_inp.write('STRICT_ABSORPTION_CORRECTION=TRUE\n')
            else:
                xds_inp.write('FRIEDEL\'S_LAW=TRUE\n')

            if self._spacegroup_number:
                if not self._cell:
                    raise RuntimeError(
                        'cannot set spacegroup without unit cell')

                xds_inp.write('SPACE_GROUP_NUMBER=%d\n' % \
                              self._spacegroup_number)
            if self._cell:
                xds_inp.write('UNIT_CELL_CONSTANTS=')
                xds_inp.write('%6.2f %6.2f %6.2f %6.2f %6.2f %6.2f\n' % \
                              tuple(self._cell))
            if self._reindex_matrix:
                xds_inp.write('REIDX=%d %d %d %d %d %d %d %d %d %d %d %d' % \
                              tuple(map(int, self._reindex_matrix)))

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), 'XDS.INP'),
                os.path.join(self.get_working_directory(),
                             '%d_CORRECT.INP' % self.get_xpid()))

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())
            xds_check_error(self.get_all_output())

            # look for errors
            # like this perhaps
            #   !!! ERROR !!! ILLEGAL SPACE GROUP NUMBER OR UNIT CELL

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), 'CORRECT.LP'),
                os.path.join(self.get_working_directory(),
                             '%d_CORRECT.LP' % self.get_xpid()))

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file)

            self._xds_ascii_hkl = os.path.join(self.get_working_directory(),
                                               'XDS_ASCII.HKL')

            # do some parsing of the correct output...

            self._results = _parse_correct_lp(
                os.path.join(self.get_working_directory(), 'CORRECT.LP'))

            # check that the unit cell is comparable to what went in i.e.
            # the volume is the same to within a factor of 10 (which is
            # extremely generous and should only spot gross errors)

            original = unit_cell(self._cell)
            refined = unit_cell(self._results['cell'])

            if original.volume() / refined.volume() > 10:
                raise RuntimeError('catastrophic change in unit cell volume')

            if refined.volume() / original.volume() > 10:
                raise RuntimeError('catastrophic change in unit cell volume')

            # record reindex operation used for future reference... this
            # is to trap trac #419

            if 'reindex_op' in self._results:
                format = 'XDS applied reindex:' + 12 * ' %d'
                Debug.write(format % tuple(self._results['reindex_op']))
                self._reindex_used = self._results['reindex_op']

            # get the reflections to remove...
            for line in open(
                    os.path.join(self.get_working_directory(), 'CORRECT.LP'),
                    'r').readlines():
                if '"alien"' in line:
                    h, k, l = tuple(map(int, line.split()[:3]))
                    z = float(line.split()[4])
                    if not (h, k, l, z) in self._remove:
                        self._remove.append((h, k, l, z))

            return
示例#5
0
        def run(self):
            '''Run colspot.'''

            #image_header = self.get_header()

            ## crank through the header dictionary and replace incorrect
            ## information with updated values through the indexer
            ## interface if available...

            ## need to add distance, wavelength - that should be enough...

            #if self.get_distance():
            #image_header['distance'] = self.get_distance()

            #if self.get_wavelength():
            #image_header['wavelength'] = self.get_wavelength()

            #if self.get_two_theta():
            #image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(
                os.path.join(self.get_working_directory(), 'XDS.INP'), 'w')

            # what are we doing?
            xds_inp.write('JOB=COLSPOT\n')
            xds_inp.write('MAXIMUM_NUMBER_OF_PROCESSORS=%d\n' % \
                          self._parallel)
            xds_inp.write('MAXIMUM_NUMBER_OF_JOBS=1\n')

            #if image_header['detector'] in ('pilatus', 'dectris'):
            if self.get_imageset().get_detector()[0].get_type(
            ) == 'SENSOR_PAD':
                xds_inp.write('MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT=%d\n' %
                              self._params.minimum_pixels_per_spot)

            for record in header:
                xds_inp.write('%s\n' % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template()))

            record = 'NAME_TEMPLATE_OF_DATA_FRAMES=%s\n' % \
                     name_template

            xds_inp.write(record)

            lib_str = find_hdf5_lib(
                os.path.join(self.get_directory(), self.get_template()))
            if lib_str:
                xds_inp.write(lib_str)

            xds_inp.write('DATA_RANGE=%d %d\n' % self._data_range)
            for spot_range in self._spot_range:
                xds_inp.write('SPOT_RANGE=%d %d\n' % spot_range)
            xds_inp.write('BACKGROUND_RANGE=%d %d\n' % \
                          self._background_range)

            if PhilIndex.params.xia2.settings.small_molecule == True:
                xds_inp.write('STRONG_PIXEL=5\n')
                # FIXME should probably be moved to a phil parameter

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), 'XDS.INP'),
                os.path.join(self.get_working_directory(),
                             '%d_COLSPOT.INP' % self.get_xpid()))

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), 'COLSPOT.LP'),
                os.path.join(self.get_working_directory(),
                             '%d_COLSPOT.LP' % self.get_xpid()))

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file)

            return
        def run(self):
            """Run integrate."""

            # image_header = self.get_header()

            ## crank through the header dictionary and replace incorrect
            ## information with updated values through the indexer
            ## interface if available...

            ## need to add distance, wavelength - that should be enough...

            # if self.get_distance():
            # image_header['distance'] = self.get_distance()

            # if self.get_wavelength():
            # image_header['wavelength'] = self.get_wavelength()

            # if self.get_two_theta():
            # image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=INTEGRATE\n")
            xds_inp.write("MAXIMUM_NUMBER_OF_PROCESSORS=%d\n" % self._parallel)

            from xia2.Handlers.Phil import PhilIndex

            xds_params = PhilIndex.params.xds
            if xds_params.profile_grid_size:
                ab, c = xds_params.profile_grid_size
                assert ab > 0 and ab < 22 and (ab % 2) == 1
                assert c > 0 and c < 22 and (c % 2) == 1
                xds_inp.write(
                    "NUMBER_OF_PROFILE_GRID_POINTS_ALONG_ALPHA/BETA= %d\n" % ab
                )
                xds_inp.write("NUMBER_OF_PROFILE_GRID_POINTS_ALONG_GAMMA= %d\n" % c)

            from libtbx import Auto

            mp_params = PhilIndex.params.xia2.settings.multiprocessing
            if mp_params.mode == "serial" and mp_params.njob > 1:
                xds_inp.write("MAXIMUM_NUMBER_OF_JOBS=%d\n" % mp_params.njob)

            elif mp_params.mode == "serial" and mp_params.njob == Auto:
                chunk_width = 30.0
                phi_width = self.get_phi_width()
                nchunks = int(
                    (self._data_range[1] - self._data_range[0] + 1)
                    * phi_width
                    / chunk_width
                )

                Debug.write("Xparallel: -1 using %d chunks" % nchunks)

                xds_inp.write("MAXIMUM_NUMBER_OF_JOBS=%d\n" % nchunks)
            else:
                xds_inp.write("MAXIMUM_NUMBER_OF_JOBS=1\n")

            profile_fitting = PhilIndex.params.xia2.settings.integration.profile_fitting
            if not profile_fitting:
                xds_inp.write("PROFILE_FITTING=FALSE\n")

            # write out lots of output
            xds_inp.write("TEST=2\n")

            if self._params.delphi:
                xds_inp.write("DELPHI=%.1f\n" % self._params.delphi)
            elif PhilIndex.params.xia2.settings.small_molecule:
                xds_inp.write("DELPHI=%.1f\n" % xds_params.delphi_small)
            else:
                xds_inp.write("DELPHI=%.1f\n" % xds_params.delphi)

            if self._refined_xparm:
                xds_inp.write(
                    "REFINE(INTEGRATE)=%s\n" % " ".join(self._params.refine_final)
                )
            else:
                xds_inp.write("REFINE(INTEGRATE)=%s\n" % " ".join(self._params.refine))

            if self._params.fix_scale:
                if _running_xds_version() >= 20130330:
                    xds_inp.write(
                        "DATA_RANGE_FIXED_SCALE_FACTOR= %d %d 1\n" % self._data_range
                    )
                else:
                    xds_inp.write("FIXED_SCALE_FACTOR=TRUE\n")

            # check for updated input parameters or ones from phil

            if (
                "BEAM_DIVERGENCE" in self._updates
                and "BEAM_DIVERGENCE_E.S.D." in self._updates
            ):
                xds_inp.write(
                    "BEAM_DIVERGENCE=%f BEAM_DIVERGENCE_E.S.D.=%f\n"
                    % (
                        self._updates["BEAM_DIVERGENCE"],
                        self._updates["BEAM_DIVERGENCE_E.S.D."],
                    )
                )
            elif self._params.beam_divergence and self._params.beam_divergence_esd:
                xds_inp.write(
                    "BEAM_DIVERGENCE=%f BEAM_DIVERGENCE_E.S.D.=%f\n"
                    % (self._params.beam_divergence, self._params.beam_divergence_esd)
                )

            if (
                "REFLECTING_RANGE" in self._updates
                and "REFLECTING_RANGE_E.S.D." in self._updates
            ):
                xds_inp.write(
                    "REFLECTING_RANGE=%f REFLECTING_RANGE_E.S.D.=%f\n"
                    % (
                        self._updates["REFLECTING_RANGE"],
                        self._updates["REFLECTING_RANGE_E.S.D."],
                    )
                )
            elif self._params.reflecting_range and self._params.reflecting_range_esd:
                xds_inp.write(
                    "REFLECTING_RANGE=%f REFLECTING_RANGE_E.S.D.=%f\n"
                    % (self._params.reflecting_range, self._params.reflecting_range_esd)
                )

            for record in header:
                xds_inp.write("%s\n" % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template())
            )

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            lib_str = find_hdf5_lib(
                os.path.join(self.get_directory(), self.get_template())
            )
            if lib_str:
                xds_inp.write(lib_str)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(
                    self.get_working_directory(), "%d_INTEGRATE.INP" % self.get_xpid()
                ),
            )

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())
            xds_check_error(self.get_all_output())

            # look for errors
            # like this perhaps - what the hell does this mean?
            #   !!! ERROR !!! "STRONGHKL": ASSERT VIOLATION

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "INTEGRATE.LP"),
                os.path.join(
                    self.get_working_directory(), "%d_INTEGRATE.LP" % self.get_xpid()
                ),
            )

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file
                )

            self._integrate_hkl = os.path.join(
                self.get_working_directory(), "INTEGRATE.HKL"
            )

            # look through integrate.lp for some useful information
            # to help with the analysis

            space_group_number = 0

            mosaics = []

            for o in open(
                os.path.join(self.get_working_directory(), "INTEGRATE.LP")
            ).readlines():
                if "SPACE_GROUP_NUMBER" in o:
                    space_group_number = int(o.split()[-1])
                if "CRYSTAL MOSAICITY (DEGREES)" in o:
                    mosaic = float(o.split()[-1])
                    mosaics.append(mosaic)

            assert (
                len(mosaics) > 0
            ), "XDS refinement failed (no mosaic spread range reported)"
            self._min_mosaic = min(mosaics)
            self._max_mosaic = max(mosaics)
            self._mean_mosaic = sum(mosaics) / len(mosaics)

            Debug.write(
                "Mosaic spread range: %.3f %.3f %.3f"
                % (self._min_mosaic, self._mean_mosaic, self._max_mosaic)
            )

            stats = _parse_integrate_lp(
                os.path.join(self.get_working_directory(), "INTEGRATE.LP")
            )

            self._per_image_statistics = stats

            self._updates = _parse_integrate_lp_updates(
                os.path.join(self.get_working_directory(), "INTEGRATE.LP")
            )

            return
示例#7
0
        def run(self):
            """Run colspot."""
            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=COLSPOT\n")
            xds_inp.write("MAXIMUM_NUMBER_OF_PROCESSORS=%d\n" % self._parallel)
            xds_inp.write("MAXIMUM_NUMBER_OF_JOBS=1\n")

            if self.get_imageset().get_detector()[0].get_type() == "SENSOR_PAD":
                xds_inp.write(
                    "MINIMUM_NUMBER_OF_PIXELS_IN_A_SPOT=%d\n"
                    % self._params.minimum_pixels_per_spot
                )

            for record in header:
                xds_inp.write("%s\n" % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template())
            )

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            lib_str = find_hdf5_lib(
                os.path.join(self.get_directory(), self.get_template())
            )
            if lib_str:
                xds_inp.write(lib_str)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)
            for spot_range in self._spot_range:
                xds_inp.write("SPOT_RANGE=%d %d\n" % spot_range)
            xds_inp.write("BACKGROUND_RANGE=%d %d\n" % self._background_range)

            if PhilIndex.params.xia2.settings.small_molecule:
                xds_inp.write("STRONG_PIXEL=5\n")
                # FIXME should probably be moved to a phil parameter

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(
                    self.get_working_directory(), "%d_COLSPOT.INP" % self.get_xpid()
                ),
            )

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "COLSPOT.LP"),
                os.path.join(
                    self.get_working_directory(), "%d_COLSPOT.LP" % self.get_xpid()
                ),
            )

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file
                )
示例#8
0
        def run(self):
            """Run defpix."""

            # image_header = self.get_header()

            ## crank through the header dictionary and replace incorrect
            ## information with updated values through the indexer
            ## interface if available...

            ## need to add distance, wavelength - that should be enough...

            # if self.get_distance():
            # image_header['distance'] = self.get_distance()

            # if self.get_wavelength():
            # image_header['wavelength'] = self.get_wavelength()

            # if self.get_two_theta():
            # image_header['two_theta'] = self.get_two_theta()

            header = imageset_to_xds(self.get_imageset())

            xds_inp = open(
                os.path.join(self.get_working_directory(), "XDS.INP"), "w")

            # what are we doing?
            xds_inp.write("JOB=DEFPIX\n")

            for record in header:
                xds_inp.write("%s\n" % record)

            name_template = template_to_xds(
                os.path.join(self.get_directory(), self.get_template()))

            record = "NAME_TEMPLATE_OF_DATA_FRAMES=%s\n" % name_template

            xds_inp.write(record)

            xds_inp.write("DATA_RANGE=%d %d\n" % self._data_range)

            # include the resolution range, perhaps
            if self._resolution_high > 0.0 or self._resolution_low > 0.0:
                xds_inp.write("INCLUDE_RESOLUTION_RANGE=%.2f %.2f\n" %
                              (self._resolution_low, self._resolution_high))

            if self._value_range_for_trusted_detector_pixels is not None:
                xds_inp.write("VALUE_RANGE_FOR_TRUSTED_DETECTOR_PIXELS=%i %i" %
                              self._value_range_for_trusted_detector_pixels)

            xds_inp.close()

            # copy the input file...
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "XDS.INP"),
                os.path.join(self.get_working_directory(),
                             "%d_DEFPIX.INP" % self.get_xpid()),
            )

            # write the input data files...

            for file_name in self._input_data_files_list:
                src = self._input_data_files[file_name]
                dst = os.path.join(self.get_working_directory(), file_name)
                if src != dst:
                    shutil.copyfile(src, dst)

            self.start()
            self.close_wait()

            xds_check_version_supported(self.get_all_output())

            # copy the LP file
            shutil.copyfile(
                os.path.join(self.get_working_directory(), "DEFPIX.LP"),
                os.path.join(self.get_working_directory(),
                             "%d_DEFPIX.LP" % self.get_xpid()),
            )

            # check the resolution asked for is achievable (if set)
            for record in open(
                    os.path.join(self.get_working_directory(), "DEFPIX.LP")):
                if "RESOLUTION RANGE RECORDED BY DETECTOR" in record:
                    real_high = float(record.split()[-1])
                    if self._resolution_high:
                        if real_high > self._resolution_high + 0.01:
                            logger.warning(
                                "Warning: resolution limited to %.2f",
                                real_high)

            # gather the output files

            for file in self._output_data_files_list:
                self._output_data_files[file] = os.path.join(
                    self.get_working_directory(), file)