@@ -74,7 +74,7 @@ int phypp_main(int argc, char* argv[]) {
7474 std::string mass_func_file = egg_share_dir+" mass_func_candels.fits" ;
7575
7676 // SED libraries
77- std::string ir_lib_file = egg_share_dir+" ir_lib_cs15 .fits" ;
77+ std::string ir_lib_file = egg_share_dir+" ir_lib_cs17 .fits" ;
7878 std::string opt_lib_file = egg_share_dir+" opt_lib_fast.fits" ;
7979
8080 // Filter library
@@ -295,18 +295,19 @@ int phypp_main(int argc, char* argv[]) {
295295
296296 struct {
297297 vec2d lam, dust, pah;
298- vec1d tdust, lir_dust, lir_pah;
299- } ir_lib_cs15 ;
298+ vec1d tdust, lir_dust, lir_pah, l8_dust, l8_pah ;
299+ } ir_lib_cs17 ;
300300
301301 uint_t nirsed;
302- if (file::get_basename (ir_lib_file) == " ir_lib_cs15 .fits" ) {
302+ if (file::get_basename (ir_lib_file) == " ir_lib_cs17 .fits" ) {
303303 // My library, calibrated in unit Mdust
304304 fits::read_table (ir_lib_file, ftable (
305- ir_lib_cs15.lam , ir_lib_cs15.dust , ir_lib_cs15.pah ,
306- ir_lib_cs15.tdust , ir_lib_cs15.lir_dust , ir_lib_cs15.lir_pah
305+ ir_lib_cs17.lam , ir_lib_cs17.dust , ir_lib_cs17.pah ,
306+ ir_lib_cs17.tdust , ir_lib_cs17.lir_dust , ir_lib_cs17.lir_pah ,
307+ ir_lib_cs17.l8_dust , ir_lib_cs17.l8_pah
307308 ));
308309
309- nirsed = ir_lib_cs15 .lam .dims [0 ];
310+ nirsed = ir_lib_cs17 .lam .dims [0 ];
310311 } else {
311312 // Generic library
312313 auto cols = fits::read_table_columns (ir_lib_file);
@@ -1376,28 +1377,29 @@ if (!no_stellar) {
13761377 vec1f oir8 = out.ir8 ;
13771378 vec1f otdust = out.tdust ;
13781379
1379- out.tdust = 4.65 *(out.z -2.0 ) + 31.0 ;
1380+ vec1f tdust_ms = 32.9 + 4.60 *(out.z - 2.0 ) - 0.77 ;
1381+ out.tdust = tdust_ms;
13801382
13811383 if (magdis_tdust) {
13821384 vec1u idz = where (out.z > 1 );
13831385 out.tdust [idz] = 2.0 *(clamp (out.z [idz], 0.0 , 2.0 )-1.0 ) + 27.0 ;
13841386 }
13851387
13861388 // Starbursts are warmer
1387- out.tdust += 6.6 *out.rsb ;
1389+ out.tdust += 10.1 *out.rsb ;
13881390 // Massive galaxies are colder (= downfall of SFE)
1389- out.tdust -= 1.5 *min (0.0 , out. z - 2.0 )*clamp (out.m - 10.7 , 0.0 , 1.0 );
1391+ out.tdust -= 1.5 *max (0.0 , 2.0 - out. z )*clamp (out.m - 10.7 , 0.0 , 1.0 );
13901392
1391- out.ir8 = (1.95 * min ( 0.0 , out.z - 2.0 ) + 7.73 )
1392- // Starburst have larger IR8
1393- * e10 (0.43 *max (0.0 , out.rsb ))
1394- // Low-mass galaxies have larger IR8
1395- * e10 (-1.8 *clamp (out.m - 10.0 , -1 , 0.0 ));
1393+ out.ir8 = (4.08 + 3.29 * clamp ( out.z - 1.0 , 0.0 , 1.0 ))* 0.81 ;
1394+ // Starburst have larger IR8
1395+ out. ir8 *= e10 (0.66 *max (0.0 , out.rsb ));
1396+ // Low-mass galaxies have larger IR8
1397+ out. ir8 *= e10 (-1.0 *clamp (out.m - 10.0 , -1 , 0.0 ));
13961398
13971399 if (!no_random) {
13981400 // Add some random scatter
1399- out.tdust += 3.0 *randomn (seed, ngal);
1400- out.ir8 *= e10 (0.1 *randomn (seed, ngal));
1401+ out.tdust += 0.12 *tdust_ms *randomn (seed, ngal);
1402+ out.ir8 *= e10 (0.18 *randomn (seed, ngal));
14011403 }
14021404
14031405 out.lir = out.sfrir /1.72e-10 ;
@@ -1409,8 +1411,8 @@ if (!no_stellar) {
14091411 out.irx [id] = out.sfrir [id]/out.sfruv [id];
14101412 double orsb = out.rsb [id];
14111413 out.rsb [id] = log10 (out.sfr [id]) - sfrms[id];
1412- out.tdust [id] += 6.6 *(out.rsb [id] - orsb);
1413- out.ir8 [id] *= e10 (0.43 *(max (0.0 , out.rsb [id]) - max (0.0 , orsb)));
1414+ out.tdust [id] += 6.42 *(out.rsb [id] - orsb);
1415+ out.ir8 [id] *= e10 (0.40 *(max (0.0 , out.rsb [id]) - max (0.0 , orsb)));
14141416 };
14151417
14161418 // Keep the values provided by the user in the input catalog (if any)
@@ -1456,8 +1458,8 @@ if (!no_stellar) {
14561458 }
14571459
14581460 // Make sure the values are valid
1459- out.ir8 = clamp (out.ir8 , 0.48 , 22.8 ); // range allowed by IR library
1460- out.fpah = 0.267 /(out. ir8 - 0.217 ) - 0.0118 ;
1461+ out.ir8 = clamp (out.ir8 , 0.48 , 27.5 ); // range allowed by IR library
1462+ out.fpah = clamp ( 1.0 /( 1.0 - ( 331 - 691 *out. ir8 )/( 193 - 6.98 *out. ir8 )), 0.0 , 1.0 ) ;
14611463 out.lir [where (!is_finite (out.lir ))] = 0.0 ;
14621464
14631465
@@ -1488,9 +1490,9 @@ if (!no_stellar) {
14881490
14891491 // Temperature offset as function of RSB (not calibrated, but see Magnelli+13)
14901492 fir_sed += clamp (out.rsb /ms_disp, -2.0 , 2.0 );
1491- } else if (file::get_basename (ir_lib_file) == " ir_lib_cs15 .fits" ) {
1493+ } else if (file::get_basename (ir_lib_file) == " ir_lib_cs17 .fits" ) {
14921494 // My own library, using calibration from stacks and detections
1493- fir_sed = interpolate (findgen (nirsed), ir_lib_cs15 .tdust , out.tdust );
1495+ fir_sed = interpolate (findgen (nirsed), ir_lib_cs17 .tdust , out.tdust );
14941496 } else {
14951497 error (" no calibration code available for the IR library '" , ir_lib_file, " '" );
14961498 return 1 ;
@@ -1513,25 +1515,33 @@ if (!no_flux) {
15131515 note (" computing fluxes" , (rffilters.empty () ? " " : " and absolute magnitudes" ), " ..." );
15141516 }
15151517
1516- if (file::get_basename (ir_lib_file) == " ir_lib_cs15 .fits" ) {
1518+ if (file::get_basename (ir_lib_file) == " ir_lib_cs17 .fits" ) {
15171519 out.mdust .resize (ngal);
15181520 }
15191521
15201522 auto get_ir_sed = [&](uint_t i, vec1f& irlam, vec1f& irsed) {
1521- if (file::get_basename (ir_lib_file) == " ir_lib_cs15.fits" ) {
1523+ uint_t s = out.ir_sed [i];
1524+
1525+ if (file::get_basename (ir_lib_file) == " ir_lib_cs17.fits" ) {
15221526 // My library
1523- irlam = ir_lib_cs15.lam (out.ir_sed [i],_);
1524- irsed = ir_lib_cs15.dust (out.ir_sed [i],_)*(1.0 - out.fpah [i])
1525- + ir_lib_cs15.pah (out.ir_sed [i],_)*out.fpah [i];
15261527
1527- // SED is in unit Mdust
1528- out.mdust [i] = out.lir [i]/(ir_lib_cs15.lir_dust [out.ir_sed [i]]*(1.0 - out.fpah [i])
1529- + ir_lib_cs15.lir_pah [out.ir_sed [i]]*out.fpah [i]);
1528+ // Get exact fPAH
1529+ out.fpah [i] = clamp (1.0 /(1.0 - (ir_lib_cs17.lir_pah [s] - ir_lib_cs17.l8_pah [s]*out.ir8 [i])/
1530+ (ir_lib_cs17.lir_dust [s] - ir_lib_cs17.l8_dust [s]*out.ir8 [i])), 0.0 , 1.0 );
1531+
1532+ // Build combined SED
1533+ irlam = ir_lib_cs17.lam (s,_);
1534+ irsed = ir_lib_cs17.dust (s,_)*(1.0 - out.fpah [i])
1535+ + ir_lib_cs17.pah (s,_)*out.fpah [i];
1536+
1537+ // SED is in unit Mdust, normalize it to our dust mass
1538+ out.mdust [i] = out.lir [i]/(ir_lib_cs17.lir_dust [s]*(1.0 - out.fpah [i])
1539+ + ir_lib_cs17.lir_pah [s]*out.fpah [i]);
15301540 irsed *= out.mdust [i];
15311541 } else {
15321542 // Generic library, SEDs in units of LIR
1533- irlam = ir_lib.lam (out. ir_sed [i] ,_);
1534- irsed = out.lir [i]*ir_lib.sed (out. ir_sed [i] ,_);
1543+ irlam = ir_lib.lam (s ,_);
1544+ irsed = out.lir [i]*ir_lib.sed (s ,_);
15351545 }
15361546 };
15371547
0 commit comments