GSoC 2019: Project IRISpy 2.2¶
To follow up, the problem encountered as reported in edition 2.1 in this series has been resolved with the help of my very helpful and responsive mentors. But some lingering issues remain, which we suspect to be mostly indexing-related, as is apparent from the way the given IDL code is translated into Python. So now all four versions of IRIS response can be used to produce some get_iris_response function output. However, say for example version=4, I have been only able to successfully reproduce 3/4’s of the expected output as generated by the IDL version of the code. This is encouraging, as previously only half was the same as the target output. So the part of the IDL code that I am having some problems with is the following:
; 4. SJI effective areas if fix(r.version) le 3 then begin sz = size(r.coeffs_sji) for j=0,sz-1 do begin ; calculate pre-launch area from the individual elements pl_a = r.geom_area for k=0,n_elements(r.index_el_sji[*,j])-1 do $ pl_a=pl_a*r.elements[r.index_el_sji[k,j]].trans ; time dependent response rr = fit_iris_xput(tt,r.c_s_time[*,*,j],r.coeffs_sji[*,*,j]) ; time dependent profiles for k=0L,ntt-1 do o[k].area_sji[*,j]=pl_a*rr[k] endfor endif else begin for nuv=0,1 do begin ; calculate baseline SJI area curves asji = r.geom_area for k=0,n_elements(r.index_el_sji[*,nuv*2])-1 do $ asji=asji*r.elements[reform(r.index_el_sji[k,nuv*2:nuv*2+1])].trans ; apply time dependent profile shape adjustment to FUV SJI if ~nuv then begin ; FUV: apply FUV SG "slant", then normalize so that a weighted (2.4:1) ; sum at C II and Si IV gives constant response wei = [2.4,1.0] ; typical solar ratio CII : SiIV wav = r.c_f_lambda nwv = n_elements(wav) wav = [wav,(wav[nwv-2]*2.0+wav[nwv-1])/3.0] ; 2 wvlngts in nm ; calculate baseline SG area for scaling purposes asg = r.geom_area for k=0,n_elements(r.index_el_sg[*,nuv])-1 do $ asg=asg*r.elements[r.index_el_sg[k,nuv]].trans ; SG and SJI areas at wav asg2 = interpol(asg,r.lambda,wav) asj2 = fltarr(2,2) for j=0,1 do asj2[*,j]=interpol(asji[*,j],r.lambda,wav) ; calculate the normalized slant function scal, apply to asji for k=0L,ntt-1 do begin ; best-estimate slant, i.e., eff.area @ wav / baseline SG @ wav sca2 = interpol(o[k].area_sg[*,0],o[k].lambda,wav) / asg2 ; normalize slant so that total(wei*asj2*sca2)/total(wei*asj2)=1 for j=0,1 do begin sca2n = sca2 * total(wei*asj2[*,j])/total(wei*asj2[*,j]*sca2) scaln = interpol(sca2n,wav,r.lambda) > 0.0 o[k].area_sji[*,j] = asji[*,j]*scaln endfor endfor endif else begin ; NUV: essentially same calculation as r.version=3 for k=0L,ntt-1 do o[k].area_sji[*,2:3]=asji endelse endfor for j=0,3 do begin ; SJI specific time dependency rr = fit_iris_xput(tt,r.c_s_time[*,*,j],r.coeffs_sji[*,*,j]) for k=0L,ntt-1 do o[k].area_sji[*,j]=o[k].area_sji[*,j]*rr[k] endfor endelse if keyword_set(angstrom) then o.lambda=o.lambda*10. return, o
This is the last but most complicated part of the get_iris_response code to compute the SJI effective areas for both the FUV’s and NUV’s. Something of interest to note is that the indexing in Python is the exact reverse of that in IDL. But it will be a lot fun trying to make the current code I have been working on to agree with the above 100%. I have been thinking maybe there is something regarding the IDL interpol function (for interpolation) that I have been translating wrong, as there is no exact equivalents in Python, and the closest thing to it is some two-part scipy.interpolate methods which I can use for the same task. Hopefully I will be able to overcome this almost last hurdle soon, say within a week or two. That would leave me with enough time to complete the project comfortably before the conclusion of GSoC 2019.