Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 : Copyright (c) 2012-2023 The plumed team 3 : (see the PEOPLE file at the root of the distribution for a list of names) 4 : 5 : See http://www.plumed.org for more information. 6 : 7 : This file is part of plumed, version 2. 8 : 9 : plumed is free software: you can redistribute it and/or modify 10 : it under the terms of the GNU Lesser General Public License as published by 11 : the Free Software Foundation, either version 3 of the License, or 12 : (at your option) any later version. 13 : 14 : plumed is distributed in the hope that it will be useful, 15 : but WITHOUT ANY WARRANTY; without even the implied warranty of 16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 : GNU Lesser General Public License for more details. 18 : 19 : You should have received a copy of the GNU Lesser General Public License 20 : along with plumed. If not, see <http://www.gnu.org/licenses/>. 21 : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ 22 : #ifndef __PLUMED_tools_HistogramBead_h 23 : #define __PLUMED_tools_HistogramBead_h 24 : 25 : #include <string> 26 : #include <vector> 27 : #include "Exception.h" 28 : #include "Tools.h" 29 : 30 : namespace PLMD { 31 : 32 : class Keywords; 33 : class Log; 34 : 35 : /** 36 : \ingroup TOOLBOX 37 : A class for calculating whether or not values are within a given range using : \f$ \sum_i \int_a^b G( s_i, \sigma*(b-a) ) \f$ 38 : */ 39 : 40 : class HistogramBead { 41 : private: 42 : bool init; 43 : double lowb; 44 : double highb; 45 : double width; 46 : double cutoff; 47 : enum {gaussian,triangular} type; 48 : enum {unset,periodic,notperiodic} periodicity; 49 : double min, max, max_minus_min, inv_max_minus_min; 50 : double difference( const double& d1, const double& d2 ) const ; 51 : public: 52 : static void registerKeywords( Keywords& keys ); 53 : static void generateBins( const std::string& params, std::vector<std::string>& bins ); 54 : HistogramBead(); 55 : std::string description() const ; 56 : bool hasBeenSet() const; 57 : void isNotPeriodic(); 58 : void isPeriodic( const double& mlow, const double& mhigh ); 59 : void setKernelType( const std::string& ktype ); 60 : void set(const std::string& params, std::string& errormsg); 61 : void set(double l, double h, double w); 62 : double calculate(double x, double&df) const; 63 : double calculateWithCutoff( double x, double& df ) const; 64 : double lboundDerivative( const double& x ) const; 65 : double uboundDerivative( const double& x ) const; 66 : double getlowb() const ; 67 : double getbigb() const ; 68 : double getCutoff() const ; 69 : }; 70 : 71 : inline 72 : bool HistogramBead::hasBeenSet() const { 73 : return init; 74 : } 75 : 76 : inline 77 : void HistogramBead::isNotPeriodic() { 78 79303 : periodicity=notperiodic; 79 67 : } 80 : 81 : inline 82 1 : void HistogramBead::isPeriodic( const double& mlow, const double& mhigh ) { 83 1 : periodicity=periodic; min=mlow; max=mhigh; 84 1 : max_minus_min=max-min; 85 1 : plumed_massert(max_minus_min>0, "your function has a very strange domain?"); 86 1 : inv_max_minus_min=1.0/max_minus_min; 87 1 : } 88 : 89 : inline 90 : double HistogramBead::getlowb() const { return lowb; } 91 : 92 : inline 93 : double HistogramBead::getbigb() const { return highb; } 94 : 95 : inline 96 82228271 : double HistogramBead::getCutoff() const { return cutoff*width; } 97 : 98 : inline 99 595780 : double HistogramBead::difference( const double& d1, const double& d2 ) const { 100 595780 : if(periodicity==notperiodic) { 101 595760 : return d2-d1; 102 20 : } else if(periodicity==periodic) { 103 : // Make sure the point is in the target range 104 20 : double newx=d1*inv_max_minus_min; 105 20 : newx=Tools::pbc(newx); 106 20 : newx*=max_minus_min; 107 20 : return d2-newx; 108 0 : } else plumed_merror("periodicty was not set"); 109 : return 0; 110 : } 111 : 112 : } 113 : 114 : #endif