From 1af9f585d1e23f4d6413fc5ccc180ab3a66667c5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 14 May 2026 05:25:24 +0000 Subject: [PATCH 1/2] Use ParmOff in ProSpectSEDlike for bounds/logged and function dispatch Agent-Logs-Url: https://github.com/asgr/ProSpect/sessions/20970253-fcc0-468d-9a54-4254b92e17f4 Co-authored-by: asgr <5617132+asgr@users.noreply.github.com> --- R/ProSpect.R | 103 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/R/ProSpect.R b/R/ProSpect.R index 9ffda0f..b123c19 100644 --- a/R/ProSpect.R +++ b/R/ProSpect.R @@ -533,6 +533,21 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { } names(parm) = Data$parm.names + + if (!requireNamespace("ParmOff", quietly = TRUE)) { + stop("The ParmOff package is needed for parameter mapping in ProSpectSEDlike. Please install it from GitHub/asgr/ParmOff.", call. = FALSE) + } + + logged_parm_names = NULL + if (!is.null(Data$logged)) { + if (length(Data$logged) == 1) { + if (Data$logged) { + logged_parm_names = Data$parm.names + } + } else { + logged_parm_names = Data$parm.names[Data$logged] + } + } if(is.null(Data$photom) & isTRUE(Data$mode == 'photom')){ Data$photom = Data$flux @@ -573,7 +588,7 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { z_genSF = Data$arglist$z_genSF ## What redshift should we start star formation? ztest = parm["z"] - if(Data$logged[Data$parm.names == "z"]){ + if("z" %in% logged_parm_names){ ztest = 10^ztest } @@ -622,26 +637,28 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { parm = Data$constraints(parm) } + parm_lower = NULL + parm_upper = NULL if (!is.null(Data$intervals)) { - #parm[parm < Data$intervals$lo] = Data$intervals$lo[parm < Data$intervals$lo] - #parm[parm > Data$intervals$hi] = Data$intervals$hi[parm > Data$intervals$hi] - parm = pmin(pmax(parm, Data$intervals$lo), Data$intervals$hi) - } - - if (!is.null(Data$logged)) { - if (length(Data$logged) == 1) { - if (Data$logged) { - parmlist = 10 ^ parm - } else{ - parmlist = parm - } - } else{ - parmlist = parm - parmlist[Data$logged] = 10 ^ parm[Data$logged] - } - } else{ - parmlist = parm - } + parm_lower = Data$intervals$lo + parm_upper = Data$intervals$hi + names(parm_lower) = Data$parm.names + names(parm_upper) = Data$parm.names + } + + parmlist = ParmOff::ParmOff( + .func = ProSpectSED, + .args = as.list(parm), + .lower = parm_lower, + .upper = parm_upper, + .logged = logged_parm_names, + .return = 'args', + .check = FALSE + )$current_args + if(any(lengths(parmlist) != 1L)){ + stop('All fitting parameters must be scalar values.') + } + parmlist = unlist(parmlist, recursive = FALSE, use.names = TRUE) if (Data$verbose) { message(parmlist) @@ -666,20 +683,22 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { } if (returnall) { - SEDout = do.call( - 'ProSpectSED', - args = c( - parmlist, - list(SFH = quote(Data$SFH)), - list(speclib = quote(Data$speclib)), - list(Dale = quote(Data$Dale)), - list(AGN = quote(Data$AGN)), - list(filtout = quote(filtout)), + SEDout = ParmOff::ParmOff( + .func = ProSpectSED, + .args = c( + as.list(parmlist), + list(SFH = Data$SFH), + list(speclib = Data$speclib), + list(Dale = Data$Dale), + list(AGN = Data$AGN), + list(filtout = filtout), list(filters = NULL), list(returnall = TRUE), - list(Dale_M2L_func = quote(Data$Dale_M2L_func)), + list(Dale_M2L_func = Data$Dale_M2L_func), Data$arglist - ) + ), + .return = 'func', + .check = FALSE ) if(is.null(Data$filtout) | isTRUE(Data$mode == 'spec') | isTRUE(Data$mode == 'both')){ #this means we are in spec-z mode @@ -718,19 +737,21 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { } } else{ - Photom = do.call( - 'ProSpectSED', - args = c( - parmlist, - list(SFH = quote(Data$SFH)), - list(speclib = quote(Data$speclib)), - list(Dale = quote(Data$Dale)), - list(AGN = quote(Data$AGN)), - list(filtout = quote(filtout)), + Photom = ParmOff::ParmOff( + .func = ProSpectSED, + .args = c( + as.list(parmlist), + list(SFH = Data$SFH), + list(speclib = Data$speclib), + list(Dale = Data$Dale), + list(AGN = Data$AGN), + list(filtout = filtout), list(filters = NULL), list(returnall = FALSE), Data$arglist - ) + ), + .return = 'func', + .check = FALSE ) if(is.null(filtout)){ From 3444d84a81cd2c10ae710d5380fd780790764532 Mon Sep 17 00:00:00 2001 From: Aaron Robotham Date: Thu, 14 May 2026 17:48:24 +0800 Subject: [PATCH 2/2] Fix! --- R/ProSpect.R | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/R/ProSpect.R b/R/ProSpect.R index b123c19..fe7dac8 100644 --- a/R/ProSpect.R +++ b/R/ProSpect.R @@ -637,18 +637,27 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { parm = Data$constraints(parm) } + if('scat_scale' %in% Data$parm.names){ + sel = which('scat_scale' == Data$parm.names) + scat_scale = parmlist[sel] + parmlist = parmlist[-sel] + Data$parm.names = Data$parm.names[-sel] + }else{ + scat_scale = 1 + } + parm_lower = NULL parm_upper = NULL if (!is.null(Data$intervals)) { - parm_lower = Data$intervals$lo - parm_upper = Data$intervals$hi + parm_lower = as.list(Data$intervals$lo) + parm_upper = as.list(Data$intervals$hi) names(parm_lower) = Data$parm.names names(parm_upper) = Data$parm.names } - + parmlist = ParmOff::ParmOff( .func = ProSpectSED, - .args = as.list(parm), + .args = parm, .lower = parm_lower, .upper = parm_upper, .logged = logged_parm_names, @@ -664,15 +673,6 @@ ProSpectSEDlike = function(parm = c(8, 9, 10, 10, 0, -0.5, 0.2), Data) { message(parmlist) } - if('scat_scale' %in% Data$parm.names){ - sel = which('scat_scale' == Data$parm.names) - scat_scale = parmlist[sel] - parmlist = parmlist[-sel] - Data$parm.names = Data$parm.names[-sel] - }else{ - scat_scale = 1 - } - Monitor = {} if(isTRUE(Data$mode == 'spec') | isTRUE(Data$mode == 'both')){