kalzium
kalziumgradienttype.cpp
Go to the documentation of this file.00001 /*************************************************************************** 00002 * Copyright (C) 2005, 2006 by Pino Toscano, toscano.pino@tiscali.it * 00003 * * 00004 * This program is free software; you can redistribute it and/or modify * 00005 * it under the terms of the GNU General Public License as published by * 00006 * the Free Software Foundation; either version 2 of the License, or * 00007 * (at your option) any later version. * 00008 * * 00009 * This program is distributed in the hope that it will be useful, * 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00012 * GNU General Public License for more details. * 00013 * * 00014 * You should have received a copy of the GNU General Public License * 00015 * along with this program; if not, write to the * 00016 * Free Software Foundation, Inc., * 00017 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 00018 ***************************************************************************/ 00019 00020 #include "kalziumgradienttype.h" 00021 00022 #include "element.h" 00023 #include "prefs.h" 00024 #include "kalziumdataobject.h" 00025 00026 #include <QVariant> 00027 00028 #include <klocale.h> 00029 #include <kdebug.h> 00030 00031 #include <math.h> 00032 00033 KalziumGradientTypeFactory::KalziumGradientTypeFactory() 00034 { 00035 m_gradients << KalziumCovalentRadiusGradientType::instance(); 00036 m_gradients << KalziumVanDerWaalsRadiusGradientType::instance(); 00037 m_gradients << KalziumMassGradientType::instance(); 00038 m_gradients << KalziumBoilingPointGradientType::instance(); 00039 m_gradients << KalziumMeltingPointGradientType::instance(); 00040 m_gradients << KalziumElectronegativityGradientType::instance(); 00041 m_gradients << KalziumElectronaffinityGradientType::instance(); 00042 m_gradients << KalziumDiscoverydateGradientType::instance(); 00043 m_gradients << KalziumIonizationGradientType::instance(); 00044 } 00045 00046 KalziumGradientTypeFactory* KalziumGradientTypeFactory::instance() 00047 { 00048 static KalziumGradientTypeFactory kttf; 00049 return &kttf; 00050 } 00051 00052 KalziumGradientType* KalziumGradientTypeFactory::build( int id ) const 00053 { 00054 if ( ( id < 0 ) || ( id >= m_gradients.count() ) ) 00055 return 0; 00056 00057 return m_gradients.at( id ); 00058 } 00059 00060 KalziumGradientType* KalziumGradientTypeFactory::build( const QByteArray& id ) const 00061 { 00062 for ( int i = 0; i < m_gradients.count(); i++ ) 00063 { 00064 if ( m_gradients.at( i )->name() == id ) 00065 return m_gradients.at( i ); 00066 } 00067 00068 // not found 00069 return 0; 00070 } 00071 00072 QStringList KalziumGradientTypeFactory::gradients() const 00073 { 00074 QStringList l; 00075 for ( int i = 0; i < m_gradients.count(); i++ ) 00076 { 00077 l << m_gradients.at( i )->description(); 00078 } 00079 return l; 00080 } 00081 00082 00083 KalziumGradientType::KalziumGradientType() 00084 { 00085 } 00086 00087 KalziumGradientType::~KalziumGradientType() 00088 { 00089 } 00090 00091 KalziumGradientType* KalziumGradientType::instance() 00092 { 00093 return 0; 00094 } 00095 00096 double KalziumGradientType::elementCoeff( int el ) const 00097 { 00098 double val = value( el ); 00099 if( val <= 0.0 ) return -1; 00100 00101 if(logarithmicGradient()) { 00102 double result = ( log(val) - log(minValue()) ) / ( log(maxValue()) - log(minValue()) ); 00103 00104 // now we perform a "gamma-correction" on the result. Indeed, logarithmic gradients 00105 // often have the problem that all high values have roughly the same color. Note that 00106 // as firstColor() is not necessarily black and secondColor() is not necessarily white, 00107 // this is not exactly a "gamma-correction" in the usual sense. 00108 const double gamma = 1.4; 00109 result = exp(gamma * log(result)); 00110 return result; 00111 } 00112 else { 00113 return ( val - minValue() ) / ( maxValue() - minValue() ); 00114 } 00115 } 00116 00117 QColor KalziumGradientType::firstColor() const 00118 { 00119 return Qt::white; 00120 } 00121 00122 QColor KalziumGradientType::secondColor() const 00123 { 00124 return Qt::red; 00125 } 00126 00127 QColor KalziumGradientType::notAvailableColor() const 00128 { 00129 return Qt::lightGray; 00130 } 00131 00132 QColor KalziumGradientType::calculateColor( const double coeff ) const 00133 { 00134 if ( ( coeff < 0.0 ) || ( coeff > 1.0 ) ) return notAvailableColor(); 00135 00136 QColor color2 = secondColor(); 00137 QColor color1 = firstColor(); 00138 00139 int red = static_cast<int>( (color2.red() - color1.red()) * coeff + color1.red() ); 00140 int green = static_cast<int>( (color2.green() - color1.green()) * coeff + color1.green() ); 00141 int blue = static_cast<int>( (color2.blue() - color1.blue()) * coeff + color1.blue() ); 00142 00143 return QColor( red, green, blue ); 00144 } 00145 00146 KalziumCovalentRadiusGradientType* KalziumCovalentRadiusGradientType::instance() 00147 { 00148 static KalziumCovalentRadiusGradientType kcrgt; 00149 return &kcrgt; 00150 } 00151 00152 KalziumCovalentRadiusGradientType::KalziumCovalentRadiusGradientType() 00153 : KalziumGradientType() 00154 { 00155 } 00156 00157 QByteArray KalziumCovalentRadiusGradientType::name() const 00158 { 00159 return "CovalentRadius"; 00160 } 00161 00162 QString KalziumCovalentRadiusGradientType::description() const 00163 { 00164 return i18n( "Covalent Radius" ); 00165 } 00166 00167 double KalziumCovalentRadiusGradientType::value( int el ) const 00168 { 00169 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusCovalent ); 00170 if ( v.type() != QVariant::Double ) return -1; 00171 return v.toDouble(); 00172 } 00173 00174 double KalziumCovalentRadiusGradientType::minValue() const 00175 { 00176 return 0.32; 00177 } 00178 00179 double KalziumCovalentRadiusGradientType::maxValue() const 00180 { 00181 return 2.25; 00182 } 00183 00184 bool KalziumCovalentRadiusGradientType::logarithmicGradient() const 00185 { 00186 return Prefs::logarithmicCovalentRadiusGradient(); 00187 } 00188 00189 00190 KalziumVanDerWaalsRadiusGradientType* KalziumVanDerWaalsRadiusGradientType::instance() 00191 { 00192 static KalziumVanDerWaalsRadiusGradientType kvdwrgt; 00193 return &kvdwrgt; 00194 } 00195 00196 KalziumVanDerWaalsRadiusGradientType::KalziumVanDerWaalsRadiusGradientType() 00197 : KalziumGradientType() 00198 { 00199 } 00200 00201 QByteArray KalziumVanDerWaalsRadiusGradientType::name() const 00202 { 00203 return "KalziumVanDerWaalsRadiusGradientType"; 00204 } 00205 00206 QString KalziumVanDerWaalsRadiusGradientType::description() const 00207 { 00208 return i18n( "van Der Waals" ); 00209 } 00210 00211 double KalziumVanDerWaalsRadiusGradientType::value( int el ) const 00212 { 00213 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusVDW ); 00214 if ( v.type() != QVariant::Double ) return -1; 00215 return v.toDouble(); 00216 } 00217 00218 double KalziumVanDerWaalsRadiusGradientType::minValue() const 00219 { 00220 return 1.2; 00221 } 00222 00223 double KalziumVanDerWaalsRadiusGradientType::maxValue() const 00224 { 00225 return 3.0; 00226 } 00227 00228 bool KalziumVanDerWaalsRadiusGradientType::logarithmicGradient() const 00229 { 00230 return Prefs::logarithmicVanDerWaalsRadiusGradient(); 00231 } 00232 00233 00234 KalziumMassGradientType* KalziumMassGradientType::instance() 00235 { 00236 static KalziumMassGradientType kargt; 00237 return &kargt; 00238 } 00239 00240 KalziumMassGradientType::KalziumMassGradientType() 00241 : KalziumGradientType() 00242 { 00243 } 00244 00245 QByteArray KalziumMassGradientType::name() const 00246 { 00247 return "AtomicMass"; 00248 } 00249 00250 QString KalziumMassGradientType::description() const 00251 { 00252 return i18n( "Atomic Mass" ); 00253 } 00254 00255 double KalziumMassGradientType::value( int el ) const 00256 { 00257 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::mass ); 00258 if ( v.type() != QVariant::Double ) return -1; 00259 return v.toDouble(); 00260 } 00261 00262 double KalziumMassGradientType::minValue() const 00263 { 00264 return 1.00794; 00265 } 00266 00267 double KalziumMassGradientType::maxValue() const 00268 { 00269 return 292.0; 00270 } 00271 00272 bool KalziumMassGradientType::logarithmicGradient() const 00273 { 00274 return Prefs::logarithmicMassGradient(); 00275 } 00276 00277 KalziumBoilingPointGradientType* KalziumBoilingPointGradientType::instance() 00278 { 00279 static KalziumBoilingPointGradientType kbpgt; 00280 return &kbpgt; 00281 } 00282 00283 KalziumBoilingPointGradientType::KalziumBoilingPointGradientType() 00284 : KalziumGradientType() 00285 { 00286 } 00287 00288 QByteArray KalziumBoilingPointGradientType::name() const 00289 { 00290 return "BoilingPoint"; 00291 } 00292 00293 QString KalziumBoilingPointGradientType::description() const 00294 { 00295 return i18n( "Boiling Point" ); 00296 } 00297 00298 double KalziumBoilingPointGradientType::value( int el ) const 00299 { 00300 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::boilingpoint ); 00301 if ( v.type() != QVariant::Double ) return -1; 00302 return v.toDouble(); 00303 } 00304 00305 double KalziumBoilingPointGradientType::minValue() const 00306 { 00307 return 4.216; 00308 } 00309 00310 double KalziumBoilingPointGradientType::maxValue() const 00311 { 00312 return 5870.0; 00313 } 00314 00315 bool KalziumBoilingPointGradientType::logarithmicGradient() const 00316 { 00317 return Prefs::logarithmicBoilingPointGradient(); 00318 } 00319 00320 KalziumMeltingPointGradientType* KalziumMeltingPointGradientType::instance() 00321 { 00322 static KalziumMeltingPointGradientType kmpgt; 00323 return &kmpgt; 00324 } 00325 00326 KalziumMeltingPointGradientType::KalziumMeltingPointGradientType() 00327 : KalziumGradientType() 00328 { 00329 } 00330 00331 QByteArray KalziumMeltingPointGradientType::name() const 00332 { 00333 return "MeltingPoint"; 00334 } 00335 00336 QString KalziumMeltingPointGradientType::description() const 00337 { 00338 return i18n( "Melting Point" ); 00339 } 00340 00341 double KalziumMeltingPointGradientType::value( int el ) const 00342 { 00343 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::meltingpoint ); 00344 if ( v.type() != QVariant::Double ) return -1; 00345 return v.toDouble(); 00346 } 00347 00348 double KalziumMeltingPointGradientType::minValue() const 00349 { 00350 return 0.94; 00351 } 00352 00353 double KalziumMeltingPointGradientType::maxValue() const 00354 { 00355 return 3825.0; 00356 } 00357 00358 bool KalziumMeltingPointGradientType::logarithmicGradient() const 00359 { 00360 return Prefs::logarithmicMeltingPointGradient(); 00361 } 00362 00363 00364 KalziumElectronegativityGradientType* KalziumElectronegativityGradientType::instance() 00365 { 00366 static KalziumElectronegativityGradientType kegt; 00367 return &kegt; 00368 } 00369 00370 KalziumElectronegativityGradientType::KalziumElectronegativityGradientType() 00371 : KalziumGradientType() 00372 { 00373 } 00374 00375 QByteArray KalziumElectronegativityGradientType::name() const 00376 { 00377 return "Electronegativity"; 00378 } 00379 00380 QString KalziumElectronegativityGradientType::description() const 00381 { 00382 return i18n( "Electronegativity (Pauling)" ); 00383 } 00384 00385 double KalziumElectronegativityGradientType::value( int el ) const 00386 { 00387 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronegativityPauling ); 00388 if ( v.type() != QVariant::Double ) return -1; 00389 return v.toDouble(); 00390 } 00391 00392 double KalziumElectronegativityGradientType::minValue() const 00393 { 00394 return 0.7; 00395 } 00396 00397 double KalziumElectronegativityGradientType::maxValue() const 00398 { 00399 return 3.98; 00400 } 00401 00402 bool KalziumElectronegativityGradientType::logarithmicGradient() const 00403 { 00404 return Prefs::logarithmicElectronegativityGradient(); 00405 } 00406 00408 00409 KalziumDiscoverydateGradientType* KalziumDiscoverydateGradientType::instance() 00410 { 00411 static KalziumDiscoverydateGradientType kegt; 00412 return &kegt; 00413 } 00414 00415 KalziumDiscoverydateGradientType::KalziumDiscoverydateGradientType() 00416 : KalziumGradientType() 00417 { 00418 } 00419 00420 QByteArray KalziumDiscoverydateGradientType::name() const 00421 { 00422 return "Discoverydate"; 00423 } 00424 00425 QString KalziumDiscoverydateGradientType::description() const 00426 { 00427 return i18n( "Discoverydate" ); 00428 } 00429 00430 double KalziumDiscoverydateGradientType::value( int el ) const 00431 { 00432 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::date ); 00433 00434 return v.toDouble(); 00435 } 00436 00437 double KalziumDiscoverydateGradientType::minValue() const 00438 { 00439 return 1699.0; 00440 } 00441 00442 double KalziumDiscoverydateGradientType::maxValue() const 00443 { 00444 return 1994.0; 00445 } 00446 00447 bool KalziumDiscoverydateGradientType::logarithmicGradient() const 00448 { 00449 return Prefs::logarithmicDiscoverydateGradient(); 00450 } 00451 00452 00454 00455 KalziumElectronaffinityGradientType* KalziumElectronaffinityGradientType::instance() 00456 { 00457 static KalziumElectronaffinityGradientType kegt; 00458 return &kegt; 00459 } 00460 00461 KalziumElectronaffinityGradientType::KalziumElectronaffinityGradientType() 00462 : KalziumGradientType() 00463 { 00464 } 00465 00466 QByteArray KalziumElectronaffinityGradientType::name() const 00467 { 00468 return "Electronaffinity"; 00469 } 00470 00471 QString KalziumElectronaffinityGradientType::description() const 00472 { 00473 return i18n( "Electronaffinity" ); 00474 } 00475 00476 double KalziumElectronaffinityGradientType::value( int el ) const 00477 { 00478 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronAffinity ); 00479 00480 return v.toDouble(); 00481 } 00482 00483 double KalziumElectronaffinityGradientType::minValue() const 00484 { 00485 return 0.0; 00486 } 00487 00488 double KalziumElectronaffinityGradientType::maxValue() const 00489 { 00490 return 3.7; 00491 } 00492 00493 bool KalziumElectronaffinityGradientType::logarithmicGradient() const 00494 { 00495 return Prefs::logarithmicElectronaffinityGradient(); 00496 } 00497 00499 00500 KalziumIonizationGradientType* KalziumIonizationGradientType::instance() 00501 { 00502 static KalziumIonizationGradientType kegt; 00503 return &kegt; 00504 } 00505 00506 KalziumIonizationGradientType::KalziumIonizationGradientType() 00507 : KalziumGradientType() 00508 { 00509 } 00510 00511 QByteArray KalziumIonizationGradientType::name() const 00512 { 00513 return "Ionization"; 00514 } 00515 00516 QString KalziumIonizationGradientType::description() const 00517 { 00518 return i18n( "First Ionization" ); 00519 } 00520 00521 double KalziumIonizationGradientType::value( int el ) const 00522 { 00523 QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::ionization ); 00524 00525 return v.toDouble(); 00526 } 00527 00528 double KalziumIonizationGradientType::minValue() const 00529 { 00530 return 0.0;//3.89; 00531 } 00532 00533 double KalziumIonizationGradientType::maxValue() const 00534 { 00535 return 25.0; 00536 } 00537 00538 bool KalziumIonizationGradientType::logarithmicGradient() const 00539 { 00540 return Prefs::logarithmicIonizationGradient(); 00541 }
KDE 4.0 API Reference