# ExternalPrgParameters.py # -*- coding: latin-1 -*- import os, sys import olx import olex import olex_core from olexFunctions import OlexFunctions OV = OlexFunctions() import phil_interface import libtbx.utils from method_imp import * global RPD RPD = {} global SPD SPD = {} global managed_references managed_references = set() class ExternalProgramDictionary(object): def __init__(self): self.programs = {} self.counter = 0 def addProgram(self, program): program.order = self.counter self.programs.setdefault(program.name, program) self.counter += 1 def __contains__(self, name): if type(name) == str: return name in self.programs else: return name in self.programs.values() def __iter__(self): return self.programs.itervalues() class Program(object): def __init__(self, name, program_type, author, reference, brief_reference, execs=None, versions=None, phil_entry_name=None): self.name = name self.program_type = program_type self.author = author self.reference = reference self.brief_reference = brief_reference self.execs = execs self.versions = versions self.methods = {} self.counter = 0 self.phil_entry_name = phil_entry_name def __contains__(self, name): if type(name) == str: return name in self.methods else: return name in self.methods.values() def __iter__(self): return self.methods.itervalues() def addMethod(self, method): method.order = self.counter self.methods.setdefault(method.name, method) self.counter += 1 def defineExternalPrograms(): # define solution methods direct_methods = Method_shelx_direct_methods(direct_methods_phil) patterson = Method_shelx_solution(patterson_phil) xt_intrinsic_phasing = Method_shelxt(shelxt_phil_str) texp = Method_shelx_solution(texp_phil) dual_space = Method_shelxd(dual_space_phil) charge_flipping = Method_cctbx_ChargeFlip(charge_flipping_phil) sir97_dm = Method_SIR(sir_dm_phil) sir97_patt = Method_SIR(sir_patt_phil) sir2002_dm = Method_SIR(sir_dm_phil) sir2002_patt = Method_SIR(sir_patt_phil) sir2004_dm = Method_SIR(sir_dm_phil) sir2004_patt = Method_SIR(sir_patt_phil) sir2008_dm = Method_SIR(sir_dm_phil) sir2008_patt = Method_SIR(sir_patt_phil) sir2011_dm = Method_SIR(sir_dm_phil) sir2011_patt = Method_SIR(sir_patt_phil) sir2014_dm = Method_SIR(sir_dm_phil) sir2014_patt = Method_SIR(sir_patt_phil) superflip_cf = Method_Superflip(superflip_cf_phil) # define refinement methods least_squares = Method_shelx_refinement(get_LS_phil()) cgls = Method_shelx_refinement(get_CGLS_phil()) gauss_newton = Method_cctbx_refinement(gauss_newton_phil) levenberg_marquardt = Method_cctbx_refinement(levenberg_marquardt_phil) # define solution programs ShelXS = Program( name='ShelXS', program_type='solution', author="G.M.Sheldrick", reference="Sheldrick, G.M. (2008). Acta Cryst. A64, 112-122.", brief_reference="Sheldrick, 2008", execs=["shelxs.exe", "shelxs"], phil_entry_name="ShelXS") ShelXS97 = Program( name='ShelXS-1997', program_type='solution', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxs97.exe", "shelxs97"]) ShelXS86 = Program( name='ShelXS-1986', program_type='solution', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxs86.exe", "shelxs86"]) XS = Program( name='XS', program_type='solution', author="G.M.Sheldrick/Bruker", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["xs.exe", "xs"], phil_entry_name="XS") XT = Program( name='XT', program_type='solution', author="G.M.Sheldrick/Bruker", reference="Sheldrick, G.M. (2015). Acta Cryst. A71, 3-8.", brief_reference="Sheldrick, 2015", execs=["xt.exe", "xt"], phil_entry_name="XT") ShelXT = Program( name='ShelXT', program_type='solution', author="G.M.Sheldrick", reference=XT.reference, brief_reference=XT.brief_reference, execs=["shelxt.exe", "shelxt"], phil_entry_name="ShelXT") ShelXD = Program( name='ShelXD', program_type='solution', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxd.exe", "shelxd"], phil_entry_name="ShelXD") ShelXD97 = Program( name='ShelXD-1997', program_type='solution', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxd97.exe", "shelxd97"]) XM = Program( name='XM', program_type='solution', author="G.M.Sheldrick/Bruker", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["xm.exe", "xm"], phil_entry_name="XM") smtbx_solve = Program( name='olex2.solve', program_type='solution', author="Luc Bourhis et al", reference="""Bourhis, L.J., Dolomanov, O.V., Gildea, R.J., Howard, J.A.K., Puschmann, H. (2015). Acta Cryst. A71, 59-75.""", brief_reference="Bourhis et al., 2015", ) SIR97 = Program( name='SIR97', program_type='solution', author="Maria C. Burla, Rocco Caliandro, Mercedes Camalli, Benedetta Carrozzini,"+ "Giovanni Luca Cascarano, Liberato De Caro, Carmelo Giacovazzo, Giampiero Polidori,"+ "Dritan Siliqi, Riccardo Spagna", reference="""Burla, M.C., Caliandro, R., Camalli, M., Carrozzini, B., Cascarano, G.L., De Caro, L., Giacovazzo, C., Polidori, G., Siliqi, D., Spagna, R. (2007). J. Appl. Cryst. 40, 609-613.""", brief_reference="Burla et al., 2007", versions = '97', execs=["sir97.exe", "sir97"]) SIR2002 = Program( name='SIR2002', program_type='solution', author=SIR97.author, reference=SIR97.reference, brief_reference=SIR97.brief_reference, versions = '2002', execs=["sir2002.exe", "sir2002"]) SIR2004 = Program( name='SIR2004', program_type='solution', author=SIR97.author, reference=SIR97.reference, brief_reference=SIR97.brief_reference, versions = '2004', execs=["sir2004.exe", "sir2004"]) SIR2008 = Program( name='SIR2008', program_type='solution', author=SIR97.author, reference=SIR97.reference, brief_reference=SIR97.brief_reference, versions = '2008', execs=["sir2008.exe", "sir2008"]) SIR2011 = Program( name='SIR2011', program_type='solution', author=SIR97.author, reference=SIR97.reference, brief_reference=SIR97.brief_reference, versions = '2011', execs=["sir2011.exe", "sir2011"]) SIR2014 = Program( name='SIR2014', program_type='solution', author=SIR97.author, reference=SIR97.reference, brief_reference=SIR97.brief_reference, versions = '2014', execs=["sir2014.exe", "sir2014"]) Superflip = Program( name='Superflip', program_type='solution', author="A van der Lee, C.Dumas & L. Palatinus", reference="""Palatinus, L. & Chapuis, G. (2007). J. Appl. Cryst., 40, 786-790; Palatinus, L. & van der Lee, A. (2008). J. Appl. Cryst. 41, 975-984; Palatinus, L., Prathapa, S. J. & van Smaalen, S. (2012). J. Appl. Cryst. 45, 575-580.""", brief_reference="""Palatinus & Chapuis, 2007;Palatinus & van der Lee, 2008; Palatinus et al., 2012""", versions='260711', execs=["superflip.exe", "superflip"]) ShelXS.addMethod(direct_methods) ShelXS.addMethod(patterson) ShelXS.addMethod(texp) ShelXS97.addMethod(direct_methods) ShelXS97.addMethod(patterson) ShelXS97.addMethod(texp) ShelXS86.addMethod(direct_methods) ShelXS86.addMethod(patterson) ShelXS86.addMethod(texp) XS.addMethod(direct_methods) XS.addMethod(patterson) XS.addMethod(texp) XT.addMethod(xt_intrinsic_phasing) ShelXT.addMethod(xt_intrinsic_phasing) ShelXD.addMethod(dual_space) ShelXD97.addMethod(dual_space) XM.addMethod(dual_space) smtbx_solve.addMethod(charge_flipping) SIR97.addMethod(sir97_dm) SIR97.addMethod(sir97_patt) SIR2002.addMethod(sir2002_dm) SIR2002.addMethod(sir2002_patt) SIR2004.addMethod(sir2004_dm) SIR2004.addMethod(sir2004_patt) SIR2008.addMethod(sir2008_dm) SIR2008.addMethod(sir2008_patt) SIR2011.addMethod(sir2011_dm) SIR2011.addMethod(sir2011_patt) SIR2014.addMethod(sir2014_dm) SIR2014.addMethod(sir2014_patt) Superflip.addMethod(superflip_cf) # define refinement programs ShelXL = Program( name='ShelXL', program_type='refinement', author="G.M.Sheldrick", reference="Sheldrick, G.M. (2015). Acta Cryst. C71, 3-8.", brief_reference="Sheldrick, 2015", execs=["shelxl.exe", "shelxl"], phil_entry_name="ShelXL") ShelXL97 = Program( name='ShelXL-1997', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxl97.exe", "shelxl97"], phil_entry_name="ShelXL97") XL = Program( name='XL', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["xl.exe", "xl"], phil_entry_name="ShelXL97") XLMP = Program( name='XLMP', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["xlmp.exe", "xlmp"], phil_entry_name="XLMP") ShelXH97 = Program( name='ShelXH-1997', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxh.exe", "shelxh"], phil_entry_name="ShelXL97") XH = Program( name='XH', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["xh.exe", "xh"], phil_entry_name="ShelXL97") ShelXL_ifc = Program( name='ShelXL_ifc', program_type='refinement', author="G.M.Sheldrick", reference=ShelXS.reference, brief_reference=ShelXS.brief_reference, execs=["shelxl_ifc"], phil_entry_name="ShelXL97") smtbx_refine = Program( name='olex2.refine', program_type='refinement', author="L.J. Bourhis, O.V. Dolomanov, R.J. Gildea", reference=smtbx_solve.reference, brief_reference=smtbx_solve.brief_reference, ) tonto_refine = Program( name='Tonto', program_type='refinement', author="D. Jayatilaka and D. J. Grimwood", reference="D. Jayatilaka and D. J. Grimwood (2003). Computational Science - ICCS, 4, 142-151", brief_reference="Jayatilaka & Grimwood, 2003", execs=["tonto.exe", "tonto"], ) RPD = ExternalProgramDictionary() for prg in (ShelXL, ShelXL97, XL, XLMP, ShelXH97, XH, ShelXL_ifc): prg.addMethod(least_squares) prg.addMethod(cgls) RPD.addProgram(prg) smtbx_refine.addMethod(gauss_newton) smtbx_refine.addMethod(levenberg_marquardt) RPD.addProgram(smtbx_refine) tonto_refine.addMethod(Method_tonto_HAR(tonto_HAR_phil)) RPD.addProgram(tonto_refine) SPD = ExternalProgramDictionary() for prg in (ShelXS, ShelXS97, ShelXS86, XS, XT, ShelXT, ShelXD, ShelXD97, XM, smtbx_solve, SIR97, SIR2002, SIR2004, SIR2008, SIR2011, Superflip): SPD.addProgram(prg) return SPD, RPD #{'name':'SHEL', 'values':['dmax:', 'dmin:0']}, #{'name':'PATS', 'values':['+np or -dis:100', 'npt:', 'nf:5']}, #{'name':'GROP', 'values':['nor:99', 'Eg:1.5', 'dg:1.2', 'ntr:99']}, #{'name':'PSMF', 'values':['pres:3.0', 'psfac:0.34']}, #{'name':'FRES', 'values':['res:3.0',]}, #{'name':'ESEL', 'values':['Emin:', 'dlim:1.0']}, #{'name':'SHEL', 'values':['dmax:', 'dmin:0']}, #{'name':'PATS', 'values':['+np or -dis:100', 'npt:', 'nf:5']}, #{'name':'GROP', 'values':['nor:99', 'Eg:1.5', 'dg:1.2', 'ntr:99']}, #{'name':'PSMF', 'values':['pres:3.0', 'psfac:0.34']}, #{'name':'FRES', 'values':['res:3.0',]}, #{'name':'DSUL', 'values':['nss:0',]}, #{'name':'TANG', 'values':['ftan:0.9', 'fex:0.4']}, #{'name':'NTPR', 'values':['ntpr:100',]}, #{'name':'SKIP', 'values':['min2:0.5',]}, #{'name':'WEED', 'values':['fr:0.3',]}, #{'name':'CCWT', 'values':['g:0.1',]}, #{'name':'TEST', 'values':['CCmin:', 'delCC:']}, #{'name':'KEEP', 'values':['nh:0',]}, #{'name':'PREJ', 'values':['max:3', 'dsp:-0.01', 'mf:1']}, #{'name':'SEED', 'values':['nrand:0',]}, #{'name':'MOVE', 'values':['dx:0', 'dy:0', 'dz:0', 'sign:1']}, def get_program_dictionaries(cRPD=None, cSPD=None): global SPD global RPD if not cRPD or not cSPD: if RPD and SPD: return SPD, RPD else: SPD, RPD = defineExternalPrograms() return SPD, RPD def get_managed_reference_set(): global managed_references if managed_references: return managed_references sd, rd = get_program_dictionaries() rl = [] for p in sd: rl.append(p.reference) for p in rd: rl.append(p.reference) managed_references = set([''.join(x.replace('\r', '').split()) for x in rl]) return managed_references def get_known(kind): sd, rd = get_program_dictionaries() if kind == 'solution': src = sd else: src = rd rv = [] for p in src: rv.append(p.name) rv = sorted(rv, key=lambda s: s.lower()) return ';'.join(rv) olex.registerFunction(get_known, False, "programs") if __name__ == '__main__': SPD, RPD = defineExternalPrograms()