function omni4d,inpdat,bins=bins,mass=mass
dat = inpdat
units = dat.units_name
if size(/type,dat) ne 8 then return,0
if dat.valid eq 0 then return,{valid:0}
if dat.nmass eq 1 and dat.nbins eq 1 then return,dat
tags = ['project_name','spacecraft','data_name','apid','units_name','units_procedure','valid','quality_flag', $
'time','end_time', 'delta_t', 'integ_t', $
'md', 'mode', 'rate', 'swp_ind', 'mlut', 'att', $
'nenergy', 'nbins', 'ndef' ,'nanode', 'geom_factor', 'nmass', 'mass', $
'charge', 'sc_pot',$
'magf','quat_sc','quat_mso','pos_sc_mso']
extract_tags,omni,dat,tags=tags
omni.nbins = 1
if keyword_set(bins) eq 0 then bins = replicate(1b,dat.nbins)
ind = where(bins,count)
if count eq 0 then return,omni
norm = count
str_element,/add,omni, 'theta',0.
str_element,/add,omni, 'dtheta',90.
str_element,/add,omni, 'phi',0.
str_element,/add,omni, 'dphi',360.
str_element,/add,omni, 'domega',2.^.5*2.*!pi
if keyword_set(mass) then omni.nmass = dat.nmass else omni.nmass = 1
if omni.nmass eq 1 then begin
if dat.apid eq 'C8' then str_element,/add,omni,'mass_arr',min(dat.mass_arr) else str_element,/add,omni,'mass_arr',1.
if ndimen(dat.data) eq 2 and dat.nbins gt 1 then begin
str_element,/add,omni, 'denergy' ,reform(dat.denergy[*,0])
str_element,/add,omni, 'energy' ,reform(dat.energy[*,0])
str_element,/add,omni, 'bins' ,1
str_element,/add,omni, 'bins_sc' ,1
str_element,/add,omni, 'data' ,total(dat.data[*,ind],2)
str_element,/add,omni, 'bkg' ,total(dat.bkg[*,ind],2)
str_element,/add,omni, 'gf' ,total(dat.gf[*,ind],2)
str_element,/add,omni, 'eff' ,total(dat.eff[*,ind],2)/norm
str_element,/add,omni, 'dead' ,total(dat.dead[*,ind]*dat.dead[*,ind],2)/total(dat.dead[*,ind],2)
endif else if ndimen(dat.data) eq 2 and dat.nbins eq 1 then begin
str_element,/add,omni, 'denergy' ,reform(dat.denergy[*,0])
str_element,/add,omni, 'energy' ,reform(dat.energy[*,0])
str_element,/add,omni, 'bins' ,1
str_element,/add,omni, 'bins_sc' ,1
str_element,/add,omni, 'data' ,total(dat.data[*,*],2)
str_element,/add,omni, 'bkg' ,total(dat.bkg[*,*],2)
str_element,/add,omni, 'gf' ,total(dat.gf[*,*],2)/dat.nmass
str_element,/add,omni, 'eff' ,total(dat.eff[*,*],2)/dat.nmass
str_element,/add,omni, 'dead' ,reform(dat.dead[*,0])
endif else if ndimen(dat.data) eq 3 then begin
str_element,/add,omni, 'denergy' ,reform(dat.denergy[*,0,0])
str_element,/add,omni, 'energy' ,reform(dat.energy[*,0,0])
str_element,/add,omni, 'bins' ,1
str_element,/add,omni, 'bins_sc' ,1
str_element,/add,omni, 'data' ,total(total(dat.data[*,ind,*],3),2)
str_element,/add,omni, 'bkg' ,total(total(dat.bkg[*,ind,*],3),2)
str_element,/add,omni, 'gf' ,total(total(dat.gf[*,ind,*],3),2)/dat.nmass
str_element,/add,omni, 'eff' ,total(total(dat.eff[*,ind,*],3),2)/dat.nmass/norm
str_element,/add,omni, 'dead' ,reform(total(dat.dead[*,ind,0]*dat.dead[*,ind,0],2))/reform(total(dat.dead[*,ind,0],2))
endif
endif else begin
if ndimen(dat.data) eq 2 then begin
return,dat
endif else if ndimen(dat.data) eq 3 then begin
str_element,/add,omni, 'denergy' ,reform(dat.denergy[*,0,*],dat.nenergy,dat.nmass)
str_element,/add,omni, 'energy' ,reform(dat.energy[*,0,*],dat.nenergy,dat.nmass)
str_element,/add,omni, 'mass_arr',reform(dat.mass_arr[*,0,*],dat.nenergy,dat.nmass)
str_element,/add,omni, 'tof_arr' ,reform(dat.tof_arr[*,0,*],dat.nenergy,dat.nmass)
str_element,/add,omni, 'twt_arr' ,reform(dat.twt_arr[*,0,*],dat.nenergy,dat.nmass)
str_element,/add,omni, 'bins' ,1
str_element,/add,omni, 'bins_sc' ,1
str_element,/add,omni, 'data' ,total(dat.data[*,ind,*],2)
str_element,/add,omni, 'bkg' ,total(dat.bkg[*,ind,*],2)
str_element,/add,omni, 'gf' ,total(dat.gf[*,ind,*],2)
str_element,/add,omni, 'eff' ,total(dat.eff[*,ind,*],2)/dat.nbins
str_element,/add,omni, 'dead' ,total(dat.dead[*,ind,*]*dat.dead[*,ind,*],2)/total(dat.dead[*,ind,*],2)
endif
endelse
return,omni
end