예제 #1
0
파일: XScaleR.py 프로젝트: hainm/xia2
    def run(self):
      '''Actually run XSCALE.'''

      self._write_xscale_inp()

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

      self.start()
      self.close_wait()

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

      # now look at XSCALE.LP
      xds_check_error(self.get_all_output())

      dname = None

      # get the outlier reflections... and the overall scale factor
      for line in open(os.path.join(
          self.get_working_directory(),
          'XSCALE.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))

        if 'FACTOR TO PLACE ALL DATA SETS TO ' in line:
          self._scale_factor = float(line.split()[-1])

        if 'STATISTICS OF SCALED OUTPUT DATA SET' in line:
          dname = line.split()[-1].replace('.HKL', '')

        if 'total' in line and not dname in self._rmerges:
          if len(line.split()) > 5:
            self._rmerges[dname] = float(
                line.replace('%', '').split()[5])

        # trac #419 - if the data sets are not correctly indexed,
        # throw an exception. N.B. this will only work if the
        # data sets are moderately complete (i.e. there are more
        # than a handful of common reflections) - which may not be
        # the case in MULTICRYSTAL mode.

        if ' !!! WARNING !!! ' in line and \
               'CORRELATION FACTORS ARE DANGEROUSLY SMALL' in line:
          groups = get_correlation_coefficients_and_group(
              os.path.join(self.get_working_directory(),
                           'XSCALE.LP'))
          Debug.write('Low correlations - check data sets')
          for j, name in enumerate(groups):
            Debug.write('Group %d' % j)
            for file_name in groups[name]:
              Debug.write(file_name)

          if not Flags.get_microcrystal():
            raise RuntimeError, 'reindexing error: %s' % \
                  os.path.join(self.get_working_directory(),
                               'XSCALE.LP')

      return
예제 #2
0
파일: XDSIntegrate.py 프로젝트: xia2/xia2
    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)

      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 == True:
        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)

      xds_inp.write('DATA_RANGE=%d %d\n' % self._data_range)
      # xds_inp.write('MINIMUM_ZETA=0.1\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_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
예제 #3
0
파일: XDSCorrect.py 프로젝트: hainm/xia2
    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 len(self._excluded_regions) != 0:
        Debug.write('Excluding regions: %s' % `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)

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

      name_template = os.path.join(self.get_directory(),
                                   self.get_template().replace('#', '?'))

      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
예제 #4
0
파일: XDSIdxref.py 프로젝트: xia2/xia2
    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()
예제 #5
0
파일: XDSXycorr.py 프로젝트: hainm/xia2
    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 = os.path.join(self.get_directory(),
                                   self.get_template().replace('#', '?'))

      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