pro mvn_kp_bin, kp_data, to_bin, bin_by, output, std_out, binsize=binsize, list=list, avg_out=avg_out, mins=mins, maxs=maxs, $
std = std, density=density
if keyword_set(binsize) then begin
if n_elements(bin_by) ne n_elements(binsize) then begin
print,'The number of fields fields and BINNING fields do not match.'
return
endif
endif
MVN_KP_TAG_PARSER, kp_data, base_tag_count, first_level_count, second_level_count, base_tags, first_level_tags, second_level_tags
if arg_present(list) then begin
list = strarr(250)
index2=0
for i=0,base_tag_count-1 do begin
if first_level_count[i] ne 0 then begin
for j=0,first_level_count[i]-1 do begin
if first_level_count[i] ne 0 then begin
list[index2] = '#'+strtrim(string(index2+1),2)+' '+base_tags[i]+'.'+strtrim(string(first_level_tags[index2-1]),2)
index2 = index2+1
endif
endfor
endif
endfor
list = list[0:index2-1]
return
endif else begin
if keyword_set(list) then begin
MVN_KP_TAG_LIST, kp_data, base_tag_count, first_level_count, base_tags, first_level_tags
return
endif
endelse
total_fields = n_elements(bin_by)
level0_index = intarr(total_fields)
level1_index = intarr(total_fields)
for i=0, total_fields-1 do begin
mvn_kp_tag_verify, kp_data, bin_by[i], base_tag_count, first_level_count,base_tags,$
first_level_tags, check, l0, l1, tag_array
level0_index[i] = l0
level1_index[i] = l1
if check eq -1 then begin
print,'Requested bin parameter '+strtrim(string(bin_by[i]),2)+' is not included in the data structure.'
print,'Use the /LIST flag to check your structure for valid parameter names.'
return
endif
endfor
if keyword_set(mins) ne 1 then begin
mins = dblarr(total_fields)
for i=0,total_fields-1 do begin
mins[i] = min(kp_data.(level0_index[i]).(level1_index[i]))
endfor
endif else begin
if n_elements(mins) ne total_fields then begin
print,'The minimum value array must have the same number of elements as the bin array'
return
endif
endelse
if keyword_set(maxs) ne 1 then begin
maxs = dblarr(total_fields)
for i=0, total_fields-1 do begin
maxs[i] = max(kp_data.(level0_index[i]).(level1_index[i]))
endfor
endif else begin
if n_elements(maxs) ne total_fields then begin
print,'The maximum value array must have the same number of elements as the bin array'
return
endif
endelse
ranges = dblarr(total_fields)
total_bins = intarr(total_fields)
for i=0, total_fields -1 do begin
ranges[i] = maxs[i] - mins[i]
total_bins[i] = ceil(ranges[i]/binsize[i])
endfor
mvn_kp_tag_verify, kp_data, to_bin, base_tag_count, first_level_count,base_tags,$
first_level_tags, check, input_level0, input_level1, tag_array
output = make_array(total_bins+1,/double)
density = make_array(total_bins+1,/double)
index = intarr(total_fields+1)
for i=0, n_elements(kp_data) -1 do begin
for j=0, total_fields-1 do begin
data_value = kp_data[i].(level0_index[j]).(level1_index[j])
dv = floor((data_value - mins[j])/binsize[j])
index[j] = dv
endfor
case total_fields of
1: begin
output[index[0]] = output[index[0]] + kp_data[i].(input_level0).(input_level1)
density[index[0]] = density[index[0]] + 1
end
2: begin
output[index[0],index[1]] = output[index[0],index[1]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1]] = density[index[0],index[1]] + 1
end
3: begin
output[index[0],index[1],index[2]] = output[index[0],index[1],index[2]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2]] = density[index[0],index[1],index[2]] + 1
end
4: begin
output[index[0],index[1],index[2],index[3]] = output[index[0],index[1],index[2],index[3]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2],index[3]] = density[index[0],index[1],index[2],index[3]] + 1
end
5: begin
output[index[0],index[1],index[2],index[3],index[4]] = output[index[0],index[1],index[2],index[3],index[4]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2],index[3],index[4]] = density[index[0],index[1],index[2],index[3],index[4]] + 1
end
6: begin
output[index[0],index[1],index[2],index[3],index[4],index[5]] = output[index[0],index[1],index[2],index[3],index[4],index[5]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2],index[3],index[4],index[5]] = density[index[0],index[1],index[2],index[3],index[4],index[5]] + 1
end
7: begin
output[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] = output[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] = density[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] + 1
end
8: begin
output[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] = output[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] + kp_data[i].(input_level0).(input_level1)
density[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] = density[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] + 1
end
endcase
endfor
if keyword_set(avg_out) then begin
average_out= output/density
endif
if keyword_set(std) then begin
if keyword_set(avg_out) ne 1 then begin
average_out= output/density
endif
std_out = make_array(total_bins,/double)
for i=0, n_elements(kp_data) -1 do begin
for j=0, total_fields-1 do begin
data_value = kp_data[i].(level0_index[j]).(level1_index[j])
dv = floor((data_value - mins[j])/binsize[j])
index[j] = dv
endfor
case total_fields of
1: begin
std_out[index[0]] = std_out[index[0]] + (kp_data[i].(input_level0).(input_level1) - average_out[index[0]])^2
end
2: begin
std_out[index[0],index[1]] = std_out[index[0],index[1]] + (kp_data[i].(input_level0).(input_level1) - average_out[index[0],index[1]])^2
end
3: begin
std_out[index[0],index[1],index[2]] = std_out[index[0],index[1],index[2]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2]])^2
end
4: begin
std_out[index[0],index[1],index[2],index[3]] = std_out[index[0],index[1],index[2],index[3]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2],index[3]])^2
end
5: begin
std_out[index[0],index[1],index[2],index[3],index[4]] = std_out[index[0],index[1],index[2],index[3],index[4]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2],index[3],index[4]])^2
end
6: begin
std_out[index[0],index[1],index[2],index[3],index[4],index[5]] = std_out[index[0],index[1],index[2],index[3],index[4],index[5]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2],index[3],index[4],index[5]])^2
end
7: begin
std_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] = std_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6]])^2
end
8: begin
std_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] = std_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]] + (kp_data[i].(input_level0).(input_level1) - $
average_out[index[0],index[1],index[2],index[3],index[4],index[5],index[6],index[7]])^2
end
endcase
endfor
std_out = sqrt(std_out/density)
endif
end