def setupResults(sql): # rather than use the sql2Q method: #q = sqlparse.sql2Q(sql) start_time = time.time() # ... we parse the query into its restrictables and logic: if not sql.where: return {} logic, rs, count = sqlparse.splitWhere(sql.where) # and replace any restrictions on ChemicalName or StoichiometricFormula # with the equivalent on MoleculeInchiKey. Also convert wavelength # (in Angstroms) to wavenumber: for i in rs: r, op, foo = rs[i][0], rs[i][1], rs[i][2:] if r == 'MoleculeChemicalName': rs[i] = ChemicalName2MoleculeInchiKey(op, foo) if r == 'MoleculeStoichiometricFormula': rs[i] = StoichiometricFormula2MoleculeInchiKey(op, foo) if r == 'RadTransWavelength': rs[i] = Wavelength2Wavenumber(op, foo) if r == 'Pressure': rs[i] = Pascals2Torr(op, foo) # now rebuild the query as a dictionary of QTypes ... qdict = {} for i, r in rs.items(): q = sqlparse.restriction2Q(r) qdict[i] = q # ... and merge them to a single query object q = sqlparse.mergeQwithLogic(qdict, logic) if 'radiativecrosssections' in sql.requestables: return setupXsecResults(q) transitions = Trans.objects.filter(q).order_by('nu') ntrans = transitions.count() if settings.TRANSLIM is not None and ntrans > settings.TRANSLIM: # we need to filter transitions again later, so can't take a slice #transitions = transitions[:settings.TRANSLIM] # so do this: numax = transitions[settings.TRANSLIM].nu transitions = Trans.objects.filter(q, Q(nu__lte=numax)) percentage = '%.1f' % (float(settings.TRANSLIM)/ntrans * 100) ntrans = transitions.count() print 'Results truncated to %s %%' % percentage else: percentage = '100' print 'Results not truncated' print 'TRANSLIM is', settings.TRANSLIM print 'ntrans =',ntrans ts = time.time() ref_ids = attach_prms(transitions) te = time.time() print 'time to attach parameters = %.1f secs' % (te-ts) ts = time.time() sources = get_sources(ref_ids) te = time.time() print 'time to get sources = %.1f secs' % (te-ts) # extract the state quantum numbers in a form that generators.py can use: ts = time.time() species, nspecies, nstates = get_species(transitions) te = time.time() print 'time to get species = %.1f secs' % (te-ts) LOG('%s transitions retrieved from HITRAN database' % ntrans) LOG('%s states retrieved from HITRAN database' % nstates) LOG('%s species retrieved from HITRAN database' % nspecies) nsources = 0 if sources is not None: # sources is a Python list, not a queryset, so we can't use count() nsources = len(sources) print 'nsources =', nsources print 'nspecies =', nspecies print 'nstates =', nstates print 'ntrans =', ntrans headerinfo = { 'Truncated': '%s %%' % percentage, 'count-sources': nsources, 'count-species': nspecies, 'count-molecules': nspecies, 'count-states': nstates, 'count-radiative': ntrans } methods = [Method('MEXP', 'experiment', 'experiment'), Method('MTHEORY', 'theory', 'theory')] end_time = time.time() print 'timed at %.1f secs' % (end_time - start_time) # return the dictionary as described above return {'HeaderInfo': headerinfo, 'Methods': methods, 'RadTrans': transitions, 'Sources': sources, 'Molecules': species, 'Environments': HITRANenvs, 'Functions': HITRANfuncs}
except Exception, e: return {} # ... we parse the query into its restrictables and logic: if not sql.where: return {} logic, rs, count = splitWhere(sql.where) # Convert MoleculeNormalModeHarmonicFrequency # from MHz to cm-1: for i in rs: r, op, foo = rs[i][0], rs[i][1], rs[i][2:] if r == "MoleculeNormalModeHarmonicFrequency": rs[i] = MoleculeNormalModeHarmonicFrequency_MHz2cm(op, foo) # now rebuild the query as a dictionary of QTypes ... qdict = {} for i, r in rs.items(): q = restriction2Q(r) qdict[i] = q # ... and merge them to a single query object q = mergeQwithLogic(qdict, logic) # We build a queryset of database matches on the Transision model # since through this model (in our example) we are be able to # reach all other models. Note that a queryset is actually not yet # hitting the database, making it very efficient. molecularspecies = models.MolecularSpecies.objects.filter(q).distinct() # count the number of matches, make a simple trunkation if there are # too many (record the coverage in the returned header) nmolecularspecies = molecularspecies.count() if limit < nmolecularspecies: nmolecularspecies = molecularspecies[:limit] percentage = "%.1f" % (float(limit) / nmolecularspecies * 100)
def setupResults(sql): # rather than use the sql2Q method: #q = sqlparse.sql2Q(sql) start_time = time.time() # ... we parse the query into its restrictables and logic: if not sql.where: return {} logic, rs, count = sqlparse.splitWhere(sql.where) # and replace any restrictions on ChemicalName or StoichiometricFormula # with the equivalent on MoleculeInchiKey. Also convert wavelength # (in Angstroms) to wavenumber: for i in rs: r, op, foo = rs[i][0], rs[i][1], rs[i][2:] if r == 'MoleculeChemicalName': rs[i] = ChemicalName2MoleculeInchiKey(op, foo) if r == 'MoleculeStoichiometricFormula': rs[i] = StoichiometricFormula2MoleculeInchiKey(op, foo) if r == 'RadTransWavelength': rs[i] = Wavelength2Wavenumber(op, foo) if r == 'Pressure': rs[i] = Pascals2Torr(op, foo) # now rebuild the query as a dictionary of QTypes ... qdict = {} for i, r in rs.items(): q = sqlparse.restriction2Q(r) qdict[i] = q # ... and merge them to a single query object q = sqlparse.mergeQwithLogic(qdict, logic) if 'radiativecrosssections' in sql.requestables: return setupXsecResults(q) transitions = Trans.objects.filter(q).order_by('nu') ntrans = transitions.count() if settings.TRANSLIM is not None and ntrans > settings.TRANSLIM: # we need to filter transitions again later, so can't take a slice #transitions = transitions[:settings.TRANSLIM] # so do this: numax = transitions[settings.TRANSLIM].nu transitions = Trans.objects.filter(q, Q(nu__lte=numax)) percentage = '%.1f' % (float(settings.TRANSLIM) / ntrans * 100) ntrans = transitions.count() print 'Results truncated to %s %%' % percentage else: percentage = '100' print 'Results not truncated' print 'TRANSLIM is', settings.TRANSLIM print 'ntrans =', ntrans ts = time.time() ref_ids = attach_prms(transitions) te = time.time() print 'time to attach parameters = %.1f secs' % (te - ts) ts = time.time() sources = get_sources(ref_ids) te = time.time() print 'time to get sources = %.1f secs' % (te - ts) # extract the state quantum numbers in a form that generators.py can use: ts = time.time() species, nspecies, nstates = get_species(transitions) te = time.time() print 'time to get species = %.1f secs' % (te - ts) LOG('%s transitions retrieved from HITRAN database' % ntrans) LOG('%s states retrieved from HITRAN database' % nstates) LOG('%s species retrieved from HITRAN database' % nspecies) nsources = 0 if sources is not None: # sources is a Python list, not a queryset, so we can't use count() nsources = len(sources) print 'nsources =', nsources print 'nspecies =', nspecies print 'nstates =', nstates print 'ntrans =', ntrans headerinfo = { 'Truncated': '%s %%' % percentage, 'count-sources': nsources, 'count-species': nspecies, 'count-molecules': nspecies, 'count-states': nstates, 'count-radiative': ntrans } methods = [ Method('MEXP', 'experiment', 'experiment'), Method('MTHEORY', 'theory', 'theory') ] end_time = time.time() print 'timed at %.1f secs' % (end_time - start_time) # return the dictionary as described above if (ntrans > 0 or nstates > 0 or nspecies > 0): return { 'HeaderInfo': headerinfo, 'Methods': methods, 'RadTrans': transitions, 'Sources': sources, 'Molecules': species, 'Environments': HITRANenvs, 'Functions': HITRANfuncs } # return an empty dictionary to trigger a 204 if there's no data return {}
except Exception, e: return {} # ... we parse the query into its restrictables and logic: if not sql.where: return {} logic, rs, count = splitWhere(sql.where) #Convert MoleculeNormalModeHarmonicFrequency # from MHz to cm-1: for i in rs: r, op, foo = rs[i][0], rs[i][1], rs[i][2:] if r == 'MoleculeNormalModeHarmonicFrequency': rs[i] = MoleculeNormalModeHarmonicFrequency_MHz2cm(op, foo) # now rebuild the query as a dictionary of QTypes ... qdict = {} for i, r in rs.items(): q = restriction2Q(r) qdict[i] = q # ... and merge them to a single query object q = mergeQwithLogic(qdict, logic) # We build a queryset of database matches on the Transision model # since through this model (in our example) we are be able to # reach all other models. Note that a queryset is actually not yet # hitting the database, making it very efficient. molecularspecies = models.MolecularSpecies.objects.filter(q).distinct() # count the number of matches, make a simple trunkation if there are # too many (record the coverage in the returned header) nmolecularspecies = molecularspecies.count() if limit < nmolecularspecies: nmolecularspecies = molecularspecies[:limit] percentage = '%.1f' % (float(limit) / nmolecularspecies * 100)