Skip to content

Commit

Permalink
Merge pull request #33 from xnx/master
Browse files Browse the repository at this point in the history
Pull! Pull! Pull!
  • Loading branch information
ivh committed Jun 8, 2011
2 parents 5b045a6 + 5d4c957 commit bc28459
Show file tree
Hide file tree
Showing 8 changed files with 353 additions and 260 deletions.
4 changes: 2 additions & 2 deletions nodes/hitran/node/dictionaries.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,14 @@
'MoleculeStateEnergyUnit':'1/cm',
'MoleculeStateEnergyOrigin':'Zero-point energy',
'MoleculeStateCharacTotalStatisticalWeight':'MoleculeState.g',
'MoleculeStateQuantumNumbers': 'MoleculeState.parsed_qns',
'MoleculeStateQuantumNumbers': 'MoleculeState',

'MoleculeQnStateID': 'MolQN.stateid',
'MoleculeQnCase': 'MolQN.case', # e.g. 'dcs', 'ltcs', ...
'MoleculeQnLabel': 'MolQN.label', # e.g. 'J', 'asSym', ...
'MoleculeQnValue': 'MolQN.value',
'MoleculeQnAttribute': 'MolQN.qn_attr',
'MoleculeQnXML': 'MolQN.xml',
'MoleculeQnXML': 'MoleculeState.get_qn_xml()',
'Inchikey':'inchikey'})

RESTRICTABLES = CaselessDict({\
Expand Down
145 changes: 141 additions & 4 deletions nodes/hitran/node/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,22 @@

import datetime, time

case_prefixes = {}
case_prefixes[1] = 'dcs'
case_prefixes[2] = 'hunda'
case_prefixes[3] = 'hundb'
case_prefixes[4] = 'ltcs'
case_prefixes[5] = 'nltcs'
case_prefixes[6] = 'stcs'
case_prefixes[7] = 'lpcs'
case_prefixes[8] = 'asymcs'
case_prefixes[9] = 'asymos'
case_prefixes[10] = 'sphcs'
case_prefixes[11] = 'sphos'
case_prefixes[12] = 'ltos'
case_prefixes[13] = 'lpos'
case_prefixes[14] = 'nltos'

class Molecules(models.Model):
molecid = models.IntegerField(primary_key=True, null=False,
db_column='molecID')
Expand Down Expand Up @@ -83,6 +99,32 @@ class States(models.Model):
class Meta:
db_table = u'states'

def qns_xml(self):
"""Yield the XML for the state quantum numbers"""
qns = Qns.objects.filter(stateid=self.id).order_by('id')
if qns:
caseID = qns[0].caseid
try:
case = case_prefixes[caseID]
except KeyError:
# unrecognised caseID
return 'unrecognised case'
caseNS = 'http://vamdc.org/xml/xsams/0.2/cases/%s' % case
caseNSloc = '../../cases/%s.xsd' % case
xml = []
xml.append('<Case xsi:type="%s:Case" caseID="%s"'\
' xmlns:%s="%s" xsi:schemaLocation="%s %s">'\
% (case, case, case, caseNS, caseNS, caseNSloc))
xml.append('<%s:QNs>\n' % case)
xml.append('\n'.join([qn.xml for qn in qns]))
xml.append('</%s:QNs>\n' % case)
xml.append('</Case>\n')
return ''.join(xml)
#yield ''.join(xml)
# associate qns_xml with the XML attribute of the States class
# so that generators.py checkXML() works:
XML = qns_xml

class Method:
def __init__(self, id, category, description):
self.id = id
Expand Down Expand Up @@ -174,14 +216,109 @@ class Trans(models.Model):
blank=True)

prms = []
broadening_xml = ''
shifting_xml = ''

def XML_Broadening(self):
return self.broadening_xml
prms = Prms.objects.filter(transid=self.id)
prm_dict = {}
for prm in prms:
prm_dict[prm.prm_name] = prm
# XXX for now, replace reference with the generic HITRAN08 ref
prm_dict[prm.prm_name].prm_ref = 'BHIT-B_HITRAN2008'
broadenings = []
if 'g_air' in prm_dict.keys() and 'n_air' in prm_dict.keys():
g_air_val = str(prm_dict['g_air'].prm_val)
g_air_ref = str(prm_dict['g_air'].prm_ref)
n_air_val = str(prm_dict['n_air'].prm_val)
n_air_ref = str(prm_dict['n_air'].prm_ref)
lineshape_xml = [' <Lineshape name="Lorentzian">\n'\
' <Comments>The temperature-dependent pressure'\
' broadening Lorentzian lineshape</Comments>\n'\
' <LineshapeParameter name="gammaL">\n'\
' <FitParameters functionRef="FgammaL">\n'\
' <FitArgument name="T" units="K">\n'\
' <LowerLimit>240</LowerLimit>\n'\
' <UpperLimit>350</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitArgument name="p" units="K">\n'\
' <LowerLimit>0.</LowerLimit>\n'\
' <UpperLimit>1.2</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitParameter name="gammaL_ref">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="1/cm">%s</Value>\n'\
% (g_air_ref, g_air_val),]
g_air_err = prm_dict['g_air'].prm_err
if g_air_err:
g_air_err = str(g_air_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % g_air_err)
lineshape_xml.append(' </FitParameter>\n'\
' <FitParameter name="n">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="unitless">%s</Value>\n'\
% (n_air_ref, n_air_val))
n_air_err = prm_dict['n_air'].prm_err
if n_air_err:
n_air_err = str(n_air_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % n_air_err)
lineshape_xml.append(' </FitParameter>\n'\
' </FitParameters>\n'\
' </LineshapeParameter>\n</Lineshape>\n')
broadening = ' <Broadening'\
' envRef="Eair-broadening-ref-env" name="pressure">\n'\
'%s </Broadening>\n' % ''.join(lineshape_xml)
broadenings.append(broadening)
if 'g_self' in prm_dict.keys():
g_self_val = str(prm_dict['g_self'].prm_val)
g_self_ref = str(prm_dict['g_self'].prm_ref)
lineshape_xml = [' <Lineshape name="Lorentzian">\n'\
' <LineshapeParameter name="gammaL">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="1/cm">%s</Value>\n'\
% (g_self_ref, g_self_val),]
g_self_err = prm_dict['g_self'].prm_err
if g_self_err:
g_self_err = str(g_self_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % g_self_err)
lineshape_xml.append(' </LineshapeParameter>\n'\
' </Lineshape>\n')
broadening = ' <Broadening'\
' envRef="Eself-broadening-ref-env" name="pressure">\n'\
'%s </Broadening>\n' % ''.join(lineshape_xml)
broadenings.append(broadening)
# XXX for now, do shiftings at the same time as broadenings
shiftings = []
if 'delta_air' in prm_dict.keys():
delta_air_val = str(prm_dict['delta_air'].prm_val)
delta_air_ref = str(prm_dict['delta_air'].prm_ref)
shifting_xml = [' <Shifting envRef='\
'"Eair-broadening-ref-env">\n'\
' <ShiftingParameter name="delta">\n'\
' <FitParameters functionRef="Fdelta">\n'\
' <FitArgument name="p" units="K">\n'\
' <LowerLimit>0.</LowerLimit>\n'\
' <UpperLimit>1.2</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitParameter name="delta_ref">'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="unitless">%s</Value>\n'\
% (delta_air_ref, delta_air_val),]
delta_air_err = prm_dict['delta_air'].prm_err
if delta_air_err:
delta_air_err = str(delta_air_err)
shifting_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % delta_air_err)
shifting_xml.append(' </FitParameter>\n'\
' </FitParameters>\n'\
' </ShiftingParameter>\n'\
' </Shifting>\n')
shiftings.append(''.join(shifting_xml))
return ' %s\n %s\n' % (''.join(broadenings), ''.join(shiftings))

def XML_Shifting(self):
return self.shifting_xml
return ''

class Meta:
db_table = u'trans'
Expand Down
135 changes: 9 additions & 126 deletions nodes/hitran/node/queryfunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,121 +28,6 @@ def LOG(s):
case_prefixes[13] = 'lpos'
case_prefixes[14] = 'nltos'

def getHITRANbroadening(transs, XSAMSvariant):
if XSAMSvariant == 'vamdc':
# for vamdc-XSAMS, there's no broadening:
for trans in transs:
trans.broadening_xml = '<!-- Broadening --> '
return

if XSAMSvariant == 'ucl':
print 'the XSAMS variant ucl is no longer supported on this branch'\
' of the node software'
return

if XSAMSvariant == 'working':
# for vamdc-working branch, write the broadening XML:
for trans in transs:
prms = Prms.objects.filter(transid=trans.id)
prm_dict = {}
for prm in prms:
prm_dict[prm.prm_name] = prm
# XXX for now, replace reference with the generic HITRAN08 ref
prm_dict[prm.prm_name].prm_ref = 'BHIT-B_HITRAN2008'
broadenings = []
if 'g_air' in prm_dict.keys() and 'n_air' in prm_dict.keys():
g_air_val = str(prm_dict['g_air'].prm_val)
g_air_ref = str(prm_dict['g_air'].prm_ref)
n_air_val = str(prm_dict['n_air'].prm_val)
n_air_ref = str(prm_dict['n_air'].prm_ref)
lineshape_xml = [' <Lineshape name="Lorentzian">\n'\
' <Comments>The temperature-dependent pressure'\
' broadening Lorentzian lineshape</Comments>\n'\
' <LineshapeParameter name="gammaL">\n'\
' <FitParameters functionRef="FgammaL">\n'\
' <FitArgument name="T" units="K">\n'\
' <LowerLimit>240</LowerLimit>\n'\
' <UpperLimit>350</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitArgument name="p" units="K">\n'\
' <LowerLimit>0.</LowerLimit>\n'\
' <UpperLimit>1.2</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitParameter name="gammaL_ref">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="1/cm">%s</Value>\n'\
% (g_air_ref, g_air_val),]
g_air_err = prm_dict['g_air'].prm_err
if g_air_err:
g_air_err = str(g_air_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % g_air_err)
lineshape_xml.append(' </FitParameter>\n'\
' <FitParameter name="n">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="unitless">%s</Value>\n'\
% (n_air_ref, n_air_val))
n_air_err = prm_dict['n_air'].prm_err
if n_air_err:
n_air_err = str(n_air_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % n_air_err)
lineshape_xml.append(' </FitParameter>\n'\
' </FitParameters>\n'\
' </LineshapeParameter>\n</Lineshape>\n')
broadening = ' <Broadening'\
' envRef="Eair-broadening-ref-env" name="pressure">\n'\
'%s </Broadening>\n' % ''.join(lineshape_xml)
broadenings.append(broadening)
if 'g_self' in prm_dict.keys():
g_self_val = str(prm_dict['g_self'].prm_val)
g_self_ref = str(prm_dict['g_self'].prm_ref)
lineshape_xml = [' <Lineshape name="Lorentzian">\n'\
' <LineshapeParameter name="gammaL">\n'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="1/cm">%s</Value>\n'\
% (g_self_ref, g_self_val),]
g_self_err = prm_dict['g_self'].prm_err
if g_self_err:
g_self_err = str(g_self_err)
lineshape_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % g_self_err)
lineshape_xml.append(' </LineshapeParameter>\n'\
' </Lineshape>\n')
broadening = ' <Broadening'\
' envRef="Eself-broadening-ref-env" name="pressure">\n'\
'%s </Broadening>\n' % ''.join(lineshape_xml)
broadenings.append(broadening)
shiftings = []
if 'delta_air' in prm_dict.keys():
delta_air_val = str(prm_dict['delta_air'].prm_val)
delta_air_ref = str(prm_dict['delta_air'].prm_ref)
shifting_xml = [' <Shifting envRef='\
'"Eair-broadening-ref-env">\n'\
' <ShiftingParameter name="delta">\n'\
' <FitParameters functionRef="Fdelta">\n'\
' <FitArgument name="p" units="K">\n'\
' <LowerLimit>0.</LowerLimit>\n'\
' <UpperLimit>1.2</UpperLimit>\n'\
' </FitArgument>\n'\
' <FitParameter name="delta_ref">'\
' <SourceRef>%s</SourceRef>\n'\
' <Value units="unitless">%s</Value>\n'\
% (delta_air_ref, delta_air_val),]
delta_air_err = prm_dict['delta_air'].prm_err
if delta_air_err:
delta_air_err = str(delta_air_err)
shifting_xml.append(' <Accuracy><Statistical>'\
'%s</Statistical></Accuracy>\n' % delta_air_err)
shifting_xml.append(' </FitParameter>\n'\
' </FitParameters>\n'\
' </ShiftingParameter>\n'\
' </Shifting>\n')
shiftings.append(''.join(shifting_xml))

trans.broadening_xml = ' %s\n' % ''.join(broadenings)
trans.shifting_xml = ' %s\n' % ''.join(shiftings)

def attach_state_qns(states):
for state in states:
state.parsed_qns = []
Expand All @@ -156,9 +41,7 @@ def attach_state_qns(states):
qn.qn_name, qn.qn_val, qn.qn_attr, qn.xml))

def getHITRANmolecules(transs):
InChIKeys = set([])
for trans in transs:
InChIKeys.add(trans.inchikey)
InChIKeys = set(transs.values_list('inchikey', flat=True))
nstates = 0
species = []
for isotopologue in Isotopologues.objects.filter(pk__in=InChIKeys):
Expand All @@ -179,7 +62,7 @@ def getHITRANmolecules(transs):
sids = set(chain(stateps, statepps))
# attach the corresponding states to the molecule:
this_species.States = States.objects.filter( pk__in = sids)
attach_state_qns(this_species.States)
#attach_state_qns(this_species.States)
nstates += len(sids)
# add this species object to the list:
species.append(this_species)
Expand All @@ -190,11 +73,11 @@ def getHITRANsources(transs):
# for now, we set all the references to HITRAN2008
#sourceIDs = set([])
sourceIDs = ['B_HITRAN2008',]
for trans in transs:
#for trans in transs:
#s = set([trans.nu_ref, trans.a_ref])
trans.nu_ref = 'B_HITRAN2008'
trans.a_ref = 'B_HITRAN2008'
trans.s_ref = 'B_HITRAN2008'
# trans.nu_ref = 'B_HITRAN2008'
# trans.a_ref = 'B_HITRAN2008'
# trans.s_ref = 'B_HITRAN2008'
#sourceIDs = sourceIDs.union(s)

sources = []
Expand All @@ -205,7 +88,7 @@ def getHITRANsources(transs):
source.note, source.doi))
return sources

def setupResults(sql, LIMIT=None, XSAMSvariant='working'):
def setupResults(sql, LIMIT=None):
q = sqlparse.where2q(sql.where,RESTRICTABLES)
try:
q=eval(q)
Expand All @@ -224,9 +107,9 @@ def setupResults(sql, LIMIT=None, XSAMSvariant='working'):
transs = Trans.objects.filter(q, Q(nu__lte=numax))
percentage = '%.1f' % (float(LIMIT)/ntrans * 100)
else:
percentage = None
percentage = '100'
print 'Truncated to %s %%' % percentage

getHITRANbroadening(transs, XSAMSvariant)
sources = getHITRANsources(transs)
# extract the state quantum numbers in a form that generators.py can use:
species, nspecies, nstates = getHITRANmolecules(transs)
Expand Down
Loading

0 comments on commit bc28459

Please sign in to comment.