Source code for schrodinger.application.matsci.qexsd.utils
"""
Helper functions/classes for qexsd.
Copyright Schrodinger, LLC. All rights reserved.
"""
import xml.etree.ElementTree as Etree
from os.path import splitext
from schrodinger.application.matsci.qexsd import qespresso
NORUN_WARNING = """! === WARNING ===
! This file is not used by periodic_dft_driver.py or <jobname>.sh
! If you want to run this file, use runner.py
! ======
"""
[docs]def xml2in(xml_fn, warning=False):
"""
Convert XML file to .in QE format.
:type xml_fn: str
:param xml_fn: XML filename
:param bool warning: Print warning if True
:rtype: str
:return: .in filename
"""
# Based on the qexsd/tests/test_converters.py MIT license: LEGAL-616
tree = Etree.parse(xml_fn)
root = tree.getroot()
elementName = root.tag.split('}')[-1]
if elementName == 'espresso':
xml_conf = qespresso.PwDocument()
elif elementName == 'nebRun':
xml_conf = qespresso.NebDocument()
elif elementName == 'espressoph':
xml_conf = qespresso.PhononDocument()
elif elementName == 'tddfpt':
xml_conf = qespresso.TdDocument()
elif elementName == 'spectrumIn':
xml_conf = qespresso.SpectrumDocument()
else:
raise ValueError('Could not find correct XML in %s' % xml_fn)
# Free memory
root = None
tree = None
xml_conf.read(xml_fn)
qe_in = xml_conf.get_qe_input()
input_fn_name, input_fn_ext = splitext(xml_fn)
outfile = input_fn_name + '.in'
with open(outfile, 'w') as out_fh:
if warning:
out_fh.write(NORUN_WARNING)
out_fh.write(qe_in)
out_fh.write('\n')
return outfile