PRO dustem_activate_plugins,p_min,help=help,st ;+ ; NAME: ; dustem_activate_plugins ; PURPOSE: ; activates the plugins present in the parameter description vector (pd) ; CATEGORY: ; DUSTEM Wrapper, Distributed, Mid-Level, Plugins ; CALLING SEQUENCE: ; dustem_activate_plugins,pd ; INPUTS: ; parameter desription vector ; OPTIONAL INPUT PARAMETERS: ; key = input parameter number ; val = input parameter value ; OUTPUTS: ; None ; OPTIONAL OUTPUT PARAMETERS: ; None ; ACCEPTED KEY-WORDS: ; help = if set, print this help ; COMMON BLOCKS: ; None ; SIDE EFFECTS: ; None ; RESTRICTIONS: ; The DustEM fortran code must be installed ; The DustEMWrap idl code must be installed ; PROCEDURES AND SUBROUTINES USED: ; *** COMMENT AH --> is this really NONE? **** ; ; EXAMPLES ; dustem_activate_plugins, pd ; ; MODIFICATION HISTORY: ; Written by IC Apr-2022 ; Evolution details on the DustEMWrap gitlab. ; See http://dustemwrap.irap.omp.eu/ for FAQ and help. ;- IF keyword_set(help) THEN BEGIN doc_library,'dustem_activate_plugins' goto,the_end output=0. ENDIF p_dim = p_min * (*(*!dustem_fit).param_init_values) st=dustem_run(p_dim) !dustem_current = ptr_new(st) if isa((*!dustem_fit).fixed_param_descs) then begin ;concatenating the parameter vectors param_descs = [(*(*!dustem_fit).param_descs),(*(*!dustem_fit).fixed_param_descs)] param_values = [p_dim,(*(*!dustem_fit).fixed_param_init_values)] param_values = param_values(sort(param_descs)) ;should we put it back to the way it was? param_descs = param_descs(sort(param_descs)) ;Taking care of the param_func vector dustem_set_func_ind, param_descs, param_values ; this sets (*(*!dustem_fit).param_func) param_func = (*(*!dustem_fit).param_func) dustem_set_func_ind, (*(*!dustem_fit).param_descs), p_dim ;setting the pointers back to their original valyes endif else begin param_descs = (*(*!dustem_fit).param_descs) param_values = p_dim param_func = (*(*!dustem_fit).param_func) endelse f=1 ; Initializing the index that is associated to each plugin FOR i=0L,n_elements(param_descs)-1 DO BEGIN parameter_type=dustem_parameter_description2type(param_descs[i],string_name=string_name) ; Looping over the parameter description vector (here saved in a system variable) to sort out its different elements with repect to their types IF parameter_type EQ 'PLUGIN' THEN BEGIN ; Selecting the plugins ftn = strmid(param_descs(i),0) ; String containing the name of the plugin and the keyword used (ie: dustem_create_continuum_2) ii = strsplit(ftn,'_',count=countx) & ii = ii(countx-1)-1 ; Locating the last underscore to automate the extraction of the plugin's keyword ftn = strmid(ftn,0,ii) ; String containing the name of the plugin without the associated keyword k=where(strmid(tag_names(*!dustem_plugin),0,8) eq strmid(strupcase(strmid(ftn,14)),0,8),counte) ; Selecting a plugin through matching the string name of the plugin from the scope system variable with the one read from the parameter description vector tmp = where(param_func eq f, count) ; Array of indices helping with the sorting out of the different plugins (as a plugin can be called several times with different keywords so as to fit several quantities) PDO_tmp = param_descs(tmp) ; Array containing the different calls of each plugin at a time p_dim_tmp = param_values(tmp) ; Array containing the values of the fitted parameters vari = strmid(PDO_tmp(0),ii+1) ; Test variable to be used to alter the initialization of the index and value arrays below as a keyword can be a scalar or a string ; Initialization of the index and value arrays. These arrays will be used (below) when calling the plugins (with the default key=key and val=val keywords) if strlen(strtrim(string(vari),2)) gt 1 then begin index = strarr(count) & value = fltarr(count) endif else begin index = fltarr(count) & value = fltarr(count) endelse ; Filling the index and value arrays for one plugin at a time FOR l=0, count-1 DO BEGIN index[l] = strmid(PDO_tmp[l],ii+1) value[l] = p_dim_tmp[l] ENDFOR ;==============Assigning data to the plugin data structure============== ;Dry run of the plugins to obtain their scopes and run them accordingly (an advanced user might want to add their own lines here) str='toto='+ftn+'(scope=scope)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).scope)=ptr_new(scope) ;we first need to run the isrf plugin ;should we adjust the list of plugins with given priority? if (*(*!dustem_plugin).(k).scope) NE 'STELLAR_POPULATION' and strmid((*(*!dustem_plugin).(k).scope),0,7) NE 'REPLACE' THEN BEGIN str='toto='+ftn+'(paramtag=paramtag)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).paramtag)=ptr_new(paramtag) str='((*!dustem_plugin).('+strtrim(k,2)+').spec)=ptr_new('+ftn+'(key=index,val=value)'+')' & str=str(0) toto=execute(str) & IF !dustem_verbose NE 0 THEN message,strupcase(strmid(ftn,7)),/info ENDIF f=f+1 & i=i+count-1 ; Incrementing the parameter and same-type plugin indices ENDIF ENDFOR f=1 ; Initializing the index that is associated to each plugin FOR i=0L,n_elements(param_descs)-1 DO BEGIN parameter_type=dustem_parameter_description2type(param_descs[i],string_name=string_name) ; Looping over the parameter description vector (here saved in a system variable) to sort out its different elements with repect to their types IF parameter_type EQ 'PLUGIN' THEN BEGIN ; Selecting the plugins ftn = strmid(param_descs(i),0) ; String containing the name of the plugin and the keyword used (ie: dustem_create_continuum_2) ii = strsplit(ftn,'_',count=countx) & ii = ii(countx-1)-1 ; Locating the last underscore to automate the extraction of the plugin's keyword ftn = strmid(ftn,0,ii) ; String containing the name of the plugin without the associated keyword k=where(strmid(tag_names(*!dustem_plugin),0,8) eq strmid(strupcase(strmid(ftn,14)),0,8),counte) ; Selecting a plugin through matching the string name of the plugin from the scope system variable with the one read from the parameter description vector tmp = where(param_func eq f, count) ; Array of indices helping with the sorting out of the different plugins (as a plugin can be called several times with different keywords so as to fit several quantities) PDO_tmp = param_descs(tmp) ; Array containing the different calls of each plugin at a time p_dim_tmp = param_values(tmp) ; Array containing the values of the fitted parameters vari = strmid(PDO_tmp(0),ii+1) ; Test variable to be used to alter the initialization of the index and value arrays below as a keyword can be a scalar or a string ; Initialization of the index and value arrays. These arrays will be used (below) when calling the plugins (with the default key=key and val=val keywords) if strlen(strtrim(string(vari),2)) gt 1 then begin index = strarr(count) & value = fltarr(count) endif else begin index = fltarr(count) & value = fltarr(count) endelse ; Filling the index and value arrays for one plugin at a time FOR l=0, count-1 DO BEGIN index[l] = strmid(PDO_tmp[l],ii+1) value[l] = p_dim_tmp[l] ENDFOR ;==============Assigning data to the plugin data structure============== ;Dry run of the plugins to obtain their scopes and run them accordingly (an advanced user might want to add their own lines here) str='toto='+ftn+'(scope=scope)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).scope)=ptr_new(scope) ;we first need to run the isrf plugin ;should we adjust the list of plugins with given priority? if (*(*!dustem_plugin).(k).scope) EQ 'STELLAR_POPULATION' THEN BEGIN str='toto='+ftn+'(paramtag=paramtag)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).paramtag)=ptr_new(paramtag) str='((*!dustem_plugin).('+strtrim(k,2)+').spec)=ptr_new('+ftn+'(key=index,val=value)'+')' & str=str(0) toto=execute(str) & IF !dustem_verbose NE 0 THEN message,strupcase(strmid(ftn,7)),/info st = dustem_run(p_dim) ;run with changed isrf !dustem_current = ptr_new(st) ENDIF f=f+1 & i=i+count-1 ; Incrementing the parameter and same-type plugin indices ENDIF ENDFOR f=1 ; Initializing the index that is associated to each plugin FOR i=0L,n_elements(param_descs)-1 DO BEGIN parameter_type=dustem_parameter_description2type(param_descs[i],string_name=string_name) ; Looping over the parameter description vector (here saved in a system variable) to sort out its different elements with repect to their types IF parameter_type EQ 'PLUGIN' THEN BEGIN ; Selecting the plugins ftn = strmid(param_descs(i),0) ; String containing the name of the plugin and the keyword used (ie: dustem_create_continuum_2) ii = strsplit(ftn,'_',count=countx) & ii = ii(countx-1)-1 ; Locating the last underscore to automate the extraction of the plugin's keyword ftn = strmid(ftn,0,ii) ; String containing the name of the plugin without the associated keyword k=where(strmid(tag_names(*!dustem_plugin),0,8) eq strmid(strupcase(strmid(ftn,14)),0,8),counte) ; Selecting a plugin through matching the string name of the plugin from the scope system variable with the one read from the parameter description vector tmp = where(param_func eq f, count) ; Array of indices helping with the sorting out of the different plugins (as a plugin can be called several times with different keywords so as to fit several quantities) PDO_tmp = param_descs(tmp) ; Array containing the different calls of each plugin at a time p_dim_tmp = param_values(tmp) ; Array containing the values of the fitted parameters vari = strmid(PDO_tmp(0),ii+1) ; Test variable to be used to alter the initialization of the index and value arrays below as a keyword can be a scalar or a string ; Initialization of the index and value arrays. These arrays will be used (below) when calling the plugins (with the default key=key and val=val keywords) if strlen(strtrim(string(vari),2)) gt 1 then begin index = strarr(count) & value = fltarr(count) endif else begin index = fltarr(count) & value = fltarr(count) endelse ; Filling the index and value arrays for one plugin at a time FOR l=0, count-1 DO BEGIN index[l] = strmid(PDO_tmp[l],ii+1) value[l] = p_dim_tmp[l] ENDFOR ;==============Assigning data to the plugin data structure============== ;Dry run of the plugins to obtain their scopes and run them accordingly (an advanced user might want to add their own lines here) str='toto='+ftn+'(scope=scope)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).scope)=ptr_new(scope) ;we first need to run the isrf plugin ;should we adjust the list of plugins with given priority? if strmid((*(*!dustem_plugin).(k).scope),0,7) EQ 'REPLACE' THEN BEGIN str='toto='+ftn+'(paramtag=paramtag)' & str=str(0) toto=execute(str) ((*!dustem_plugin).(k).paramtag)=ptr_new(paramtag) str='((*!dustem_plugin).('+strtrim(k,2)+').spec)=ptr_new('+ftn+'(key=index,val=value)'+')' & str=str(0) toto=execute(str) & IF !dustem_verbose NE 0 THEN message,strupcase(strmid(ftn,7)),/info st = dustem_run(p_dim) ;run with changed isrf !dustem_current = ptr_new(st) ENDIF f=f+1 & i=i+count-1 ; Incrementing the parameter and same-type plugin indices ENDIF ENDFOR the_end: END