diff --git a/CHANGES/Unreleased.txt b/CHANGES/Unreleased.txt index e6d50af6e2a5198632b473ee1f8c61209f33d29a..0c4c1f8dc29014ba47f819df72594e7af8d2e203 100644 --- a/CHANGES/Unreleased.txt +++ b/CHANGES/Unreleased.txt @@ -42,6 +42,8 @@ Changes from version 2.0 which are relevant for users: - \ref HISTOGRAM: GRID_SPACING (alternative to GRID_BIN to set grid spacing), FREQUENCY and FREE-ENERGY flags in addition to standard probability density, additional option for KERNEL=NONE to accumulate standard histograms. + - \ref sum_hills: added options --spacing (alternative to --bin to set grid spacing) + and --setmintozero to translate the minimum of the output files to zero. - New features in MD patches (require repatch): - Gromacs 4.6.5 support \ref COMMITTOR analysis. - Gromacs 4.6.5 can be now be used to perform energy minimization. diff --git a/src/cltools/SumHills.cpp b/src/cltools/SumHills.cpp index 43c1a0ee4410de5631d0fdd438ccc3c6fddf0146..fdc932f8c42715ab86b47bd1a0fb61ff865921fd 100644 --- a/src/cltools/SumHills.cpp +++ b/src/cltools/SumHills.cpp @@ -206,6 +206,7 @@ void CLToolSumHills::registerKeywords( Keywords& keys ){ keys.add("optional","--min","the lower bounds for the grid"); keys.add("optional","--max","the upper bounds for the grid"); keys.add("optional","--bin","the number of bins for the grid"); + keys.add("optional","--spacing","grid spacing, alternative to the number of bins"); keys.add("optional","--idw","specify the variables to be integrated (default is all)"); keys.add("optional","--outfile","specify the outputfile for sumhills"); keys.add("optional","--outhisto","specify the outputfile for the histogram"); @@ -213,6 +214,7 @@ void CLToolSumHills::registerKeywords( Keywords& keys ){ keys.add("optional","--sigma"," a vector that specify the sigma for binning (only needed when doing histogram "); keys.addFlag("--negbias",false," print the negative bias instead of the free energy (only needed with welltempered runs and flexible hills) "); keys.addFlag("--nohistory",false," to be used with --stride: it splits the bias/histogram in pieces without previous history "); + keys.addFlag("--mintozero",false," it translate all the minimum value in bias/histogram to zero (usefull to compare results) "); keys.add("optional","--fmt","specify the output format"); } @@ -301,6 +303,12 @@ int CLToolSumHills::main(FILE* in,FILE*out,Communicator& pc){ if(gbin.size()!=cvs.size() && gbin.size()!=0) plumed_merror("not enough values for --bin"); grid_has_bin=true; } + vector<std::string> gspacing(cvs.size()); + bool grid_has_spacing; grid_has_spacing=false; + if(parseVector("--spacing",gspacing)){ + if(gspacing.size()!=cvs.size() && gspacing.size()!=0) plumed_merror("not enough values for --spacing"); + grid_has_spacing=true; + } // allowed: no grids only bin // not allowed: partial grid definition plumed_massert( gmin.size()==gmax.size() && (gmin.size()==0 || gmin.size()==cvs.size() ) ,"you should specify --min and --max together with same number of components"); @@ -453,10 +461,10 @@ int CLToolSumHills::main(FILE* in,FILE*out,Communicator& pc){ if(grid_has_bin){ addme="GRID_BIN="; for(unsigned i=0;i<(ncv-1);i++)addme+=gbin[i]+","; addme+=gbin[ncv-1]; actioninput.push_back(addme); -// }else{ -// //automatic bin: 50 per dimension; -// addme="GRID_BIN="; for(unsigned i=0;i<(ncv-1);i++)addme+="50,"; addme+="50"; -// actioninput.push_back(addme); + } + if(grid_has_spacing){ + addme="GRID_SPACING="; for(unsigned i=0;i<(ncv-1);i++)addme+=gspacing[i]+","; addme+=gspacing[ncv-1]; + actioninput.push_back(addme); } std::string stride; stride=""; if(parse("--stride",stride)){ @@ -467,6 +475,11 @@ int CLToolSumHills::main(FILE* in,FILE*out,Communicator& pc){ actioninput.push_back("NOHISTORY"); } } + bool mintozero; + parseFlag("--mintozero",mintozero); + if(mintozero){ + actioninput.push_back("MINTOZERO"); + } if(idw.size()!=0){ addme="PROJ="; for(unsigned i=0;i<idw.size()-1;i++){addme+=idw[i]+",";} diff --git a/src/function/FuncSumHills.cpp b/src/function/FuncSumHills.cpp index e57eab05bee2509d58192466db843cc0feaaf224..724bdffb4cddbff5fd7a38699129fa184155e3ef 100644 --- a/src/function/FuncSumHills.cpp +++ b/src/function/FuncSumHills.cpp @@ -146,7 +146,7 @@ bool FilesHandler::scanOneHill(BiasRepresentation *br, IFile *ifile ){ double dummy; if(ifile->scanField("time",dummy)){ //(*log)<<" scanning one hill: "<<dummy<<" \n"; - ifile->scanField("biasf",dummy); + if(ifile->FieldExist("biasf")) ifile->scanField("biasf",dummy); if(ifile->FieldExist("clock")) ifile->scanField("clock",dummy); // keep this intermediate function in case you need to parse more data in the future br->pushKernel(ifile); @@ -179,6 +179,7 @@ class FuncSumHills : bool iscltool,integratehills,integratehisto,parallelread; bool negativebias; bool nohistory; + bool minTOzero; double beta; string outhills,outhisto,fmt; BiasRepresentation *biasrep; @@ -204,6 +205,7 @@ void FuncSumHills::registerKeywords(Keywords& keys){ keys.add("optional","GRID_MIN","the lower bounds for the grid"); keys.add("optional","GRID_MAX","the upper bounds for the grid"); keys.add("optional","GRID_BIN","the number of bins for the grid"); + keys.add("optional","GRID_SPACING","the approximate grid spacing (to be used as an alternative or together with GRID_BIN)"); keys.add("optional","OUTHILLS"," output file for hills "); keys.add("optional","OUTHISTO"," output file for histogram "); keys.add("optional","INITSTRIDE"," stride if you want an initial dump "); @@ -212,6 +214,7 @@ void FuncSumHills::registerKeywords(Keywords& keys){ keys.addFlag("PARALLELREAD",false,"read parallel HILLS file"); keys.addFlag("NEGBIAS",false,"dump negative bias ( -bias ) instead of the free energy: needed in welltempered with flexible hills "); keys.addFlag("NOHISTORY",false,"to be used with INITSTRIDE: it splits the bias/histogram in pieces without previous history "); + keys.addFlag("MINTOZERO",false,"translate the resulting bias/histogram to have the minimum to zero "); keys.add("optional","FMT","the format that should be used to output real numbers"); } @@ -225,6 +228,7 @@ integratehisto(false), parallelread(false), negativebias(false), nohistory(false), +minTOzero(false), beta(-1.), fmt("%14.9f") { @@ -243,10 +247,27 @@ fmt("%14.9f") if(gmax.size()!=getNumberOfArguments() && gmax.size()!=0) error("not enough values for GRID_MAX"); plumed_massert(gmax.size()==getNumberOfArguments() || gmax.size()==0,"need GRID_MAX argument for this") ; vector<unsigned> gbin; + vector<double> gspacing; parseVector("GRID_BIN",gbin); - plumed_massert(gbin.size()==getNumberOfArguments() || gbin.size()==0,"need GRID_BIN argument for this"); + plumed_massert(gbin.size()==getNumberOfArguments() || gbin.size()==0,"need GRID_BIN argument for this") ; if(gbin.size()!=getNumberOfArguments() && gbin.size()!=0) error("not enough values for GRID_BIN"); - //plumed_assert(getNumberOfArguments()==gbin.size()); + parseVector("GRID_SPACING",gspacing); + plumed_massert(gspacing.size()==getNumberOfArguments() || gspacing.size()==0,"need GRID_SPACING argument for this") ; + if(gspacing.size()!=getNumberOfArguments() && gspacing.size()!=0) error("not enough values for GRID_SPACING"); + if(gspacing.size()!=0 && gbin.size()==0){ + log<<" The number of bins will be estimated from GRID_SPACING\n"; + } else if(gspacing.size()!=0 && gbin.size()!=0){ + log<<" You specified both GRID_BIN and GRID_SPACING\n"; + log<<" The more conservative (highest) number of bins will be used for each variable\n"; + } + if(gspacing.size()!=0) for(unsigned i=0;i<getNumberOfArguments();i++){ + if(gbin.size()==0) gbin.assign(getNumberOfArguments(),1); + double a,b; + Tools::convert(gmin[i],a); + Tools::convert(gmax[i],b); + unsigned n=((b-a)/gspacing[i])+1; + if(gbin[i]<n) gbin[i]=n; + } // hills file: parseVector("HILLSFILES",hillsFiles); @@ -351,7 +372,8 @@ fmt("%14.9f") parseFlag("NOHISTORY",nohistory); if(nohistory)log<<" nohistory: each stride block has no memory of the previous block\n"; } - + parseFlag("MINTOZERO",minTOzero); + if(minTOzero)log<<" mintozero: bias/histogram will be translated to have the minimum value equal to zero\n"; //what might it be this? // here start // want something right now?? do it and return @@ -477,7 +499,8 @@ fmt("%14.9f") if(initstride>0){ myout=outhills+ostr.str()+".dat" ;}else{myout=outhills;} log<<" Writing full grid on file "<<myout<<" \n"; gridfile.open(myout); - + + if(minTOzero) biasGrid.setMinToZero(); biasGrid.setOutputFmt(fmt); biasGrid.writeToFile(gridfile); gridfile.close(); @@ -496,7 +519,8 @@ fmt("%14.9f") if(initstride>0){ myout=outhisto+ostr.str()+".dat" ;}else{myout=outhisto;} log<<" Writing full grid on file "<<myout<<" \n"; gridfile.open(myout); - + + if(minTOzero) histoGrid.setMinToZero(); histoGrid.setOutputFmt(fmt); histoGrid.writeToFile(gridfile); gridfile.close();