def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginControlXdsBest.preProcess") self._xds = self.loadPlugin('EDPluginExecMinimalXdsv1_0') # save the root path (where the initial xds.inp is) for later use self.root_dir = os.path.abspath(os.path.dirname(self.dataInput.input_file.value)) # let's begin by copying the input file to avoid clobbering it shutil.copy(self.dataInput.input_file.value, self.getWorkingDirectory()) self.real_input_file = os.path.join(self.getWorkingDirectory(), os.path.basename(self.dataInput.input_file.value)) # update the keywords self.parsed_config = parse_xds_file(self.real_input_file) di = self.dataInput unit_cell_constants = '{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f}'.format( di.unit_cell_a.value, di.unit_cell_b.value, di.unit_cell_c.value, di.unit_cell_alpha.value, di.unit_cell_beta.value, di.unit_cell_gamma.value) sg = int(di.space_group.value) self.parsed_config['UNIT_CELL_CONSTANTS='] = unit_cell_constants self.parsed_config['SPACE_GROUP_NUMBER='] = sg # to avoid any problem let's also make the image template # absolute as well. The underlying XDS template will take care # of creating the links in its dir imtemplate = self.parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='][0] basedir = os.path.abspath(os.path.dirname(self.dataInput.input_file.value)) newpath = os.path.join(basedir, imtemplate) self.parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='] = newpath # Make the [XY]-GEO_CORR paths absolute if 'X-GEO_CORR=' in self.parsed_config: xgeo = os.path.abspath(os.path.join(self.root_dir, self.parsed_config['X-GEO_CORR='][0])) if not os.path.exists(xgeo): self.DEBUG('geometry file {0} does not exist, removing'.format(xgeo)) del self.parsed_config['X-GEO_CORR='] else: self.parsed_config['X-GEO_CORR='] = xgeo if 'Y-GEO_CORR=' in self.parsed_config: ygeo = os.path.abspath(os.path.join(self.root_dir, self.parsed_config['Y-GEO_CORR='][0])) if not os.path.exists(ygeo): self.DEBUG('geometry file {0} does not exist, removing'.format(ygeo)) del self.parsed_config['Y-GEO_CORR='] else: self.parsed_config['Y-GEO_CORR='] = ygeo dump_xds_file(self.real_input_file, self.parsed_config) # create the input data model for the XDS plugin input_dm = XSDataMinimalXdsIn() input_dm.input_file = XSDataString(self.real_input_file) self._xds.dataInput = input_dm
def process(self, _edObject=None): EDPluginControl.process(self) self.DEBUG("EDPluginControlXdsBest.process") self._xds.executeSynchronous() expected = os.path.join(self._xds.getWorkingDirectory(), 'XDS_ASCII.HKL') if not os.path.exists(expected): # Try to re-run with JOB = DEFPIX INTEGRATE CORRECT self.parsed_config["JOB="] = "DEFPIX INTEGRATE CORRECT" self._xds2 = self.loadPlugin('EDPluginExecMinimalXdsv1_0') self._xds2.setWorkingDirectory(self._xds.getWorkingDirectory()) dump_xds_file(self.real_input_file, self.parsed_config) input_dm2 = XSDataMinimalXdsIn() input_dm2.input_file = XSDataString(self.real_input_file) self._xds2.dataInput = input_dm2 self._xds2.executeSynchronous()
def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginXDSGeneratev1_0.preProcess") self.xds_anom = self.loadPlugin('EDPluginExecMinimalXdsv1_0') self.xds_noanom = self.loadPlugin('EDPluginExecMinimalXdsv1_0') path = os.path.abspath(self.dataInput.previous_run_dir.value) # The MinimalXds plugin takes care of creating determining the # real images directory and creating a symlink to it so we # only need to update the NAMED_TEMPLATE_OF_DATA_FILES keyword # to not be relative anymore. We'll copy it to our own dir # beforehand to avoid clobbering it xdsinp = os.path.join(path, 'XDS.INP') new_xdsinp = os.path.join(self.getWorkingDirectory(), 'XDS.INP') copyfile(xdsinp, new_xdsinp) parsed_config = parse_xds_file(new_xdsinp) file_template = parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='][0] parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='] = os.path.abspath(os.path.join(path, file_template)) dump_xds_file(new_xdsinp, parsed_config) # create the data inputs now we know the files are here input_anom = XSDataMinimalXdsIn() input_anom.input_file = XSDataString(new_xdsinp) input_anom.friedels_law = XSDataBoolean(False) input_anom.job = XSDataString('CORRECT') input_anom.resolution = self.dataInput.resolution input_anom.resolution_range = [XSDataDouble(60), self.dataInput.resolution] input_anom.spacegroup = self.dataInput.spacegroup input_anom.unit_cell = self.dataInput.unit_cell self.xds_anom.dataInput = input_anom input_noanom = XSDataMinimalXdsIn() input_noanom.input_file = XSDataString(new_xdsinp) input_noanom.friedels_law = XSDataBoolean(True) input_noanom.job = XSDataString('CORRECT') input_noanom.resolution_range = [XSDataDouble(60), self.dataInput.resolution] input_noanom.spacegroup = self.dataInput.spacegroup input_noanom.unit_cell = self.dataInput.unit_cell self.xds_noanom.dataInput = input_noanom xds_anom_dir = os.path.abspath(self.xds_anom.getWorkingDirectory()) xds_noanom_dir = os.path.abspath(self.xds_noanom.getWorkingDirectory()) # let's make some links! for f in self._to_link: os.symlink(f, os.path.join(xds_anom_dir, os.path.basename(f))) os.symlink(f, os.path.join(xds_noanom_dir, os.path.basename(f)))
def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginControlXdsBest.preProcess") self._xds = self.loadPlugin('EDPluginExecMinimalXdsv1_0') # save the root path (where the initial xds.inp is) for later use self.root_dir = os.path.abspath( os.path.dirname(self.dataInput.input_file.value)) # let's begin by copying the input file to avoid clobbering it shutil.copy(self.dataInput.input_file.value, self.getWorkingDirectory()) self.real_input_file = os.path.join( self.getWorkingDirectory(), os.path.basename(self.dataInput.input_file.value)) # update the keywords self.parsed_config = parse_xds_file(self.real_input_file) di = self.dataInput unit_cell_constants = '{0:.2f} {1:.2f} {2:.2f} {3:.2f} {4:.2f} {5:.2f}'.format( di.unit_cell_a.value, di.unit_cell_b.value, di.unit_cell_c.value, di.unit_cell_alpha.value, di.unit_cell_beta.value, di.unit_cell_gamma.value) sg = int(di.space_group.value) self.parsed_config['UNIT_CELL_CONSTANTS='] = unit_cell_constants self.parsed_config['SPACE_GROUP_NUMBER='] = sg # to avoid any problem let's also make the image template # absolute as well. The underlying XDS template will take care # of creating the links in its dir imtemplate = self.parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='][0] basedir = os.path.abspath( os.path.dirname(self.dataInput.input_file.value)) newpath = os.path.join(basedir, imtemplate) self.parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='] = newpath # Make the [XY]-GEO_CORR paths absolute if 'X-GEO_CORR=' in self.parsed_config: xgeo = os.path.abspath( os.path.join(self.root_dir, self.parsed_config['X-GEO_CORR='][0])) if not os.path.exists(xgeo): self.DEBUG( 'geometry file {0} does not exist, removing'.format(xgeo)) del self.parsed_config['X-GEO_CORR='] else: self.parsed_config['X-GEO_CORR='] = xgeo if 'Y-GEO_CORR=' in self.parsed_config: ygeo = os.path.abspath( os.path.join(self.root_dir, self.parsed_config['Y-GEO_CORR='][0])) if not os.path.exists(ygeo): self.DEBUG( 'geometry file {0} does not exist, removing'.format(ygeo)) del self.parsed_config['Y-GEO_CORR='] else: self.parsed_config['Y-GEO_CORR='] = ygeo dump_xds_file(self.real_input_file, self.parsed_config) # create the input data model for the XDS plugin input_dm = XSDataMinimalXdsIn() input_dm.input_file = XSDataString(self.real_input_file) self._xds.dataInput = input_dm
def process(self, _edObject=None): EDPluginControl.process(self) self.DEBUG("EDPluginControlRunXdsFastProcv1_0.process") # First run is vanilla without any modification params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell # Fix for 'SPOT_RANGE 0 100' problem for srange in self.spot_range: if srange[0] > 0: xsDataRange = XSDataRange() xsDataRange.begin = srange[0] xsDataRange.end = srange[1] params.addSpot_range(xsDataRange) # Gleb on Mon Aug 4 18:54:36 CEST 2014: set jobs parameters in order to prevent # params.job = XSDataString('XYCORR INIT COLSPOT IDXREF') self.first_run.dataInput = params self.first_run.executeSynchronous() self.retrieveFailureMessages(self.first_run, "First XDS run") EDVerbose.DEBUG('first run completed...') if self.first_run.dataOutput is not None and self.first_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.first_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: self.second_run = self.loadPlugin(self.controlled_plugin_name) self.screen('Retrying with increased SPOT_RANGE') self.DEBUG('copying previously generated files to the new plugin dir') copy_xds_files(self.first_run.getWorkingDirectory(), self.second_run.getWorkingDirectory()) params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file # params.job = XSDataString('DEFPIX INTEGRATE CORRECT') params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell # Extended spot range if self.end_image_no <= 300: # All data as spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = 1 xsDataRangeLimited.end = self.end_image_no params.addSpot_range(xsDataRangeLimited) else: # Start spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = 1 xsDataRangeLimited.end = 100 params.addSpot_range(xsDataRangeLimited) # Start spot range middleImageNumber = int(self.end_image_no / 2) xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = middleImageNumber - 49 xsDataRangeLimited.end = middleImageNumber + 50 params.addSpot_range(xsDataRangeLimited) # End spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = self.end_image_no - 99 xsDataRangeLimited.end = self.end_image_no params.addSpot_range(xsDataRangeLimited) self.second_run.dataInput = params self.second_run.executeSynchronous() self.retrieveFailureMessages(self.second_run, "Second XDS run") EDVerbose.DEBUG('second run completed') if self.second_run.dataOutput is not None and self.second_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.second_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: self.third_run = self.loadPlugin(self.controlled_plugin_name) self.screen('Retrying with reduced SPOT_RANGE') self.DEBUG('copying previously generated files to the new plugin dir') copy_xds_files(self.first_run.getWorkingDirectory(), self.third_run.getWorkingDirectory()) params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file # params.job = XSDataString('DEFPIX INTEGRATE CORRECT') params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell # Limited spot range: 1 to 20 or max no data points xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = 1 xsDataRangeLimited.end = 20 if self.end_image_no > 20 else self.end_image_no params.addSpot_range(xsDataRangeLimited) self.third_run.dataInput = params self.third_run.executeSynchronous() self.retrieveFailureMessages(self.third_run, "Second XDS run") EDVerbose.DEBUG('second run completed') if self.third_run.dataOutput is not None and self.third_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.third_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: # all runs failed so bail out ... strErrorMessage = "All three XDS runs failed" self.addErrorMessage(strErrorMessage) self.ERROR(strErrorMessage) self.setFailure() else: # use the xds parser plugin to parse the xds output file... parser = self.loadPlugin("EDPluginParseXdsOutputv1_0") wd = self.successful_run.getWorkingDirectory() parser_input = XSDataXdsOutputFile() correct_lp_path = XSDataFile() correct_lp_path.path = XSDataString(os.path.join(wd, 'CORRECT.LP')) parser_input.correct_lp = correct_lp_path gxparm_path = os.path.join(wd, 'GXPARM.XDS') if os.path.isfile(gxparm_path): gxparm = XSDataFile() gxparm.path = XSDataString(os.path.join(wd, 'GXPARM.XDS')) parser_input.gxparm = gxparm parser.dataInput = parser_input parser.executeSynchronous() if parser.isFailure(): # that should not happen strErrorMessage = "Parser failure in XDS fast proc" self.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() return self.dataOutput = parser.dataOutput
def preProcess(self, _edObject=None): EDPluginControl.preProcess(self) self.DEBUG("EDPluginXDSGeneratev1_0.preProcess") if self.dataInput.doAnomAndNonanom is not None: if self.dataInput.doAnomAndNonanom.value: self.doAnomAndNonanom = True else: self.doAnomAndNonanom = False self.xds_anom = self.loadPlugin('EDPluginExecMinimalXdsv1_0') if self.doAnomAndNonanom: self.xds_noanom = self.loadPlugin('EDPluginExecMinimalXdsv1_0') path = os.path.abspath(self.dataInput.previous_run_dir.value) # The MinimalXds plugin takes care of creating determining the # real images directory and creating a symlink to it so we # only need to update the NAMED_TEMPLATE_OF_DATA_FILES keyword # to not be relative anymore. We'll copy it to our own dir # beforehand to avoid clobbering it xdsinp = os.path.join(path, 'XDS.INP') new_xdsinp = os.path.join(self.getWorkingDirectory(), 'XDS.INP') copyfile(xdsinp, new_xdsinp) parsed_config = parse_xds_file(new_xdsinp) file_template = parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='][0] parsed_config['NAME_TEMPLATE_OF_DATA_FRAMES='] = os.path.abspath( os.path.join(path, file_template)) dump_xds_file(new_xdsinp, parsed_config) # create the data inputs now we know the files are here input_anom = XSDataMinimalXdsIn() input_anom.input_file = XSDataString(new_xdsinp) input_anom.friedels_law = XSDataBoolean(False) input_anom.job = XSDataString('CORRECT') input_anom.resolution = self.dataInput.resolution input_anom.resolution_range = [ XSDataDouble(60), self.dataInput.resolution ] input_anom.spacegroup = self.dataInput.spacegroup input_anom.unit_cell = self.dataInput.unit_cell self.xds_anom.dataInput = input_anom xds_anom_dir = os.path.abspath(self.xds_anom.getWorkingDirectory()) if self.doAnomAndNonanom: input_noanom = XSDataMinimalXdsIn() input_noanom.input_file = XSDataString(new_xdsinp) input_noanom.friedels_law = XSDataBoolean(True) input_noanom.job = XSDataString('CORRECT') input_noanom.resolution_range = [ XSDataDouble(60), self.dataInput.resolution ] input_noanom.spacegroup = self.dataInput.spacegroup input_noanom.unit_cell = self.dataInput.unit_cell self.xds_noanom.dataInput = input_noanom xds_noanom_dir = os.path.abspath( self.xds_noanom.getWorkingDirectory()) # let's make some links! for f in self._to_link: os.symlink(f, os.path.join(xds_anom_dir, os.path.basename(f))) if self.doAnomAndNonanom: os.symlink(f, os.path.join(xds_noanom_dir, os.path.basename(f)))
def process(self, _edObject=None): EDPluginControl.process(self) self.DEBUG("EDPluginControlRunXdsFastProcv1_0.process") # First run is vanilla without any modification params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell params.start_image = self.dataInput.start_image params.end_image = self.dataInput.end_image # Fix for 'SPOT_RANGE 0 100' problem for srange in self.spot_range: if srange[0] > 0: xsDataRange = XSDataRange() xsDataRange.begin = srange[0] xsDataRange.end = srange[1] params.addSpot_range(xsDataRange) # Gleb on Mon Aug 4 18:54:36 CEST 2014: set jobs parameters in order to prevent # params.job = XSDataString('XYCORR INIT COLSPOT IDXREF') self.first_run.dataInput = params self.first_run.executeSynchronous() self.retrieveFailureMessages(self.first_run, "First XDS run") EDVerbose.DEBUG('first run completed...') if self.first_run.dataOutput is not None and self.first_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.first_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: self.second_run = self.loadPlugin(self.controlled_plugin_name) self.screen('Retrying with increased SPOT_RANGE') self.DEBUG( 'copying previously generated files to the new plugin dir') copy_xds_files(self.first_run.getWorkingDirectory(), self.second_run.getWorkingDirectory()) params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file # params.job = XSDataString('DEFPIX INTEGRATE CORRECT') params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell # Extended spot range if self.end_image_no - self.start_image_no < 300: # All data as spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = self.start_image_no xsDataRangeLimited.end = self.end_image_no params.addSpot_range(xsDataRangeLimited) else: # Start spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = self.start_image_no xsDataRangeLimited.end = self.start_image_no + 99 params.addSpot_range(xsDataRangeLimited) # Start spot range middleImageNumber = self.start_image_no + int( self.end_image_no / 2) - 1 xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = middleImageNumber - 49 xsDataRangeLimited.end = middleImageNumber + 50 params.addSpot_range(xsDataRangeLimited) # End spot range xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = self.end_image_no - 99 xsDataRangeLimited.end = self.end_image_no params.addSpot_range(xsDataRangeLimited) self.second_run.dataInput = params self.second_run.executeSynchronous() self.retrieveFailureMessages(self.second_run, "Second XDS run") EDVerbose.DEBUG('second run completed') if self.second_run.dataOutput is not None and self.second_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.second_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: self.third_run = self.loadPlugin(self.controlled_plugin_name) self.screen('Retrying with reduced SPOT_RANGE') self.DEBUG( 'copying previously generated files to the new plugin dir') copy_xds_files(self.first_run.getWorkingDirectory(), self.third_run.getWorkingDirectory()) params = XSDataMinimalXdsIn() params.input_file = self.dataInput.input_file # params.job = XSDataString('DEFPIX INTEGRATE CORRECT') params.spacegroup = self.dataInput.spacegroup params.unit_cell = self.dataInput.unit_cell # Limited spot range: 1 to 20 or max no data points xsDataRangeLimited = XSDataRange() xsDataRangeLimited.begin = 1 xsDataRangeLimited.end = 20 if self.end_image_no > 20 else self.end_image_no params.addSpot_range(xsDataRangeLimited) self.third_run.dataInput = params self.third_run.executeSynchronous() self.retrieveFailureMessages(self.third_run, "Second XDS run") EDVerbose.DEBUG('second run completed') if self.third_run.dataOutput is not None and self.third_run.dataOutput.succeeded.value: EDVerbose.DEBUG('... and it worked') self.successful_run = self.third_run else: EDVerbose.DEBUG('... and it failed') if not self.successful_run: # all runs failed so bail out ... strErrorMessage = "All three XDS runs failed" self.addErrorMessage(strErrorMessage) self.ERROR(strErrorMessage) self.setFailure() else: # use the xds parser plugin to parse the xds output file... parser = self.loadPlugin("EDPluginParseXdsOutputv1_0") wd = self.successful_run.getWorkingDirectory() parser_input = XSDataXdsOutputFile() correct_lp_path = XSDataFile() correct_lp_path.path = XSDataString(os.path.join(wd, 'CORRECT.LP')) parser_input.correct_lp = correct_lp_path gxparm_path = os.path.join(wd, 'GXPARM.XDS') if os.path.isfile(gxparm_path): gxparm = XSDataFile() gxparm.path = XSDataString(os.path.join(wd, 'GXPARM.XDS')) parser_input.gxparm = gxparm parser.dataInput = parser_input parser.executeSynchronous() if parser.isFailure(): # that should not happen strErrorMessage = "Parser failure in XDS fast proc" self.ERROR(strErrorMessage) self.addErrorMessage(strErrorMessage) self.setFailure() return self.dataOutput = parser.dataOutput