Exemple #1
0
Datum pgheal_ipix2ang_ring(PG_FUNCTION_ARGS)
{	
	q3c_ipix_t ipix;
	q3c_coord_t ra, dec, theta, phi;
	q3c_ipix_t nside = PG_GETARG_INT64(0);
	nside_check(nside);
	ipix = PG_GETARG_INT64(1);
	ipix_check(nside, ipix);
	pix2ang_ring(nside, ipix, &theta, &phi);
	get_ra_dec(theta, phi, &ra, &dec);
	PG_RETURN_ARRAYTYPE_P(build_array(ra,dec));
}
int main( const int argc, const char *argv[] )
{

	// Open and read in the fields list
	std::ifstream fi;
	IceBRG::open_file_input(fi,fields_list);

	std::vector<std::string> field_names;
	std::string temp_field_name;

	while(fi>>temp_field_name)
	{
		field_names.push_back(temp_field_name);
	}

	size_t num_fields = field_names.size();

	//num_fields = 1;

	// Loop over all fields
	#ifdef _OPENMP
	#pragma omp parallel for schedule(dynamic)
	#endif
	for(unsigned i=0;i<num_fields;++i)
	{
		// Set up and seed the random generator for this field
		std::ranlux48 gen(base_seed*(i+1));

		std::string & field_name = field_names[i];
		std::string field_name_root = field_name.substr(0,6);

		std::string pixel_map_name = field_directory + field_name_root + pixel_map_root;
		std::string lens_output_file_name = field_directory + field_name_root + lens_output_root;

		const std::vector<std::vector<bool>> good_pixels =
				IceBRG::binary_load<std::vector<std::vector<bool>>>(pixel_map_name);

		const size_t ncol = good_pixels.size();
		assert(ncol>0);
		const size_t nrow = good_pixels[0].size();
		assert(nrow>0);

		assert(static_cast<double>(num_good_pixels(good_pixels))/(ncol*nrow)>min_good_frac);

		std::vector<std::pair<double,double>> galaxy_positions;

#ifdef MAKE_CALIBRATION_LENSES

		// For the calibration lenses, we only need one good position, relatively near the centre

		bool good_point_found = false;
		unsigned counter = 0;

		while((!good_point_found)&&(++counter<10000))
		{
			const double x = IceBRG::drand(ncol/2-counter,ncol/2+counter);
			const double y = IceBRG::drand(nrow/2-counter,nrow/2+counter);

			const unsigned xp = IceBRG::round_int(x);
			const unsigned yp = IceBRG::round_int(y);

			if(good_pixels[xp][yp])
			{
				good_point_found = true;
				for(unsigned j = 0; j< num_lenses_to_generate; ++j)
					galaxy_positions.push_back(std::make_pair(x,y));
			}
		}

		if(!good_point_found) throw std::runtime_error("Could not find good point for calibration lens.");

		unsigned num_lenses_generated = galaxy_positions.size();

#else

		unsigned num_lenses_generated = 0;

		// For each galaxy we want to generate, get good random pixel positions for it
		for(unsigned j=0; j<num_lenses_to_generate; ++j)
		{
			const double x = IceBRG::drand(-0.5,ncol-0.5,gen);
			const double y = IceBRG::drand(-0.5,nrow-0.5,gen);

			const unsigned xp = IceBRG::round_int(x);
			const unsigned yp = IceBRG::round_int(y);

			if(good_pixels[xp][yp])
			{
				galaxy_positions.push_back(std::make_pair(x,y));
				++num_lenses_generated;
				// If not, skip - we don't want to introduce a bias here
			}
		}

#endif

		auto galaxy_sky_positions =
				get_ra_dec(field_name,galaxy_positions);

		// Create the output table, and then add each galaxy to it
		IceBRG::table_map_t<double> field_output_table;


#ifdef MAKE_CALIBRATION_LENSES
		unsigned z100step = 100*(max_lens_z-min_lens_z)/(num_lenses_generated-1);
		if(z100step<1) z100step = 1;
		unsigned z100 = 100*min_lens_z - z100step;
#else
		unsigned z100;
#endif


		for( size_t j=0; j<num_lenses_generated; ++j )
		{
			field_output_table["SeqNr"].push_back(j);
			field_output_table["ra_radians"].push_back(galaxy_sky_positions[j].first.first*IceBRG::unitconv::degtorad);
			field_output_table["dec_radians"].push_back(galaxy_sky_positions[j].first.second*IceBRG::unitconv::degtorad);
			field_output_table["Xpos"].push_back(galaxy_sky_positions[j].second.first);
			field_output_table["Ypos"].push_back(galaxy_sky_positions[j].second.second);
#ifdef MAKE_CALIBRATION_LENSES
			z100 += z100step;
#else
			z100 = 100*IceBRG::drand(min_lens_z,max_lens_z);
#endif
			field_output_table["Z_B"].push_back(z100/100.);
			field_output_table["T_B"].push_back(IceBRG::drand(min_T,max_T));
			field_output_table["ODDS"].push_back(1);
			field_output_table["CHI_SQUARED_BPZ"].push_back(1);

			double Mstel_kg = pow(10,IceBRG::drand(min_lens_lmsun,max_lens_lmsun,gen))*IceBRG::unitconv::Msuntokg;
			field_output_table["Mstel_kg"].push_back(Mstel_kg);
			field_output_table["Mstel_lo_kg"].push_back(Mstel_kg/2);
			field_output_table["Mstel_hi_kg"].push_back(2*Mstel_kg);

			field_output_table["MAG_i"].push_back(IceBRG::drand(min_lens_mag,max_lens_mag,gen));
			field_output_table["MAGERR_i"].push_back(1);
			field_output_table["EXTINCTION_i"].push_back(0);
			field_output_table["MAG_r"].push_back(IceBRG::drand(min_lens_mag,max_lens_mag,gen));
			field_output_table["MAGERR_r"].push_back(1);
			field_output_table["EXTINCTION_r"].push_back(0);
		}

		// Output the table
		#ifdef _OPENMP
		#pragma omp critical(output_mock_lenses)
		#endif
		{
			IceBRG::print_table_map(lens_output_file_name,field_output_table);
			std::cout << "Finished generating " << lens_output_file_name << ".\n";
		}

#ifndef MAKE_CALIBRATION_LENSES

		// Repeat for sources
		std::string source_output_file_name = field_directory + field_name_root + source_output_root;

		galaxy_positions.clear();

		unsigned num_sources_generated = 0;

		// For each galaxy we want to generate, get good random pixel positions for it
		for(unsigned j=0; j<num_sources_to_generate; ++j)
		{
			// Generate a random position and add it if it's inside the mask
			const double x = IceBRG::drand(-0.5,ncol-0.5,gen);
			const double y = IceBRG::drand(-0.5,nrow-0.5,gen);

			const unsigned xp = IceBRG::round_int(x);
			const unsigned yp = IceBRG::round_int(y);

			if(good_pixels[xp][yp])
			{
				galaxy_positions.push_back(std::make_pair(x,y));
				++num_sources_generated;
				// If not, skip - we don't want to introduce a bias here
			}
		}

		galaxy_sky_positions =
				get_ra_dec(field_name,galaxy_positions);

		// Create the output table, and then add each galaxy to it
		field_output_table.clear();

		for( size_t j=0; j<num_sources_generated; ++j )
		{
			field_output_table["SeqNr"].push_back(j);
			field_output_table["ra_radians"].push_back(galaxy_sky_positions[j].first.first*IceBRG::unitconv::degtorad);
			field_output_table["dec_radians"].push_back(galaxy_sky_positions[j].first.second*IceBRG::unitconv::degtorad);
			field_output_table["Xpos"].push_back(galaxy_sky_positions[j].second.first);
			field_output_table["Ypos"].push_back(galaxy_sky_positions[j].second.second);
			unsigned z100 = 100*IceBRG::drand(min_source_z,max_source_z,gen);
			field_output_table["Z_B"].push_back(z100/100.);
			field_output_table["T_B"].push_back(IceBRG::drand(min_T,max_T,gen));
			field_output_table["ODDS"].push_back(1);
			field_output_table["e1"].push_back(0);
			field_output_table["e2"].push_back(0);
			field_output_table["weight"].push_back(1);
			field_output_table["m"].push_back(0);
			field_output_table["c2"].push_back(0);

			double Mstel_kg = pow(10,IceBRG::drand(min_lens_lmsun,max_lens_lmsun,gen))*IceBRG::unitconv::Msuntokg;
			field_output_table["Mstel_kg"].push_back(Mstel_kg);
			field_output_table["Mstel_lo_kg"].push_back(Mstel_kg/2);
			field_output_table["Mstel_hi_kg"].push_back(2*Mstel_kg);

			field_output_table["MAG_i"].push_back(IceBRG::drand(min_source_mag,max_source_mag,gen));
			field_output_table["MAGERR_i"].push_back(1);
			field_output_table["EXTINCTION_i"].push_back(0);
			field_output_table["MAG_r"].push_back(IceBRG::drand(min_source_mag,max_source_mag,gen));
			field_output_table["MAGERR_r"].push_back(1);
			field_output_table["EXTINCTION_r"].push_back(0);
		}

		// Output the table
		#ifdef _OPENMP
		#pragma omp critical(output_mock_sources)
		#endif
		{
			IceBRG::print_table_map(source_output_file_name,field_output_table);
			std::cout << "Finished generating " << source_output_file_name << ".\n";
		}

#endif // #ifndef MAKE_CALIBRATION_LENSES
	}

	return 0;
}