dustem_check_data.pro 18.3 KB
FUNCTION dustem_check_data, sed=sed,ext=ext,fpol=fpol,ist=ist,pst=pst,fpst=fpst,qst=qst,ust=ust,exst=exst,pexst=pexst,qexst=qexst,uexst=uexst


;THIS PROCEDURE CHECKS THE DATA PROVIDED BY THE USER AND RETURNS DIFFERENT STRUCTURES TO DEFINE (SET) THE COMPOSITE DATA FITTING STRUCTURE (!dustem_data)


;write help section here
;I don't think this function should return anything 
;This replaces a big portion of dustem_set_data, JP was right.


;CHECKING THE FORMAT OF THE SED STRUCTURE
IF KEYWORD_SET(sed) THEN BEGIN
    ans=''
    wavs=sed.wave
    ;=== Impose central wavelengths for photometric channels
    ind=where(sed.filter NE 'SPECTRUM',count)
    IF count NE 0 THEN BEGIN
        wavs(ind)=dustem_filter2wav(sed(ind).filter)
    ENDIF
    ;=== define observations structure 
    obs_st={instru_names:sed.instru,filt_names:sed.filter,wav:wavs, values:sed.StokesI,sigma:sqrt(abs(sed.sigmaII))} 
    ;INITIALIZING OUTPUT STRUCTURES
    ist = obs_st
    pst = ist
    fpst = ist
    qst = ist
    ust = ist
    ;This allows the user to fit polsed, qsed and used individually.
    ;Test if there is StokesI data. If not move to polsed testing.
    ind = where(sed.StokesI NE la_undef() and finite(sed.StokesI) EQ 1 and sed.sigmaII NE la_undef() and finite(sed.sigmaII) EQ 1,N_sed) ;Testing if the data and errors are set
    IF N_sed EQ 0 THEN BEGIN
        ist = ptr_new()
        goto, pzone
    ENDIF ELSE BEGIN 
    ind = where(finite(sed.StokesI) EQ 0 or finite(sed.sigmaII) EQ 0, countnoki) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnoki NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in StokesI data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        read, ans, prompt='Would you like automatic format filtering? (Y/N):'
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF 
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testi=where(sed.sigmaII NE 0. and finite(sed.sigmaII) EQ 1 and sed.sigmaII NE la_undef() and sed.StokesI NE la_undef() and finite(sed.StokesI) EQ 1,ctesti)                
    IF ctesti NE 0 THEN BEGIN 
        instru_names = ist.instru_names(testi)
        filt_names = ist.filt_names(testi)
        wav = ist.wav(testi)
        values = ist.values(testi)
        sigma = ist.sigma(testi)
        ist={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF    
    ENDELSE
    pzone:
    ans=''
    pst.values=sed.largeP
    pst.sigma=sqrt(abs(sed.sigma_largeP))
    ;Testig if there is LargeP data. If not move to polfrac data (fpol)
    ind = where(sed.largeP NE la_undef() and finite(sed.largeP) EQ 1 and sed.sigma_largeP NE la_undef() and finite(sed.sigma_largeP) EQ 1,NP) ;Testing on the nan values is needed to move to testing the other data fields (because if the dataset is full of Nans but not la_undef(), the code will think it's valid dta)
    IF NP EQ 0 THEN BEGIN
        pst = ptr_new()
        goto, fpzone
    ENDIF ELSE BEGIN
    ind = where(finite(sed.largeP) EQ 0 or finite(sed.sigma_largeP) EQ 0, countnokp) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokp NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in LargeP data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testp=where(sed.sigma_largeP NE 0. and finite(sed.sigma_largeP) EQ 1 and sed.sigma_largeP NE la_undef() and sed.largeP NE la_undef() and finite(sed.largeP) EQ 1,ctestp)                
    IF ctestp NE 0 THEN BEGIN 
        instru_names = pst.instru_names(testp)
        filt_names = pst.filt_names(testp)
        wav = pst.wav(testp)
        values = pst.values(testp)
        sigma = pst.sigma(testp)
        pst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF
    ENDELSE 
    fpzone:
    ans=''
    fpst.values=sed.smallp
    fpst.sigma=sqrt(abs(sed.sigma_smallp))
    ;Testig if there is smallp data. If not move to qsed data
    ind = where(sed.smallP NE la_undef() and finite(sed.smallP) EQ 1 and sed.sigma_smallP NE la_undef() and finite(sed.sigma_smallP) EQ 1,NSP) ;Testing on the nan values is needed to move to testing the other data fields (because if the dataset is full of Nans but not la_undef(), the code will think it's valid dta)
    IF NSP EQ 0 THEN BEGIN
        fpst = ptr_new()
        ;goto, qzone
        goto, qzone
    ENDIF ELSE BEGIN
    ind = where(finite(sed.smallP) EQ 0 or finite(sed.sigma_smallP) EQ 0, countnoksp) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnoksp NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in SmallP data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testsp=where(sed.sigma_smallP NE 0. and finite(sed.sigma_smallP) EQ 1 and sed.sigma_smallP NE la_undef() and sed.smallP NE la_undef() and finite(sed.smallP) EQ 1,ctestsp)                
    IF ctestsp NE 0 THEN BEGIN 
        instru_names = fpst.instru_names(testsp)
        filt_names = fpst.filt_names(testsp)
        wav = fpst.wav(testsp)
        values = fpst.values(testsp)
        sigma = fpst.sigma(testsp)
        fpst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF
    ENDELSE
    qzone:
    ans=''
    qst.values=sed.StokesQ
    qst.sigma=sqrt(abs(sed.sigmaQQ))
    ;Testig if there is StokesQ data. If not move to used data
    ind = where(sed.StokesQ NE la_undef() and finite(sed.StokesQ) EQ 1 and sed.sigmaQQ NE la_undef() and finite(sed.sigmaQQ) EQ 1,NQ)
    IF NQ EQ 0 THEN BEGIN
        qst = ptr_new()
        goto, uzone
    ENDIF ELSE BEGIN
    ind = where(finite(sed.StokesQ) EQ 0 or finite(sed.sigmaQQ) EQ 0, countnokq) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokq NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in StokesQ data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testq=where(sed.sigmaQQ NE 0. and finite(sed.sigmaQQ) EQ 1 and sed.sigmaQQ NE la_undef() and sed.StokesQ NE la_undef() and finite(sed.StokesQ) EQ 1,ctestq)                
    IF ctestq NE 0 THEN BEGIN 
        instru_names = qst.instru_names(testq)
        filt_names = qst.filt_names(testq)
        wav = qst.wav(testq)
        values = qst.values(testq)
        sigma = qst.sigma(testq)
        qst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF
    ENDELSE
    uzone:
    ans=''
    ust.values=sed.StokesU
    ust.sigma=sqrt(abs(sed.sigmaUU))
    ;Testig if there is StokesU data. If not return empty value and end loop.
    ind = where(sed.StokesU NE la_undef() and finite(sed.StokesU) EQ 1 and sed.sigmaUU NE la_undef() and finite(sed.sigmaUU) EQ 1,NU)
    IF NU EQ 0 THEN BEGIN
        ust = ptr_new()
        goto, end_sed
    ENDIF ELSE BEGIN
    ind = where(finite(sed.StokesU) EQ 0 or finite(sed.sigmaUU) EQ 0, countnoku) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnoku NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in StokesU data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF  
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testu=where(sed.sigmaUU NE 0. and finite(sed.sigmaUU) EQ 1 and sed.sigmaUU NE la_undef() and sed.StokesU NE la_undef() and finite(sed.StokesU) EQ 1,ctestu)                
    IF ctestu NE 0 THEN BEGIN 
        instru_names = ust.instru_names(testu)
        filt_names = ust.filt_names(testu)
        wav = ust.wav(testu)
        values = ust.values(testu)
        sigma = ust.sigma(testu)
        ust={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF
    ENDELSE
    end_sed:
ENDIF



;CHECKING THE FORMAT OF THE EXT STRUCTURE 
IF KEYWORD_SET(ext) THEN begin
    ans=''
    wavs=ext.wave
    ;=== Impose central wavelengths for photometric channels
    ind=where(ext.filter NE 'SPECTRUM',count)
    IF count NE 0 THEN BEGIN
        wavs(ind)=dustem_filter2wav(ext(ind).filter)
    ENDIF
    ;=== define observations structure 
    obs_st={instru_names:ext.instru,filt_names:ext.filter,wav:wavs, values:ext.EXT_I,sigma:sqrt(abs(ext.sigextII))} 
    ;INITIALIZING OUTPUT STRUCTURES
    exst = obs_st
    pexst = exst
    qexst = exst
    uexst = exst
    ;This allows the user to fit polext, qext and uext individually.
    ;Test if there is extinction data. If not move to polext testing.
    ;this condition was updated because you cannot have data without errors and errors without data
    ind = where(ext.EXT_I NE la_undef() and finite(ext.EXT_I) EQ 1 and ext.sigextII NE la_undef() and finite(ext.sigextII) EQ 1,N_ext) ;Testing if the data and errors are set
    IF N_ext EQ 0 THEN BEGIN
        exst = ptr_new()
        goto, pexzone
    ENDIF ELSE BEGIN
    ind = where(finite(ext.EXT_I) EQ 0 or finite(ext.sigextII) EQ 0, countnokex) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokex NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in EXT_I data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        ans=''
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF      
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $ 
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testex=where(ext.sigextII NE 0. and finite(ext.sigextII) EQ 1 and ext.sigextII NE la_undef() and ext.EXT_I NE la_undef() and finite(ext.EXT_I) EQ 1,ctestex)                
    IF ctestex NE 0 THEN BEGIN 
        instru_names = exst.instru_names(testex)
        filt_names = exst.filt_names(testex)
        wav = exst.wav(testex)
        values = exst.values(testex)
        sigma = exst.sigma(testex)
        exst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF 
    ENDELSE
    pexzone:
    ans=''
    pexst.values=ext.EXT_P
    pexst.sigma=sqrt(abs(ext.sigextP))
    ;Testig if there is EXT_P data. If not move to EXT_Q testing
    ind = where(ext.EXT_P NE la_undef() and finite(ext.EXT_P) EQ 1 and ext.sigextP NE la_undef() and finite(ext.sigextII) EQ 1,NP_ext) ;Testing if the data and errors are set
    IF NP_ext EQ 0 THEN BEGIN
        pexst = ptr_new()
        goto, qexzone
    ENDIF ELSE BEGIN
    ind = where(finite(ext.EXT_P) EQ 0 or finite(ext.sigextP) EQ 0, countnokpex) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokpex NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in EXT_I data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        ans=''
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $ 
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testpex=where(ext.sigextP NE 0. and finite(ext.sigextP) EQ 1 and ext.sigextP NE la_undef() and ext.EXT_P NE la_undef() and finite(ext.EXT_P) EQ 1,ctestpex)                
    IF ctestpex NE 0 THEN BEGIN 
        instru_names = pexst.instru_names(testpex)
        filt_names = pexst.filt_names(testpex)
        wav = pexst.wav(testpex)
        values = pexst.values(testpex)
        sigma = pexst.sigma(testpex)
        pexst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF 
    ENDELSE
    qexzone:
    ans=''
    qexst.values=ext.EXT_Q
    qexst.sigma=sqrt(abs(ext.sigextQQ))
    ;Testig if there is EXT_P data. If not move to EXT_U testing
    ind = where(ext.EXT_Q NE la_undef() and finite(ext.EXT_Q) EQ 1 and ext.sigextQQ NE la_undef() and finite(ext.sigextQQ) EQ 1,NQ_ext) ;Testing if the data and errors are set
    ;dustem_set_data.prostop   
    IF NQ_ext EQ 0 THEN BEGIN
        qexst = ptr_new()
        goto, uexzone
    ENDIF ELSE BEGIN
    ind = where(finite(ext.EXT_Q) EQ 0 or finite(ext.sigextQQ) EQ 0, countnokqex) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokqex NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in EXT_I data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        ans=''
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testqex=where(ext.sigextQQ NE 0. and finite(ext.sigextQQ) EQ 1 and ext.sigextQQ NE la_undef() and ext.EXT_Q NE la_undef() and finite(ext.EXT_Q) EQ 1,ctestqex)                
    IF ctestqex NE 0 THEN BEGIN 
        instru_names = qexst.instru_names(testqex)
        filt_names = qexst.filt_names(testqex)
        wav = qexst.wav(testqex)
        values = qexst.values(testqex)
        sigma = qexst.sigma(testqex)
        qexst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF 
    ENDELSE
    uexzone:
    ans=''
    uexst.values=ext.EXT_U
    uexst.sigma=sqrt(abs(ext.sigextUU))
    ;Testig if there is EXT_P data. If not return empty value and end loop.
    ind = where(ext.EXT_U NE la_undef() and finite(ext.EXT_U) EQ 1 and ext.sigextUU NE la_undef() and finite(ext.sigextUU) EQ 1,NU_ext) ;Testing if the data and errors are set
    IF NU_ext EQ 0 THEN BEGIN
        uexst = ptr_new()
        goto, end_ext
    ENDIF ELSE BEGIN
    ind = where(finite(ext.EXT_U) EQ 0 or finite(ext.sigextUU) EQ 0, countnokuex) ;Format is not okay if there are nan values but the wrapper recognizes the la_undef() value 
    IF countnokuex NE 0 THEN BEGIN 
        message, "SED format isn't met. NaN value(s) detected in EXT_I data.",/continue
        message, 'Without automatic format fitering you cannot proceed.',/continue
        ans=''
        read, ans, prompt='Would you like automatic format filtering? (Y/N):' 
        IF strupcase(ans) EQ 'N' THEN BEGIN
            message,'You have chosen not to use automatic filtering. Please adjust the SED format.',/continue
            message, 'Aborting ...'
        ENDIF
    ENDIF
    IF strupcase(ans) EQ 'Y' THEN message, 'You have chosen automatic format filtering. Removal of undefined data points...',/continue $
    ELSE message, 'Data format is met. Removal of undefined data points...',/continue
    testuex=where(ext.sigextUU NE 0. and finite(ext.sigextUU) EQ 1 and ext.sigextUU NE la_undef() and ext.EXT_U NE la_undef() and finite(ext.EXT_U) EQ 1,ctestuex)                
    IF ctestuex NE 0 THEN BEGIN 
        instru_names = uexst.instru_names(testuex)
        filt_names = uexst.filt_names(testuex)
        wav = uexst.wav(testuex)
        values = uexst.values(testuex)
        sigma = uexst.sigma(testuex)
        uexst={instru_names:instru_names,filt_names:filt_names,wav:wav,values:values,sigma:sigma}
    ENDIF 
    ENDELSE
    end_ext:
ENDIF


RETURN, 0.
;stop

END