;
; NOSA HEADER START
;
; The contents of this file are subject to the terms of the NASA Open
; Source Agreement (NOSA), Version 1.3 only (the "Agreement"). You may
; not use this file except in compliance with the Agreement.
;
; You can obtain a copy of the agreement at
; docs/NASA_Open_Source_Agreement_1.3.txt
; or
; https://cdaweb.gsfc.nasa.gov/WebServices/NASA_Open_Source_Agreement_1.3.txt.
;
; See the Agreement for the specific language governing permissions
; and limitations under the Agreement.
;
; When distributing Covered Code, include this NOSA HEADER in each
; file and include the Agreement file at
; docs/NASA_Open_Source_Agreement_1.3.txt. If applicable, add the
; following below this NOSA HEADER, with the fields enclosed by
; brackets "[]" replaced with your own identifying information:
; Portions Copyright [yyyy] [name of copyright owner]
;
; NOSA HEADER END
;
; Copyright (c) 2010-2023 United States Government as represented by the
; National Aeronautics and Space Administration. No copyright is claimed
; in the United States under Title 17, U.S.Code. All Other Rights Reserved.
;
;
;+
; This file contains a procedure-oriented wrapper that integrates
; functionality from the SpdfCdas class (IDL client interface to
; <a href="https://cdaweb.gsfc.nasa.gov/WebServices">
; Coordinated Data Analysis System Web Services</a> (CDAS WSs))
; and the
; <a href="https://spdf.gsfc.nasa.gov/CDAWlib.html">CDAWlib</a>
; library.
;
; @copyright Copyright (c) 2010-2023 United States Government as
; represented by the National Aeronautics and Space
; Administration. No copyright is claimed in the United States
; under Title 17, U.S.Code. All Other Rights Reserved.
;
; @author B. Harris
;-
;+
; This function is an example of a callback_function for the
; spdfGetData function.
;
; @param statusInfo {in} {type=strarr}
; @param progressInfo {in} {type=lon64arr}
; @param callbackData {in} {type=reference}
; @returns a continue flag. A return value of zero indicates that
; the operation should be cancelled. A return value of one
; indicates that the operation should continue.
;-
function SpdfGetDataCallback, $
statusInfo, progressInfo, callbackData
compile_opt idl2
print, 'spdfGetDataCallback: statusInfo:', statusInfo
if progressInfo[0] eq 1 then begin
percentComplete = $
double(progressInfo[2]) / progressInfo[1] * 100.0
print, progressinfo[2], progressInfo[1], percentComplete, $
format='(%"spdfGetDataCallback: (%d) bytes of (%d) complete (%f%%)")'
endif
return, 1
end
;+
; This function gets data from <a href="https://www.nasa.gov/">NASA</a>'s
; <a href="https://spdf.gsfc.nasa.gov/">Space Physics Data Facility</a>
; <a href="https://cdaweb.gsfc.nasa.gov/">Coordinated Data Analysis
; System</a> and returns it in a
; <a href="https://spdf.gsfc.nasa.gov/CDAWlib.html">CDAWlib</a>
; structure..
; <br>
; Notes: <ul>
; <li>If any one of the <code>binInterval, binInterpolateMissingValues,
; binSigmaMultiplier, or binOverrideDefaultBinning</code> keyword
; parameters is set,
; <a href="https://cdaweb.gsfc.nasa.gov/CDAWeb_Binning_readme.html">
; binning of the data</a>
; will be requested with the default values for any missing
; <code>bin*</code> keyword values. If no <code>bin*</code> keyword
; parameters are set, binning of the data will not be requested.</li>
; <li>A few datasets in CDAS contain variables with names that cannot
; be used as tag names an IDL structure. In those cases, the
; tag name in this structure will be a modification of the
; actual CDF variable name. For example, if you requested the
; 'H+' variable from the 'FA_K0_TMS' dataset, the 'H+' values
; will be returned in a structure under the tag name 'H$'.</li>
; </ul>
;
; @param dataset {in} {type=string}
; name of dataset to get data from.
; @param variables {in} {out} {type=strarr}
; On entry, names of variables whose values are to be gotten.
; If the first (only) name is "ALL-VARIABLES", then the
; resulting CDF will contain all variables.
; On exit, names of variables actually read (may be more
; than requested).
; @param timeSpans {in} {type=strarr(n, 2)}
; ISO 8601 format strings of the start and stop times of the
; data to get.
; @keyword binInterval {in} {optional} {type=double} {default=60.0D}
; binning interval (seconds).
; @keyword binInterpolateMissingValues {in} {optional} {type=byte}
; {default=1}
; flag indicating whether to interpolate missing values.
; @keyword binSigmaMultiplier {in} {optional} {type=int} {default=0}
; standard deviation multiplier used for rejecting data.
; @keyword binOverrideDefaultBinning {in} {optional} {type=byte}
; {default=0}
; flag indicating whether to override the default selection
; of variables to bin. 0 = use default selection (only
; variables with the ALLOW_BIN attribute set). 1 = bin
; additional variables beyond just those with the ALLOW_BIN
; attribute set.
; @keyword dataview {in} {optional} {type=string} {default='sp_phys'}
; name of dataview containing the dataset.
; @keyword endpoint {in} {optional} {type=string}
; {default='https://cdaweb.gsfc.nasa.gov/WS/cdasr/1'}
; URL of CDAS web service.
; @keyword keepfiles {in} {optional} {type=boolean} {default=false}
; The KEEPFILES keyword causes SpdfGetData to retain the
; downloaded data files. Normally these files are deleted
; after the data is read into the IDL environment.
; @keyword quiet {in} {optional} {type=boolean} {default=false}
; SpdfGetData normally prints an error message if no data is
; found. If QUIET is set, no error messages is printed.
; @keyword verbose {in} {optional} {type=boolean} {default=false}
; The VERBOSE keyword causes SpdfGetData to print additional
; status, debugging, and usage information.
; @keyword callback_function {in} {optional} {type=string}
; this keyword value is the name of the IDL function that
; is to be called during this retrieval operation. The
; callbacks provide feedback to the user about the ongoing
; operation, as well as provide a method to cancel an
; ongoing operation. If this keyword is not set, no
; callback to the caller is made. For information on
; creating a callback function, see "Using Callbacks with
; the IDLnetURL Object" in the IDL documentation.
; @keyword callback_data {in} {optional} {type=reference}
; this keyword value contains data that is passed to the
; caller when a callback is made. The data contained in
; this variable is defined and set by the caller. The
; variable is passed, unmodified, directly to the caller
; as a parameter in the callback function. If this keyword
; is not set, the corresponding callback parameter's value
; is undefined.
; @keyword sslVerifyPeer {in} {optional} {type=int}
; {default=spdfGetDefaultSslVerify()}
; Specifies whether the authenticity of the peer's SSL
; certificate should be verified. When 0, the connection
; succeeds regardless of what the peer SSL certificate
; contains.
; @returns structure containing requested data.
; @examples
; <pre>
; d = spdfgetdata('AC_H2_MFI', ['Magnitude', 'BGSEc'], $
; ['2013-01-01T00:00:00.000Z', '2013-01-03T00:00:00.000Z'], $
; /VERBOSE)
;
; The Epoch values are returned in d.epoch.dat
; The Magnitude values are in d.magnitude.dat
; The BGSEc values are in d.bgsec.dat
;
; To see further info. about each variable type
; help, /struct, d."variablename"
; To make a plot with the CDAWlib s/w type
; s = plotmaster(d, /AUTO, /CDAWEB, /GIF, /SMOOTH, /SLOW)
; </pre>
;-
function SpdfGetData, $
dataset, $
variables, $
timeSpans, $
binInterval = binInterval, $
binInterpolateMissingValues = binInterpolateMissingValues, $
binSigmaMultiplier = binSigmaMultiplier, $
binOverrideDefaultBinning = binOverrideDefaultBinning, $
dataview = dataview, $
endpoint = endpoint, $
keepfiles = keepfiles, $
quiet = quiet, $
verbose = verbose, $
callback_function = callback_function, $
callback_data = callback_data, $
sslVerifyPeer = sslVerifyPeer
compile_opt idl2
if ~obj_valid(httpErrorReporter) then begin
httpErrorReporter = obj_new('SpdfHttpErrorReporter')
endif
if ~keyword_set(dataview) then begin
dataview = 'sp_phys'
end
cdas = $
obj_new('SpdfCdas', $
endpoint = endpoint, $
userAgent = 'SpdfGetData', $
defaultDataview = dataview, $
sslVerifyPeer = sslVerifyPeer)
sizeTimeSpans = size(timeSpans)
if sizeTimeSpans[0] eq 1 and sizeTimeSpans[1] eq 2 then begin
timeIntervals = $
[obj_new('SpdfTimeInterval', timeSpans[0], timeSpans[1])]
endif else begin
if sizeTimeSpans[0] eq 2 then begin
timeIntervals = objarr(sizeTimeSpans[1])
for i = 0, sizeTimeSpans[1] - 1 do begin
timeIntervals[i] = $
obj_new('SpdfTimeInterval', $
timeSpans[0, i], timeSpans[1, i])
endfor
endif else begin
if ~keyword_set(quiet) then begin
print, 'Error: timeSpans parameter must be strarr(n, 2)'
print, 'Error: size(timeSpans) = ', sizeTimeSpans
endif
obj_destroy, cdas
return, obj_new()
endelse
endelse
if keyword_set(binInterval) or $
keyword_set(binInterpolateMissingValues) or $
keyword_set(binSigmaMultiplier) or $
keyword_set(binOverrideDefaultBinning) then begin
if ~keyword_set(binInterval) then binInterval = 60.0D
if ~keyword_set(binInterpolateMissingValues) then $
binInterpolateMissingValues = 1B
if ~keyword_set(binSigmaMultiplier) then binSigmaMultiplier = 0L
if ~keyword_set(binOverrideDefaultBinning) then binOverrideDefaultBinning = 0B
binData = obj_new('SpdfBinData', binInterval, $
binInterpolateMissingValues, binSigmaMultiplier, $
binOverrideDefaultBinning)
endif
data = cdas->getCdawlibData( $
timeIntervals, dataset, variables, $
binData = binData, $
httpErrorReporter = httpErrorReporter, $
keepfiles = keepfiles, $
quiet = quiet, $
verbose = verbose, $
callback_function = callback_function, $
callback_data = callback_data)
obj_destroy, timeIntervals
obj_destroy, cdas
if keyword_set(verbose) then begin
print, 'Data values are returned in the data structure in each variables .dat tag member. '
print, ' '
print, "For example - for the call d = spdfgetdata('AC_H2_MFI', ['Magnitude', 'BGSEc'], ['2013-01-01T00:00:00.000Z', '2013-01-03T00:00:00.000Z'])"
print, ' '
print, 'The Epoch values are returned in d.epoch.dat'
print, 'the Magnitude values are in d.magnitude.dat'
print, 'and the BGSEc values are in d.bgsec.dat'
print, ' '
print, 'To see further info. about each variable type help, /struct, d."variablename"'
print, 'To make a plot with the CDAWlib s/w type s = plotmaster(d, /AUTO, /CDAWEB, /GIF, /SMOOTH, /SLOW)
endif
return, data
end