You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kalzium/src/kalziumdataobject.cpp

265 lines
9.9 KiB

/***************************************************************************
* Copyright (C) 2005 by Carsten Niehaus *
* cniehaus@kde.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include "kalziumdataobject.h"
#include "isotope.h"
#include "spectrum.h"
#include <tqdom.h>
#include <tqfile.h>
#include <klocale.h>
#include <kdebug.h>
#include <klocale.h>
#include <kurl.h>
#include <kstandarddirs.h>
#include <kapplication.h>
KalziumDataObject* KalziumDataObject::instance()
{
static KalziumDataObject kdo;
return &kdo;
}
KalziumDataObject::KalziumDataObject()
{
TQDomDocument doc( "datadocument" );
KURL url;
url.setPath( locate("data", "kalzium/data/"));
url.setFileName( "data.xml" );
TQFile layoutFile( url.path() );
if (!layoutFile.exists())
{
kdDebug() << "data.xml not found, exiting" << endl;
kapp->exit(0);
return;
}
if (!layoutFile.open(IO_ReadOnly))
{
kdDebug() << "data.xml IO-error" << endl;
return;
}
// Check if the document is well-formed
if (!doc.setContent(&layoutFile))
{
kdDebug() << "wrong xml" << endl;
layoutFile.close();
return;
}
layoutFile.close();
ElementList = readData( doc );
m_numOfElements = ElementList.count();
}
KalziumDataObject::~KalziumDataObject()
{
}
Element* KalziumDataObject::element( int number )
{
// checking that we are requesting a valid element
if ( ( number <= 0 ) || ( number > m_numOfElements ) )
return 0;
return *( ElementList.at( number-1 ) );
}
EList KalziumDataObject::readData( TQDomDocument &dataDocument )
{
EList list;
TQDomNodeList elementNodes; //the list of all element
TQDomElement domElement; //a single element
//read in all elements
elementNodes = dataDocument.elementsByTagName( "element" );
const uint count = elementNodes.count();
for ( uint i = 0; i < count; ++i )
{//iterate through all elements
domElement = ( const TQDomElement& ) elementNodes.item( i ).toElement();
double mass = domElement.namedItem( "mass" ).toElement().text().toDouble();
double en = domElement.namedItem( "electronegativity" ).toElement().text().toDouble();
double ea = domElement.namedItem( "electronaffinity" ).toElement().text().toDouble();
double mp = domElement.namedItem( "meltingpoint" ).toElement().text().toDouble();
double bp = domElement.namedItem( "boilingpoint" ).toElement().text().toDouble();
double density = domElement.namedItem( "density" ).toElement().text().toDouble();
double covalent_radius = domElement.namedItem( "radius" ).namedItem( "covalent" ).toElement().text().toDouble();
//van der Waals-Radius
double vdw_radius = domElement.namedItem( "radius" ).namedItem( "vdw" ).toElement().text().toDouble();
double atomic_radius = domElement.namedItem( "radius" ).namedItem( "atomic" ).toElement().text().toDouble();
double ionic_radius = domElement.namedItem( "radius" ).namedItem( "ionic" ).toElement().text().toDouble();
TQString ionic_charge = domElement.namedItem( "radius" ).namedItem( "ionic" ).toElement().attributeNode( "charge" ).value();
int bio = domElement.namedItem( "biologicalmeaning" ).toElement().text().toInt();
int radioactive = domElement.namedItem( "radioactive" ).toElement().text().toInt();
int period = domElement.namedItem( "period" ).toElement().text().toInt();
int artificial = domElement.namedItem( "artificial" ).toElement().text().toInt();
int date = domElement.namedItem( "date" ).toElement().text().toInt();
int number = domElement.namedItem( "number" ).toElement().text().toInt();
int abundance = domElement.namedItem( "abundance" ).toElement().text().toInt();
TQString scientist = domElement.namedItem( "date" ).toElement().attributeNode( "scientist" ).value();
TQString crystal = domElement.namedItem( "crystalstructure" ).toElement().text();
TQDomElement nameE = domElement.namedItem( "name" ).toElement();
TQString name = nameE.text();
TQString origin = i18n( nameE.attributeNode( "origin" ).value().utf8() );
TQString block = domElement.namedItem( "block" ).toElement().text();
TQString group = domElement.namedItem( "group" ).toElement().text();
TQString family = domElement.namedItem( "family" ).toElement().text();
TQString orbits = domElement.namedItem( "orbits" ).toElement().text();
TQString symbol = domElement.namedItem( "symbol" ).toElement().text();
TQString oxydation = domElement.namedItem( "oxydation" ).toElement().text();
TQString acidicbehaviour = domElement.namedItem( "acidicbehaviour" ).toElement().text();
TQDomNodeList elist = domElement.elementsByTagName( "energy" );
TQValueList<double> ionlist;
for( uint i = 0; i < elist.length(); i++ )
{
ionlist.append( elist.item( i ).toElement().text().toDouble() );
}
//now read in all the date for the isotopes
TQDomNodeList isotopelist = domElement.elementsByTagName( "isotope" );
TQValueList<Isotope*> isolist;
for( uint i = 0; i < isotopelist.length(); i++ )
{
TQDomElement iso = isotopelist.item( i ).toElement();
double halflife = iso.attributeNode( "halflife" ).value().toDouble();
double weight = iso.attributeNode( "weight" ).value().toDouble();
TQString format = iso.attributeNode( "halflifeformat" ).value();
int neutrons = iso.attributeNode( "neutron" ).value().toInt();
double percentage = iso.attributeNode( "percentage" ).value().toDouble();
double alphapercentage = iso.attributeNode( "alphapercentage" ).value().toDouble();
double betapluspercentage = iso.attributeNode( "betapluspercentage" ).value().toDouble();
double betaminuspercentage = iso.attributeNode( "betaminuspercentage" ).value().toDouble();
double ecpercentage = iso.attributeNode( "ecpercentage" ).value().toDouble();
double alphadecay = iso.attributeNode( "alphadecay" ).value().toDouble();
double betaplusdecay = iso.attributeNode( "betaplusdecay" ).value().toDouble();
double betaminusdecay = iso.attributeNode( "betaminusdecay" ).value().toDouble();
double ecdecay = iso.attributeNode( "ecdecay" ).value().toDouble();
TQString spin = iso.attributeNode( "spin" ).value();
TQString magmoment = iso.attributeNode( "magmoment" ).value();
Isotope *isotope = new Isotope( neutrons,
number,
percentage,
weight,
halflife,
format,
alphadecay,
betaplusdecay,
betaminusdecay,
ecdecay,
alphapercentage,
betapluspercentage,
betaminuspercentage,
ecpercentage,
spin,
magmoment );
isolist.append( isotope );
}
TQDomNodeList spectrumList = domElement.namedItem( "spectra" ).toElement().elementsByTagName( "spectrum" );
Element *e = new Element();
e->setDate(date);
e->setBiologicalMeaning(bio);
e->setNumber( number );
e->setName(i18n(name.utf8()));
e->setRadius( Element::ATOMIC, atomic_radius );
e->setRadius( Element::IONIC, ionic_radius, ionic_charge );
e->setRadius( Element::COVALENT, covalent_radius );
e->setRadius( Element::VDW, vdw_radius );
e->setAbundance( abundance );
if ( artificial == 1 )
e->setArtificial();
if ( radioactive == 1 )
e->setRadioactive();
e->setScientist(scientist);
e->setPeriod( period );
e->setCrysatalstructure( crystal );
e->setOrigin(origin);
e->setBlock(block);
e->setGroup(group);
e->setFamily(family);
e->setOrbits(orbits);
e->setSymbol(symbol);
e->setOxydation(oxydation);
e->setAcidicbehaviour(acidicbehaviour);
e->setIonisationList( ionlist );
e->setIsotopeList( isolist );
e->setMass( mass );
e->setEN( en );
e->setEA( ea );
e->setMeltingpoint( mp );
e->setBoilingpoint( bp );
e->setDensity( density );
e->setupXY();
Spectrum *spectrum = new Spectrum();
bool spectrum_temp = false;
if ( spectrumList.length() > 0 )
spectrum_temp = true;
for( uint i = 0; i < spectrumList.length(); i++ )
{
Spectrum::band b;
TQDomElement spec = spectrumList.item( i ).toElement();
b.intensity = spec.attributeNode( "intensity" ).value().toInt();
b.wavelength = spec.attributeNode( "wavelength" ).value().toDouble()/10.0;
b.aki = spec.attributeNode( "aki" ).value().toDouble();
b.energy1 = spec.attributeNode( "energy1" ).value().toDouble();
b.energy2 = spec.attributeNode( "energy2" ).value().toDouble();
b.electronconfig1 = spec.attributeNode( "electronconfig1" ).value();
b.electronconfig2 = spec.attributeNode( "electronconfig1" ).value();
b.term1 = spec.attributeNode( "term1" ).value();
b.term2 = spec.attributeNode( "term2" ).value();
b.J1 = spec.attributeNode( "J1" ).value();
b.J2 = spec.attributeNode( "J2" ).value();
spectrum->addBand( b );
}
if ( spectrum_temp ) //if no spectrumdata are found don't use this object
e->setSpectrum( spectrum );
e->setHasSepctrum( spectrum_temp );
list.append( e );
coordinate point; point.x = e->x; point.y = e->y;
CoordinateList.append( point );
}
return list;
}