Source code for segmultirefine3d

# Author: Carsten Sachse 08-Jun-2011
# Copyright: EMBL (2010 - 2018), Forschungszentrum Juelich (2019 - 2021)
# License: see license.txt for details
"""
Program to iteratively refine multiple 3D structures of helical specimens competitively from segment stacks
"""

from spring.csinfrastr.csfeatures import Features
from spring.csinfrastr.csreadinput import OptHandler
from spring.segment3d.refine.sr3d_main import SegmentRefine3d
from spring.segment3d.refine.sr3d_parameters import SegmentRefine3dPar


[docs]class SegMultiRefine3dPar(SegmentRefine3dPar): """ Class to initiate default dictionary with input parameters including help and range values and status dictionary """ def __init__(self): # package/program identity self.package = 'emspring' self.progname = 'segmultirefine3d' self.proginfo = __doc__ self.code_files = [self.progname, self.progname + '_mpi'] self.segmentrefine3d_features = Features() self.feature_set = self.segmentrefine3d_features.setup(self) self.define_parameters_and_their_properties() self.define_program_states()
[docs] def define_parameters_and_their_properties(self): super(SegMultiRefine3dPar, self).define_input_output_segmentrefine3d() super(SegMultiRefine3dPar, self).define_segmentrefine3d_parameters() self.feature_set = self.remove_key_from_feature_set(self.feature_set, 'Filter layer-lines option')
[docs] def set_helical_symmetry_parameters(self): self.feature_set = self.set_helical_symmetries(self.feature_set) self.feature_set.relatives['Helical rise/rotation or pitch/number of units per turn choice']='Symmetrize helix' self.feature_set.relatives['Helical symmetries in Angstrom or degrees']='Symmetrize helix' self.feature_set = self.set_rotational_symmetries(self.feature_set) self.feature_set = self.set_polar_apolar_helix_choices(self.feature_set)
[docs] def set_helical_symmetries(self, feature_set): inp8 = 'Helical symmetries in Angstrom or degrees' feature_set.parameters[inp8] = '(1.408, 22.03); (40, 60); (60, 80)' feature_set.hints[inp8] = 'List of semicolon-separated pairs of \'helical rise/pitch\' (Angstrom) and ' + \ '\'rotation/number of units per turn\' to be imposed to 3D reconstructions. ' feature_set.properties[inp8] = feature_set.file_properties(1, ['*'], None) feature_set.level[inp8] = 'beginner' return feature_set
[docs] def set_reference_volume(self, feature_set): inp9 = 'Reference volumes' feature_set.parameters[inp9]='reference_vol???.hdf' feature_set.properties[inp9]=feature_set.file_properties(3,['hdf'],'getFiles') feature_set.hints[inp9]='Either single reference volume or list of references to be used for competitive ' + \ '3D structure refinement. If multiple references specified header information provides helical ' + \ 'symmetry information. Accepted image file formats ({0}).'.format(', '.join(feature_set.properties[inp9].ext)) feature_set = self.set_relatives_and_level(feature_set, inp9) return feature_set
[docs] def set_rotational_symmetries(self, feature_set): inp7 = 'Rotational symmetries' feature_set.parameters[inp7] = '1, 1, 1' feature_set.hints[inp7] = 'List of comma-separated rotational symmetries. Position in list corresponds to ' + \ 'order of list of \'Helical symmetries\'.' feature_set.properties[inp7] = feature_set.file_properties(1, ['*'], None) feature_set.level[inp7]='intermediate' return feature_set
[docs] def set_polar_apolar_helix_choices(self, feature_set): inp7 = 'Helix polarities' feature_set.parameters[inp7] = str('polar, apolar') feature_set.hints[inp7] = 'Choose whether helix is \'polar\' or \'apolar\'. Polar helices have different ' + \ 'ends at the top and bottom. Only the predominant direction within a helix will be used for the ' + \ 'reconstruction. In apolar helices they are related by 180 degree rotation. Thus each segment can be ' + \ 'inserted twice in the 3D reconstruction in opposite directions.' feature_set.properties[inp7] = feature_set.file_properties(1, ['*'], None) feature_set.level[inp7]='intermediate' return feature_set
[docs] def remove_key_from_feature_set(self, feature_set, remove_key): attr = ['parameters', 'properties', 'hints', 'relatives', 'level'] for each_attr in attr: if remove_key in getattr(feature_set, each_attr).keys(): getattr(feature_set, each_attr).__delitem__(remove_key) return feature_set
[docs] def define_program_states(self): super(SegMultiRefine3dPar, self).define_program_states()
[docs]class SegMultiRefine3d(SegmentRefine3d): pass
[docs]def main(): # Option handling parset = SegMultiRefine3dPar() mergeparset = OptHandler(parset) ######## Program stack = SegMultiRefine3d(mergeparset) stack.perform_iterative_projection_matching_and_3d_reconstruction()
if __name__ == '__main__': main()