From a98bde374507012a1523f909ecab7ba4cb3e3af0 Mon Sep 17 00:00:00 2001 From: Christian Endres Date: Tue, 18 Mar 2014 11:13:40 +0100 Subject: [PATCH] added atoms and other stuff ?? Former-commit-id: d7edf984afff74ce5839aeb26c0a7cea4ec9ae41 --- .gitmodules | 3 + nodes/cdms/node/dictionaries.py | 25 +-- nodes/cdms/node/models.py | 184 ++++++++++++++++++ nodes/cdms/node/queryfunc.py | 92 +++++---- nodes/cdms/node/urls.py | 1 + nodes/cdms/node/views.py | 16 ++ .../static/xsl/convertXSAMS2html_v1.0.xslt | 73 ++++++- vamdclib | 1 + 8 files changed, 340 insertions(+), 55 deletions(-) create mode 100644 .gitmodules create mode 160000 vamdclib diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..50169cab --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vamdclib"] + path = vamdclib + url = https://github.com/cpe/vamdclib.git diff --git a/nodes/cdms/node/dictionaries.py b/nodes/cdms/node/dictionaries.py index e1489b6e..9a47b1c0 100644 --- a/nodes/cdms/node/dictionaries.py +++ b/nodes/cdms/node/dictionaries.py @@ -36,7 +36,7 @@ #'AtomStateRef':'AtomState.', #'AtomStateS':'AtomState.S', #'AtomStateS2':'AtomState.', -#'AtomStateStatisticalWeight':'AtomState.', +'AtomStateStatisticalWeight':'AtomState.degeneracy', 'AtomStateTermLSL':'Component.L', #AtomState.attach_atomic_qn()', 'AtomStateTermLSS':'Component.S', #AtomState.S', 'AtomStateTotalAngMom':'AtomState.attach_atomic_qn()', @@ -134,14 +134,14 @@ 'RadTransUpperStateRef':'RadTran.upperstateref_id', 'RadTransLowerStateRef':'RadTran.lowerstateref_id', #'RadTransFrequency':'RadTran.get_exp_transitions()', #frequencyArray', -'RadTransFrequency':'RadTran.attach_exp_frequencies()', -#'RadTransFrequency':'RadTran.frequencies', -'RadTransFrequencyUnit':'RadTran.units', -'RadTransFrequencyAccuracy':'RadTran.uncertainties', -'RadTransFrequencyRef':'RadTran.refs', +#'RadTransFrequency':'RadTran.attach_exp_frequencies()', +'RadTransFrequency':'eval(RadTran.frequencies)', +'RadTransFrequencyUnit':'MHz', #RadTran.units', +'RadTransFrequencyAccuracy':'eval(RadTran.uncertainties)', +'RadTransFrequencyRef':'eval(RadTran.references)', #'RadTransFrequencyMethod':'RadTran.freqmethodref_id', #'RadTransFrequencyMethod':'RadTran.species_id', -'RadTransFrequencyMethod':'RadTran.methods', +'RadTransFrequencyMethod':'eval(RadTran.methods)', 'RadTransProbabilityA':'RadTran.einsteina', 'RadTransProbabilityAUnit':'1/cm', # <-New 'RadTransProbabilityIdealisedIntensity':'RadTran.intensity', @@ -155,11 +155,11 @@ 'RadTransSpeciesRef':'RadTran.specie_id', #'RadTransWavelength':'RadTran.', #'RadTransWavenumber':'RadTran.', -'RadTransFrequencyEval':'RadTran.evaluations', -'RadTransFrequencyEvalRecommended':'RadTran.recommendations', -'RadTransFrequencyEvalRef':'RadTran.evalrefs', +#'RadTransFrequencyEval':'RadTran.evaluations', +#'RadTransFrequencyEvalRecommended':'RadTran.recommendations', +#'RadTransFrequencyEvalRef':'RadTran.evalrefs', -'RadTransCode':'RadTran.process_class()', +'RadTransCode':'eval(str(RadTran.processclass))', 'SourceAuthorName':'Source.getAuthorList()', 'SourceCategory':'Source.category', @@ -303,7 +303,7 @@ def processclass(r, op, *rhs): #'MoleculeStateCharacLifeTime':'', #'MoleculeStateCharacNuclearSpinSymmetry':'', 'MoleculeStateNSIName':'lowerstateref__nsi__name', #nuclearspinisomer', -'MoleculeStateNuclearSpinIsomer':'lowerstateref_nsi_name', +'MoleculeStateNuclearSpinIsomer':'lowerstateref__nsi__name', 'MoleculeStateEnergy':'lowerstateref__energy', #'MoleculeStateID':'', 'MoleculeStoichiometricFormula':'specie__molecule__stoichiometricformula', @@ -331,6 +331,7 @@ def processclass(r, op, *rhs): #'SourceCategory':'', #'SourceYear':'', 'MoleculeSpeciesID':'specie', +'SpeciesID':'specie', 'Lower.StateEnergy':'lowerstateref__energy', 'Upper.StateEnergy':'upperstateref__energy', 'StateEnergy':bothStates, diff --git a/nodes/cdms/node/models.py b/nodes/cdms/node/models.py index 3871beb6..89eaf5ce 100644 --- a/nodes/cdms/node/models.py +++ b/nodes/cdms/node/models.py @@ -14,6 +14,35 @@ # References which will always be returned DATABASE_REFERENCES = [1921] + +def formatstring(value, format, noneformat): + if value is not None: + return format % value + else: + return noneformat % "" + + +def formatqn(value): + if value == None: + return '' + elif value > 99 and value < 360: + return chr(55+value/10)+ "%01d" % ( value % 10) + elif value < -9 and value > -260: + return chr(95-(value-1)/10)+ "%01d" % -( value % -10) + else: + return str(value) + + +def format_degeneracy(value): + if value == None: + return '' + elif value>999 and value < 3600: + return chr(55+value/100) + "%02d" % (value % 100) + else: + return str(value) + + + class Molecules( Model): """ The Molecules class contains general information of the species. It is on top of @@ -562,7 +591,39 @@ def attach_exp_frequencies(self): return self.frequencies + def spfitstr(self): + if self.frequencyexp: + frequency = self.frequencyexp + speciestag = -self.speciestag + else: + frequency = self.frequency + speciestag = self.speciestag + egy_lower = formatstring(self.energylower,'%10.4lf','%10s') + if egy_lower==' -0.0000': + egy_lower = ' 0.0000' + + return '%s%s%s%s%s%3s%s%s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s'\ + % (formatstring(frequency,'%13.4lf','%13s'), + formatstring(self.uncertainty,'%8.4lf','%8s'), + formatstring(self.intensity,'%8.4lf','%8s'), + formatstring(self.degreeoffreedom,'%2d','%s'), + egy_lower, + format_degeneracy(self.upperstatedegeneracy), + formatstring(speciestag,'%7d','%7s'), + formatstring(self.qntag,'%4d','%4s'), + formatqn(self.qnup1), + formatqn(self.qnup2), + formatqn(self.qnup3), + formatqn(self.qnup4), + formatqn(self.qnup5), + formatqn(self.qnup6), + formatqn(self.qnlow1), + formatqn(self.qnlow2), + formatqn(self.qnlow3), + formatqn(self.qnlow4), + formatqn(self.qnlow5), + formatqn(self.qnlow6)) ## def get_exp_transitions(self): ## exptranss = TransitionsExp.objects.filter(species=self.species, @@ -594,6 +655,107 @@ class Meta: db_table = u'Predictions' +class RadiativeTransitions( Model): + """ + This class contains the calculated transition frequencies (mysql-table Predictions). + """ + id = IntegerField(primary_key=True, db_column='RadiativeTransitionID') + specie = ForeignKey(Species, db_column='SpeciesID') + speciestag = IntegerField(db_column='SpeciesTag') + frequency = FloatField(null=True, db_column='FrequencyValue') + intensity = FloatField(null=True, db_column='IdealisedIntensity') + einsteina = FloatField(null=True, db_column='EinsteinA') + #smu2 = FloatField(null=True, db_column='P_Smu2') + uncertainty = FloatField(null=True, db_column='EnergyWavelengthAccuracy') + energylower = FloatField(null=True, db_column='LowerStateEnergyValue') + #energyupper = FloatField(null=True, db_column='P_Energy_Upper') + qntag = IntegerField(db_column='CaseQN') + qnup1 = IntegerField(db_column='QN_Up_1') + qnup2 = IntegerField(db_column='QN_Up_2') + qnup3 = IntegerField(db_column='QN_Up_3') + qnup4 = IntegerField(db_column='QN_Up_4') + qnup5 = IntegerField(db_column='QN_Up_5') + qnup6 = IntegerField(db_column='QN_Up_6') + qnlow1 = IntegerField(db_column='QN_Low_1') + qnlow2 = IntegerField(db_column='QN_Low_2') + qnlow3 = IntegerField(db_column='QN_Low_3') + qnlow4 = IntegerField(db_column='QN_Low_4') + qnlow5 = IntegerField(db_column='QN_Low_5') + qnlow6 = IntegerField(db_column='QN_Low_6') + #dummy = CharField(max_length=20, db_column ='P_Dummy') + unit = CharField(max_length=200, db_column='FrequencyUnit') + degreeoffreedom = IntegerField(db_column='Degree_Of_Freedom') + upperstatedegeneracy = IntegerField(db_column='UpperStateNuclearStatisticalWeight') + originid = IntegerField(db_column='Resource') + hfsflag = IntegerField(db_column='hfsflag') + #userid = IntegerField(db_column='P_U_ID') + dataset = ForeignKey(Datasets, db_column='DAT_ID') + #qualityflag = IntegerField(db_column='P_Quality') + #archiveflag = IntegerField(db_column='P_Archive') + timestamp = DateTimeField(db_column='Createdate') + frequencies = CharField (db_column = 'FrequencyList') + uncertainties = CharField (db_column = 'UncertaintyList') + methods = CharField (db_column = 'MethodList') + references = CharField (db_column = 'ReferenceList') + frequencymethod = IntegerField(db_column = 'FrequencyMethodRef') + processclass = CharField(max_length=100, db_column='ProcessClass') + + upperstateref = ForeignKey(States, related_name='upperstate', + db_column='UpperStateRef') + lowerstateref = ForeignKey(States, related_name='lowerstate', + db_column='LowerStateRef') + + upstate = ForeignKey(States, related_name='upperstate', + db_column='UpperStateRef') + lostate = ForeignKey(States, related_name='lowerstate', + db_column='LowerStateRef') + #frequencyArray + + def __unicode__(self): + return u'ID:%s Tag:%s Freq: %s'%(self.id,self.speciestag,self.frequency) + + def specieid(self): + return '%s-hyp%s' % (self.specie_id,self.hfsflag) + +# def process_class(self): +# return eval(self.processclass) + + def spfitstr(self): + if self.frequencymethod == 4: + speciestag = -self.speciestag + else: + speciestag = self.speciestag + + egy_lower = formatstring(self.energylower,'%10.4lf','%10s') + if egy_lower==' -0.0000': + egy_lower = ' 0.0000' + + return '%s%s%s%s%s%3s%s%s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s%2s'\ + % (formatstring(self.frequency,'%13.4lf','%13s'), + formatstring(self.uncertainty,'%8.4lf','%8s'), + formatstring(self.intensity,'%8.4lf','%8s'), + formatstring(self.degreeoffreedom,'%2d','%s'), + egy_lower, + format_degeneracy(self.upperstatedegeneracy), + formatstring(speciestag,'%7d','%7s'), + formatstring(self.qntag,'%4d','%4s'), + formatqn(self.qnup1), + formatqn(self.qnup2), + formatqn(self.qnup3), + formatqn(self.qnup4), + formatqn(self.qnup5), + formatqn(self.qnup6), + formatqn(self.qnlow1), + formatqn(self.qnlow2), + formatqn(self.qnlow3), + formatqn(self.qnlow4), + formatqn(self.qnlow5), + formatqn(self.qnlow6)) + + + class Meta: + db_table = u'RadiativeTransitions' + class Sources( Model): @@ -887,7 +1049,29 @@ class Meta: db_table = u'Partitionfunctions' +class PartitionfunctionsDetailed( Model): + """ + This class contains partition function (mysql-table: Partitionfunctions) for each specie + which have been calculated based on the state energy listing and include contributions + from other vibrational states (other specie). + """ + id = AutoField(primary_key=True, db_column='PFD_ID') + specie = ForeignKey(Species, db_column='PFD_E_ID') + inchikey = CharField(max_length=30, db_column='PFD_Inchikey', blank=True, null = True) + state = CharField(max_length=100, db_column = 'PFD_State') + loweststateenergy = FloatField(db_column='PFD_LowestStateEnergy') + nsi = ForeignKey(NuclearSpinIsomers, db_column='PFD_NSI', blank=True, null = True) + temperature = FloatField(db_column='PFD_Temperature') + partitionfunc = FloatField(db_column='PFD_Partitionfunction') + comment = CharField(max_length=150, db_column='PFD_Comment') + createdate = DateTimeField(db_column='PFD_Createdate') + changedate = DateTimeField(db_column='PFD_Changedate') + class Meta: + db_table = u'PartitionFunctionsDetailed' + + def __unicode__(self): + return "%6d %20s %9.3lf %20.6lf" % (self.specie.id, self.state, self.temperature, self.partitionfunc) class Method: """ diff --git a/nodes/cdms/node/queryfunc.py b/nodes/cdms/node/queryfunc.py index e4215ec2..20b524f7 100644 --- a/nodes/cdms/node/queryfunc.py +++ b/nodes/cdms/node/queryfunc.py @@ -41,16 +41,20 @@ def attach_partionfunc(molecules): molecule.pfsymmetrygroup = [] molecule.pfnsilowestrovibsym = [] - #pfs = Partitionfunctions.objects.filter(eid = molecule.id, mid__isnull=False) - pfs = Partitionfunctions.objects.filter(specie = molecule, state="All") + #pfs = Partitionfunctions.objects.filter(specie = molecule, state="All") + pfs = PartitionfunctionsDetailed.objects.filter(specie = molecule) # Get List of all nuclear spin isomers "None" should be included and gives # partition functions which do not distinguish between nuclear spin isomers. nsilist = pfs.values_list('nsi_id', flat=True).distinct() for nsi in nsilist: - temp=pfs.filter(nsi_id=nsi).values_list('temperature',flat=True) - pf = pfs.filter(nsi_id=nsi).values_list('partitionfunc',flat=True) + temp_pf_list = pfs.filter(nsi_id=nsi).values('temperature').annotate(p=Sum('partitionfunc')).order_by('temperature') + + #temp=pfs.filter(nsi_id=nsi).values_list('temperature',flat=True) + #pf = pfs.filter(nsi_id=nsi).values_list('partitionfunc',flat=True) + temp =temp_pf_list.values_list('temperature',flat=True) + pf =temp_pf_list.values_list('p',flat=True) # Get information on nuclear spin isomers or Null try: @@ -223,7 +227,7 @@ def attach_exp_frequencies(transs): The calculated frequency is given anyway followed by experimental frequencies (db-table: Frequencies). In addition a unique list of methods for the experimental data is created and returned. - +ll Returns: - modified transitions (frequencies, ... attached as lists) - methods for experimental data @@ -308,7 +312,7 @@ def setupResults(sql): #datasets = Datasets.objects.filter(archiveflag=0) # Query the database and get calculated transitions (TransitionsCalc) - transs = TransitionsCalc.objects.filter(q #specie__origin=5, + transs = RadiativeTransitions.objects.filter(q #specie__origin=5, #specie__archiveflag=0, #dataset__in=datasets, #dataset__archiveflag=0 @@ -345,10 +349,13 @@ def setupResults(sql): natoms = len(atoms) #atoms.count() ntranss = transs.count() - lastmodified = datetime.datetime.now() - for specie in chain(atoms, molecules): - if specie.changedatelastmodified: lastmodified = specie.changedate + if lastmodified == datetime.datetime(2009,12,1): + lastmodified = datetime.datetime.now() # Calculate estimated size of xsams-file if ntranss+nmolecules+nsources+natoms+nstates>0: @@ -431,7 +438,7 @@ def returnResults(tap, LIMIT=None): # because only the selected columns should be returned and no additional ones col = tap.parsedSQL.columns #.asList() - transs = TransitionsCalc.objects.filter(q,specie__origin=5,specie__archiveflag=0,dataset__archiveflag=0,energylower__gt=0) + transs = RadiativeTransitions.objects.filter(q,specie__origin=5,specie__archiveflag=0,dataset__archiveflag=0,energylower__gt=0) ntrans = transs.count() if LIMIT is not None and ntrans > LIMIT: @@ -555,42 +562,43 @@ def Mrg(transs): """ for trans in transs: - trans.attach_exp_frequencies() - - speciestag = trans.speciestag - - if len(trans.frequencies)>1: - speciestag=-speciestag - frequency = trans.frequencies[1] - uncertainty = trans.uncertainties[1] - else: - frequency = trans.frequency - uncertainty = trans.uncertainty + yield '%s ' % trans.spfitstr() +## trans.attach_exp_frequencies() + +## speciestag = trans.speciestag + +## if len(trans.frequencies)>1: +## speciestag=-speciestag +## frequency = trans.frequencies[1] +## uncertainty = trans.uncertainties[1] +## else: +## frequency = trans.frequency +## uncertainty = trans.uncertainty - yield '%13.4lf' % frequency - yield '%8.4lf' % uncertainty - yield '%8.4lf' % trans.intensity +## yield '%13.4lf' % frequency +## yield '%8.4lf' % uncertainty +## yield '%8.4lf' % trans.intensity - yield '%2d' % trans.degreeoffreedom - yield '%10.4lf' % trans.energylower +## yield '%2d' % trans.degreeoffreedom +## yield '%10.4lf' % trans.energylower - yield '%3d' % trans.upperstatedegeneracy - yield '%7d' % speciestag +## yield '%3d' % trans.upperstatedegeneracy +## yield '%7d' % speciestag - yield '%4d' % trans.qntag - yield '%2s' % formatqn(trans.qnup1) - yield '%2s' % formatqn(trans.qnup2) - yield '%2s' % formatqn(trans.qnup3) - yield '%2s' % formatqn(trans.qnup4) - yield '%2s' % formatqn(trans.qnup5) - yield '%2s' % formatqn(trans.qnup6) - - yield '%2s' % formatqn(trans.qnlow1) - yield '%2s' % formatqn(trans.qnlow2) - yield '%2s' % formatqn(trans.qnlow3) - yield '%2s' % formatqn(trans.qnlow4) - yield '%2s' % formatqn(trans.qnlow5) - yield '%2s' % formatqn(trans.qnlow6) +## yield '%4d' % trans.qntag +## yield '%2s' % formatqn(trans.qnup1) +## yield '%2s' % formatqn(trans.qnup2) +## yield '%2s' % formatqn(trans.qnup3) +## yield '%2s' % formatqn(trans.qnup4) +## yield '%2s' % formatqn(trans.qnup5) +## yield '%2s' % formatqn(trans.qnup6) + +## yield '%2s' % formatqn(trans.qnlow1) +## yield '%2s' % formatqn(trans.qnlow2) +## yield '%2s' % formatqn(trans.qnlow3) +## yield '%2s' % formatqn(trans.qnlow4) +## yield '%2s' % formatqn(trans.qnlow5) +## yield '%2s' % formatqn(trans.qnlow6) yield '%s' % trans.specie.name yield '\n' diff --git a/nodes/cdms/node/urls.py b/nodes/cdms/node/urls.py index 732c2159..68779b27 100644 --- a/nodes/cdms/node/urls.py +++ b/nodes/cdms/node/urls.py @@ -24,6 +24,7 @@ (r'^catalog', 'catalog'), (r'^showResults', 'showResults'), (r'^ajaxRequest', 'ajaxRequest'), + (r'^downloadData', 'download_data'), # (r'^xsams2html', 'xsams2html'), (r'^tools', 'tools'), (r'^general', 'general'), diff --git a/nodes/cdms/node/views.py b/nodes/cdms/node/views.py index 6ce6e9cd..66498688 100644 --- a/nodes/cdms/node/views.py +++ b/nodes/cdms/node/views.py @@ -534,6 +534,22 @@ def getfile(request,id): return response +def download_data(request): + postvars = request.POST + + baseurl = request.POST.get('nodeurl', settings.BASE_URL + settings.TAP_URLPATH) + + if 'url2' in request.POST: + return HttpResponseRedirect(request.POST['url2']) + else: + postvars = QUERY(request.POST,baseurl = baseurl) + if postvars.url: + if postvars.format.lower()=='xsams': + return HttpResponseRedirect(postvars.url) + + + + def cdms_lite_download(request): """ Returns the cdms_lite (sqlite3) database file diff --git a/nodes/cdms/static/xsl/convertXSAMS2html_v1.0.xslt b/nodes/cdms/static/xsl/convertXSAMS2html_v1.0.xslt index 035e3f00..c9a4e9a2 100644 --- a/nodes/cdms/static/xsl/convertXSAMS2html_v1.0.xslt +++ b/nodes/cdms/static/xsl/convertXSAMS2html_v1.0.xslt @@ -655,7 +655,7 @@ Method: --> - +
Partition functions for @@ -679,6 +679,57 @@ Method:
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Partition functions for + + + + + +
TQ
+
+ + + + + + + + + + + + + + + + + @@ -700,6 +751,26 @@ Method: + + + + + + + + + + + + + + + + + + + +
diff --git a/vamdclib b/vamdclib new file mode 160000 index 00000000..68dfd3be --- /dev/null +++ b/vamdclib @@ -0,0 +1 @@ +Subproject commit 68dfd3be23f3a30c69aacef373b0151c7f5432c4