;+
;Purpose: Helper function to access ESA common blocks and
; return array of indices for mode changes.
;
;Notes:
; When editing this code:
; -make sure calls to scope_varfetch do not copy
; unnecessary data (see IDL documentation)
;
;-
function thm_part_getmodechange_esa, probe, datatype, tindex
compile_opt idl2, hidden
;Determine common block & variable names
case datatype of
'peif': apid = '454'
'peir': apid = '455'
'peib': apid = '456'
'peef': apid = '457'
'peer': apid = '458'
'peeb': apid = '459'
else: begin
dprint, dlevel=0, 'Invalid data type: '+datatype
return, -1
end
endcase
common_name = 'th'+probe+'_'+apid
data_name = common_name + '_dat'
;Copy config bytes for time range
c1 = ( (scope_varfetch(data_name, common=common_name)).config1 )[tindex]
c2 = ( (scope_varfetch(data_name, common=common_name)).config2 )[tindex]
;Get indices of all mode changes
u1 = where(c1 ne shift(c1,1), n1)
u2 = where(c2 ne shift(c2,1), n1)
;Combine indices
;-if first and last mode are identical then the 0th index
; will not be counted, add it here just in case
;-account for negative output form where()
u = [0,u1,u2] > 0
u = u[ uniq(u, sort(u)) ]
return, u
end
;+
;Purpose: Helper function to access SST common block and
; return array of indices for mode changes.
;
;Notes:
; When editing this code:
; -make sure calls to scope_varfetch do not copy
; unnecessary data (see IDL documentation)
; -make sure not to free pointers copied from the
; common block
;
;-
function thm_part_getmodechange_SST, probe, datatype, tindex
compile_opt idl2, hidden
common_name = 'data_cache_com'
data_name = 'dcache'
;Get index to sst data structure in common block
names = (scope_varfetch(data_name, common=common_name)).name
idx = where(names eq 'th'+probe+'_sst_raw_data',nm)
if nm lt 1 then begin
dprint, dlevel=0, 'No SST data in common block for probe: '+probe
return, -1
endif
;Get pointer to loaded SST data
;DO NOT FREE THIS POINTER
ptr = ((scope_varfetch(data_name, common=common_name))[idx]).ptr
;Get config data for specified data type
case datatype of
'psif': c = ( *(*ptr).sif_064_cnfg )[tindex]
'psef': c = ( *(*ptr).sef_064_cnfg )[tindex]
'pseb': c = ( *(*ptr).seb_064_cnfg )[tindex]
'psir': begin
c1 = ( *(*ptr).sir_001_cnfg )[tindex]
c6 = ( *(*ptr).sir_006_cnfg )[tindex]
m = ( *(*ptr).sir_mix_mode )[tindex]
end
'pser': begin
c1 = ( *(*ptr).ser_001_cnfg )[tindex]
c6 = ( *(*ptr).ser_006_cnfg )[tindex]
m = ( *(*ptr).ser_mix_mode )[tindex]
end
else: begin
dprint, dlevel=0, 'Invalid data type: '+datatype
return, -1
end
endcase
;Account for mixed modes on reduced data
if keyword_set(m) then begin
;Get indicies for single/six angle modes
idx1 = where(m, n1, comp=idx6, ncomp=n6)
if n1+n6 ne n_elements(tindex) then begin
dprint, dlevel=0, 'Error determining SST reduced modes.'
return, -1
endif
;Create combined mode array
c = uintarr(n_elements(tindex), /nozero)
if n1 gt 0 then c[idx1] = c1[idx1]
if n6 gt 0 then c[idx6] = c6[idx6]
endif
;Get indices for all mode changes
u1 = where(c ne shift(c,1))
u2 = keyword_set(m) ? where(m ne shift(m,1)):0
;Combine indices
;-if first and last mode are identical then the 0th index
; will not be counted, add it here just in case
;-account for negative output form where()
u = [0,u1,u2] > 0
u = u[ uniq(u, sort(u)) ]
return, u
end
;+
;Purpose: Helper function to access raw SST data stored in tplot
; variables and return array of indices for mode changes.
; Data loaded with thm_load_sst2 (/sst_cal keyword on higher
; level routines) is stored in tplot vars instead of the
; original common block.
;
;
;Notes:
;
;-
function thm_part_getmodechange_SST2, probe, datatype, tindex
compile_opt idl2, hidden
flag = 0ul-1 ;doubt this is a valid SST config
;Get top-level structure from tplot variable
name = 'th' + probe + '_' + datatype + '_data'
get_data, name, data=data
if ~is_struct(data) then begin
dprint, dlevel=0, 'No tplot variable for: ' + name
return, -1
end
;Get pointers to raw data structures
ptrs = data.mdistdat.distptrs
;Initialize array of config modes corresponding to
;the monotonic time array for the specified time range.
c = replicate(flag, n_elements(tindex))
;Loop over pointers and copy the config modes from each
;distribution into their appropriate place in the new
;config mode array.
for i=0, n_elements(ptrs)-1 do begin
if ~ptr_valid(ptrs[i]) then continue
;get indices of times where this distribution is used
idx = where( (data.y)[tindex] eq i, n)
;copy the config modes for this distribution
if n gt 0 then begin
c[idx] = ( ( *(*ptrs[i]).cnfg )[tindex] )[idx]
endif
endfor
;Check that all samples have a valid mode
dummy = where(c eq flag, nf)
if nf gt 0 then begin
dprint, dlevel=0, $
'Could not extract mode for all time samples from: '+name
return, -1
endif
;Get indices of mode changes
;-if first and last mode are identical then the 0th index
; will not be counted, add it here just in case
;-account for negative output form where()
u = where(c ne shift(c,1))
u = [0,u] > 0
u = u[ uniq(u, sort(u)) ]
return, u
end
;+
; Purpose:
; Access particle data common blocks to determine
; where mode changes occure and how many samples are
; in each configuration.
;
; Input:
; probe: String specifying the spacecraft (e.g. 'a','b',...)
; datatype: String specifying the type of data (e.g. 'peif')
; tindex: Array of indices specifying which samples are
; within the time range.
;
; Output:
; returned value: Array of indices correspinding to the first
; distribution for each new configuration.
; n: The total number of samples for each
; configuration.
;
; Usage:
; indices = thm_part_dist_array_getmodechange(probe='a', datatype='psif', $
; tindex=time_index_array, n=n)
;-
function thm_part_getmodechange, probe, $
datatype, $
tindex, $
sst_cal=sst_cal, $
n=n
compile_opt idl2, hidden
;Get config data out of appropriate common blocks
;The following routines will return arrays of indices
;to the first sample from each config mode.
if strmid(datatype,1,1) eq 'e' then begin
;ESA
u = thm_part_getmodechange_ESA( probe, datatype, tindex )
endif else begin
if keyword_set(sst_cal) then begin
;SST data loaded with thm_load_sst2
u = thm_part_getmodechange_SST2( probe, datatype, tindex )
endif else begin
;Original SST data
u = thm_part_getmodechange_SST( probe, datatype, tindex )
endelse
endelse
;an error occured
if u[0] eq -1 then begin
n = 0
return, u
endif
;get number of samples in each group
if n_elements(u) lt 2 then begin
n = n_elements(tindex) ;no mode changes
endif else begin
n = shift( [u,n_elements(tindex)], -1) - u
endelse
return, u
end