function comp_kcorr, mags_sdssukidss, z, errmags=errmags, bands=bands, $
    modflux_z=modflux_z, modflux_0=modflux_0, verbose=verbose, bestmatch=bestmatch, chi2=min_chi2_w
common data_kcorr, peggrid_allz, wl, peggrid_z, peggrid_tmp
common data_kcorr_pars, agegrid, metgrid, val_AV

s_pg = size(peggrid_allz)
if(s_pg[0] eq 0) then begin
    peggrid_allz_tmp=readfits('PEGASE/SSP_MilSc_SDSSUKIDSS_z_col.fits')
    kk=mrdfits('PEGASE/SSP_MilSc_SDSSUKIDSS_z_col.fits',1)
    wl=kk.wave
;    g_idx=[range(0,34),$
;           round((10^(alog10(18000.0)-1.0+0.02*findgen(50))-25.0)/50.0)]
    g_idx=[range(0,16),18+indgen(8)*2,$
           round((10^(alog10(18000.0)-1.0+0.04*findgen(25))-25.0)/50.0)]
    s_pgtmp=size(peggrid_allz_tmp)
    n_gidx=n_elements(g_idx)
    agegrid=(25.0+findgen(s_pgtmp[2])*50.0)[g_idx]
    metgrid=[-2.5, -2.0, -1.5, -1.0, -0.5, -0.3, 0.0, +0.3, +0.5, +1.0]
    ;;; converting to F_nu
    for i=0,n_elements(wl)-1 do $
        peggrid_allz_tmp[i,*,*,*]=peggrid_allz_tmp[i,*,*,*]*wl[i]^2


    ;;; extinction business
    ;val_AV=[0.0, 0.1, 0.3, 0.6, 1.0]
    val_AV=findgen(16)*0.15
    n_ext=n_elements(val_AV)
    peggrid_allz=fltarr(s_pgtmp[1],n_gidx*n_ext,s_pgtmp[3],s_pgtmp[4])
    peggrid_allz[*,0:n_gidx-1,*,*]=peggrid_allz_tmp[*,g_idx,*,*]
    for z=0,s_pgtmp[4]-1 do begin
        z_cur=0.05*z
        R_ext=3.1
        fmrcurve,1.0/(wl/(1.0+z_cur)/1e+4),R_ext,ext_wl
        ext_wl=(ext_wl+R_ext)/R_ext
        for i=1,n_ext-1 do begin
            ext_vec=10^(0.4*ext_wl*val_AV[i])
            ;oplot,ext_wl,ext_vec,psym=-4
            ;print,ext_wl,ext_wl*val_AV[i]
            for j=0,n_gidx-1 do begin
                for k=0,s_pgtmp[1]-1 do begin
                    for l=0,s_pgtmp[3]-1 do begin
                        peggrid_allz[k,j+i*n_gidx,l,z]=$
                            peggrid_allz[k,j,l,z]/ext_vec[k]
                    endfor
                endfor
            endfor
        endfor
    endfor

    peggrid_z = peggrid_allz[*,*,*,0]
    peggrid_tmp = peggrid_z
endif
s_pg = size(peggrid_allz)
if(n_elements(bands) eq 0) then bands=findgen(n_elements(wl))
n_wl = s_pg[1]
n_age = s_pg[2]
n_met = s_pg[3]
n_z = s_pg[4]

imin= ( 0 > fix(z/0.05) < (n_z-1) )
imax= ( imin+1 < (n_z-1) )

if(imax eq imin) then begin
    peggrid_z[*,*,*]=peggrid_allz[*,*,*,n_z-1]
endif else begin 
    wei = (z*20.0 - double(imin))
    peggrid_z[*,*,*]=peggrid_allz[*,*,*,imin]*(1.-wei) + $
                     peggrid_allz[*,*,*,imax]*wei
endelse

peggrid_w = total(peggrid_z[bands,*,*],1)/n_elements(bands)
for i=0,n_wl-1 do $
    peggrid_tmp[i,*,*]=peggrid_z[i,*,*]/reform(peggrid_w,1,n_age,n_met)

fluxes = 10^(0.4*(20.0-mags_sdssukidss))
mfl=mean(fluxes[bands])
fluxes = fluxes/mfl
fluxes_cube = congrid(reform(fluxes,n_wl,1,1),n_wl,n_age,n_met)
fluxes_cube_err = fluxes_cube
if(n_elements(errmags) ne n_elements(fluxes)) then errmags=fluxes*0.0+0.01
for i=0,n_wl-1 do $
    fluxes_cube_err[i,*,*]=fluxes_cube[i,*,*]*errmags[i]

;;;chi2_w = total((fluxes_cube[bands,*,*] - peggrid_tmp[bands,*,*])^2.0,1)
chi2_w = total(((fluxes_cube[bands,*,*] - peggrid_tmp[bands,*,*])/fluxes_cube_err[bands,*,*])^2.0,1)
min_chi2_w = min(chi2_w, idx)/n_elements(bands)
idx_2d = array_indices(chi2_w, idx)
bestmatch=[agegrid[idx_2d[0] mod n_elements(agegrid)],metgrid[idx_2d[1]],val_AV[fix(idx_2d[0]/n_elements(agegrid))]]
if(keyword_set(verbose)) then begin
    print,'best match: chi2=',min_chi2_w
    print,'age, met, A_V:',bestmatch
endif
kcorr = -2.5*alog10(peggrid_z[*,idx_2d[0],idx_2d[1]]/peggrid_allz[*,idx_2d[0],idx_2d[1],0])
modflux_z=peggrid_tmp[*,idx_2d[0],idx_2d[1]]*mfl
modflux_0=modflux_z*(peggrid_z[*,idx_2d[0],idx_2d[1]]/peggrid_allz[*,idx_2d[0],idx_2d[1],0])
;print,'kcorr = ',kcorr,size(kcorr)
;read,aaa
return, kcorr

end
