dustem_activate_plugins.pro
5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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
; 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 dustem idl wrapper must be installed
; PROCEDURE:
; dustem procedure
;-
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_descs = param_descs(sort(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?
;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)
str='toto='+ftn+'(paramtag=paramtag)' & str=str(0)
toto=execute(str)
((*!dustem_plugin).(k).paramtag)=ptr_new(paramtag)
if strtrim(strupcase(strmid((*(*!dustem_plugin).(k).scope),0,7)),2) EQ 'REPLACE' then begin
str='((*!dustem_plugin).('+strtrim(k,2)+').spec)=ptr_new('+ftn+'(st,key=index,val=value)'+')'
str=str(0)
endif else begin
str='((*!dustem_plugin).('+strtrim(k,2)+').spec)=ptr_new('+ftn+'(key=index,val=value)'+')'
str=str(0)
endelse
toto=execute(str) & IF !dustem_verbose NE 0 THEN message,strupcase(strmid(ftn,7)),/info
f=f+1 & i=i+count-1 ; Incrementing the parameter and same-type plugin indices
ENDIF
ENDFOR
the_end:
END