; docformat = 'rst' ; ; NAME: ; svoFilterSearch ; PURPOSE: ; Read the results of a filter search on the SVO filter service ; ;+ ; :Description: ; Read the results of a filter search on the SVO filter service ; ; :Categories: ; VO, SVO, Photometry ; ; :Params: ; svo: in, required, type=string ; Path to the file to read ; ; :Keywords: ; facility: in, optional, type=string ; Name of the facility for which the filters are sought ; instrument: in, optional, type=string ; Name of the instrument for which the filters are sought ; ID: in, optional, type=string ; Unique identifier of a filter to retrieve its transmission curve ; photSystem: in, optional, type=string ; Name of the photometric system for which the filters are sought ; dump: in, optional, type=string, default='/tmp/svofiltersearch' ; Basename of the file in which to download the results (without extension) ; noRead: in, optional, type=boolean, default=0 ; Prevent reading the downloaded file if set ; ; :Returns: ; ; :Examples: ; Read a file already downloaded locally:: ; IDL> filter = svoFilterSearch('my_file.xml') ; Retrieve and read filters from HST/ACS instrument ; IDL> filter = svoFilterSearch(Instrument='ACS') ; ; :Uses: ; sed, wget, stilts ; ; :Author: ; B.Carry (OCA) ; ; :History: ; Change History:: ; Written in August 2018, B. Carry (OCA), based on svoReadFilter (2016 B.Carry) ;- function svoFilterSearch, svo, facility=facility, instrument=instrument, ID=ID, $ photSystem=photSystem, dump=dump, noRead=noRead COMPILE_OPT hidden, idl2 ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- I -- Initialization And Input Verification -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--I.1-- Reading File or Downloading Data? --------------------------------------------------- if not keyword_set(svo) and not keyword_set(ID) and $ not keyword_set(facility) and not keyword_set(instrument) and not keyword_set(photSystem) $ then begin message, 'You must provide a file or specify a facility or instrument' return, -1 endif ;--I.2-- Validity of the Input File ---------------------------------------------------------- sufCSV='.csv' sufXML='.xml' if keyword_set(svo) then if not (file_test(svo,/Read) or $ file_test(svo+sufCSV,/Read) or $ file_test(svo+sufXML,/Read)) then begin message, 'Cannot read the input file: '+strTrim(svo,2) return, -2 endif ;--I.3-- Output Structures ------------------------------------------------------------------- eDesc={ ivorn:'', filterID:'', WavelengthUnit:'', WavelengthUCD:'', $ PhotSystem:'', DetectorType:'', Band:'', $ Instrument:'', Facility:'', ProfileReference:'', CalibrationReference:'', Description:'', Comments:'', $ WavelengthMean:0., WavelengthEff: 0., WavelengthMin: 0., WavelengthMax: 0., WidthEff: 0., $ WavelengthCen: 0., WavelengthPivot: 0., WavelengthPeak: 0., WavelengthPhot: 0., FWHM: 0., $ PhotCalID:'', MagSys:'', ZeroPoint:0., ZeroPointUnit:'', Mag0: 0., ZeroPointType:'', $ AsinhSoft:0., TransmissionCurve:''} eFilt={ ivorn:'', filterID:'', WavelengthUnit:'', WavelengthUCD:'', $ PhotSystem:'', $ Instrument:'', Facility:'', ProfileReference:'', Description:'', $ WavelengthMean:0., WavelengthEff: 0., WavelengthMin: 0., WavelengthMax: 0., WidthEff: 0., $ WavelengthCen: 0., WavelengthPivot: 0., WavelengthPeak: 0., WavelengthPhot: 0., FWHM: 0., $ PhotCalID:'', ZeroPoint:0., ZeroPointUnit:'', ZeroPointType:''} ;--I.4-- SVO Filter Base URL ----------------------------------------------------------------- url = 'http://svo2.cab.inta-csic.es/theory/fps3/fps.php?' ;--I.5-- Default Location to Dump Query Results ---------------------------------------------- if not keyword_set(dump) then dump='/tmp/svofiltersearch' svoCSV = dump+sufCSV svoXML = dump+sufXML ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- II -- Retrieve Filter Information from SVO Service ----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if not keyword_set(svo) then begin ;--II.1-- Build Query URL ------------------------------------------------------------------ query=url first=1 if keyword_set(facility) then if first eq 1 then query+= 'Facility='+strTrim(facility,2) $ else query+='&Facility='+strTrim(facility,2) if keyword_set(instrument) then if first eq 1 then query+= 'Instrument='+strTrim(instrument,2) $ else query+='&Instrument='+strTrim(instrument,2) if keyword_set(ID) then if first eq 1 then query+= 'ID='+strTrim(ID,2) $ else query+='&ID='+strTrim(ID,2) if keyword_set(photSystem) then if first eq 1 then query+= 'PhotSystem='+strTrim(photSystem,2) $ else query+='&PhotSystem='+strTrim(photSystem,2) ;--II.2-- Query SVO Filter Service --------------------------------------------------------- spawn, 'wget --quiet "'+query+'" -O '+svoXML ;--II.3-- Convert XML into CSV ------------------------------------------------------------- print, '' print, 'stilts tcopy in='+svoXML+' ifmt=votable ofmt=csv out='+svoCSV spawn, 'stilts tcopy in='+svoXML+' ifmt=votable ofmt=csv out='+svoCSV, /NOSHELL spawn, "sed -i 's/,,/, ,/g' " + svoCSV spawn, "sed -i 's/,,/, ,/g' " + svoCSV ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- III -- Convert XML to CSV & Identify File Type -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; endif else begin ;--III.1-- Find the File Extension --------------------------------------------------------- split=strSplit(svo, '.', /Extract, count=nbField) if nbField ge 2 then ext=split[-1] else ext='' ;--III.2-- Convert XML into CSV if needed -------------------------------------------------- case ext of 'xml': begin svoCSV = strMid(svo, 0, strLen(svo)-4)+sufCSV print, 'stilts tcopy in='+svo+' ifmt=votable ofmt=csv out='+svoCSV spawn, 'stilts tcopy in='+svo+' ifmt=votable ofmt=csv out='+svoCSV spawn, "sed -i 's/,,/, ,/g' " + svoCSV spawn, "sed -i 's/,,/, ,/g' " + svoCSV svoXML=svo end 'csv': begin svoCSV=svo svoXML=0 end else: begin svoCSV=svo+sufCSV svoXML=svo+sufXML end endcase endelse ;--III.3-- Exit if NoRead Specified ---------------------------------------------------------- if keyword_set(noRead) then return, 0 ;--III.4-- Summary File or Transmission Curve ------------------------------------------------ if keyword_set(facility) or keyword_set(instrument) then ID=0 ;--III.5-- Convertion to CSV if Needed ------------------------------------------------------ if not file_test(svoCSV,/Read) then begin spawn, 'stilts tcopy in='+svoXML+' ifmt=votable ofmt=csv out='+svoCSV spawn, "sed -i 's/,,/, ,/g' " + svoCSV spawn, "sed -i 's/,,/, ,/g' " + svoCSV endif ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- IV -- Read Filter Information for Facility/Instrument -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if not keyword_set(ID) then begin ;--IV.1-- Number of Entries & Output Structure --------------------------------------------- ;--IV.1.1-- Number of Entries spawn, 'wc -l '+svoCSV, res split=strSplit(res,' ',/Extract) nbSVO = round(float(split[0]))-1 ;--IV.1.2-- Set Output Structures fArr = replicate(eDesc, nbSVO) ;--IV.1.3-- Open File openR, idIn, svoCSV, /Get_Lun ;--IV.2-- Read Header Line ----------------------------------------------------------------- line='' readf, idIn, line ;--IV.3-- Loop over Filter Entries --------------------------------------------------------- for k=0, nbSVO-1 do begin ;--IV.4-- Any Field with Quotes? --------------------------------------------------------- line='' readf, idIn, line split = strSplit( line, '"', /Extract, count=n ) case n of ;--IV.5-- No Field with Quote -> Go! --------------------------------------------------- 1: begin sub = strSplit( line, ',', /Extract, count=nbSub ) if nbSub eq 2 then begin ID=1 free_lun, idIn goto, j2Curve endif fArr[k].ivorn = sub[00] fArr[k].filterID = sub[01] fArr[k].WavelengthUnit = sub[02] fArr[k].WavelengthUCD = sub[03] fArr[k].PhotSystem = sub[04] fArr[k].DetectorType = sub[05] fArr[k].Band = sub[06] fArr[k].Instrument = sub[07] fArr[k].Facility = sub[08] fArr[k].ProfileReference = sub[09] fArr[k].CalibrationReference = sub[10] fArr[k].Description = sub[11] fArr[k].Comments = sub[12] fArr[k].WavelengthMean = sub[13] fArr[k].WavelengthEff = sub[14] fArr[k].WavelengthMin = sub[15] fArr[k].WavelengthMax = sub[16] fArr[k].WidthEff = sub[17] fArr[k].WavelengthCen = sub[18] fArr[k].WavelengthPivot = sub[19] fArr[k].WavelengthPeak = sub[20] fArr[k].WavelengthPhot = sub[21] fArr[k].FWHM = sub[22] fArr[k].PhotCalID = sub[23] fArr[k].MagSys = sub[24] fArr[k].ZeroPoint = sub[25] fArr[k].ZeroPointUnit = sub[26] fArr[k].Mag0 = sub[27] fArr[k].ZeroPointType = sub[28] fArr[k].AsinhSoft = sub[29] fArr[k].TransmissionCurve = sub[30] end ;--IV.6-- Presence of a Signal Quoted Field ---------------------------------------------- 3: begin sub1 = strSplit( split[0], ',', /Extract, count=ns1 ) sub2 = strSplit( split[2], ',', /Extract, count=ns2 ) case ns1 of ;--IV.6.1-- Presence of a Quoted Description ----------------------------------------- 11: begin fArr[k].ivorn = sub1[00] fArr[k].filterID = sub1[01] fArr[k].WavelengthUnit = sub1[02] fArr[k].WavelengthUCD = sub1[03] fArr[k].PhotSystem = sub1[04] fArr[k].DetectorType = sub1[05] fArr[k].Band = sub1[06] fArr[k].Instrument = sub1[07] fArr[k].Facility = sub1[08] fArr[k].ProfileReference = sub1[09] fArr[k].CalibrationReference = sub1[10] fArr[k].Description = split[1] fArr[k].Comments = sub2[00] fArr[k].WavelengthMean = sub2[01] fArr[k].WavelengthEff = sub2[02] fArr[k].WavelengthMin = sub2[03] fArr[k].WavelengthMax = sub2[04] fArr[k].WidthEff = sub2[05] fArr[k].WavelengthCen = sub2[06] fArr[k].WavelengthPivot = sub2[07] fArr[k].WavelengthPeak = sub2[08] fArr[k].WavelengthPhot = sub2[09] fArr[k].FWHM = sub2[10] fArr[k].PhotCalID = sub2[11] fArr[k].MagSys = sub2[12] fArr[k].ZeroPoint = sub2[13] fArr[k].ZeroPointUnit = sub2[14] fArr[k].Mag0 = sub2[15] fArr[k].ZeroPointType = sub2[16] fArr[k].AsinhSoft = sub2[17] fArr[k].TransmissionCurve = sub2[18] end ;--IV.6.2-- Something else ----------------------------------------------------------- 12: begin fArr[k].ivorn = sub1[00] fArr[k].filterID = sub1[01] fArr[k].WavelengthUnit = sub1[02] fArr[k].WavelengthUCD = sub1[03] fArr[k].PhotSystem = sub1[04] fArr[k].DetectorType = sub1[05] fArr[k].Band = sub1[06] fArr[k].Instrument = sub1[07] fArr[k].Facility = sub1[08] fArr[k].ProfileReference = sub1[09] fArr[k].CalibrationReference = sub1[10] fArr[k].Description = sub1[11] fArr[k].Comments = split[1] fArr[k].WavelengthMean = sub2[00] fArr[k].WavelengthEff = sub2[01] fArr[k].WavelengthMin = sub2[02] fArr[k].WavelengthMax = sub2[03] fArr[k].WidthEff = sub2[04] fArr[k].WavelengthCen = sub2[05] fArr[k].WavelengthPivot = sub2[06] fArr[k].WavelengthPeak = sub2[07] fArr[k].WavelengthPhot = sub2[08] fArr[k].FWHM = sub2[09] fArr[k].PhotCalID = sub2[10] fArr[k].MagSys = sub2[11] fArr[k].ZeroPoint = sub2[12] fArr[k].ZeroPointUnit = sub2[13] fArr[k].Mag0 = sub2[14] fArr[k].ZeroPointType = sub2[15] fArr[k].AsinhSoft = sub2[16] fArr[k].TransmissionCurve = sub2[17] end ;--IV.6.3-- At CFHT ------------------------------------------------------------------ 9: begin fArr[k].ivorn = sub1[00] fArr[k].filterID = sub1[01] fArr[k].WavelengthUnit = sub1[02] fArr[k].WavelengthUCD = sub1[03] fArr[k].PhotSystem = sub1[04] fArr[k].DetectorType = sub1[05] fArr[k].Band = sub1[06] fArr[k].Instrument = sub1[07] fArr[k].Facility = sub1[08] fArr[k].ProfileReference = sub1[09] fArr[k].CalibrationReference = sub1[10] fArr[k].Description = sub1[11] fArr[k].Comments = split[1] fArr[k].WavelengthMean = sub2[00] fArr[k].WavelengthEff = sub2[01] fArr[k].WavelengthMin = sub2[02] fArr[k].WavelengthMax = sub2[03] fArr[k].WidthEff = sub2[04] fArr[k].WavelengthCen = sub2[05] fArr[k].WavelengthPivot = sub2[06] fArr[k].WavelengthPeak = sub2[07] fArr[k].WavelengthPhot = sub2[08] fArr[k].FWHM = sub2[09] fArr[k].PhotCalID = sub2[10] fArr[k].MagSys = sub2[11] fArr[k].ZeroPoint = sub2[12] fArr[k].ZeroPointUnit = sub2[13] fArr[k].Mag0 = sub2[14] fArr[k].ZeroPointType = sub2[15] fArr[k].AsinhSoft = sub2[16] fArr[k].TransmissionCurve = sub2[17] end endcase end ;--IV.7-- Presence of a Two Quoted Field ----------------------------------------------- 5: begin sub1 = strSplit( split[0], ',', /Extract, count=ns1 ) sub2 = strSplit( split[4], ',', /Extract, count=ns1 ) fArr[k].ivorn = sub1[00] fArr[k].filterID = sub1[01] fArr[k].WavelengthUnit = sub1[02] fArr[k].WavelengthUCD = sub1[03] fArr[k].PhotSystem = sub1[04] fArr[k].DetectorType = sub1[05] fArr[k].Band = sub1[06] fArr[k].Instrument = sub1[07] fArr[k].Facility = sub1[08] fArr[k].ProfileReference = sub1[09] fArr[k].CalibrationReference = sub1[10] fArr[k].Description = split[1] fArr[k].Comments = split[3] fArr[k].WavelengthMean = sub2[00] fArr[k].WavelengthEff = sub2[01] fArr[k].WavelengthMin = sub2[02] fArr[k].WavelengthMax = sub2[03] fArr[k].WidthEff = sub2[04] fArr[k].WavelengthCen = sub2[05] fArr[k].WavelengthPivot = sub2[06] fArr[k].WavelengthPeak = sub2[07] fArr[k].WavelengthPhot = sub2[08] fArr[k].FWHM = sub2[09] fArr[k].PhotCalID = sub2[10] fArr[k].MagSys = sub2[11] fArr[k].ZeroPoint = sub2[12] fArr[k].ZeroPointUnit = sub2[13] fArr[k].Mag0 = sub2[14] fArr[k].ZeroPointType = sub2[15] fArr[k].AsinhSoft = sub2[16] fArr[k].TransmissionCurve = sub2[17] end else: ID=1 endcase endfor ;--IV.8-- Close File and Return Result ----------------------------------------------------- free_lun, idIn return, fArr endif ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- V -- Read Filter Transmission Curve -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; j2Curve: if keyword_set(ID) then begin ;--V.1-- Number of Entries & Output Structure ---------------------------------------------- ;--V.1.1-- Number of Entries spawn, 'wc -l '+svoCSV, res split=strSplit(res,' ',/Extract) nbSVO = round(float(split[0]))-1 ;--V.1.2-- Set Output Structures trans = create_struct( eFilt, 'wave', fltarr(nbSVO), 'trans', fltarr(nbSVO)) ;--V.2-- Read Transmission Curve ----------------------------------------------------------- readcol, svoCSV, delimiter=',', w,t, /Silent trans.wave = w trans.trans= t ;--V.3-- Read Transmission Curve Header ---------------------------------------------------- if file_test(svoXML, /Read) then begin trans.ivorn = voHeaderGetValue(svoXML,'FilterProfileService') trans.filterID = voHeaderGetValue(svoXML,'filterID') trans.WavelengthUnit = voHeaderGetValue(svoXML,'WavelengthUnit') trans.WavelengthUCD = voHeaderGetValue(svoXML,'WavelengthUCD') trans.PhotSystem = voHeaderGetValue(svoXML,'PhotSystem') trans.Instrument = voHeaderGetValue(svoXML,'Instrument') trans.Facility = voHeaderGetValue(svoXML,'Facility') trans.ProfileReference = voHeaderGetValue(svoXML,'ProfileReference') trans.Description = voHeaderGetValue(svoXML,'Description') trans.WavelengthMean = voHeaderGetValue(svoXML,'WavelengthMean') trans.WavelengthEff = voHeaderGetValue(svoXML,'WavelengthEff') trans.WavelengthMin = voHeaderGetValue(svoXML,'WavelengthMin') trans.WavelengthMax = voHeaderGetValue(svoXML,'WavelengthMax') trans.WidthEff = voHeaderGetValue(svoXML,'WidthEff') trans.WavelengthCen = voHeaderGetValue(svoXML,'WavelengthCen') trans.WavelengthPivot = voHeaderGetValue(svoXML,'WavelengthPivot') trans.WavelengthPeak = voHeaderGetValue(svoXML,'WavelengthPeak') trans.WavelengthPhot = voHeaderGetValue(svoXML,'WavelengthPhot') trans.FWHM = voHeaderGetValue(svoXML,'FWHM') trans.PhotCalID = voHeaderGetValue(svoXML,'PhotCalID') trans.ZeroPoint = voHeaderGetValue(svoXML,'ZeroPoint') trans.ZeroPointUnit = voHeaderGetValue(svoXML,'ZeroPointUnit') trans.ZeroPointType = voHeaderGetValue(svoXML,'ZeroPointType') endif ;--V.4-- Return Result --------------------------------------------------------------------- return, trans endif end