def _migrate_proc_tool(project: Project, old_paths: OldPaths, tool: str): _log(f"MIGRATE PROC TOOL {tool} RESULTS") tool_dir = "xdsxscale" if tool == "xds" else tool for dset in _dbg_cutoff(project.get_datasets()): src_dir = Path(old_paths.process_dir, dset.crystal.id, dset.name, tool_dir) if not src_dir.is_dir(): # no tool results found for this dataset continue dest_dir = Path(project.get_dataset_process_dir(dset), tool) _log(f"{src_dir} -> {dest_dir}") _copytree(src_dir, dest_dir) update_proc_tool_status(project, tool, dset)
def get_refine_datasets(project: Project, filter: str, refine_tool: str): """ perform datasets filtering for 'structure refinement' jobs filters supported: 'ALL' - all of the project's datasets 'NEW' - datasets that have not been processes with specified refinement tool yet otherwise the filter is expected to be a comma separated list of dataset names """ if filter == "ALL": return project.get_datasets() if filter == "NEW": return _no_results_datasets(project, refine_tool) return _dataset_by_ids(project, filter)
def get_proc_datasets(project: Project, filter: str, tool: str): """ perform datasets filtering for 'data processing' jobs filters supported: 'ALL' - all of the project's datasets 'NEW' - datasets that have not been processes yet with specified tool otherwise the filter is expected to be a comma separated list of dataset IDs """ if filter == "ALL": return project.get_datasets() if filter == "NEW": return _no_results_datasets(project, tool) return _dataset_by_ids(project, filter)
def _migrate_refine(project: Project, old_paths: OldPaths): _log("MIGRATE REFINE RESULTS") for dset in _dbg_cutoff(project.get_datasets()): for proc_tool in ["xds", "xdsapp", "dials"]: proc_dir = "xdsxscale" if proc_tool == "xds" else proc_tool src_dir = Path(old_paths.results_dir, dset.name, proc_dir) if not src_dir.is_dir(): # no tool results found for this dataset continue dest_dir = Path(project.get_dataset_results_dir(dset), proc_tool) _log(f"{src_dir} -> {dest_dir}") # note, we can't use ignore_dangling_symlinks=True # here due to https://bugs.python.org/issue38523 _copytree(src_dir, dest_dir) for tool in REFINE_TOOLS: update_refine_tool_status(project, tool, dset) for tool in LIGFIT_TOOLS: _maybe_resync_ligfit_tool(project, tool, dset)
def _get_best_results(project: Project, proc_tool, refine_tool): if proc_tool == "frag": proc_tool = None if refine_tool == "plex": refine_tool = None for dataset in project.get_datasets(): refine_results = _get_refine_results(project, dataset, proc_tool, refine_tool) # sort refine results by R-work, R-free and resolution, # the result with lowest value(s) is the 'best' one best_result = refine_results.order_by( lambda r: (r.r_work, r.r_free, r.resolution) ).first() if best_result is None: # no refine results with request proc/refine tool combination continue yield best_result
def get_ligfit_datasets(project: Project, filter: str, ligfit_tool: Optional[str]): """ perform datasets filtering for 'ligand fitting' jobs filters supported: 'ALL' - all of the project's datasets 'NEW' - datasets that have not been processes with specified ligand fitting tools yet otherwise the filter is expected to be a comma separated list of dataset names """ if filter == "ALL": return project.get_datasets() if filter == "NEW": assert ligfit_tool is not None return _no_results_datasets(project, ligfit_tool) return _dataset_by_ids(project, filter)
def _no_results_datasets(project: Project, tool: str): for dataset in project.get_datasets(): res = dataset.result.select(tool=tool).first() if res is None: yield dataset