Test change - can I push OK?
[kdeedu-porting.git] / kalzium / src / kalziumgradienttype.cpp
blob888c2e94042cbfc71a82a69812979a6962b71556
1 /***************************************************************************
2 * Copyright (C) 2005, 2006 by Pino Toscano, toscano.pino@tiscali.it *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
20 #include "kalziumgradienttype.h"
22 #include "element.h"
23 #include "prefs.h"
24 #include "kalziumdataobject.h"
26 #include <QVariant>
28 #include <klocale.h>
29 #include <kdebug.h>
31 #include <math.h>
33 KalziumGradientTypeFactory::KalziumGradientTypeFactory()
35 m_gradients << KalziumCovalentRadiusGradientType::instance();
36 m_gradients << KalziumVanDerWaalsRadiusGradientType::instance();
37 m_gradients << KalziumMassGradientType::instance();
38 m_gradients << KalziumBoilingPointGradientType::instance();
39 m_gradients << KalziumMeltingPointGradientType::instance();
40 m_gradients << KalziumElectronegativityGradientType::instance();
41 m_gradients << KalziumElectronaffinityGradientType::instance();
42 m_gradients << KalziumDiscoverydateGradientType::instance();
43 m_gradients << KalziumIonizationGradientType::instance();
46 KalziumGradientTypeFactory* KalziumGradientTypeFactory::instance()
48 static KalziumGradientTypeFactory kttf;
49 return &kttf;
52 KalziumGradientType* KalziumGradientTypeFactory::build( int id ) const
54 if ( ( id < 0 ) || ( id >= m_gradients.count() ) )
55 return 0;
57 return m_gradients.at( id );
60 KalziumGradientType* KalziumGradientTypeFactory::build( const QByteArray& id ) const
62 for ( int i = 0; i < m_gradients.count(); i++ )
64 if ( m_gradients.at( i )->name() == id )
65 return m_gradients.at( i );
68 // not found
69 return 0;
72 QStringList KalziumGradientTypeFactory::gradients() const
74 QStringList l;
75 for ( int i = 0; i < m_gradients.count(); i++ )
77 l << m_gradients.at( i )->description();
79 return l;
83 KalziumGradientType::KalziumGradientType()
87 KalziumGradientType::~KalziumGradientType()
91 KalziumGradientType* KalziumGradientType::instance()
93 return 0;
96 double KalziumGradientType::elementCoeff( int el ) const
98 double val = value( el );
99 if( val <= 0.0 ) return -1;
101 if(logarithmicGradient()) {
102 double result = ( log(val) - log(minValue()) ) / ( log(maxValue()) - log(minValue()) );
104 // now we perform a "gamma-correction" on the result. Indeed, logarithmic gradients
105 // often have the problem that all high values have roughly the same color. Note that
106 // as firstColor() is not necessarily black and secondColor() is not necessarily white,
107 // this is not exactly a "gamma-correction" in the usual sense.
108 const double gamma = 1.4;
109 result = exp(gamma * log(result));
110 return result;
112 else {
113 return ( val - minValue() ) / ( maxValue() - minValue() );
117 QColor KalziumGradientType::firstColor() const
119 return Qt::white;
122 QColor KalziumGradientType::secondColor() const
124 return Qt::red;
127 QColor KalziumGradientType::notAvailableColor() const
129 return Qt::lightGray;
132 QColor KalziumGradientType::calculateColor( const double coeff ) const
134 if ( ( coeff < 0.0 ) || ( coeff > 1.0 ) ) return notAvailableColor();
136 QColor color2 = secondColor();
137 QColor color1 = firstColor();
139 int red = static_cast<int>( (color2.red() - color1.red()) * coeff + color1.red() );
140 int green = static_cast<int>( (color2.green() - color1.green()) * coeff + color1.green() );
141 int blue = static_cast<int>( (color2.blue() - color1.blue()) * coeff + color1.blue() );
143 return QColor( red, green, blue );
146 KalziumCovalentRadiusGradientType* KalziumCovalentRadiusGradientType::instance()
148 static KalziumCovalentRadiusGradientType kcrgt;
149 return &kcrgt;
152 KalziumCovalentRadiusGradientType::KalziumCovalentRadiusGradientType()
153 : KalziumGradientType()
157 QByteArray KalziumCovalentRadiusGradientType::name() const
159 return "CovalentRadius";
162 QString KalziumCovalentRadiusGradientType::description() const
164 return i18n( "Covalent Radius" );
167 double KalziumCovalentRadiusGradientType::value( int el ) const
169 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusCovalent );
170 if ( v.type() != QVariant::Double ) return -1;
171 return v.toDouble();
174 double KalziumCovalentRadiusGradientType::minValue() const
176 return 0.32;
179 double KalziumCovalentRadiusGradientType::maxValue() const
181 return 2.25;
184 bool KalziumCovalentRadiusGradientType::logarithmicGradient() const
186 return Prefs::logarithmicCovalentRadiusGradient();
190 KalziumVanDerWaalsRadiusGradientType* KalziumVanDerWaalsRadiusGradientType::instance()
192 static KalziumVanDerWaalsRadiusGradientType kvdwrgt;
193 return &kvdwrgt;
196 KalziumVanDerWaalsRadiusGradientType::KalziumVanDerWaalsRadiusGradientType()
197 : KalziumGradientType()
201 QByteArray KalziumVanDerWaalsRadiusGradientType::name() const
203 return "KalziumVanDerWaalsRadiusGradientType";
206 QString KalziumVanDerWaalsRadiusGradientType::description() const
208 return i18n( "van Der Waals" );
211 double KalziumVanDerWaalsRadiusGradientType::value( int el ) const
213 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusVDW );
214 if ( v.type() != QVariant::Double ) return -1;
215 return v.toDouble();
218 double KalziumVanDerWaalsRadiusGradientType::minValue() const
220 return 1.2;
223 double KalziumVanDerWaalsRadiusGradientType::maxValue() const
225 return 3.0;
228 bool KalziumVanDerWaalsRadiusGradientType::logarithmicGradient() const
230 return Prefs::logarithmicVanDerWaalsRadiusGradient();
234 KalziumMassGradientType* KalziumMassGradientType::instance()
236 static KalziumMassGradientType kargt;
237 return &kargt;
240 KalziumMassGradientType::KalziumMassGradientType()
241 : KalziumGradientType()
245 QByteArray KalziumMassGradientType::name() const
247 return "AtomicMass";
250 QString KalziumMassGradientType::description() const
252 return i18n( "Atomic Mass" );
255 double KalziumMassGradientType::value( int el ) const
257 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::mass );
258 if ( v.type() != QVariant::Double ) return -1;
259 return v.toDouble();
262 double KalziumMassGradientType::minValue() const
264 return 1.00794;
267 double KalziumMassGradientType::maxValue() const
269 return 292.0;
272 bool KalziumMassGradientType::logarithmicGradient() const
274 return Prefs::logarithmicMassGradient();
277 KalziumBoilingPointGradientType* KalziumBoilingPointGradientType::instance()
279 static KalziumBoilingPointGradientType kbpgt;
280 return &kbpgt;
283 KalziumBoilingPointGradientType::KalziumBoilingPointGradientType()
284 : KalziumGradientType()
288 QByteArray KalziumBoilingPointGradientType::name() const
290 return "BoilingPoint";
293 QString KalziumBoilingPointGradientType::description() const
295 return i18n( "Boiling Point" );
298 double KalziumBoilingPointGradientType::value( int el ) const
300 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::boilingpoint );
301 if ( v.type() != QVariant::Double ) return -1;
302 return v.toDouble();
305 double KalziumBoilingPointGradientType::minValue() const
307 return 4.216;
310 double KalziumBoilingPointGradientType::maxValue() const
312 return 5870.0;
315 bool KalziumBoilingPointGradientType::logarithmicGradient() const
317 return Prefs::logarithmicBoilingPointGradient();
320 KalziumMeltingPointGradientType* KalziumMeltingPointGradientType::instance()
322 static KalziumMeltingPointGradientType kmpgt;
323 return &kmpgt;
326 KalziumMeltingPointGradientType::KalziumMeltingPointGradientType()
327 : KalziumGradientType()
331 QByteArray KalziumMeltingPointGradientType::name() const
333 return "MeltingPoint";
336 QString KalziumMeltingPointGradientType::description() const
338 return i18n( "Melting Point" );
341 double KalziumMeltingPointGradientType::value( int el ) const
343 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::meltingpoint );
344 if ( v.type() != QVariant::Double ) return -1;
345 return v.toDouble();
348 double KalziumMeltingPointGradientType::minValue() const
350 return 0.94;
353 double KalziumMeltingPointGradientType::maxValue() const
355 return 3825.0;
358 bool KalziumMeltingPointGradientType::logarithmicGradient() const
360 return Prefs::logarithmicMeltingPointGradient();
364 KalziumElectronegativityGradientType* KalziumElectronegativityGradientType::instance()
366 static KalziumElectronegativityGradientType kegt;
367 return &kegt;
370 KalziumElectronegativityGradientType::KalziumElectronegativityGradientType()
371 : KalziumGradientType()
375 QByteArray KalziumElectronegativityGradientType::name() const
377 return "Electronegativity";
380 QString KalziumElectronegativityGradientType::description() const
382 return i18n( "Electronegativity (Pauling)" );
385 double KalziumElectronegativityGradientType::value( int el ) const
387 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronegativityPauling );
388 if ( v.type() != QVariant::Double ) return -1;
389 return v.toDouble();
392 double KalziumElectronegativityGradientType::minValue() const
394 return 0.7;
397 double KalziumElectronegativityGradientType::maxValue() const
399 return 3.98;
402 bool KalziumElectronegativityGradientType::logarithmicGradient() const
404 return Prefs::logarithmicElectronegativityGradient();
407 ///DISCOVERYDATE///
409 KalziumDiscoverydateGradientType* KalziumDiscoverydateGradientType::instance()
411 static KalziumDiscoverydateGradientType kegt;
412 return &kegt;
415 KalziumDiscoverydateGradientType::KalziumDiscoverydateGradientType()
416 : KalziumGradientType()
420 QByteArray KalziumDiscoverydateGradientType::name() const
422 return "Discoverydate";
425 QString KalziumDiscoverydateGradientType::description() const
427 return i18n( "Discoverydate" );
430 double KalziumDiscoverydateGradientType::value( int el ) const
432 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::date );
434 return v.toDouble();
437 double KalziumDiscoverydateGradientType::minValue() const
439 return 1699.0;
442 double KalziumDiscoverydateGradientType::maxValue() const
444 return 1994.0;
447 bool KalziumDiscoverydateGradientType::logarithmicGradient() const
449 return Prefs::logarithmicDiscoverydateGradient();
453 ///ELECTRONAFFINITY///
455 KalziumElectronaffinityGradientType* KalziumElectronaffinityGradientType::instance()
457 static KalziumElectronaffinityGradientType kegt;
458 return &kegt;
461 KalziumElectronaffinityGradientType::KalziumElectronaffinityGradientType()
462 : KalziumGradientType()
466 QByteArray KalziumElectronaffinityGradientType::name() const
468 return "Electronaffinity";
471 QString KalziumElectronaffinityGradientType::description() const
473 return i18n( "Electronaffinity" );
476 double KalziumElectronaffinityGradientType::value( int el ) const
478 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronAffinity );
480 return v.toDouble();
483 double KalziumElectronaffinityGradientType::minValue() const
485 return 0.0;
488 double KalziumElectronaffinityGradientType::maxValue() const
490 return 3.7;
493 bool KalziumElectronaffinityGradientType::logarithmicGradient() const
495 return Prefs::logarithmicElectronaffinityGradient();
498 ///FIRST IONIZATINO///
500 KalziumIonizationGradientType* KalziumIonizationGradientType::instance()
502 static KalziumIonizationGradientType kegt;
503 return &kegt;
506 KalziumIonizationGradientType::KalziumIonizationGradientType()
507 : KalziumGradientType()
511 QByteArray KalziumIonizationGradientType::name() const
513 return "Ionization";
516 QString KalziumIonizationGradientType::description() const
518 return i18n( "First Ionization" );
521 double KalziumIonizationGradientType::value( int el ) const
523 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::ionization );
525 return v.toDouble();
528 double KalziumIonizationGradientType::minValue() const
530 return 0.0;//3.89;
533 double KalziumIonizationGradientType::maxValue() const
535 return 25.0;
538 bool KalziumIonizationGradientType::logarithmicGradient() const
540 return Prefs::logarithmicIonizationGradient();