FUNCTION dustem_check_data, sed=sed,ext=ext,ist=ist,pst=pst,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 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 ...',/continue stop 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 qsed data 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, qzone 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 ...',/continue stop 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 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 ...',/continue stop 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 ...',/continue stop 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 ...',/continue stop 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 ...',/continue stop 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 ...',/continue stop 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 ...',/continue stop 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