import os import sys import shutil import re import olex import olx from olexFunctions import OlexFunctions OV = OlexFunctions() ''' To run this example script, type spy.OlexSir() in Olex2 ''' def OlexSir(level="normal", ManAtomContents="C 20 H 20 O 10", rhomax="0.25"): print("This script takes an exsiting file and pushes it into SIR") # Experimenting with patterson function but having issues using the partial command to work? patterson = 0 # We can assume that the INS name and information can come from Olex2 # In fact probably won't need this as I only need Cell, SpaceGroup, Content (SFAC/UNIT), reflection) """ SIR97 - Altomare A., Burla M.C., Camalli M., Cascarano G.L., Giacovazzo C. , Guagliardi A., Moliterni A.G.G., Polidori G.,Spagna R. (1999) J. Appl. Cryst. 32, 115-119. """ SirLevel = { 'normal' : '%invariants\n%phase\n%fourier\n', 'hard' : '%invariants\n%phase\n\tMinfom 0.9\n\tRandom\n%fourier\n', 'harder' : '%invariants\n\tCochran\n%phase\n\tRandom\n%fourier\n', 'difficult' : '%invariants\n\tCochran\n%phase\n\tSeed 9437\n\tRandom 250\n%fourier\n', 'bonkers' : '%invariants\n\tCochran\n%phase\n\tSeed 8793\n\tRandom 500\n%fourier\n' } sirversion = 97 rhomax = 0.250 #default for sintheta/lambda 0.5 Olex2SirIn = OV.FileName() SirCompatCell = ''.join(olx.xf.au.GetCell().split(',')) brokensym = list(olx.xf.au.GetCellSymm()) SirCompatSymmSetting = brokensym.pop(0) SirCompatSymmOpps = [] while len(brokensym) > 0: print(brokensym) print(SirCompatSymmOpps) if brokensym[0] == '-': print("true for -") SirCompatSymmOpps.append(" "+brokensym.pop(0)) SirCompatSymmOpps.append(brokensym.pop(0)) continue elif brokensym[0] in "a b c d n m": print("true for letter") SirCompatSymmOpps.append(" "+brokensym.pop(0)) continue elif brokensym[0] in "1": print("true for number") SirCompatSymmOpps.append(brokensym.pop(0)) continue elif brokensym[0] in "2 3 4 6 8 9": print("true for number") SirCompatSymmOpps.append(" "+brokensym.pop(0)) continue elif brokensym[0] in "/": print("true for number") SirCompatSymmOpps.append(" "+brokensym.pop(0)) continue print(brokensym) print(SirCompatSymmOpps) print(''.join(SirCompatSymmOpps)) OlexZ = int(olx.xf.au.GetZ()) AtomPairs = olx.xf.GetFormula().split() print(AtomPairs) AtomGroups = [] CorrectedAtoms = [] for atom in AtomPairs: AtomGroups.append(re.split("([A-Za-z]*)",atom)[1:3]) print(AtomGroups) for j in range(0, len(AtomGroups)): print(AtomGroups[j][0], AtomGroups[j][1]) CorrectedAtoms.append("%s %s"%(AtomGroups[j][0], (AtomGroups[j][1]))) AtomContents = ' '.join(CorrectedAtoms) print(AtomContents) print("ETF", AtomContents) #AtomContents = ' '.join(re.split("([A-Za-z]*)",olx.xf.GetFormula())) snuff = re.split("([A-Za-z]*)",olx.xf.GetFormula()) NumPeaks = int(OlexZ) * int(olx.xf.au.GetAtomCount()) CellV = float(olx.xf.au.GetCellVolume()) if ManAtomContents == " " or ManAtomContents != "C 20 H 20 O 10": # Ok allowing the manual input of a formula is great but we really need to check it and make sure it is in the correct format, and or take a couple of formats and convert them print("Using user input formula", ManAtomContents) AtomContents = ManAtomContents print("Job name", Olex2SirIn) print("Unit Cell", SirCompatCell) print("Olex2 Symmetry:Sir Symmetry", olx.xf.au.GetCellSymm(), ':', SirCompatSymmSetting, ' '.join(SirCompatSymmOpps)) print("Olex2 Formula", olx.xf.GetFormula()) print("Sir Friendly Formula", AtomContents) print("New formula using Z", OlexZ, end=' ') print("Number of atoms to look for", NumPeaks, 'or', float(CellV/18.0)) # There is an issue with ever decreasing returns from Olex2 and SIR. # Basically Olex2 is updating the SFAC from SIR results this then is being posted back to if you try again # NET result is you end up with NO ATOMS! # With the idea of just taking atoms from the produced INS we can get around this # Creating our SIR file # This is primative will need to add features such as patterson on and off SIRINS = open("%s.sir"%(Olex2SirIn), 'w') SIRINS.write("%window\n") SIRINS.write("%%Structure sir%s\n"%(sirversion)) SIRINS.write("%%job %s in %s\n"%(Olex2SirIn, olx.xf.au.GetCellSymm())) SIRINS.write("%Init\n") SIRINS.write("%Data\n") SIRINS.write("\tCell %s\n"%(SirCompatCell)) SIRINS.write("\tSpaceGroup %s %s\n"%(SirCompatSymmSetting, "".join(SirCompatSymmOpps))) SIRINS.write("\tContent %s\n"%(AtomContents)) SIRINS.write("\tRhomax %s\n"%(rhomax)) SIRINS.write("\tReflections %s.hkl\n"%(Olex2SirIn)) SIRINS.write("\tFosquare\n") SIRINS.write("%normal\n") SIRINS.write("%s"%(SirLevel[level])) SIRINS.write("%export\n") SIRINS.write("\tshelx sir%s.res\n"%(sirversion)) SIRINS.write("%end\n") SIRINS.close() # All this need error control content = os.popen("sir%s %s.sir "%(sirversion, Olex2SirIn)).read() # This pipes our new .sir file into sir using sirversion can use 92/97 etc print(content) # Output from pipe need proper error control here # File generated from SIR - name controlled by the Structure line in .sir file - made sir to prevent overwrite of INS src = "sir%s.res"%sirversion # We are going to push our sir result into our res file dst = Olex2SirIn + '.res' # This needs rewriting to reform the orginal Information in the INS/RES file # We have lost the: # cell ESD parameters # the HKL file used # the orginal title # This should all be possible to be either prestripped saved and returned # This needs to be done before the replacement. Or we should just replace the atoms assuming SIR puts the list in the same order? # This works fine in Linux not certain in windows? shutil.copy2(src, dst) # Get Olex2 to reload the res file and update our display olx.Atreap(dst) OV.registerFunction(OlexSir)