Skip to content

Commit 5a41b4b

Browse files
committed
Do not output results for bad inputs (incl zero uncertainty)
1 parent ed59307 commit 5a41b4b

File tree

4 files changed

+74
-16
lines changed

4 files changed

+74
-16
lines changed

src/fast++-fitter.cpp

+42-12
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,12 @@ fitter_t::fitter_t(const options_t& opt, const input_state_t& inp, const gridder
227227

228228
for (uint_t is : range(input.id)) {
229229
chi2_filename[is] = odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".chi2.grid";
230+
231+
if (!input.good[is]) {
232+
file::remove(chi2_filename[is]);
233+
continue;
234+
}
235+
230236
std::ofstream out;
231237
out.open(chi2_filename[is], std::ios::binary | std::ios::out | std::ios::trunc);
232238
if (!out.is_open()) {
@@ -352,6 +358,8 @@ void fitter_t::write_chi2(uint_t igrid, const vec1f& chi2, const vec2f& props, u
352358
for (uint_t cis : range(chi2)) {
353359
uint_t is = cis + i0;
354360

361+
if (!input.good.safe[is]) continue;
362+
355363
if (chi2.safe[cis] > best_chi2.safe[is] + opts.save_bestchi) continue;
356364

357365
if (chi2.safe[cis] < best_chi2.safe[is]) {
@@ -477,6 +485,11 @@ void fitter_t::fit_galaxies(const model_t& model, uint_t i0, uint_t i1) {
477485
for (uint_t i : range(i1-i0)) {
478486
uint_t is = i + i0;
479487

488+
if (!input.good.safe[is]) {
489+
// Skip this galaxy
490+
continue;
491+
}
492+
480493
// Apply constraints on redshift
481494
bool dofit = (idzl.safe[is] <= iz && iz <= idzu.safe[is]);
482495
bool keepfit = true;
@@ -729,6 +742,11 @@ void fitter_t::fit_galaxies(const model_t& model, uint_t i0, uint_t i1) {
729742

730743
for (uint_t i : range(i1-i0)) {
731744
uint_t is = i + i0;
745+
if (!input.good.safe[is]) {
746+
// Skip this galaxy
747+
continue;
748+
}
749+
732750
++output.num_models[is];
733751
if (output.best_chi2.safe[is] > wsp.chi2[i]) {
734752
output.best_chi2.safe[is] = wsp.chi2[i];
@@ -843,16 +861,34 @@ void fitter_t::find_best_fits() {
843861

844862
if (opts.verbose) note("finding best fits...");
845863

864+
std::string best_fits_odir = opts.output_dir+"best_fits/";
865+
bool save_sim = opts.save_sim;
866+
if (save_sim) {
867+
if (!file::mkdir(best_fits_odir)) {
868+
warning("could not save simulations");
869+
warning("the output directory '", best_fits_odir, "' could not be created");
870+
save_sim = false;
871+
}
872+
}
873+
846874
for (uint_t is : range(input.id)) {
875+
std::string best_fits_output_file =
876+
best_fits_odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".sims.fits";
877+
847878
if (!is_finite(output.best_chi2[is])) {
848-
if (!silence_invalid_chi2) {
879+
if (input.good[is] && !silence_invalid_chi2) {
849880
warning("galaxy ", input.id[is], " has no best fit solution");
850881
warning("there is probably a problem with the models, please re-run FAST++ with DEBUG=1");
851882
warning("(further occurences of this warning for other galaxies will be suppressed)");
852883
silence_invalid_chi2 = true;
853884
}
854885

855886
output.best_params(is,_,_) = dnan;
887+
888+
if (save_sim) {
889+
file::remove(best_fits_output_file);
890+
}
891+
856892
continue;
857893
}
858894

@@ -881,17 +917,11 @@ void fitter_t::find_best_fits() {
881917
bparams.safe(gridder.nparam+ip,_) = output.mc_best_props.safe(is,ip,_);
882918
}
883919

884-
if (opts.save_sim) {
885-
std::string odir = opts.output_dir+"best_fits/";
886-
if (!file::mkdir(odir)) {
887-
warning("could not save simulations");
888-
warning("the output directory '", odir, "' could not be created");
889-
} else {
890-
fits::write_table(odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".sims.fits",
891-
"result", bparams, "params", output.param_names,
892-
"chi2", output.mc_best_chi2(is,_)
893-
);
894-
}
920+
if (save_sim) {
921+
fits::write_table(best_fits_output_file,
922+
"result", bparams, "params", output.param_names,
923+
"chi2", output.mc_best_chi2(is,_)
924+
);
895925
}
896926

897927
if (!opts.interval_from_chi2) {

src/fast++-read_input.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,7 @@ bool read_fluxes(const options_t& opts, input_state_t& state) {
980980
state.zspec = replicate(fnan, ngal);
981981
state.flux = replicate(fnan, ngal, state.no_filt.size());
982982
state.eflux = replicate(fnan, ngal, state.no_filt.size());
983+
state.good = replicate(true, ngal);
983984

984985
// Now read the catalog itself, only keeping the columns we are interested in
985986
uint_t l = 0;
@@ -1053,12 +1054,20 @@ bool read_fluxes(const options_t& opts, input_state_t& state) {
10531054
err *= totcor;
10541055
}
10551056

1057+
// Check for zero uncertainty (ambiguous; could mean no data or no uncertainty)
1058+
for (uint_t idz : where(err == 0)) {
1059+
state.good.safe[gid] = false;
1060+
warning("object ", state.id.safe[gid], " (l.", l, ") has zero uncertainty for ",
1061+
header[col_eflux[idz]], "; will not fit");
1062+
}
1063+
10561064
// Flag bad values
10571065
vec1u idb = where(err < 0 || !is_finite(flx) || !is_finite(err));
10581066
err.safe[idb] = finf; flx.safe[idb] = 0;
10591067

10601068
if (idb.size() == flx.size()) {
1061-
warning("object ", state.id.safe[gid], " (l.", l, ") has no valid photometry");
1069+
state.good.safe[gid] = false;
1070+
warning("object ", state.id.safe[gid], " (l.", l, ") has no valid photometry; will not fit");
10621071
}
10631072

10641073
// Save flux and uncertainties in the input state

src/fast++-write_output.cpp

+21-3
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,16 @@ void write_best_fits(const options_t& opts, const input_state_t& input, const gr
251251
vec1f lam, sed, sed_nodust, sed_lsf, flx;
252252
auto pg = progress_start(input.id.size());
253253
for (uint_t is : range(input.id)) {
254+
std::string output_file_tpl = odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".fit";
255+
std::string output_file_flx = odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".input_res.fit";
256+
257+
if (!input.good[is]) {
258+
file::remove(output_file_tpl);
259+
file::remove(output_file_flx);
260+
if (opts.verbose) progress(pg, 13);
261+
continue;
262+
}
263+
254264
float scale = finf;
255265
uint_t model = npos;
256266

@@ -303,7 +313,7 @@ void write_best_fits(const options_t& opts, const input_state_t& input, const gr
303313
}
304314

305315
// Save model
306-
std::ofstream fout(odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".fit");
316+
std::ofstream fout(output_file_tpl);
307317
fout << "# wl fl";
308318
if (opts.intrinsic_best_fit) {
309319
fout << " fl_nodust";
@@ -328,7 +338,7 @@ void write_best_fits(const options_t& opts, const input_state_t& input, const gr
328338
fout.close();
329339

330340
// Save fluxes
331-
fout.open(odir+file::get_basename(opts.catalog)+"_"+input.id[is]+".input_res.fit");
341+
fout.open(output_file_flx);
332342
fout << "# wl fl_model fl_obs unc_obs (x 10^-19 ergs s^-1 cm^-2 Angstrom^-1)\n";
333343
for (uint_t il : range(input.lambda)) {
334344
fout << std::setw(13) << float(input.lambda[il])
@@ -386,6 +396,14 @@ void write_sfhs(const options_t& opts, const input_state_t& input, const gridder
386396

387397
auto pg = progress_start(input.id.size());
388398
for (uint_t is : range(input.id)) {
399+
std::string output_file = odir+opts.catalog+"_"+input.id[is]+".sfh";
400+
401+
if (!input.good[is]) {
402+
file::remove(output_file);
403+
if (opts.verbose) progress(pg, 13);
404+
continue;
405+
}
406+
389407
vec1u idm = gridder.grid_ids(output.best_model[is]);
390408
vec1d t = rgen_step(1e6, e10(gridder.auniv[idm[grid_id::z]]), opts.sfh_output_step);
391409
vec2f sfh = replicate(fnan, t.size(), 1+nconf);
@@ -459,7 +477,7 @@ void write_sfhs(const options_t& opts, const input_state_t& input, const gridder
459477
}
460478

461479
// Save SFH
462-
std::ofstream fout(odir+opts.catalog+"_"+input.id[is]+".sfh");
480+
std::ofstream fout(output_file);
463481
fout << header;
464482

465483
for (uint_t it : range(t)) {

src/fast++.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ struct input_state_t {
220220
vec1b lir_log; // [ngal]
221221
vec1u lir_comp; // [ngal]
222222
vec2f flux, eflux; // [ngal,nfilt+nspec]
223+
vec1b good; // [ngal]
223224
vec1f conf_interval; // [nconf]
224225
vec1f delta_chi2; // [nconf]
225226

0 commit comments

Comments
 (0)