aboutsummaryrefslogtreecommitdiffstats
path: root/mass_profile/fit_lt_pl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mass_profile/fit_lt_pl.cpp')
-rw-r--r--mass_profile/fit_lt_pl.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/mass_profile/fit_lt_pl.cpp b/mass_profile/fit_lt_pl.cpp
new file mode 100644
index 0000000..e1686e5
--- /dev/null
+++ b/mass_profile/fit_lt_pl.cpp
@@ -0,0 +1,239 @@
+/*
+ Perform a double-beta density model fitting to the surface brightness data
+ Author: Junhua Gu
+ Last modified: 2011.01.01
+ This code is distributed with no warrant
+*/
+
+//#define HAVE_X_ERROR
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <models/pl1d.hpp>
+#include <models/lin1d.hpp>
+#include "statistics/chisq.hpp"
+#include "statistics/leastsq.hpp"
+#include <data_sets/default_data_set.hpp>
+#include <methods/powell/powell_method.hpp>
+#include <core/freeze_param.hpp>
+
+using namespace std;
+using namespace opt_utilities;
+//double s=5.63136645E20;
+const double kpc=3.086E21;//kpc in cm
+const double Mpc=kpc*1000;
+const double pi=4*atan(1);
+double std_norm_rand()
+{
+ double x=0;
+ double u=0;
+ double v=0;
+
+ do
+ {
+ u=rand()/(double)RAND_MAX;
+ rand();
+ v=rand()/(double)RAND_MAX;
+
+ x=std::sqrt(-log(u))*cos(2*pi*v);
+ }while(isnan(x));
+ return x;
+}
+
+double shuffle_data(double xc,double xl,double xu)
+{
+ double result=0;
+ assert(!isnan(xc));
+ assert(!isnan(xl));
+ assert(!isnan(xu));
+ if(std_norm_rand()>0)
+ {
+ result=xc-std::abs(std_norm_rand()*xl);
+ }
+ else
+ {
+ result=xc+std::abs(std_norm_rand()*xu);
+ }
+ assert(!isnan(result));
+ return result;
+}
+
+int main(int argc,char* argv[])
+{
+ if(argc!=3)
+ {
+ cerr<<"Usage:"<<argv[0]<<" <a 5 column file with T -Terr +Terr L Lerr> <T lower limit>"<<endl;
+ return -1;
+ }
+ double T_lower_limit(atof(argv[2]));
+ ifstream ifs_data(argv[1]);
+ default_data_set<double,double> ds;
+ ofstream ofs_result("l-t_result.qdp");
+ ofs_result<<"read terr 1"<<endl;
+ ofs_result<<"read serr 2"<<endl;
+ ofs_result<<"skip single"<<endl;
+ ofs_result<<"log"<<endl;
+ //ofs_result<<"li on 2"<<endl;
+ ofs_result<<"time off"<<endl;
+ ofs_result<<"la f"<<endl;
+ ofs_result<<"la x temperature (keV)"<<endl;
+ ofs_result<<"la y Luminosity (10\\u43\\d erg s\\u-1\\d)"<<endl;
+ double yunit=1E43;
+ double sxx=0;
+ double s1=0;
+ double sx=0;
+ double sy=0;
+ double sxy=0;
+ bool is_first_nonono=true;
+ for(;;)
+ {
+ double T,Tl,Tu;
+ double L,Lerr;
+ std::string line;
+ getline(ifs_data,line);
+
+
+ if(!ifs_data.good())
+ {
+ break;
+ }
+ line+=" ";
+ istringstream iss(line);
+
+ if(line[0]=='#')
+ {
+ if(!is_first_nonono)
+ {
+ ofs_result<<"no no no"<<endl;
+ }
+ else
+ {
+ is_first_nonono=false;
+ }
+ continue;
+ }
+
+ iss>>T>>Tl>>Tu>>L>>Lerr;
+ //std::cerr<<L<<"\t"<<Lerr<<endl;
+ if(!iss.good())
+ {
+ continue;
+ }
+ if(T<T_lower_limit||L<0)
+ {
+ continue;
+ }
+ if(Lerr<L*.1)
+ {
+ Lerr=L*.1;
+ }
+ double Ll=Lerr;
+ double Lu=Lerr;
+ Tl=std::abs(Tl);
+ Tu=std::abs(Tu);
+ Ll=std::abs(Ll);
+ Lu=std::abs(Lu);
+ ofs_result<<T<<"\t"<<-std::abs(Tl)<<"\t"<<+std::abs(Tu)<<"\t"<<L/yunit<<"\t"<<std::abs(Lerr)/yunit<<endl;
+ double x=log(T);
+ double y=log(L);
+ double xu=log(T+Tu)-log(T);
+ double xl=log(T-Tl)-log(T);
+
+ double yu=log(L+Lu)-log(L);
+ double yl=log(L-Ll)-log(L);
+ if(isnan(x)||isnan(y)||isnan(yl)||isnan(yu)||
+ isnan(xl)||isnan(xu))
+ {
+ std::cerr<<"one data with error > data, skipped"<<endl;
+ std::cerr<<line<<endl;
+ continue;
+ }
+ sxx+=x*x;
+ sx+=x;
+ sy+=y;
+ sxy+=y*x;
+ s1+=1;
+ data<double,double> d(x,y,std::abs(yl),std::abs(yu),
+ std::abs(xl),std::abs(xu));
+ ds.add_data(d);
+ }
+
+ double M=sxx*s1-sx*sx;
+ double Ma=sxy*s1-sy*sx;
+ double Mb=sxx*sy-sx*sxy;
+ double k0=Ma/M;
+ double b0=Mb/M;
+
+ ofs_result<<"no no no"<<endl;
+ fitter<double,double,vector<double>,double,std::string> fit;
+ fit.set_opt_method(powell_method<double,vector<double> >());
+ fit.set_statistic(chisq<double,double,vector<double>,double,std::string>());
+ //fit.set_statistic(leastsq<double,double,vector<double>,double,std::string>());
+ fit.set_model(lin1d<double>());
+ fit.load_data(ds);
+
+ cerr<<"k0="<<k0<<endl;
+ cerr<<"b0="<<b0<<endl;
+ cerr<<"Ampl0="<<exp(b0)<<endl;
+ cerr<<"gamma0="<<k0<<endl;
+ fit.set_param_value("k",k0);
+ fit.set_param_value("b",b0);
+ fit.fit();
+ std::vector<double> p=fit.fit();
+ for(double i=.5;i<12;i*=1.01)
+ {
+ ofs_result<<i<<"\t0\t0\t"<<exp(fit.eval_model_raw(log(i),p))/yunit<<"\t0\n";
+ }
+
+
+ double mean_A=0;
+ double mean_A2=0;
+ double mean_g=0;
+ double mean_g2=0;
+ int cnt=0;
+ for(int n=0;n<100;++n)
+ {
+ ++cnt;
+ cerr<<".";
+ opt_utilities::default_data_set<double,double> ds1;
+ for(int i=0;i<ds.size();++i)
+ {
+ double new_x=shuffle_data(ds.get_data(i).get_x(),
+ ds.get_data(i).get_x_lower_err(),
+ ds.get_data(i).get_x_upper_err());
+ double new_y=shuffle_data(ds.get_data(i).get_y(),
+ ds.get_data(i).get_y_lower_err(),
+ ds.get_data(i).get_y_upper_err());
+ ds1.add_data(data<double,double>(new_x,new_y,
+ ds.get_data(i).get_y_lower_err(),
+ ds.get_data(i).get_y_upper_err(),
+ ds.get_data(i).get_y_lower_err(),
+ ds.get_data(i).get_y_upper_err()));
+ //cerr<<new_x<<"\t"<<new_y<<endl;
+ }
+ fit.load_data(ds1);
+
+ fit.fit();
+ double k=fit.get_param_value("k");
+ double b=fit.get_param_value("b");
+ double A=exp(b);
+ double g=k;
+ mean_A+=A;
+ mean_A2+=A*A;
+ mean_g+=g;
+ mean_g2+=g*g;
+ }
+ std::cerr<<endl;
+ mean_A/=cnt;
+ mean_A2/=cnt;
+ mean_g/=cnt;
+ mean_g2/=cnt;
+ double std_A=std::sqrt(mean_A2-mean_A*mean_A);
+ double std_g=std::sqrt(mean_g2-mean_g*mean_g);
+
+ std::cerr<<"L=L0*T^gamma"<<endl;
+ std::cout<<"L0= "<<exp(p[1])<<"+/-"<<std_A<<endl;
+ std::cout<<"gamma= "<<p[0]<<"+/-"<<std_g<<endl;
+ std::cout<<"Num of sources:"<<ds.size()<<endl;
+
+}