File indexing completed on 2024-04-14 03:40:14

0001 /*
0002     SPDX-FileCopyrightText: 2005-2008 Carsten Niehaus <cniehaus@kde.org>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "isotopeparser.h"
0007 
0008 #include "chemicaldataobject.h"
0009 #include "isotope.h"
0010 
0011 #include "kalzium_libscience_debug.h"
0012 
0013 #include <KUnitConversion/Converter>
0014 
0015 class IsotopeParser::Private
0016 {
0017 public:
0018     Private()
0019         : currentUnit(KUnitConversion::NoUnit)
0020         , currentErrorValue(QVariant())
0021         , currentElementSymbol(QString())
0022         , currentIsotope(nullptr)
0023         , inIsotope(false)
0024         , inElement(false)
0025         , inAtomicNumber(false)
0026         , inExactMass(false)
0027         , inSpin(false)
0028         , inMagMoment(false)
0029         , inHalfLife(false)
0030         , inAlphaDecay(false)
0031         , inAlphaDecayLikeliness(false)
0032         , inProtonDecay(false)
0033         , inProtonDecayLikeliness(false)
0034         , inTwoProtonDecay(false)
0035         , inTwoProtonDecayLikeliness(false)
0036         , inNeutronDecay(false)
0037         , inNeutronDecayLikeliness(false)
0038         , inTwoNeutronDecay(false)
0039         , inTwoNeutronDecayLikeliness(false)
0040         , inECDecay(false)
0041         , inECDecayLikeliness(false)
0042         , inTwoECDecay(false)
0043         , inTwoECDecayLikeliness(false)
0044         , inBetaminusDecay(false)
0045         , inBetaminusDecayLikeliness(false)
0046         , inBetaminusFissionDecay(false)
0047         , inBetaminusFissionDecayLikeliness(false)
0048         , inTwoBetaminusDecay(false)
0049         , inTwoBetaminusDecayLikeliness(false)
0050         , inBetaplusDecay(false)
0051         , inBetaplusDecayLikeliness(false)
0052         , inTwoBetaplusDecay(false)
0053         , inTwoBetaplusDecayLikeliness(false)
0054         , inBetaminusNeutronDecay(false)
0055         , inBetaminusNeutronDecayLikeliness(false)
0056         , inBetaminusTwoNeutronDecay(false)
0057         , inBetaminusTwoNeutronDecayLikeliness(false)
0058         , inBetaminusThreeNeutronDecay(false)
0059         , inBetaminusThreeNeutronDecayLikeliness(false)
0060         , inBetaminusFourNeutronDecay(false)
0061         , inBetaminusFourNeutronDecayLikeliness(false)
0062         , inBetaminusAlphaNeutronDecay(false)
0063         , inBetaminusAlphaNeutronDecayLikeliness(false)
0064         , inBetaminusAlphaDecay(false)
0065         , inBetaminusAlphaDecayLikeliness(false)
0066         , inBetaminusTwoAlphaDecay(false)
0067         , inBetaminusTwoAlphaDecayLikeliness(false)
0068         , inBetaminusThreeAlphaDecay(false)
0069         , inBetaminusThreeAlphaDecayLikeliness(false)
0070         , inBetaplusProtonDecay(false)
0071         , inBetaplusProtonDecayLikeliness(false)
0072         , inBetaplusTwoProtonDecay(false)
0073         , inBetaplusTwoProtonDecayLikeliness(false)
0074         , inBetaplusAlphaDecay(false)
0075         , inBetaplusAlphaDecayLikeliness(false)
0076         , inBetaplusTwoAlphaDecay(false)
0077         , inBetaplusTwoAlphaDecayLikeliness(false)
0078         , inBetaplusThreeAlphaDecay(false)
0079         , inBetaplusThreeAlphaDecayLikeliness(false)
0080         , inAlphaBetaminusDecay(false)
0081         , inAlphaBetaminusDecayLikeliness(false)
0082         , inProtonAlphaDecay(false)
0083         , inProtonAlphaDecayLikeliness(false)
0084         , inECProtonDecay(false)
0085         , inECProtonDecayLikeliness(false)
0086         , inECTwoProtonDecay(false)
0087         , inECTwoProtonDecayLikeliness(false)
0088         , inECThreeProtonDecay(false)
0089         , inECThreeProtonDecayLikeliness(false)
0090         , inECAlphaDecay(false)
0091         , inECAlphaDecayLikeliness(false)
0092         , inECAlphaProtonDecay(false)
0093         , inECAlphaProtonDecayLikeliness(false)
0094         , inSpontFissionDecay(false)
0095         , inSpontFissionDecayLikeliness(false)
0096         , inAbundance(false)
0097     {
0098     }
0099 
0100     ~Private()
0101     {
0102         delete currentIsotope;
0103         // qDeleteAll(isotopes);
0104     }
0105 
0106     ChemicalDataObject currentDataObject;
0107     int currentUnit;
0108     QVariant currentErrorValue;
0109     QString currentElementSymbol;
0110     Isotope *currentIsotope;
0111 
0112     QList<Isotope *> isotopes;
0113 
0114     bool inIsotope;
0115     bool inElement;
0116     bool inAtomicNumber;
0117     bool inExactMass;
0118     bool inSpin;
0119     bool inMagMoment;
0120     bool inHalfLife;
0121     bool inAlphaDecay;
0122     bool inAlphaDecayLikeliness;
0123     bool inProtonDecay;
0124     bool inProtonDecayLikeliness;
0125     bool inTwoProtonDecay;
0126     bool inTwoProtonDecayLikeliness;
0127     bool inNeutronDecay;
0128     bool inNeutronDecayLikeliness;
0129     bool inTwoNeutronDecay;
0130     bool inTwoNeutronDecayLikeliness;
0131     bool inECDecay;
0132     bool inECDecayLikeliness;
0133     bool inTwoECDecay;
0134     bool inTwoECDecayLikeliness;
0135     bool inBetaminusDecay;
0136     bool inBetaminusDecayLikeliness;
0137     bool inBetaminusFissionDecay;
0138     bool inBetaminusFissionDecayLikeliness;
0139     bool inTwoBetaminusDecay;
0140     bool inTwoBetaminusDecayLikeliness;
0141     bool inBetaplusDecay;
0142     bool inBetaplusDecayLikeliness;
0143     bool inTwoBetaplusDecay;
0144     bool inTwoBetaplusDecayLikeliness;
0145     bool inBetaminusNeutronDecay;
0146     bool inBetaminusNeutronDecayLikeliness;
0147     bool inBetaminusTwoNeutronDecay;
0148     bool inBetaminusTwoNeutronDecayLikeliness;
0149     bool inBetaminusThreeNeutronDecay;
0150     bool inBetaminusThreeNeutronDecayLikeliness;
0151     bool inBetaminusFourNeutronDecay;
0152     bool inBetaminusFourNeutronDecayLikeliness;
0153     bool inBetaminusAlphaNeutronDecay;
0154     bool inBetaminusAlphaNeutronDecayLikeliness;
0155     bool inBetaminusAlphaDecay;
0156     bool inBetaminusAlphaDecayLikeliness;
0157     bool inBetaminusTwoAlphaDecay;
0158     bool inBetaminusTwoAlphaDecayLikeliness;
0159     bool inBetaminusThreeAlphaDecay;
0160     bool inBetaminusThreeAlphaDecayLikeliness;
0161     bool inBetaplusProtonDecay;
0162     bool inBetaplusProtonDecayLikeliness;
0163     bool inBetaplusTwoProtonDecay;
0164     bool inBetaplusTwoProtonDecayLikeliness;
0165     bool inBetaplusAlphaDecay;
0166     bool inBetaplusAlphaDecayLikeliness;
0167     bool inBetaplusTwoAlphaDecay;
0168     bool inBetaplusTwoAlphaDecayLikeliness;
0169     bool inBetaplusThreeAlphaDecay;
0170     bool inBetaplusThreeAlphaDecayLikeliness;
0171     bool inAlphaBetaminusDecay;
0172     bool inAlphaBetaminusDecayLikeliness;
0173     bool inProtonAlphaDecay;
0174     bool inProtonAlphaDecayLikeliness;
0175     bool inECProtonDecay;
0176     bool inECProtonDecayLikeliness;
0177     bool inECTwoProtonDecay;
0178     bool inECTwoProtonDecayLikeliness;
0179     bool inECThreeProtonDecay;
0180     bool inECThreeProtonDecayLikeliness;
0181     bool inECAlphaDecay;
0182     bool inECAlphaDecayLikeliness;
0183     bool inECAlphaProtonDecay;
0184     bool inECAlphaProtonDecayLikeliness;
0185     bool inSpontFissionDecay;
0186     bool inSpontFissionDecayLikeliness;
0187     bool inAbundance;
0188 };
0189 
0190 IsotopeParser::IsotopeParser()
0191     : QXmlDefaultHandler()
0192     , d(new Private)
0193 {
0194 }
0195 
0196 IsotopeParser::~IsotopeParser()
0197 {
0198     delete d;
0199 }
0200 
0201 bool IsotopeParser::startElement(const QString &, const QString &localName, const QString &, const QXmlAttributes &attrs)
0202 {
0203     if (localName == QLatin1String("isotopeList")) {
0204         d->inElement = true;
0205 
0206         // now save the symbol of the current element
0207         for (int i = 0; i < attrs.length(); ++i) {
0208             if (attrs.localName(i) == QLatin1String("id")) {
0209                 d->currentElementSymbol = attrs.value(i);
0210             }
0211         }
0212     } else if (d->inElement && localName == QLatin1String("isotope")) {
0213         d->currentIsotope = new Isotope();
0214         d->currentIsotope->addData(ChemicalDataObject(QVariant(d->currentElementSymbol), ChemicalDataObject::symbol));
0215         d->inIsotope = true;
0216         for (int i = 0; i < attrs.length(); ++i) {
0217             if (attrs.localName(i) == QLatin1String("number")) {
0218                 d->currentIsotope->setNucleons(attrs.value(i).toInt());
0219             }
0220         }
0221     } else if (d->inIsotope && localName == QLatin1String("scalar")) {
0222         for (int i = 0; i < attrs.length(); ++i) {
0223             if (attrs.localName(i) == QLatin1String("errorValue")) {
0224                 d->currentErrorValue = QVariant(attrs.value(i));
0225                 continue;
0226             }
0227 
0228             if (attrs.value(i) == QLatin1String("bo:atomicNumber")) {
0229                 d->inAtomicNumber = true;
0230             } else if (attrs.value(i) == QLatin1String("bo:exactMass")) {
0231                 d->inExactMass = true;
0232             } else if (attrs.value(i) == QLatin1String("bo:halfLife")) {
0233                 for (int i = 0; i < attrs.length(); ++i) {
0234                     if (attrs.localName(i) == QLatin1String("units")) {
0235                         if (attrs.value(i) == QLatin1String("siUnits:s")) {
0236                             d->currentUnit = KUnitConversion::Second;
0237                         } else if (attrs.value(i) == QLatin1String("units:y")) {
0238                             d->currentUnit = KUnitConversion::Year;
0239                         } else {
0240                             d->currentUnit = KUnitConversion::NoUnit;
0241                         }
0242                     }
0243                 }
0244 
0245                 d->currentDataObject.setUnit(d->currentUnit);
0246                 d->inHalfLife = true;
0247             } else if (attrs.value(i) == QLatin1String("bo:alphaDecay")) {
0248                 d->inAlphaDecay = true;
0249             } else if (attrs.value(i) == QLatin1String("bo:alphaDecayLikeliness")) {
0250                 d->inAlphaDecayLikeliness = true;
0251             } else if (attrs.value(i) == QLatin1String("bo:protonDecay")) {
0252                 d->inProtonDecay = true;
0253             } else if (attrs.value(i) == QLatin1String("bo:protonDecayLikeliness")) {
0254                 d->inProtonDecayLikeliness = true;
0255             } else if (attrs.value(i) == QLatin1String("bo:2protonDecay")) {
0256                 d->inTwoProtonDecay = true;
0257             } else if (attrs.value(i) == QLatin1String("bo:2protonDecayLikeliness")) {
0258                 d->inTwoProtonDecayLikeliness = true;
0259             } else if (attrs.value(i) == QLatin1String("bo:neutronDecay")) {
0260                 d->inNeutronDecay = true;
0261             } else if (attrs.value(i) == QLatin1String("bo:neutronDecayLikeliness")) {
0262                 d->inNeutronDecayLikeliness = true;
0263             } else if (attrs.value(i) == QLatin1String("bo:2neutronDecay")) {
0264                 d->inTwoNeutronDecay = true;
0265             } else if (attrs.value(i) == QLatin1String("bo:2neutronDecayLikeliness")) {
0266                 d->inTwoNeutronDecayLikeliness = true;
0267             } else if (attrs.value(i) == QLatin1String("bo:ecDecay")) {
0268                 d->inECDecay = true;
0269             } else if (attrs.value(i) == QLatin1String("bo:ecDecayLikeliness")) {
0270                 d->inECDecayLikeliness = true;
0271             } else if (attrs.value(i) == QLatin1String("bo:2ecDecay")) {
0272                 d->inTwoECDecay = true;
0273             } else if (attrs.value(i) == QLatin1String("bo:2ecDecayLikeliness")) {
0274                 d->inTwoECDecayLikeliness = true;
0275             } else if (attrs.value(i) == QLatin1String("bo:betaminusDecay")) {
0276                 d->inBetaminusDecay = true;
0277             } else if (attrs.value(i) == QLatin1String("bo:betaminusDecayLikeliness")) {
0278                 d->inBetaminusDecayLikeliness = true;
0279             } else if (attrs.value(i) == QLatin1String("bo:betaminusfissionDecay")) {
0280                 d->inBetaminusFissionDecay = true;
0281             } else if (attrs.value(i) == QLatin1String("bo:betaminusfissionDecayLikeliness")) {
0282                 d->inBetaminusFissionDecayLikeliness = true;
0283             } else if (attrs.value(i) == QLatin1String("bo:2betaminusDecay")) {
0284                 d->inTwoBetaminusDecay = true;
0285             } else if (attrs.value(i) == QLatin1String("bo:2betaminusDecayLikeliness")) {
0286                 d->inTwoBetaminusDecayLikeliness = true;
0287             } else if (attrs.value(i) == QLatin1String("bo:betaplusDecay")) {
0288                 d->inBetaplusDecay = true;
0289             } else if (attrs.value(i) == QLatin1String("bo:betaplusDecayLikeliness")) {
0290                 d->inBetaplusDecayLikeliness = true;
0291             } else if (attrs.value(i) == QLatin1String("bo:2betaplusDecay")) {
0292                 d->inTwoBetaplusDecay = true;
0293             } else if (attrs.value(i) == QLatin1String("bo:2betaplusDecayLikeliness")) {
0294                 d->inTwoBetaplusDecayLikeliness = true;
0295             } else if (attrs.value(i) == QLatin1String("bo:betaminusneutronDecay")) {
0296                 d->inBetaminusNeutronDecay = true;
0297             } else if (attrs.value(i) == QLatin1String("bo:betaminusneutronDecayLikeliness")) {
0298                 d->inBetaminusNeutronDecayLikeliness = true;
0299             } else if (attrs.value(i) == QLatin1String("bo:betaminus2neutronDecay")) {
0300                 d->inBetaminusTwoNeutronDecay = true;
0301             } else if (attrs.value(i) == QLatin1String("bo:betaminus2neutronDecayLikeliness")) {
0302                 d->inBetaminusTwoNeutronDecayLikeliness = true;
0303             } else if (attrs.value(i) == QLatin1String("bo:betaminus3neutronDecay")) {
0304                 d->inBetaminusThreeNeutronDecay = true;
0305             } else if (attrs.value(i) == QLatin1String("bo:betaminus3neutronDecayLikeliness")) {
0306                 d->inBetaminusThreeNeutronDecayLikeliness = true;
0307             } else if (attrs.value(i) == QLatin1String("bo:betaminus4neutronDecay")) {
0308                 d->inBetaminusFourNeutronDecay = true;
0309             } else if (attrs.value(i) == QLatin1String("bo:betaminus4neutronDecayLikeliness")) {
0310                 d->inBetaminusFourNeutronDecayLikeliness = true;
0311             } else if (attrs.value(i) == QLatin1String("bo:betaminusalphaneutronDecay")) {
0312                 d->inBetaminusAlphaNeutronDecay = true;
0313             } else if (attrs.value(i) == QLatin1String("bo:betaminusalphaneutronDecayLikeliness")) {
0314                 d->inBetaminusAlphaNeutronDecayLikeliness = true;
0315             } else if (attrs.value(i) == QLatin1String("bo:betaminusalphaDecay")) {
0316                 d->inBetaminusAlphaDecay = true;
0317             } else if (attrs.value(i) == QLatin1String("bo:betaminusalphaDecayLikeliness")) {
0318                 d->inBetaminusAlphaDecayLikeliness = true;
0319             } else if (attrs.value(i) == QLatin1String("bo:betaminus2alphaDecay")) {
0320                 d->inBetaminusTwoAlphaDecay = true;
0321             } else if (attrs.value(i) == QLatin1String("bo:betaminus2alphaDecayLikeliness")) {
0322                 d->inBetaminusTwoAlphaDecayLikeliness = true;
0323             } else if (attrs.value(i) == QLatin1String("bo:betaminus3alphaDecay")) {
0324                 d->inBetaminusThreeAlphaDecay = true;
0325             } else if (attrs.value(i) == QLatin1String("bo:betaminus3alphaDecayLikeliness")) {
0326                 d->inBetaminusThreeAlphaDecayLikeliness = true;
0327             } else if (attrs.value(i) == QLatin1String("bo:betaplusprotonDecay")) {
0328                 d->inBetaplusProtonDecay = true;
0329             } else if (attrs.value(i) == QLatin1String("bo:betaplusprotonDecayLikeliness")) {
0330                 d->inBetaplusProtonDecayLikeliness = true;
0331             } else if (attrs.value(i) == QLatin1String("bo:betaplus2protonDecay")) {
0332                 d->inBetaplusTwoProtonDecay = true;
0333             } else if (attrs.value(i) == QLatin1String("bo:betaplus2protonDecayLikeliness")) {
0334                 d->inBetaplusTwoProtonDecayLikeliness = true;
0335             } else if (attrs.value(i) == QLatin1String("bo:betaplusalphaDecay")) {
0336                 d->inBetaplusAlphaDecay = true;
0337             } else if (attrs.value(i) == QLatin1String("bo:betaplusalphaDecayLikeliness")) {
0338                 d->inBetaplusAlphaDecayLikeliness = true;
0339             } else if (attrs.value(i) == QLatin1String("bo:betaplus2alphaDecay")) {
0340                 d->inBetaplusTwoAlphaDecay = true;
0341             } else if (attrs.value(i) == QLatin1String("bo:betaplus2alphaDecayLikeliness")) {
0342                 d->inBetaplusTwoAlphaDecayLikeliness = true;
0343             } else if (attrs.value(i) == QLatin1String("bo:betaplus3alphaDecay")) {
0344                 d->inBetaplusThreeAlphaDecay = true;
0345             } else if (attrs.value(i) == QLatin1String("bo:betaplus3alphaDecayLikeliness")) {
0346                 d->inBetaplusThreeAlphaDecayLikeliness = true;
0347             } else if (attrs.value(i) == QLatin1String("bo:alphabetaminusDecay")) {
0348                 d->inAlphaBetaminusDecay = true;
0349             } else if (attrs.value(i) == QLatin1String("bo:alphabetaminusDecayLikeliness")) {
0350                 d->inAlphaBetaminusDecayLikeliness = true;
0351             } else if (attrs.value(i) == QLatin1String("bo:protonalphaDecay")) {
0352                 d->inProtonAlphaDecay = true;
0353             } else if (attrs.value(i) == QLatin1String("bo:protonalphaDecayLikeliness")) {
0354                 d->inProtonAlphaDecayLikeliness = true;
0355             } else if (attrs.value(i) == QLatin1String("bo:ecprotonDecay")) {
0356                 d->inECProtonDecay = true;
0357             } else if (attrs.value(i) == QLatin1String("bo:ecprotonDecayLikeliness")) {
0358                 d->inECProtonDecayLikeliness = true;
0359             } else if (attrs.value(i) == QLatin1String("bo:ec2protonDecay")) {
0360                 d->inECTwoProtonDecay = true;
0361             } else if (attrs.value(i) == QLatin1String("bo:ec2protonDecayLikeliness")) {
0362                 d->inECTwoProtonDecayLikeliness = true;
0363             } else if (attrs.value(i) == QLatin1String("bo:ec3protonDecay")) {
0364                 d->inECThreeProtonDecay = true;
0365             } else if (attrs.value(i) == QLatin1String("bo:ec3protonDecayLikeliness")) {
0366                 d->inECThreeProtonDecayLikeliness = true;
0367             } else if (attrs.value(i) == QLatin1String("bo:ecalphaDecay")) {
0368                 d->inECAlphaDecay = true;
0369             } else if (attrs.value(i) == QLatin1String("bo:ecalphaDecayLikeliness")) {
0370                 d->inECAlphaDecayLikeliness = true;
0371             } else if (attrs.value(i) == QLatin1String("bo:ecalphaprotonDecay")) {
0372                 d->inECAlphaProtonDecay = true;
0373             } else if (attrs.value(i) == QLatin1String("bo:ecalphaprotonDecayLikeliness")) {
0374                 d->inECAlphaProtonDecayLikeliness = true;
0375             } else if (attrs.value(i) == QLatin1String("bo:spontfissionDecay")) {
0376                 d->inSpontFissionDecay = true;
0377             } else if (attrs.value(i) == QLatin1String("bo:spontfissionDecayLikeliness")) {
0378                 d->inSpontFissionDecayLikeliness = true;
0379             } else if (attrs.value(i) == QLatin1String("bo:spin")) {
0380                 d->inSpin = true;
0381             } else if (attrs.value(i) == QLatin1String("bo:magneticMoment")) {
0382                 d->inMagMoment = true;
0383             } else if (attrs.value(i) == QLatin1String("bo:relativeAbundance")) {
0384                 d->inAbundance = true;
0385             }
0386         }
0387     }
0388     return true;
0389 }
0390 
0391 bool IsotopeParser::endElement(const QString &, const QString &localName, const QString &)
0392 {
0393     if (localName == QLatin1String("isotope")) {
0394         d->isotopes.append(d->currentIsotope);
0395 
0396         d->currentIsotope = nullptr;
0397         d->inIsotope = false;
0398     } else if (localName == QLatin1String("isotopeList")) { // a new list of isotopes start...
0399         d->inElement = false;
0400     }
0401 
0402     return true;
0403 }
0404 
0405 bool IsotopeParser::characters(const QString &ch)
0406 {
0407     ChemicalDataObject::BlueObelisk type;
0408     QVariant value;
0409 
0410     if (d->inExactMass) {
0411         value = ch.toDouble();
0412         type = ChemicalDataObject::exactMass;
0413         d->inExactMass = false;
0414     } else if (d->inAtomicNumber) {
0415         value = ch.toInt();
0416         type = ChemicalDataObject::atomicNumber;
0417         d->inAtomicNumber = false;
0418     } else if (d->inSpin) {
0419         value = ch;
0420         type = ChemicalDataObject::spin;
0421         d->inSpin = false;
0422     } else if (d->inMagMoment) {
0423         value = ch;
0424         type = ChemicalDataObject::magneticMoment;
0425         d->inMagMoment = false;
0426     } else if (d->inHalfLife) {
0427         value = ch.toDouble();
0428         type = ChemicalDataObject::halfLife;
0429         d->inHalfLife = false;
0430     } else if (d->inAlphaDecay) {
0431         value = ch.toDouble();
0432         type = ChemicalDataObject::alphaDecay;
0433         d->inAlphaDecay = false;
0434     } else if (d->inAlphaDecayLikeliness) {
0435         value = ch.toDouble();
0436         type = ChemicalDataObject::alphaDecayLikeliness;
0437         d->inAlphaDecayLikeliness = false;
0438     } else if (d->inProtonDecay) {
0439         value = ch.toDouble();
0440         type = ChemicalDataObject::protonDecay;
0441         d->inProtonDecay = false;
0442     } else if (d->inProtonDecayLikeliness) {
0443         value = ch.toDouble();
0444         type = ChemicalDataObject::protonDecayLikeliness;
0445         d->inProtonDecayLikeliness = false;
0446     } else if (d->inTwoProtonDecay) {
0447         value = ch.toDouble();
0448         type = ChemicalDataObject::twoprotonDecay;
0449         d->inTwoProtonDecay = false;
0450     } else if (d->inTwoProtonDecayLikeliness) {
0451         value = ch.toDouble();
0452         type = ChemicalDataObject::twoprotonDecayLikeliness;
0453         d->inTwoProtonDecayLikeliness = false;
0454     } else if (d->inNeutronDecay) {
0455         value = ch.toDouble();
0456         type = ChemicalDataObject::neutronDecay;
0457         d->inNeutronDecay = false;
0458     } else if (d->inNeutronDecayLikeliness) {
0459         value = ch.toDouble();
0460         type = ChemicalDataObject::neutronDecayLikeliness;
0461         d->inNeutronDecayLikeliness = false;
0462     } else if (d->inTwoNeutronDecay) {
0463         value = ch.toDouble();
0464         type = ChemicalDataObject::twoneutronDecay;
0465         d->inTwoNeutronDecay = false;
0466     } else if (d->inTwoNeutronDecayLikeliness) {
0467         value = ch.toDouble();
0468         type = ChemicalDataObject::twoneutronDecayLikeliness;
0469         d->inTwoNeutronDecayLikeliness = false;
0470     } else if (d->inECDecay) {
0471         value = ch.toDouble();
0472         type = ChemicalDataObject::ecDecay;
0473         d->inECDecay = false;
0474     } else if (d->inECDecayLikeliness) {
0475         value = ch.toDouble();
0476         type = ChemicalDataObject::ecDecayLikeliness;
0477         d->inECDecayLikeliness = false;
0478     } else if (d->inTwoECDecay) {
0479         value = ch.toDouble();
0480         type = ChemicalDataObject::twoecDecay;
0481         d->inTwoECDecay = false;
0482     } else if (d->inTwoECDecayLikeliness) {
0483         value = ch.toDouble();
0484         type = ChemicalDataObject::twoecDecayLikeliness;
0485         d->inTwoECDecayLikeliness = false;
0486     } else if (d->inBetaminusDecay) {
0487         value = ch.toDouble();
0488         type = ChemicalDataObject::betaminusDecay;
0489         d->inBetaminusDecay = false;
0490     } else if (d->inBetaminusDecayLikeliness) {
0491         value = ch.toDouble();
0492         type = ChemicalDataObject::betaminusDecayLikeliness;
0493         d->inBetaminusDecayLikeliness = false;
0494     } else if (d->inBetaminusFissionDecay) {
0495         value = ch.toDouble();
0496         type = ChemicalDataObject::betaminusfissionDecay;
0497         d->inBetaminusFissionDecay = false;
0498     } else if (d->inBetaminusFissionDecayLikeliness) {
0499         value = ch.toDouble();
0500         type = ChemicalDataObject::betaminusfissionDecayLikeliness;
0501         d->inBetaminusFissionDecayLikeliness = false;
0502     } else if (d->inTwoBetaminusDecay) {
0503         value = ch.toDouble();
0504         type = ChemicalDataObject::twobetaminusDecay;
0505         d->inTwoBetaminusDecay = false;
0506     } else if (d->inTwoBetaminusDecayLikeliness) {
0507         value = ch.toDouble();
0508         type = ChemicalDataObject::twobetaminusDecayLikeliness;
0509         d->inTwoBetaminusDecayLikeliness = false;
0510     } else if (d->inBetaplusDecay) {
0511         value = ch.toDouble();
0512         type = ChemicalDataObject::betaplusDecay;
0513         d->inBetaplusDecay = false;
0514     } else if (d->inBetaplusDecayLikeliness) {
0515         value = ch.toDouble();
0516         type = ChemicalDataObject::betaplusDecayLikeliness;
0517         d->inBetaplusDecayLikeliness = false;
0518     } else if (d->inTwoBetaplusDecay) {
0519         value = ch.toDouble();
0520         type = ChemicalDataObject::twobetaplusDecay;
0521         d->inTwoBetaplusDecay = false;
0522     } else if (d->inTwoBetaplusDecayLikeliness) {
0523         value = ch.toDouble();
0524         type = ChemicalDataObject::twobetaplusDecayLikeliness;
0525         d->inTwoBetaplusDecayLikeliness = false;
0526     } else if (d->inBetaminusNeutronDecay) {
0527         value = ch.toDouble();
0528         type = ChemicalDataObject::betaminusneutronDecay;
0529         d->inBetaminusNeutronDecay = false;
0530     } else if (d->inBetaminusNeutronDecayLikeliness) {
0531         value = ch.toDouble();
0532         type = ChemicalDataObject::betaminusneutronDecayLikeliness;
0533         d->inBetaminusNeutronDecayLikeliness = false;
0534     } else if (d->inBetaminusTwoNeutronDecay) {
0535         value = ch.toDouble();
0536         type = ChemicalDataObject::betaminustwoneutronDecay;
0537         d->inBetaminusTwoNeutronDecay = false;
0538     } else if (d->inBetaminusTwoNeutronDecayLikeliness) {
0539         value = ch.toDouble();
0540         type = ChemicalDataObject::betaminustwoneutronDecayLikeliness;
0541         d->inBetaminusTwoNeutronDecayLikeliness = false;
0542     } else if (d->inBetaminusThreeNeutronDecay) {
0543         value = ch.toDouble();
0544         type = ChemicalDataObject::betaminusthreeneutronDecay;
0545         d->inBetaminusThreeNeutronDecay = false;
0546     } else if (d->inBetaminusThreeNeutronDecayLikeliness) {
0547         value = ch.toDouble();
0548         type = ChemicalDataObject::betaminusthreeneutronDecayLikeliness;
0549         d->inBetaminusThreeNeutronDecayLikeliness = false;
0550     } else if (d->inBetaminusFourNeutronDecay) {
0551         value = ch.toDouble();
0552         type = ChemicalDataObject::betaminusfourneutronDecay;
0553         d->inBetaminusFourNeutronDecay = false;
0554     } else if (d->inBetaminusFourNeutronDecayLikeliness) {
0555         value = ch.toDouble();
0556         type = ChemicalDataObject::betaminusfourneutronDecayLikeliness;
0557         d->inBetaminusFourNeutronDecayLikeliness = false;
0558     } else if (d->inBetaminusAlphaNeutronDecay) {
0559         value = ch.toDouble();
0560         type = ChemicalDataObject::betaminusalphaneutronDecay;
0561         d->inBetaminusAlphaNeutronDecay = false;
0562     } else if (d->inBetaminusAlphaNeutronDecayLikeliness) {
0563         value = ch.toDouble();
0564         type = ChemicalDataObject::betaminusalphaneutronDecayLikeliness;
0565         d->inBetaminusAlphaNeutronDecayLikeliness = false;
0566     } else if (d->inBetaminusAlphaDecay) {
0567         value = ch.toDouble();
0568         type = ChemicalDataObject::betaminusalphaDecay;
0569         d->inBetaminusAlphaDecay = false;
0570     } else if (d->inBetaminusAlphaDecayLikeliness) {
0571         value = ch.toDouble();
0572         type = ChemicalDataObject::betaminusalphaDecayLikeliness;
0573         d->inBetaminusAlphaDecayLikeliness = false;
0574     } else if (d->inBetaminusTwoAlphaDecay) {
0575         value = ch.toDouble();
0576         type = ChemicalDataObject::betaminustwoalphaDecay;
0577         d->inBetaminusTwoAlphaDecay = false;
0578     } else if (d->inBetaminusTwoAlphaDecayLikeliness) {
0579         value = ch.toDouble();
0580         type = ChemicalDataObject::betaminustwoalphaDecayLikeliness;
0581         d->inBetaminusTwoAlphaDecayLikeliness = false;
0582     } else if (d->inBetaminusThreeAlphaDecay) {
0583         value = ch.toDouble();
0584         type = ChemicalDataObject::betaminusthreealphaDecay;
0585         d->inBetaminusThreeAlphaDecay = false;
0586     } else if (d->inBetaminusThreeAlphaDecayLikeliness) {
0587         value = ch.toDouble();
0588         type = ChemicalDataObject::betaminusthreealphaDecayLikeliness;
0589         d->inBetaminusThreeAlphaDecayLikeliness = false;
0590     } else if (d->inBetaplusProtonDecay) {
0591         value = ch.toDouble();
0592         type = ChemicalDataObject::betaplusprotonDecay;
0593         d->inBetaplusProtonDecay = false;
0594     } else if (d->inBetaplusProtonDecayLikeliness) {
0595         value = ch.toDouble();
0596         type = ChemicalDataObject::betaplusprotonDecayLikeliness;
0597         d->inBetaplusProtonDecayLikeliness = false;
0598     } else if (d->inBetaplusTwoProtonDecay) {
0599         value = ch.toDouble();
0600         type = ChemicalDataObject::betaplustwoprotonDecay;
0601         d->inBetaplusTwoProtonDecay = false;
0602     } else if (d->inBetaplusTwoProtonDecayLikeliness) {
0603         value = ch.toDouble();
0604         type = ChemicalDataObject::betaplustwoprotonDecayLikeliness;
0605         d->inBetaplusTwoProtonDecayLikeliness = false;
0606     } else if (d->inBetaplusAlphaDecay) {
0607         value = ch.toDouble();
0608         type = ChemicalDataObject::betaplusalphaDecay;
0609         d->inBetaplusAlphaDecay = false;
0610     } else if (d->inBetaplusAlphaDecayLikeliness) {
0611         value = ch.toDouble();
0612         type = ChemicalDataObject::betaplusalphaDecayLikeliness;
0613         d->inBetaplusAlphaDecayLikeliness = false;
0614     } else if (d->inBetaplusTwoAlphaDecay) {
0615         value = ch.toDouble();
0616         type = ChemicalDataObject::betaplustwoalphaDecay;
0617         d->inBetaplusTwoAlphaDecay = false;
0618     } else if (d->inBetaplusTwoAlphaDecayLikeliness) {
0619         value = ch.toDouble();
0620         type = ChemicalDataObject::betaplustwoalphaDecayLikeliness;
0621         d->inBetaplusTwoAlphaDecayLikeliness = false;
0622     } else if (d->inBetaplusThreeAlphaDecay) {
0623         value = ch.toDouble();
0624         type = ChemicalDataObject::betaplusthreealphaDecay;
0625         d->inBetaplusThreeAlphaDecay = false;
0626     } else if (d->inBetaplusThreeAlphaDecayLikeliness) {
0627         value = ch.toDouble();
0628         type = ChemicalDataObject::betaplusthreealphaDecayLikeliness;
0629         d->inBetaplusThreeAlphaDecayLikeliness = false;
0630     } else if (d->inAlphaBetaminusDecay) {
0631         value = ch.toDouble();
0632         type = ChemicalDataObject::alphabetaminusDecay;
0633         d->inAlphaBetaminusDecay = false;
0634     } else if (d->inAlphaBetaminusDecayLikeliness) {
0635         value = ch.toDouble();
0636         type = ChemicalDataObject::alphabetaminusDecayLikeliness;
0637         d->inAlphaBetaminusDecayLikeliness = false;
0638     } else if (d->inProtonAlphaDecay) {
0639         value = ch.toDouble();
0640         type = ChemicalDataObject::protonalphaDecay;
0641         d->inProtonAlphaDecay = false;
0642     } else if (d->inProtonAlphaDecayLikeliness) {
0643         value = ch.toDouble();
0644         type = ChemicalDataObject::protonalphaDecayLikeliness;
0645         d->inProtonAlphaDecayLikeliness = false;
0646     } else if (d->inECProtonDecay) {
0647         value = ch.toDouble();
0648         type = ChemicalDataObject::ecprotonDecay;
0649         d->inECProtonDecay = false;
0650     } else if (d->inECProtonDecayLikeliness) {
0651         value = ch.toDouble();
0652         type = ChemicalDataObject::ecprotonDecayLikeliness;
0653         d->inECProtonDecayLikeliness = false;
0654     } else if (d->inECTwoProtonDecay) {
0655         value = ch.toDouble();
0656         type = ChemicalDataObject::ectwoprotonDecay;
0657         d->inECTwoProtonDecay = false;
0658     } else if (d->inECTwoProtonDecayLikeliness) {
0659         value = ch.toDouble();
0660         type = ChemicalDataObject::ectwoprotonDecayLikeliness;
0661         d->inECTwoProtonDecayLikeliness = false;
0662     } else if (d->inECThreeProtonDecay) {
0663         value = ch.toDouble();
0664         type = ChemicalDataObject::ecthreeprotonDecay;
0665         d->inECThreeProtonDecay = false;
0666     } else if (d->inECThreeProtonDecayLikeliness) {
0667         value = ch.toDouble();
0668         type = ChemicalDataObject::ecthreeprotonDecayLikeliness;
0669         d->inECThreeProtonDecayLikeliness = false;
0670     } else if (d->inECAlphaDecay) {
0671         value = ch.toDouble();
0672         type = ChemicalDataObject::ecalphaDecay;
0673         d->inECAlphaDecay = false;
0674     } else if (d->inECAlphaDecayLikeliness) {
0675         value = ch.toDouble();
0676         type = ChemicalDataObject::ecalphaDecayLikeliness;
0677         d->inECAlphaDecayLikeliness = false;
0678     } else if (d->inECAlphaProtonDecay) {
0679         value = ch.toDouble();
0680         type = ChemicalDataObject::ecalphaprotonDecay;
0681         d->inECAlphaProtonDecay = false;
0682     } else if (d->inECAlphaProtonDecayLikeliness) {
0683         value = ch.toDouble();
0684         type = ChemicalDataObject::ecalphaprotonDecayLikeliness;
0685         d->inECAlphaProtonDecayLikeliness = false;
0686     } else if (d->inSpontFissionDecay) {
0687         value = ch.toDouble();
0688         type = ChemicalDataObject::spontfissionDecay;
0689         d->inSpontFissionDecay = false;
0690     } else if (d->inSpontFissionDecayLikeliness) {
0691         value = ch.toDouble();
0692         type = ChemicalDataObject::spontfissionDecayLikeliness;
0693         d->inSpontFissionDecayLikeliness = false;
0694     } else if (d->inAbundance) {
0695         value = ch;
0696         type = ChemicalDataObject::relativeAbundance;
0697         d->inAbundance = false;
0698     } else { // it is a non known value. Do not create a wrong object but return
0699         return true;
0700     }
0701 
0702     if (type == ChemicalDataObject::exactMass) {
0703         d->currentDataObject.setErrorValue(d->currentErrorValue);
0704     }
0705 
0706     d->currentDataObject.setData(value);
0707     d->currentDataObject.setType(type);
0708 
0709     if (d->currentIsotope) {
0710         d->currentIsotope->addData(d->currentDataObject);
0711     }
0712 
0713     return true;
0714 }
0715 
0716 QList<Isotope *> IsotopeParser::getIsotopes() const
0717 {
0718     return d->isotopes;
0719 }