Esempio n. 1
0
void gcta::update_freq(string freq)
{
    ifstream ifreq(freq.c_str());
    if(!ifreq) throw("Error: can not open the file ["+freq+"] to read.");
    int i=0;
    string ref_A_buf;
    double fbuf=0.0;
    string snp_name_buf, str_buf;
	cout<<"Reading allele frequencies of the SNPs from ["+freq+"]."<<endl;
    map<string, int>::iterator iter, End=_snp_name_map.end();
    _mu.clear();
    _mu.resize(_snp_num, 0.0);
    int icount=0;
	while(ifreq){
		ifreq>>snp_name_buf;
		if(ifreq.eof()) break;
		iter=_snp_name_map.find(snp_name_buf);
		ifreq>>ref_A_buf;
        ifreq>>str_buf;
		fbuf=atof(str_buf.c_str());
		if(iter!=End){
		    if(fbuf>1.0 || fbuf<0.0) throw("Error: invalid value of allele frequency for the SNP "+snp_name_buf+".");
            if(ref_A_buf!=_allele1[iter->second] && ref_A_buf!=_allele2[iter->second]){
                throw("Invalid allele type \""+ref_A_buf+"\" for the SNP "+_snp_name[iter->second]+".");
            }
		    if(ref_A_buf==_ref_A[iter->second]) _mu[iter->second]=fbuf*2.0;
		    else _mu[iter->second]=(1.0-fbuf)*2.0;
		    icount++;
		}
		getline(ifreq, str_buf);
	}
    ifreq.close();

	cout<<"Allele frequencies of "<<icount<<" SNPs are update from ["+freq+"]."<<endl;
    if(icount!=_snp_num) cout<<"Warning: allele frequencies of "<<_snp_num-icount<<" SNPs have not been updated."<<endl;
}
Esempio n. 2
0
int main(int argc, char **argv){
    std::cout<<"Hi! I check tails!"<<std::endl;

    std::string directory;
    std::string GF_h5_filename, Sim_h5_filename;
    std::string GFmTail_output, SEmTail_output;
    std::string GF_output, SE_output;
    int nsites, nfreq, mu, beta, U;
    bool info;

    try{    //command line parser
        TCLAP::CmdLine cmd("Subtract tail from Greens function, Self-Energy to check validity");
        TCLAP::ValueArg<std::string> directory_arg("d", "directory", "directory containing SE, GF (.)", false, ".", "string", cmd);
        TCLAP::ValueArg<std::string> GF_filename_arg("G", "greens_h5", "Greens function h5 filename (greens)", false, "Greens", "string", cmd);
        TCLAP::ValueArg<std::string> h5_filename_arg("x", "hdf5", "hdf5 file with parameters (sim.h5)", false, "sim.h5", "string", cmd);
        TCLAP::ValueArg<std::string> GFmTail_output_arg("g", "greensmtail_out", "output file with G-Gtail", false, "GmTail.dat", "string", cmd);
        TCLAP::ValueArg<std::string> SEmTail_output_arg("s", "selfenergymtail_out", "output file with SE-SEtail", false, "SEmTail.dat", "string", cmd);
        TCLAP::ValueArg<std::string> GF_output_arg("j", "greens_out", "output file with G", false, "G.dat", "string", cmd);
        TCLAP::ValueArg<std::string> SE_output_arg("t", "selfenergy_out", "output file with SE", false, "SE.dat", "string", cmd);
        TCLAP::ValueArg<bool> info_arg("i", "info", "output info about the calculation", false, false, "bool", cmd);

        cmd.parse( argc, argv );

        directory = directory_arg.getValue();
        GF_h5_filename = GF_filename_arg.getValue();
        Sim_h5_filename = h5_filename_arg.getValue();
        GFmTail_output = GFmTail_output_arg.getValue();
        SEmTail_output = SEmTail_output_arg.getValue();
        GF_output = GF_output_arg.getValue();
        SE_output = SE_output_arg.getValue();
        info = info_arg.getValue();

        if(info) {
            std::cout << "Subtracting tails from GF and SE" << std::endl;
            std::cout << "Directory = " << directory << std::endl;
            std::cout << "GF_filename = " << GF_h5_filename << std::endl;
            std::cout << "h5_filename = " << Sim_h5_filename << std::endl;
            std::cout << "GFmTail output = " << GFmTail_output << std::endl;
            std::cout << "SEmTail output = " << SEmTail_output << std::endl;
            std::cout << "GF output = " << GF_output << std::endl;
            std::cout << "SE output = " << SE_output << std::endl;

        }

    }
    catch(TCLAP::ArgException &e) {
        std::cerr << "error: " << e.error() << " for arg " << e.argId() << std::endl; exit(1);
    }

    //Get parameters from simulation h5 file
    std::stringstream h5_file_fullpath; h5_file_fullpath << directory<< "/" <<Sim_h5_filename;
    alps::hdf5::archive ar(h5_file_fullpath.str().c_str(), alps::hdf5::archive::READ);
    ar.read("/parameters/dca.SITES", nsites);
    ar.read("/parameters/NMATSUBARA", nfreq);
    ar.read("/parameters/U", U);
    ar.read("/parameters/MU", mu);
    ar.read("/parameters/BETA", beta);

    if(info) {
        std::cout << "nsites = " << nsites << std::endl;
        std::cout << "nfreq = " << nfreq << std::endl;
        std::cout << "U = " << U << std::endl;
        std::cout << "mu = " << mu << std::endl;
        std::cout << "beta = " << beta << std::endl;
    }
    ar.close();

    cluster_matsubara_kspace_gf green(alps::gf::omega_k_sigma_gf(
            alps::gf::matsubara_positive_mesh(beta, nfreq),
            alps::gf::momentum_index_mesh(9,2),
            alps::gf::index_mesh(2))
    );

    cluster_matsubara_kspace_gf sigma(alps::gf::omega_k_sigma_gf(
            alps::gf::matsubara_positive_mesh(beta, nfreq),
            alps::gf::momentum_index_mesh(9,2),
            alps::gf::index_mesh(2))
    );

    alps::hdf5::archive G_ar(GF_h5_filename.c_str(), alps::hdf5::archive::READ);
    green.load(G_ar, "/G_komega");
    sigma.load(G_ar, "/Sigma_komega");
    G_ar.close();

    //Get tails
    cluster_matsubara_kspace_gf_tail green_c1 = green.tail(1);
    cluster_matsubara_kspace_gf_tail green_c2 = green.tail(2);
    cluster_matsubara_kspace_gf_tail green_c3 = green.tail(3);

    cluster_matsubara_kspace_gf_tail sigma_c0 = sigma.tail(0);
    cluster_matsubara_kspace_gf_tail sigma_c1 = sigma.tail(1);

    std::ofstream G_out;
    std::ofstream SE_out;
    std::ofstream GmTail_out;
    std::ofstream SEmTail_out;
    G_out.open(GF_output);
    SE_out.open(SE_output);
    GmTail_out.open(GFmTail_output);
    SEmTail_out.open(SEmTail_output);

    G_out<<"#Freq\t";
    SE_out<<"#Freq\t";
    GmTail_out<<"#Freq\t";
    SEmTail_out<<"#Freq\t";
    for(mom_index k(0); k<nsites; k++){
        double k0 = green.mesh2().points()[k()][0];
        double k1 = green.mesh2().points()[k()][1];
        G_out<<"Re(k="<<k0<<","<<k1<<",up)\tIm(k="<<k0<<","<<k1<<",up)\tRe(k="<<k0<<","<<k1<<",dn)\tIm(k="<<k0<<","<<k1<<",dn)\t";
        SE_out<<"Re(k="<<k0<<","<<k1<<",up)\tIm(k="<<k0<<","<<k1<<",up)\tRe(k="<<k0<<","<<k1<<",dn)\tIm(k="<<k0<<","<<k1<<",dn)\t";
        GmTail_out<<"Re(k="<<k0<<","<<k1<<",up)\tIm(k="<<k0<<","<<k1<<",up)\tRe(k="<<k0<<","<<k1<<",dn)\tIm(k="<<k0<<","<<k1<<",dn)\t";
        SEmTail_out<<"Re(k="<<k0<<","<<k1<<",up)\tIm(k="<<k0<<","<<k1<<",up)\tRe(k="<<k0<<","<<k1<<",dn)\tIm(k="<<k0<<","<<k1<<",dn)\t";
    }
    G_out<<std::endl;
    SE_out<<std::endl;
    GmTail_out<<std::endl;
    SEmTail_out<<std::endl;
    for(freq_index f(0); f<nfreq; f++){
        double freq = green.mesh1().points()[f()];
        G_out<<freq<<"\t";
        SE_out<<freq<<"\t";
        GmTail_out<<std::log(freq)<<"\t";
        SEmTail_out<<std::log(freq)<<"\t";
        std::complex<double> ifreq(0.0, freq);
        //std::cout<<ifreq<<std::endl;

        for(mom_index k(0); k<nsites; k++){
           for(spin_index s(0); s<2; s++){
               if(f()==0){
                   std::cout<<"k = ("<<green.mesh2().points()[k()][0]<<", "<<green.mesh2().points()[k()][1]<<"), spin = "<<s()<<std::endl;
                   std::cout<<green_c1(k,s) <<"\t"<< green_c2(k,s) <<"\t"<< green_c3(k,s)<<"\t"<<(U*0.5 - 2*(std::cos(green.mesh2().points()[k()][0])+std::cos(green.mesh2().points()[k()][1])) - mu)<<std::endl;
               }
               if(f()==nfreq-1){
                   std::cout<<"k = ("<<green.mesh2().points()[k()][0]<<", "<<green.mesh2().points()[k()][1]<<"), spin = "<<s()<<std::endl;
                   std::cout<<"Fit value of c2(k) = "<<green(f,k,s).real()*ifreq*ifreq<<std::endl;
                   std::cout<<"Attached value = "<<green_c2(k,s)<<std::endl;
                   std::cout<<"Theory value = "<<(U*0.5 - 2*(std::cos(green.mesh2().points()[k()][0])+std::cos(green.mesh2().points()[k()][1])) - (mu+U/2.))<<std::endl;
               }
               std::complex<double> g_val = green(f,k,s);
               std::complex<double> gtail_val = green_c1(k,s)/ifreq + green_c2(k,s)/(ifreq*ifreq) + green_c3(k,s)/(ifreq*ifreq*ifreq);
               //std::complex<double> gtail_val = green_c1(k,s)/ifreq +
               //        (U*0.5 - 2*(std::cos(green.mesh2().points()[k()][0])+std::cos(green.mesh2().points()[k()][1])) - (mu+U/2))/(ifreq*ifreq) +
               //        green_c3(k,s)/(ifreq*ifreq*ifreq);
               std::complex<double> se_val = sigma(f,k,s);
               std::complex<double> setail_val = sigma_c0(k,s) + sigma_c1(k,s)/ifreq;
               G_out<<g_val.real()<<"\t"<<g_val.imag()<<"\t";
               SE_out<<se_val.real()<<"\t"<<se_val.imag()<<"\t";
               GmTail_out<<std::log(std::abs((g_val-gtail_val).real()))<<"\t"<<std::log(std::abs((g_val-gtail_val).imag()))<<"\t";
               SEmTail_out<<std::log(std::abs((se_val-setail_val).real()))<<"\t"<<std::log(std::abs((se_val-setail_val).imag()))<<"\t";
           }
        }

        G_out<<std::endl;
        SE_out<<std::endl;
        GmTail_out<<std::endl;
        SEmTail_out<<std::endl;
    }
    G_out.close();
    SE_out.close();
    GmTail_out.close();
    SEmTail_out.close();

    return 0;
}