Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : Copyright (c) 2012-2019 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 79301 : periodicity=notperiodic;
79 : }
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 595708 : double HistogramBead::difference( const double& d1, const double& d2 ) const {
100 595708 : if(periodicity==notperiodic) {
101 595688 : 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 : 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
|