PRO eldatacombine, $
                   DATA=data0, $
                   COMBINE=combine0, $
                   CDATA=cdata, $
                   CTYPE=ctype, $
                   SEPARATOR=separator, $
                   SORT=sort, $
                   LOGARITHMIC=logarithmic

@compile_opt

;make local copy
IF N_ELEMENTS(data0) NE 0 THEN data=data0

elmax=83

IF N_ELEMENTS(sort) EQ 0 THEN sort=1
IF N_ELEMENTS(logarithmic) EQ 0 THEN logarithmic=-1
IF logarithmic EQ -1 THEN STOP

; nothing will happen if combine is not defined.
ncdata=N_ELEMENTS(combine0)
ndata=N_ELEMENTS(data)
nxdata=ncdata+ndata
IF nxdata EQ 0 THEN RETURN

cdata=REPLICATE({ $
                  z:0.0D0, $
                  sigma:0.0D0, $
                  abu:0.0D0, $
                  el:'', $
                  iscomb:0, $
                  ncomb:0, $
                  fcomb:DBLARR(elmax), $
                  zcomb:INTARR(elmax), $
                  elcomb:STRARR(elmax) $
                }, nxdata)

IF ncdata GT 0 THEN BEGIN
@solabu_var
    IF N_ELEMENTS(separator) EQ 0 THEN separator=''
;make local copy
    combine=REPLICATE({z:INTARR(elmax),el:strarr(elmax),name:''},ncdata)
    keep=REPLICATE(1,ndata)
    n=N_TAGS(combine[0])
    names=TAG_NAMES(combine0[0])
    x=WHERE(names EQ 'NAME')
    IF x[0] NE -1 THEN BEGIN
        combine[*].name=combine0[*].name
    ENDIF
    x=WHERE(names EQ 'Z')
    IF x[0] NE -1 THEN BEGIN
        FOR i=0,ncdata-1 DO BEGIN
            x=WHERE(combine0[i].z NE 0)
            nx=N_ELEMENTS(x)
            combine[i].z[0:nx-1]=combine0[i].z[x]
            combine[i].el[0:nx-1]=elsym(combine[i].z[0:nx-1])
        ENDFOR
    ENDIF ELSE BEGIN
        FOR i=0,ncdata-1 DO BEGIN
            x=WHERE(combine0[i].el NE '')
            nx=N_ELEMENTS(x)
            combine[i].el[0:nx-1]=combine0[i].el[x]
            combine[i].z[0:nx-1]=el2z(combine[i].el[0:nx-1])
        ENDFOR
    ENDELSE
    cdata[*].el=combine[*].name

; need to specify ctype explicitly to ensure this is used correctly
    IF N_ELEMENTS(ctype) EQ 0 THEN ctype=''
    FOR i=0, ncdata-1 DO BEGIN
        makename=0
        IF separator NE '' THEN cdata[i].el=''            
        IF cdata[i].el EQ '' THEN makename=1
        x=WHERE(combine[i].z NE 0)
        IF x[0] EQ -1 THEN BEGIN 
            nc=0
        ENDIF ELSE BEGIN
            nc=N_ELEMENTS(x)
            combine[i].z[0:nc-1]=combine[i].z[x]
        ENDELSE
        z_average=DOUBLE(TOTAL(combine[i].z[0:nc-1]))/nc
        sigma_sum2=0
        data_combine=0.0D0
        norm_combine=0.0D0
        sigma_sign=1
        FOR j=0,nc-1 DO BEGIN            
            jz=combine[i].z[j]
            x=WHERE(data.z EQ jz)
            jj=x[0]
            IF jj EQ -1 THEN BEGIN
                PRINT,' [ABUNDATAPLOT] COMBINE ERROR element '+STRTRIM(STRING(jz),2)+' not found.'
                STOP    
            ENDIF
            IF keep[jj] EQ 0 THEN BEGIN
                PRINT,' [ABUNDATAPLOT] COMBINE ERROR element used twice.'
                STOP    
            ENDIF
            ;; IF j EQ 0 THEN BEGIN
            ;;     sigma_sign=sgn(data[jj].sigma)
            ;; ENDIF ELSE BEGIN
            ;;     IF sigma_sign NE sgn(data[jj].sigma) THEN BEGIN
            ;;         PRINT,' [ABUNDATAPLOT] COMBINE ERROR in sigma signs.'
            ;;         STOP
            ;;     ENDIF
            ;; ENDELSE
            IF sgn(data[jj].sigma) LT 1 THEN BEGIN
               sigma_sign = -1
            ENDIF
            y=data[jj].abu
            s=ABS(data[jj].sigma)
            IF logarithmic EQ 1 THEN BEGIN
                y=10.D0^y
                s=(10.D0^s-1.D0)*y
            ENDIF
            CASE ctype OF
                'pf': BEGIN
; pf normalization
                    x=WHERE(sol_el_z EQ jz)
                    js=x[0]
                    sj=sol_el_mol[js]
                    norm_combine+=sj
                    data_combine+=sj*y
                    cdata[i].fcomb[j]=sj
                    sigma_sum2+=(s*sj)^2
                END
                'y': BEGIN
; number fraction normalization (sum)
                    norm_combine=1.D0        
                    data_combine+=y
                    cdata[i].fcomb[j]=1.D0
                    sigma_sum2+=s^2
                END
                ELSE: STOP
            ENDCASE
            cdata[i].zcomb[j]=jz
            cdata[i].elcomb[j]=elsym(jz)
            IF makename EQ 1 THEN BEGIN 
                IF cdata[i].el NE '' THEN cdata[i].el+=separator
                cdata[i].el+=elsym(jz)
            ENDIF
            keep[jj]=0
        ENDFOR
        cdata[i].abu=data_combine/norm_combine
        cdata[i].z=z_average
        cdata[i].sigma=SQRT(sigma_sum2)/norm_combine
        cdata[i].iscomb=1
        cdata[i].ncomb=nc
        cdata[i].fcomb/=norm_combine
        IF logarithmic EQ 1 THEN BEGIN
            cdata[i].sigma=ALOG10(cdata[i].sigma/cdata[i].abu+1.D0)
            cdata[i].abu=ALOG10(cdata[i].abu)
        ENDIF
        cdata[i].sigma*=sigma_sign
    ENDFOR
    x=WHERE(keep EQ 1)
    IF x[0] NE -1 THEN BEGIN 
        data=data[x]
    ENDIF ELSE BEGIN
        clear,data
    ENDELSE
    ndata=N_ELEMENTS(data)
ENDIF

FOR i=0,ndata-1 DO BEGIN
    j=ncdata+i
    cdata[j].z=data[i].z
    cdata[j].abu=data[i].abu
    cdata[j].sigma=data[i].sigma
    cdata[j].el=data[i].el
ENDFOR
ncdata+=ndata
cdata=cdata[0:ncdata-1]

IF sort mod 2 NE 0 THEN BEGIN
    x=SORT(cdata.z)
    IF N_ELEMENTS(x) NE ncdata THEN BEGIN
        PRINT,' [ABUNDATAPLOT] something is odd here.'
        STOP
    ENDIF
    cdata=cdata[x]
ENDIF
IF sort mod 4 GE 2 THEN BEGIN
    x0=WHERE(cdata.iscomb EQ 0)
    x1=WHERE(cdata.iscomb EQ 1)
    x=[x0,x1]
    x1=WHERE(x NE -1)
    x=x[x1]
    cdata=cdata[x]
ENDIF


END
