aboutsummaryrefslogtreecommitdiffstats
path: root/mass_profile/fit_wang2012_model.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mass_profile/fit_wang2012_model.cpp')
-rw-r--r--mass_profile/fit_wang2012_model.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/mass_profile/fit_wang2012_model.cpp b/mass_profile/fit_wang2012_model.cpp
new file mode 100644
index 0000000..3fe14b6
--- /dev/null
+++ b/mass_profile/fit_wang2012_model.cpp
@@ -0,0 +1,195 @@
+/*
+ Fitting Jy Wang's temperature profile model
+ Author: Jingying Wang
+ Last modification 20120819
+
+*/
+
+#include "wang2012_model.hpp"
+#include <core/optimizer.hpp>
+#include <core/fitter.hpp>
+#include <data_sets/default_data_set.hpp>
+#include "chisq.hpp"
+#include <methods/powell/powell_method.hpp>
+#include <core/freeze_param.hpp>
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <string>
+
+using namespace opt_utilities;
+using namespace std;
+const double cm=1;
+const double kpc=3.08568e+21*cm;
+
+int main(int argc,char* argv[])
+{
+ if(argc<2)
+ {
+ cerr<<"Usage:"<<argv[0]<<" <data file with 4 columns of x, xe, y, ye> [param file] [cm per pixel]"<<endl;
+ return -1;
+ }
+ double cm_per_pixel=-1;
+ if(argc>=4)
+ {
+ cm_per_pixel=atof(argv[3]);
+ }
+
+ //define the fitter
+ fitter<double,double,vector<double>,double,std::string> fit;
+ //define the data set
+ default_data_set<double,double> ds;
+ //open the data file
+ ifstream ifs(argv[1]);
+ double min_r=1e9;
+ //cout<<"read serr 2"<<endl;
+ ofstream ofs_fit_result("fit_result.qdp");
+ ofs_fit_result<<"read serr 1 2"<<endl;
+ ofs_fit_result<<"skip single"<<endl;
+ if(cm_per_pixel>0)
+ {
+ ofs_fit_result<<"la x radius (kpc)"<<endl;
+ }
+ else
+ {
+ ofs_fit_result<<"la x radius (pixel)"<<endl;
+ }
+ ofs_fit_result<<"la y temperature (keV)"<<endl;
+ for(;;)
+ {
+ //read radius, temperature and error
+ double r,re,t,te;
+ ifs>>r>>re>>t>>te;
+ if(!ifs.good())
+ {
+ break;
+ }
+ min_r=min(r,min_r);
+ data<double,double> d(r,t,te,te,re,re);
+ //std::cerr<<r<<"\t"<<t<<"\t"<<te<<endl;
+ if(cm_per_pixel>0)
+ {
+ ofs_fit_result<<r*cm_per_pixel/kpc<<"\t"<<re*cm_per_pixel/kpc<<"\t"<<t<<"\t"<<te<<endl;
+ }
+ else
+ {
+ ofs_fit_result<<r<<"\t"<<re<<"\t"<<t<<"\t"<<te<<endl;
+ }
+ ds.add_data(d);
+ }
+ ofs_fit_result<<"no no no"<<endl;
+ //load data
+ fit.load_data(ds);
+ //define the optimization method
+ fit.set_opt_method(powell_method<double,vector<double> >());
+ //use chi^2 statistic
+ chisq<double,double,vector<double>,double,std::string> chisq_object;
+ chisq_object.set_limit();
+ fit.set_statistic(chisq_object);
+ //fit.set_statistic(chisq<double,double,vector<double>,double,std::string>());
+ fit.set_model(wang2012_model<double>());
+
+ if(argc>=3&&std::string(argv[2])!="NONE")
+ {
+ std::vector<std::string> freeze_list;
+ ifstream ifs_param(argv[2]);
+ assert(ifs_param.is_open());
+ for(;;)
+ {
+ string pname;
+ double pvalue;
+ double lower,upper;
+ char param_status;
+ ifs_param>>pname>>pvalue>>lower>>upper>>param_status;
+ if(!ifs_param.good())
+ {
+ break;
+ }
+ if(param_status=='F')
+ {
+ freeze_list.push_back(pname);
+ }
+ if(pvalue<=lower||pvalue>=upper)
+ {
+ cerr<<"Invalid initial value, central value not enclosed by the lower and upper boundaries, adjust automatically"<<endl;
+ pvalue=std::max(pvalue,lower);
+ pvalue=std::min(pvalue,upper);
+ }
+ fit.set_param_value(pname,pvalue);
+ fit.set_param_lower_limit(pname,lower);
+ fit.set_param_upper_limit(pname,upper);
+ }
+ if(!freeze_list.empty())
+ {
+ freeze_param<double,double,std::vector<double>,std::string> fp(freeze_list[0]);
+ fit.set_param_modifier(fp);
+ for(int i=1;i<freeze_list.size();++i)
+ {
+ dynamic_cast<freeze_param<double,double,std::vector<double>,std::string>&>(fit.get_param_modifier())+=freeze_param<double,double,std::vector<double>,std::string>(freeze_list[i]);
+ }
+ }
+ }
+
+ for(int i=0;i<100;++i)
+ {
+ fit.fit();
+ }
+ vector<double> p=fit.fit();
+#if 0
+ ofstream output_param;
+ if(argc>=3&&std::string(argv[2])!="NONE")
+ {
+ output_param.open(argv[2]);
+ }
+ else
+ {
+ output_param.open("para0.txt");
+ }
+#endif
+ //output parameters
+ for(int i=0;i<fit.get_num_params();++i)
+ {
+ std::string pname=fit.get_param_info(i).get_name();
+ std::string pstatus=fit.get_model().report_param_status(pname);
+
+ if(pstatus==""||pstatus=="thawed")
+ {
+ pstatus="T";
+ }
+ else
+ {
+ pstatus="F";
+ }
+ cout<<fit.get_param_info(i).get_name()<<"\t"<<fit.get_param_info(i).get_value()<<"\t"<<fit.get_param_info(i).get_lower_limit()<<"\t"<<fit.get_param_info(i).get_upper_limit()<<"\t"<<pstatus<<endl;
+ //if(argc>=3&&std::string(argv[2])!="NONE")
+#if 0
+ {
+ output_param<<fit.get_param_info(i).get_name()<<"\t"<<fit.get_param_info(i).get_value()<<"\t"<<fit.get_param_info(i).get_lower_limit()<<"\t"<<fit.get_param_info(i).get_upper_limit()<<"\t"<<pstatus<<endl;
+ }
+#endif
+ }
+
+ //cout<<"T0"<<"\t"<<fit.get_param_value("T0")<<endl;
+ //cout<<"T1"<<"\t"<<fit.get_param_value("T1")<<endl;
+ //cout<<"xt"<<"\t"<<fit.get_param_value("xt")<<endl;
+ //cout<<"eta"<<"\t"<<fit.get_param_value("eta")<<endl;
+ //dump the data for checking
+ ofstream ofs_model("wang2012_dump.qdp");
+
+
+ min_r=0;
+ for(double x=min_r;x<3000;x+=10)
+ {
+ double model_value=fit.eval_model_raw(x,p);
+
+ ofs_model<<x<<"\t"<<model_value<<endl;
+ if(cm_per_pixel>0)
+ {
+ ofs_fit_result<<x*cm_per_pixel/kpc<<"\t0\t"<<model_value<<"\t0"<<endl;
+ }
+ else
+ {
+ ofs_fit_result<<x<<"\t0\t"<<model_value<<"\t0"<<endl;
+ }
+ }
+}