def obj_func(xdict):
    global posdntr_opt
    global velodtr_opt

    param = xdict['param']
    funcs = {}

    coef0 = np.array([])
    coef1 = np.array([])
    coef2 = np.array([])
    coef3 = np.array([])
    coef4 = np.array([])
    coef5 = np.array([])
    coef6 = np.array([])
    coef7 = np.array([])
    coef8 = np.array([])

    k = 0
    for i in range(9):
        for j in range(10):
            exec('coef'+str(i)+'= np.append(coef'+str(i)+',param['+str(k)+'])')
            k += 1

    posdn = posdntr_opt[0,:]
    poslt = posdntr_opt[1,:]

    vel = _velcalcqme.sheet(xttr,ystr,posdn,poslt,coef0,coef1,coef2,coef3,coef4,coef5,coef6,coef7,coef8)
    error = np.sum((vel-velodtr_opt)**2)

    ##Print
    # print error

    funcs['obj'] = error

    fail = False

    return funcs, fail
def sheet(pos,param1,param2,param3,param4,param5,param6,param7,param8,param9,param10,param11,param12,param13,param14,param15,param16,param17,param18,param19,param20,param21,param22,param23,param24,param25,param26,param27,param28,param29,param30,param31,param32,param33,param34,param35,param36,param37,param38,param39,param40,param41,param42,param43,param44,param45,param46,param47,param48,param49,param50,param51,param52,param53,param54,param55,param56,param57,param58,param59,param60,param61,param62,param63,param64,param65,param66,param67,param68,param69,param70,param71,param72,param73,param74,param75,param76,param77,param78,param79,param80,param81,param82,param83,param84,param85,param86,param87,param88,param89,param90):
    global xttr
    global ystr

    global spr1_ord
    global pow1_ord
    global pow2_ord
    global pow3_ord
    global spr2_ord
    global skw_ord
    global scl1_ord
    global scl2_ord
    global scl3_ord


    coef0 = np.array([])
    coef1 = np.array([])
    coef2 = np.array([])
    coef3 = np.array([])
    coef4 = np.array([])
    coef5 = np.array([])
    coef6 = np.array([])
    coef7 = np.array([])
    coef8 = np.array([])

    k = 1
    for i in range(9):
        for j in range(10):
            exec('coef'+str(i)+'= np.append(coef'+str(i)+',param'+str(k)+')')
            k += 1

    posdn = pos[0,:]
    poslt = pos[1,:]

    # p00,p10,p01,p20,p11,p02,p30,p21,p12,p03
    if spr1_ord == 2:
        coef0[9] = 0.

    if pow1_ord == 1:
        coef1[3] = 0.
        coef1[6] = 0.
        coef1[7] = 0.
        coef1[8] = 0.
        coef1[9] = 0.
    elif pow1_ord == 2:
        coef1[6] = 0.
        coef1[7] = 0.
        coef1[8] = 0.
        coef1[9] = 0.

    if pow2_ord == 1:
        coef2[6] = 0.
        coef2[7] = 0.
        coef2[8] = 0.
        coef2[9] = 0.
    elif pow2_ord == 2:
        coef2[5] = 0.
        coef2[6] = 0.
        coef2[7] = 0.
        coef2[8] = 0.
        coef2[9] = 0.

    if pow3_ord == 1:
        coef3[9] = 0.

    if spr2_ord == 1:
        coef4[3] = 0.
        coef4[6] = 0.
        coef4[7] = 0.
        coef4[8] = 0.
        coef4[9] = 0.
    elif spr2_ord == 2:
        coef4[9] = 0.

    if skw_ord == 1:
        coef5[6] = 0.
    elif skw_ord == 2:
        coef5[9] = 0.

    if scl1_ord == 1:
        coef6[9] = 0.

    if scl2_ord == 1:
        coef7[9] = 0.

    if scl3_ord == 2:
        coef8[6] = 0.
        coef8[7] = 0.
        coef8[8] = 0.
        coef8[9] = 0.
    # p00,p10,p01,p20,p11,p02,p30,p21,p12,p03

    vel = _velcalcqme.sheet(xttr,ystr,posdn,poslt,coef0,coef1,coef2,coef3,coef4,coef5,coef6,coef7,coef8)
    # print vel

    ## Using Python instead of Fortran
    # vel = np.zeros_like(posdn)
    # for i in range(np.size(pos[0,:])):
    #     spr1 = overlay(xttr[i],ystr[i],coef0)
    #     pow1 = overlay(xttr[i],ystr[i],coef1)
    #     pow2 = overlay(xttr[i],ystr[i],coef2)
    #     pow3 = overlay(xttr[i],ystr[i],coef3)
    #     spr2 = overlay(xttr[i],ystr[i],coef4)
    #     skw = overlay(xttr[i],ystr[i],coef5)
    #     scl1 = overlay(xttr[i],ystr[i],coef6)
    #     scl2 = overlay(xttr[i],ystr[i],coef7)
    #     scl3 = overlay(xttr[i],ystr[i],coef8)
    #
    #
    #     vel[i] = veldist(posdn[i],poslt[i],spr1,pow1,pow2,pow3,spr2,skw,scl1,scl2,scl3)
    #     print i,'of (',np.size(posdn),')'

    # print vel

    return vel
    coef3 = np.array([])
    coef4 = np.array([])
    coef5 = np.array([])
    coef6 = np.array([])
    coef7 = np.array([])
    coef8 = np.array([])

    k = 0
    for i in range(9):
        for j in range(10):
            exec('coef'+str(i)+'= np.append(coef'+str(i)+',res[k])')
            k += 1


    if cv_on == 0:
        velc = _velcalcqme.sheet(xttr,ystr,posdntr[0,:],posdntr[1,:],coef0,coef1,coef2,coef3,coef4,coef5,coef6,coef7,coef8)
        velf = _velcalcqme.sheet(xtts,ysts,posdnts[0,:],posdnts[1,:],coef0,coef1,coef2,coef3,coef4,coef5,coef6,coef7,coef8)

        error_curve = np.sum((velc-velodtr)**2)
        error_cv = np.sum((velf-velodts)**2)

        print '\nCross Validation Error:',error_cv
        print 'Curve Fit Error:',error_curve

        print '\ncoef0 = np.array(',coef0.tolist(),')'
        print 'coef1 = np.array(',coef1.tolist(),')'
        print 'coef2 = np.array(',coef2.tolist(),')'
        print 'coef3 = np.array(',coef3.tolist(),')'
        print 'coef4 = np.array(',coef4.tolist(),')'
        print 'coef5 = np.array(',coef5.tolist(),')'
        print 'coef6 = np.array(',coef6.tolist(),')'