function sum4d, d1,d2
if size(/type,d1) ne 8 then return,d2
if d2.valid eq 0 then return,d1
if d1.valid eq 0 then return,d2
if d1.data_name ne d2.data_name or d1.mode ne d2.mode then begin
print,'Incompatible data types'
return,d2
endif
sum = d1
sum.data = sum.data+d2.data
sum.delta_t = d2.end_time - d1.time
sum.integ_t = d1.integ_t + d2.integ_t
sum.end_time = d1.end_time > d2.end_time
sum.time = d1.time < d2.time
sum.valid = d1.valid and d2.valid
value=0 & str_element,sum,'delta_t',value
if n_elements(value) gt 1 then sum.delta_t= (d1.delta_t + d2.delta_t)
value=0 & str_element,sum,'sc_pot',value
if n_elements(value) gt 1 then sum.sc_pot= (d1.sc_pot*d1.integ_t + d2.sc_pot*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'b_gse',value
if n_elements(value) gt 1 then sum.b_gse= (d1.b_gse*d1.integ_t + d2.b_gse*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'magf',value
if n_elements(value) gt 1 then sum.magf= (d1.magf*d1.integ_t + d2.magf*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'quat_sc',value
if n_elements(value) gt 1 then sum.quat_sc= (d1.quat_sc*d1.integ_t + d2.quat_sc*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'quat_mso',value
if n_elements(value) gt 1 then sum.quat_mso= (d1.quat_mso*d1.integ_t + d2.quat_mso*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'pos_sc_mso',value
if n_elements(value) gt 1 then sum.pos_sc_mso= (d1.pos_sc_mso*d1.integ_t + d2.pos_sc_mso*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'magf',value
if n_elements(value) gt 1 then sum.magf= (d1.magf*d1.integ_t + d2.magf*d2.integ_t)/sum.integ_t
value=0 & str_element,sum,'bkg',value
if n_elements(value) gt 1 then sum.bkg= (d1.bkg + d2.bkg)
value=0 & str_element,sum,'bins_sc',value
if n_elements(value) gt 1 then sum.bins_sc= (d1.bins_sc and d2.bins_sc)
value=0 & str_element,sum,'dead',value
if n_elements(value) gt 1 then sum.dead= (d1.integ_t*d1.dead^2 + d2.integ_t*d2.dead^2)/(d1.integ_t*d1.dead + d2.integ_t*d2.dead)
return, sum
end