def _prepare_pointless_hklin(working_directory, hklin, phi_width): '''Prepare some data for pointless - this will take only 180 degrees of data if there is more than this (through a "rebatch" command) else will simply return hklin.''' # also remove blank images? if not Flags.get_microcrystal() and not Flags.get_small_molecule(): Debug.write('Excluding blank images') hklout = os.path.join( working_directory, '%s_noblank.mtz' % (os.path.split(hklin)[-1][:-4])) FileHandler.record_temporary_file(hklout) hklin = remove_blank(hklin, hklout) # find the number of batches md = Mtzdump() md.set_working_directory(working_directory) auto_logfiler(md) md.set_hklin(hklin) md.dump() batches = max(md.get_batches()) - min(md.get_batches()) phi_limit = 180 if batches * phi_width < phi_limit or Flags.get_small_molecule(): return hklin hklout = os.path.join( working_directory, '%s_prepointless.mtz' % (os.path.split(hklin)[-1][:-4])) rb = Rebatch() rb.set_working_directory(working_directory) auto_logfiler(rb) rb.set_hklin(hklin) rb.set_hklout(hklout) first = min(md.get_batches()) last = first + int(phi_limit / phi_width) Debug.write('Preparing data for pointless - %d batches (%d degrees)' % \ ((last - first), phi_limit)) rb.limit_batches(first, last) # we will want to delete this one exit FileHandler.record_temporary_file(hklout) return hklout
def copyfree(self): '''Copy the free column from freein into hklin -> hklout.''' if not self._hklin_files: raise RuntimeError('no hklin files defined') if len(self._hklin_files) > 1: raise RuntimeError('can have only one hklin to update') hklin = self._hklin_files[0] # get the resolution limit to give as a limit for the FreeR # column md = Mtzdump() md.set_working_directory(self.get_working_directory()) md.set_hklin(hklin) md.dump() resolution_range = md.get_resolution_range() self.check_hklout() if self._freein is None: raise RuntimeError('freein not defined') if self._freein_column is None: raise RuntimeError('freein column not defined') self.add_command_line('hklin1') self.add_command_line(self._freein) self.add_command_line('hklin2') self.add_command_line(hklin) self.start() self.input('labin file_number 1 E1=%s' % self._freein_column) self.input('resolution file_number 1 %f %f' % resolution_range) self.input('labin file_number 2 all') self.close_wait() try: self.check_for_errors() self.check_ccp4_errors() except RuntimeError as e: # something went wrong; remove the output file try: os.remove(self.get_hklout()) except Exception: pass raise e return self.get_ccp4_status()
def merge(self): '''Merge multiple reflection files into one file.''' if not self._hklin_files: raise RuntimeError('no hklin files defined') self.check_hklout() hklin_counter = 0 # for each reflection file, need to gather the column names # and so on, to put in the cad input here - also check to see # if the column names clash... check also that the spacegroups # match up... spacegroup = None column_names = [] column_names_by_file = {} for hklin in self._hklin_files: md = Mtzdump() md.set_working_directory(self.get_working_directory()) md.set_hklin(hklin) md.dump() columns = md.get_columns() spag = md.get_spacegroup() if spacegroup is None: spacegroup = spag if spag != spacegroup: raise RuntimeError('spacegroups do not match') column_names_by_file[hklin] = [] for c in columns: name = c[0] if name in ['H', 'K', 'L']: continue if name in column_names: raise RuntimeError('duplicate column names') column_names.append(name) column_names_by_file[hklin].append(name) # if we get to here then this is a good set up... # create the command line hklin_counter = 0 for hklin in self._hklin_files: hklin_counter += 1 self.add_command_line('hklin%d' % hklin_counter) self.add_command_line(hklin) self.start() hklin_counter = 0 for hklin in self._hklin_files: column_counter = 0 hklin_counter += 1 labin_command = 'labin file_number %d' % hklin_counter for column in column_names_by_file[hklin]: column_counter += 1 labin_command += ' E%d=%s' % (column_counter, column) self.input(labin_command) self.close_wait() try: self.check_for_errors() self.check_ccp4_errors() except RuntimeError as e: # something went wrong; remove the output file try: os.remove(self.get_hklout()) except Exception: pass raise e return self.get_ccp4_status()