PRO dustemwrap_plot_noobj,p_dim,st, $
                    dustem_sed,SED_spec, $
                    dustem_qsed,Q_spec, $
                    dustem_used,U_spec, $
                    dustem_polsed,P_spec, $
                    dustem_polfrac,SP_spec, $
                    dustem_psi_em,PSI_spec, $
                    dustem_ext,EXT_spec, $
                    dustem_qext,QEXT_spec, $
                    dustem_uext,UEXT_spec, $
                    dustem_polext,POLEXT_spec, $
                    dustem_fpolext,SPEXT_spec, $
                    dustem_psi_ext,PSIEXT_spec, $
                    _extra=_extra,help=help

;+
; NAME:
;    dustemwrap_plot_noobj
; PURPOSE:
;    plots dustemwrap observed sed, predicted sed, predicted spectra for total Intensity, polarization in emission and extinction without OOP routines
; CATEGORY:
;    DustEMWrap
; CALLING SEQUENCE:
;    dustemwrap_plot_noobj,p_dim,st,dustem_sed,SED_spec,dustem_qsed,Q_spec,dustem_used,U_spec,dustem_polsed,P_spec,dustem_polfrac,SP_spec,dustem_psi_em,PSI_spec,dustem_ext,EXT_spec,dustem_qext,QEXT_spec,dustem_uext,UEXT_spec,dustem_polext,POLEXT_spec,dustem_fpolext,SPEXT_spec,dustem_psi_ext,PSIEXT_spec,_extra=_extra 
; INPUTS:
;    p_dim
; OPTIONAL INPUT PARAMETERS:
;    st
;    dustem_sed
;    dustem_qsed
;    dustem_used
;    dustem_polsed
;    dustem_polfrac
;    dustem_psi_em
;    dustem_ext
;    dustem_qext
;    dustem_uext
;    dustem_polext
;    dustem_fpolext
;    dustem_psi_ext
; OUTPUTS:
;    dustem_sed
;    dustem_qsed
;    dustem_used
;    dustem_polsed
;    dustem_polfrac
;    dustem_psi_em
;    dustem_ext
;    dustem_qext
;    dustem_uext
;    dustem_polext
;    dustem_fpolext
;    dustem_psi_ext
;    SED_spec
;    Q_spec
;    U_spec
;    P_spec
;    SP_spec
;    PSI_spec
;    EXT_spec
;    QEXT_spec
;    UEXT_spec
;    POLEXT_spec
;    SPEXT_spec
;    PSIEXT_spec
; OPTIONAL OUTPUT PARAMETERS:
;    

; ACCEPTED KEY-WORDS:
;    help
; COMMON BLOCKS:
;    None
; SIDE EFFECTS:
;    Does a plot
; RESTRICTIONS:
;    The DustEM fortran code must be installed
;    The DustEMWrap IDL code must be installed
; PROCEDURES AND SUBROUTINES USED:
;
; EXAMPLES
;    
; MODIFICATION HISTORY:
;    Written by Ilyes Choubani
;    Evolution details on the DustEMWrap gitlab.
;-

IF keyword_set(help) THEN BEGIN
  doc_library,'dustemwrap_plot'
  goto,the_end
END

;This is also necessary for the plotting of the results of the fit (Last iteration) 
IF not keyword_set(st) THEN BEGIN
;Activation of the plugins is needed because of the plotting of the total emission model that includes them. 
  dustem_activate_plugins,p_dim/(*(*!dustem_fit).param_init_values),st=st  ; 0/0 division case?

ENDIF 
  
;# Emission

if not keyword_set(dustem_sed) and isa((*!dustem_data).sed) then begin ;better test?
  
  dustem_sed = dustem_compute_sed(p_dim,st=st,SED_spec=SED_spec)
  
  if !run_pol && !run_lin then begin
     dustem_polsed = dustem_compute_polsed(p_dim,st=st,P_spec=P_spec,SP_spec=SP_spec,dustem_polfrac=dustem_polfrac)
     toto = dustem_compute_stokes(p_dim,st=st,Q_spec=Q_spec,U_spec=U_spec,PSI_spec=PSI_spec,dustem_psi_em=dustem_psi_em) 
     dustem_qsed = toto[0]
     dustem_used = toto[1]   
  endif         
endif

;# Extinction

if not keyword_set(dustem_ext) and isa((*!dustem_data).ext) then begin
    dustem_ext = dustem_compute_ext(p_dim,st=st,EXT_spec=EXT_spec)
  
    if !run_pol && !run_lin then begin
  
      dustem_polext = dustem_compute_polext(p_dim,st=st,polext_spec=POLEXT_spec,spext_spec=SPEXT_spec,dustem_fpolext=dustem_fpolext)

      toto = dustem_compute_stokext(p_dim,st=st,QEXT_spec=QEXT_spec,UEXT_spec=UEXT_spec,PSIEXT_spe=PSIEXT_spec,dustem_psi_ext=dustem_psi_ext) 
      dustem_qext = toto[0]
      dustem_uext = toto[1]   
    endif
endif
  

mouchard=*!iteration_mouchard
new_mouchard=mouchard[0]
new_mouchard.iteration=!dustem_iter.act
new_mouchard.chi2=(*!dustem_fit).chi2
new_mouchard.rchi2=(*!dustem_fit).rchi2


;JPB: need here to store values of current parameter values (including plugins) into !iteration_mouchard
;help,(*!dustem_fit).CURRENT_PARAM_VALUES   ;This is not currently filled up ...

;Below will work only for non plugin parameters
;goto,skip1
;param_descs=*(*!dustem_fit).param_descs
;params_current=[0.D0]
;FOR i=0L,n_elements(param_descs)-1 DO BEGIN
;    str='params_current=[params_current,'+param_descs[i]+']'
;    print,str
;    toto=execute(str)
;ENDFOR
;params_current=params_current[1:*]
;print,params_current
;
;stop
;skip1:
 
mouchard=[mouchard,new_mouchard]
!iteration_mouchard=ptr_new(mouchard)

;LIST OF TESTS THAT NEED TO BE RAN SO THAT THE PLOTTING OF THE MODEL SPECTRA OCCURS

test_sed = isa((*!dustem_show).sed)
test_ext = isa((*!dustem_show).ext)
if !run_pol then begin
    test_polext = isa((*!dustem_show).polext)
    test_polsed = isa((*!dustem_show).polsed)
    test_polfrac = isa((*!dustem_show).polfrac)
    test_fpolext = isa((*!dustem_show).fpolext)
    test_psi_em = isa((*!dustem_show).psi_em)
    test_psi_ext = isa((*!dustem_show).psi_ext)
    test_qsed = isa((*!dustem_show).qsed)
    test_used = isa((*!dustem_show).used)
    test_qext = isa((*!dustem_show).qext)
    test_uext = isa((*!dustem_show).uext)
    test_m = test_sed or test_polsed or test_polfrac or test_qsed or test_used or test_psi_em
    test_x = test_ext or test_polext or test_fpolext or test_qext or test_uext or test_psi_ext
endif else begin
    test_m = test_sed 
    test_x = test_ext 
endelse

;testing on the fitting of emission vs extinction data

n_plgns = n_tags(*!dustem_plugin)

frmt0='(A36)'
frmt1='(1E10.2)'
frmt2='(10F10.2)'

;Instead of setting the extra tags for plotting in dustemcgwin, we'll place them in this (parent) procedure. 
tgnms_extra = tag_names(_extra)

dustem_set_plot_range,test_sed, test_ext,_extra= _extra

if isa((*!dustem_fit).current_param_errors) then begin
    errors = (*(*!dustem_fit).current_param_errors)
endif else begin
    errors = (*(*!dustem_fit).param_init_values)*0. 
ENDELSE 

if isa((*!dustem_fit).chi2) then begin
    chi2 = (*!dustem_fit).chi2    
endif else begin
    chi2 = la_undef()
endelse 

if isa((*!dustem_fit).rchi2) then begin
    rchi2 = (*!dustem_fit).rchi2    
endif else begin
    rchi2 = la_undef()
endelse 


;==== These are arameters for window positioning
if !run_pol then BEGIN
    wdelta_x=60
    main_wxsize=910
    main_wysize=658

    param_wxpos=main_wxsize+wdelta_x
    param_wypos=15
    param_wxsize=350
    param_wysize=200

    plugin_wxpos=main_wxsize+wdelta_x
    plugin_wypos=300
    plugin_wxsize=350
    plugin_wysize=200
ENDIF ELSE BEGIN
    wdelta_x=60
    main_wxsize=640  ;default of cgwindow
    main_wysize=512  ;default of cgwindow

    param_wxpos=main_wxsize+wdelta_x;700
    param_wypos=15
    param_wxsize=350
    param_wysize=200

    plugin_wxpos=main_wxsize+wdelta_x;700
    plugin_wypos=300
    plugin_wxsize=350
    plugin_wysize=200
ENDELSE

;JPB: I moved these 3 lines out of the if test, so that they apply also
;when only extinction is present
TVLCT, 255, 255, 255, 254 ; White color
!P.Color = 253
!P.Background = 254

if test_m then begin
    ;Generating emission window and saving window ID
        
    IF !d.name NE 'PS' THEN BEGIN
        IF !run_pol THEN BEGIN
            window,0, xsize=main_wxsize,ysize=main_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (EMISSION)',xpos=0,ypos=0
        ENDIF else BEGIN
            window,0,xsize=main_wxsize,ysize=main_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (EMISSION)',xpos=0, ypos=0;, wback='grey';,wobject=winobj_m
        ENDELSE
    ENDIF

    ;Plotting model string (legend)
    xxpos = 0.015 
    yypos = 0.97
    ;Plotting Hydrogen column density string (legend)
    cgtext,  xxpos, yypos,'Model : '+!dustem_model,color=0,/normal,charsize = 1.2;,/addcmd ;& cmdind_m+=1 This is the first command in the window
    yypos = 0.95
    cgtext, xxpos, yypos,textoidl('N_{H}')+textoidl(' (H/cm^2) : ')+strmid(string(*!dustem_HCD,format='(1E10.2)'),2),color=0,/normal,charsize = 1.2;,/addcmd & cmdind_m+=1
    
    ;Plotting of the number of iterations completed by the fitter
    
    ;Plotting of the number of runs
    ;Getting the width of the unrefreshed string
    widthtot=0.
    ;cgtext, xxpos, yypos,'Runs : ',color=0,/normal,charsize=-1,width=thiswidth,/addcmd & cmdind_m+=1
    cgtext, xxpos, yypos,'Iteration : ',color=0,/normal,charsize=-1,width=thiswidth 
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    !dustemcgwin_ncmds.runs.txtwdth = thiswidth
    
    ;Getting the width of the refreshed string
    cgtext, xxpos, yypos,strtrim(!dustem_iter.act,2),color=0,/normal,charsize=-1,width=thiswidth 
    widthtot+= thiswidth;varying width        
    
    ;These two lines will also have to      be modified when plotting the refreshed values
    xxpos = 0.015 ;1.0 - widthtot - 0.03
    yypos = 0.015
    
    ;Displaying fixed part
    ;cgtext, xxpos, yypos,'Runs : ',color=0,/normal,charsize = 1.35,/addcmd & cmdind_m+=1
    cgtext, xxpos, yypos,'Iteration : ',color=0,/normal,charsize = 1.35 
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    cgtext, xxpos + widthtext*1.35 + 0.015 , yypos,strtrim(!dustem_iter.act,2),color=0,/normal,charsize = 1.0 
    
    ;plotting of (mostly) fixed data for rchi2
    ;Since the format of the strings is specified, the length/width of the string in thex direction is fixed. 
    
    
    ;Getting the width of the unrefreshed string
    widthtot=0.
    cgtext, xxpos, yypos,textoidl('\chi^{2} : '),color=0,/normal,charsize=-1,width=thiswidth 
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    
    ;Getting the width of the refresh.ed string
    cgtext, xxpos, yypos,strtrim(string(chi2,format=frmt2),2),color=0,/normal,charsize=-1,width=thiswidth 
    widthtot+= thiswidth;varying width        
    ;saving the command string width to replace it
    
    xxpos = 1.0 - widthtot - 0.03
    
    yypos = 0.97
    
    ;Displaying fixed part
    cgtext, xxpos, yypos,textoidl('\chi^{2} : '),color=0,/normal,charsize = 1.0 
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    
    cgtext, xxpos + widthtext , yypos,strtrim(string(chi2,format=frmt2),2),color=0,/normal,charsize = 1.0 
   
    
    ;plotting of (mostly) fixed data for rchi2
    
    ;Getting the width of the unrefreshed string
    widthtot=0.
    cgtext, xxpos, yypos,textoidl('r_{\chi^{2}} : '),color=0,/normal,charsize=-1,width=thiswidth 
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    ;!dustemcgwin_ncmds.rchi2.txtwdth1 = thiswidth
    ;Getting the width of the refreshed string
    cgtext, xxpos, yypos,strtrim(string(rchi2,format=frmt2),2),color=0,/normal,charsize=-1,width=thiswidth 
    widthtot+= thiswidth;varying width        
    
    
    ;These two lines will also have to      be modified when plotting the refreshed values
    xxpos = 1.0 - widthtot - 0.03
    yypos = 0.95
    
    ;Displaying fixed part
    cgtext, xxpos, yypos,textoidl('r_{\chi^{2}} : '),color=0,/normal,charsize = 1.35 
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    cgtext, xxpos + widthtext , yypos,strtrim(string(rchi2,format=frmt2),2),color=0,/normal,charsize = 1.0 
    ;saving the command id to replace it 
    
    ;Plotting of the title of the dashboard (plot(s))
    
    
    ;NB issue here because the user can't modify the title after the dustem_mpfit_data call at the main procedure level (user proc)
    ;Getting the width of the title 
    
    tit=!dustem_plot_range.title_m
    
    xxpos = 0.5
    yypos =0.96
    
    ;the runs inbetween
    if !dustem_end EQ 0 then cgtext, xxpos , yypos,tit+' (RUNNING)',color=0,/normal,charsize = 1.6,alignment=0.5
    
    ;subsequent iterations to the end of the fit
    if !dustem_end EQ -1 then cgtext, xxpos , yypos,tit,color=0,/normal,charsize = 1.6,alignment=0.5
    
    ;last iteration of the fit
    if !dustem_end EQ 1 then cgtext, xxpos , yypos,tit+' (FINAL RUN)',color=0,/normal,charsize = 1.6,alignment=0.5
     
    
   if !run_pol then begin
        ;,wback='grey'
        
        ;position arrays for plot and normalized graph
        
        ;THIS IS HARD-CODED IN A VERY SILLY WAY
        
        p_sed = [0.05,0.67,0.475,0.90]
        p_psed = [0.525,0.67,0.95,0.90]
        p_spsed = [0.05,0.375,0.475,0.575]
        p_psised = [0.525,0.375,0.95,0.575]
        p_qsed = [0.05,0.12,0.475,0.35]  
        p_used = [0.525,0.12,0.95,0.35]
        
        np_sed = [0.05,0.60,0.475,0.67]
        np_psed = [0.525,0.60,0.95,0.67]
        np_qsed = [0.05,0.05,0.475,0.12] 
        np_used = [0.525,0.05,0.95,0.12]
        
        p_sed[1]+= 0.0125 & p_sed[3]+= 0.0125 
        p_psed[1]+= 0.0125 & p_psed[3]+= 0.0125
        p_spsed[1]+= 0.0125 & p_spsed[3]+= 0.0125
        p_psised[1]+= 0.0125 & p_psised[3]+= 0.0125
        p_qsed[1]+= 0.0125 & p_qsed[3]+= 0.0125
        p_used[1]+= 0.0125 & p_used[3]+= 0.0125
        
        np_sed[1]+= 0.0125 & np_sed[3]+= 0.0125 
        np_psed[1]+= 0.0125 & np_psed[3]+= 0.0125
        np_qsed[1]+= 0.0125 & np_qsed[3]+= 0.0125
        np_used[1]+= 0.0125 & np_used[3]+= 0.0125
        
        
          
    endif else begin
        p_sed  = [0.07,0.30,0.97,0.85]
        np_sed = [0.07,0.10,0.97,0.30]
    
    endelse

    ;Plotting of sed data axes (whether or not data is present)
    plotsym,0,/fill ;you might need to execute this again. hmm...
;stop

    ;This is not the right test the user might want to show the prediction for sed and fit the stokes parameters
    if ~test_sed then begin ; SED data is not present (For completeness) # This is only valid when !run_pol=1
        
        dustem_plot_dataset, st, dataset='SED', /nodata, position=p_sed, _extra=_extra 
        dustem_plot_dataset, st, dataset='SED', /nodata, /norm, position=np_sed, _extra=_extra 

    endif else begin ;SED exists
           ;this plots the observed SED
           dustem_plot_dataset, st, dataset='SED', position=p_sed, _extra=_extra
           ;this plots the predicted spectrum and predicted SED
           dustem_plot_dataset, st, dustem_sed,SED_spec, dataset='SED', /refresh ,position=p_sed, _extra=_extra 
           ;This plots an empty normalized plot
           dustem_plot_dataset, st, dataset='SED',/norm, position=np_sed, _extra=_extra ;I think nodata can also be used too
           ;This plots the normalized observed SED - best fit
           dustem_plot_dataset, st, dustem_sed,SED_spec, dataset='SED', /norm, /refresh,position=np_sed, _extra=_extra 
    endelse
    

      if !run_pol then begin ;then goto, end_m
        
        if ~test_qsed then begin ;Qsed is not present
            
            dustem_plot_dataset, st, dataset='QSED', /nodata, position=p_qsed, _extra=_extra 
            dustem_plot_dataset, st, dataset='QSED', /nodata, /norm, position=np_qsed, _extra=_extra 
        
        endif else begin ;Qsed data is present
                
            ;Plotting of postive values if they exist (if hidden data is present it is plotted if not an empty plot is rendered)
            dustem_plot_dataset, st, dataset='QSED', position=p_qsed,/positive_only, _extra=_extra 
            ;Refreshing the positive_only plot ONLY if there is data. If not do nothing
            dustem_plot_dataset, st, dustem_qsed,Q_spec, dataset='QSED',/positive_only, /refresh ,position=p_qsed, _extra=_extra 
            
             
            dustem_plot_dataset, st, dataset='QSED', position=p_qsed, /addcmd,/negative_only, _extra=_extra 
            ;Refreshing the negative_only plot ONLY if there is data. If not do nothing
            dustem_plot_dataset, st, dustem_qsed,Q_spec,dataset='QSED',/negative_only, /refresh ,position=p_qsed, _extra=_extra
            
            
            dustem_plot_dataset, st, dataset='QSED',/norm, position=np_qsed, _extra=_extra  ;I think nodata can also be uqsed too
            dustem_plot_dataset, st, dustem_qsed,Q_spec,dataset='QSED', /norm, /refresh,position=np_qsed, _extra=_extra 
               
      endelse
      
         
              
        if ~test_used then begin ;used is not present
            
            dustem_plot_dataset, st, dataset='USED', /nodata, position=p_used, _extra=_extra 
            dustem_plot_dataset, st, dataset='USED', /nodata, /norm, position=np_used, _extra=_extra 
            
        endif else begin ;used data is present
                       
            ;Plotting of postive values if they exist (if hidden data is present it is plotted if not an empty plot is rendred)
            dustem_plot_dataset, st, dataset='USED', position=p_used,/positive_only, _extra=_extra 
            ;Refreshing the positive_only plot ONLY if there is data. If not do nothing
            dustem_plot_dataset, st, dustem_used,U_spec, dataset='USED',/positive_only, /refresh ,position=p_used, _extra=_extra 
            
            dustem_plot_dataset, st, dataset='USED', position=p_used, winid=winid_m,/negative_only, _extra=_extra 
            ;Refreshing the negative_only plot ONLY if there is data. If not do nothing
            dustem_plot_dataset, st, dustem_used,U_spec, dataset='USED',/negative_only, /refresh ,position=p_used, _extra=_extra 
            
            dustem_plot_dataset, st, dataset='USED',/norm, position=np_used, _extra=_extra ;I think nodata can also be uused too
            dustem_plot_dataset, st, dustem_used,U_spec, dataset='USED', /norm, /refresh,position=np_used, _extra=_extra 
              
      endelse
      
      if ~test_psi_em then begin ; psi_em data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='psi_em', /nodata, position=p_psised, /addcmd, winid=winid_m, _extra=_extra

      endif else begin ;psi_em exists
         
        dustem_plot_dataset, st, dataset='psi_em', position=p_psised, _extra=_extra 
        dustem_plot_dataset, st, dustem_psi_em,PSI_spec, dataset='psi_em', /refresh ,position=p_psised, _extra=_extra
                   
      endelse
        
      
      if ~test_polsed then begin ; polsed data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='polsed', /nodata, position=p_psed, _extra=_extra 
          dustem_plot_dataset, st, dataset='polsed', /nodata, /norm, position=np_psed, _extra=_extra

      endif else begin 
      
        dustem_plot_dataset, st, dataset='polsed', position=p_psed, _extra=_extra
        dustem_plot_dataset, st, dustem_polsed,P_spec, dataset='polsed', /refresh ,position=p_psed, _extra=_extra 
      
        dustem_plot_dataset, st, dataset='polsed',/norm, position=np_psed, _extra=_extra ;I think nodata can also be upolsed too
        dustem_plot_dataset, st, dustem_polsed,P_spec, dataset='polsed', /norm, /refresh,position=np_psed, _extra=_extra
            
      endelse      
      
      
      if ~test_polfrac then begin ; polfrac data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='polfrac', /nodata, position=p_spsed, _extra=_extra

      endif else begin ;polfrac exists


         dustem_plot_dataset, st, dataset='polfrac', position=p_spsed, _extra=_extra 
         dustem_plot_dataset, st, dustem_polfrac,SP_spec,SED_spec, dataset='polfrac', /refresh ,position=p_spsed, _extra=_extra 

      endelse  
      

    ENDIF
    
         
ENDIF 



;stop
if test_x then begin
    ;Generating extinction window and saving window ID
    if !run_pol then window,1,xsize=main_wxsize,ysize=main_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (EXTINCTION)' else window,1,xsize=main_wxsize,ysize=main_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (EXTINCTION)';, wback='grey';,wobject=winobj_m
    
    
    ;Plotting model string (legend)
    xxpos = 0.015
    yypos = 0.97
    ;Plotting Hydrogen column density string (legend)
    cgtext, xxpos, yypos,'Model : '+!dustem_model,color=0,/normal,charsize = 1.2;,/addcmd ;& cmdind_m+=1 This is the first command in the window
    yypos = 0.95
    cgtext, xxpos, yypos,textoidl('N_{H}')+textoidl(' (H/cm^2) : ')+strmid(string(*!dustem_HCD,format='(1E10.2)'),2),color=0,/normal,charsize = 1.2
    
    ;Plotting of the number of iterations completed by the fitter
    
    ;Plotting of the number of runs
    ;Getting the width of the unrefreshed string
    widthtot=0.
    ;cgtext, xxpos, yypos,'Runs : ',color=0,/normal,charsize=-1,width=thiswidth,/addcmd & cmdind_x+=1
    cgtext, xxpos, yypos,'Iteration : ',color=0,/normal,charsize=-1,width=thiswidth
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    
    ;Getting the width of the refreshed string
    cgtext, xxpos, yypos,strtrim(!dustem_iter.act,2),color=0,/normal,charsize=-1,width=thiswidth
    widthtot+= thiswidth;varying width        
    
    ;These two lines will also have to      be modified when plotting the refreshed values
    xxpos = 0.015 ;1.0 - widthtot - 0.03
    yypos = 0.015
    
    ;Displaying fixed part
    ;cgtext, xxpos, yypos,'Runs : ',color=0,/normal,charsize = 1.35,/addcmd & cmdind_x+=1
    cgtext, xxpos, yypos,'Iteration : ',color=0,/normal,charsize = 1.35
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    cgtext, xxpos + widthtext + 0.015 , yypos,strtrim(!dustem_iter.act,2),color=0,/normal,charsize = 1.0
    ;saving the command id to replace it
    
    
    ;plotting of (mostly) fixed data for rchi2
    ;Since the format of the strings is specified, the length/width of the string in thex direction is fixed. 
    
    
    ;Getting the width of the unrefreshed string
    widthtot=0.
    cgtext, xxpos, yypos,textoidl('\chi^{2} : '),color=0,/normal,charsize=-1,width=thiswidth
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    
    ;Getting the width of the refresh.ed string
    cgtext, xxpos, yypos,strtrim(string(chi2,format=frmt2),2),color=0,/normal,charsize=-1,width=thiswidth
    widthtot+= thiswidth;varying width        
    ;saving the command string width to replace it
    
    
    xxpos = 1.0 - widthtot - 0.03
    
    yypos = 0.97
    
    ;Displaying fixed part
    cgtext, xxpos, yypos,textoidl('\chi^{2} : '),color=0,/normal,charsize = 1.0
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    
    cgtext, xxpos + widthtext , yypos,strtrim(string(chi2,format=frmt2),2),color=0,/normal,charsize = 1.0
    
    ;saving the command id to replace it
      
    
    
    ;plotting of (mostly) fixed data for rchi2
    
    ;Getting the width of the unrefreshed string
    widthtot=0.
    cgtext, xxpos, yypos,textoidl('r_{\chi^{2}} : '),color=0,/normal,charsize=-1,width=thiswidth
    widthtext = thiswidth
    widthtot+= thiswidth ;fixed width
    ;!dustemcgwin_ncmds.rchi2.txtwdth1 = thiswidth
    ;Getting the width of the refreshed string
    cgtext, xxpos, yypos,strtrim(string(rchi2,format=frmt2),2),color=0,/normal,charsize=-1,width=thiswidth
    widthtot+= thiswidth;varying width        
    
    ;These two lines will also have to      be modified when plotting the refreshed values
    xxpos = 1.0 - widthtot - 0.03
    yypos = 0.95
    
    ;Displaying fixed part
    cgtext, xxpos, yypos,textoidl('r_{\chi^{2}} : '),color=0,/normal,charsize = 1.35
    ;Displaying refreshed part (first run . This is the command that will be replaced)
    cgtext, xxpos + widthtext , yypos,strtrim(string(rchi2,format=frmt2),2),color=0,/normal,charsize = 1.0
    ;saving the command id to replace it
    
   ;plotting of title 
    tit=!dustem_plot_range.title_x
    
    xxpos = 0.5
    yypos =0.96
    
    ;the runs inbetween
    if !dustem_end EQ 0 then cgtext, xxpos , yypos,tit+' (RUNNING)',color=0,/normal,charsize = 1.6,alignment=0.5
    
    ;subsequent iterations to the end of the fit
    if !dustem_end EQ -1 then cgtext, xxpos , yypos,tit,color=0,/normal,charsize = 1.6,alignment=0.5
    
    ;last iteration of the fit
    if !dustem_end EQ 1 then cgtext, xxpos , yypos,tit+' (FINAL RUN)',color=0,/normal,charsize = 1.6,alignment=0.5
    
    
    if !run_pol then begin
       
        ;position arrays for plot and normalized graph
        
        ;THIS IS HARD-CODED IN A VERY SILLY WAY
        
        p_ext = [0.05,0.67,0.475,0.90]
        p_pext = [0.525,0.67,0.95,0.90]
        p_spext = [0.05,0.375,0.475,0.575] ; Should we plot this? tau_polext/tau_ext_tot. YES FOR NOW...
        p_psiext = [0.525,0.375,0.95,0.575]
        p_qext = [0.05,0.12,0.475,0.35]  
        p_uext = [0.525,0.12,0.95,0.35]
        
        np_ext = [0.05,0.60,0.475,0.67]
        np_pext = [0.525,0.60,0.95,0.67]
        np_qext = [0.05,0.05,0.475,0.12] 
        np_uext = [0.525,0.05,0.95,0.12]
        
        p_ext[1]+= 0.0125 & p_ext[3]+= 0.0125 
        p_pext[1]+= 0.0125 & p_pext[3]+= 0.0125
        p_spext[1]+= 0.0125 & p_spext[3]+= 0.0125
        p_psiext[1]+= 0.0125 & p_psiext[3]+= 0.0125
        p_qext[1]+= 0.0125 & p_qext[3]+= 0.0125
        p_uext[1]+= 0.0125 & p_uext[3]+= 0.0125
        
        np_ext[1]+= 0.0125 & np_ext[3]+= 0.0125 
        np_pext[1]+= 0.0125 & np_pext[3]+= 0.0125
        np_qext[1]+= 0.0125 & np_qext[3]+= 0.0125
        np_uext[1]+= 0.0125 & np_uext[3]+= 0.0125
        
        
          
    endif else begin
        p_ext  = [0.07,0.30,0.97,0.85]
        np_ext = [0.07,0.10,0.97,0.30]
    
    endelse

    ;Plotting of sed data axes (whether or not data is present)
    plotsym,0,/fill ;you might need to execute this again. hmm...


    ;This is not the right test the user might want to show the prediction for sed and fit the stokes parameters
    if ~test_ext then begin ; EXT data is not present (For completeness) # This is only valid when !run_pol=1
        
        dustem_plot_dataset, st, dataset='EXT', /nodata, position=p_ext, _extra=_extra 
        dustem_plot_dataset, st, dataset='EXT', /nodata, /norm, position=np_ext, _extra=_extra

    endif else begin ;EXT exists
      
        dustem_plot_dataset, st, dataset='EXT', position=p_ext, _extra=_extra
        dustem_plot_dataset, st, dustem_ext,EXT_spec, dataset='EXT', /refresh ,position=p_ext, _extra=_extra 
        
        dustem_plot_dataset, st, dataset='EXT',/norm, position=np_ext, _extra=_extra ;I think nodata can also be used too
        
        dustem_plot_dataset, st, dustem_ext,EXT_spec, dataset='EXT', /norm, /refresh,position=np_ext, _extra=_extra 
               
    endelse
    
    
      if !run_pol then begin 
        
        if ~test_qext then begin ;Qext is not present
            
            dustem_plot_dataset, st, dataset='QEXT', /nodata, position=p_qext, _extra=_extra 
            dustem_plot_dataset, st, dataset='QEXT', /nodata, /norm, position=np_qext, _extra=_extra 
        
        endif else begin ;Qext data is present
                    
            ;Plotting of postive values if they exist (if hidden data is present it is plotted if not an empty plot is rendered)
            dustem_plot_dataset, st, dataset='QEXT', position=p_qext,/positive_only, _extra=_extra 
            ;Refreshing the positive_only plot ONLY if there is data. If not do nothing
            
            dustem_plot_dataset, st, dustem_qext,QEXT_spec, dataset='QEXT',/positive_only, /refresh ,position=p_qext, _extra=_extra 
            
            dustem_plot_dataset, st, dataset='QEXT', position=p_qext,/negative_only, _extra=_extra
            ;Refreshing the negative_only plot ONLY if there is data. If not do nothing
            dustem_plot_dataset, st, dustem_qext,QEXT_spec,dataset='QEXT',/negative_only, /refresh ,position=p_qext, _extra=_extra
        
            dustem_plot_dataset, st, dataset='QEXT',/norm, position=np_qext, _extra=_extra ;I think nodata can also be uqsed too
            dustem_plot_dataset, st, dustem_qext,QEXT_spec,dataset='QEXT', /norm, /refresh,position=np_qext, _extra=_extra

      endelse
          ;stop        
        if ~test_uext then begin ;uext is not present
            
            dustem_plot_dataset, st, dataset='UEXT', /nodata, position=p_uext, _extra=_extra
            dustem_plot_dataset, st, dataset='UEXT', /nodata, /norm, position=np_uext, _extra=_extra 
        
        endif else begin ;uext data is present
            
            ;stop
                ;Plotting of postive values if they exist (if hidden data is present it is plotted if not an empty plot is rendred)
                dustem_plot_dataset, st, dataset='UEXT', position=p_uext,/positive_only, _extra=_extra
                
                ;Refreshing the positive_only plot ONLY if there is data. If not do nothing
                dustem_plot_dataset, st, dustem_uext,UEXT_spec, dataset='UEXT',/positive_only, /refresh ,position=p_uext, _extra=_extra 
                
              
                dustem_plot_dataset, st, dataset='UEXT', position=p_uext,/negative_only, _extra=_extra 
                ;Refreshing the negative_only plot ONLY if there is data. If not do nothing
                dustem_plot_dataset, st, dustem_uext,UEXT_spec, dataset='UEXT',/negative_only, /refresh ,position=p_uext, _extra=_extra
                
                
                dustem_plot_dataset, st, dataset='UEXT',/norm, position=np_uext, _extra=_extra ;I think nodata can also be uused too
                dustem_plot_dataset, st, dustem_uext,UEXT_spec, dataset='UEXT', /norm, /refresh,position=np_uext, _extra=_extra 
            
                      
      endelse
      
      if ~test_psi_ext then begin ; psi_ext data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='PSI_EXT', /nodata, position=p_psiext, _extra=_extra  

      endif else begin ;psi_ext exists

              dustem_plot_dataset, st, dataset='psi_ext', position=p_psiext, _extra=_extra 
              dustem_plot_dataset, st, dustem_psi_ext,PSIEXT_spec, dataset='psi_ext', /refresh ,position=p_psiext, _extra=_extra 
              
              
      endelse
        
      
      if ~test_polext then begin ; polext data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='polext', /nodata, position=p_pext, _extra=_extra 
          dustem_plot_dataset, st, dataset='polext', /nodata, /norm, position=np_pext, _extra=_extra 

      endif else begin ;polext exists

        dustem_plot_dataset, st, dataset='polext', position=p_pext, _extra=_extra 
        dustem_plot_dataset, st, dustem_polext,POLEXT_spec, dataset='polext', /refresh ,position=p_pext, _extra=_extra 
         
        dustem_plot_dataset, st, dataset='polext',/norm, position=np_pext, _extra=_extra  ;I think nodata can also be upolsed too
        dustem_plot_dataset, st, dustem_polext,POLEXT_spec, dataset='polext', /norm, /refresh,position=np_pext, _extra=_extra 
        
      endelse      
      
      
      if ~test_fpolext then begin ; fpolext data is not present (For completeness) # This is only valid when !run_pol=1
          
          dustem_plot_dataset, st, dataset='fpolext', /nodata, position=p_spext, _extra=_extra  
          

      endif else begin ;fpolext exists

        
        dustem_plot_dataset, st, dataset='fpolext', position=p_spext, _extra=_extra 
        dustem_plot_dataset, st, dustem_fpolext,SPEXT_spec,EXT_spec, dataset='fpolext', /refresh ,position=p_spext, _extra=_extra


      endelse  
      

    ENDIF
        
     
          
ENDIF 


if !dustem_end then !dustem_end = -1 ;so that the last iteration is only plotted once.

;PLOTTING OF THE PARAMETERS
IF !d.name NE 'PS' THEN BEGIN
    window,2,xpos=param_wxpos,ypos=param_wypos,xsize=param_wxsize,ysize=param_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (PARAMETERS)' ; keeping the same y dimension of the emission/extinction plot? 
ENDIF
dustem_plot_dataset, st, p_dim, errors,dataset='PARAMETERS',_extra=_extra ;& cmdind_prms+=1
dustem_plot_dataset, st,  p_dim,errors,dataset='PARAMETERS',/refresh, _extra=_extra 

;PLOTTING OF THE PLUGINS
IF (tag_names(*!dustem_plugin))(0) NE 'NONE' THEN BEGIN  
    IF !d.name NE 'PS' THEN BEGIN
        window,3,xpos=plugin_wxpos,ypos=plugin_wypos,xsize=plugin_wxsize,ysize=plugin_wysize,title='DUSTEMWRAP '+!dustem_version.version+' (PLUGINS)' ; keeping the same y dimension of the emission/extinction plot? 
    ENDIF
    dustem_plot_dataset, st, p_dim, errors,dataset='PLUGINS',_extra=_extra ;& cmdind_prms+=1
    dustem_plot_dataset, st, p_dim, errors,dataset='PLUGINS', /refresh , winid=winid_plgns, _extra=_extra 
     
ENDIF

the_end:

END