[1053] | 1 | #! /usr/bin/env python |
---|
| 2 | import matplotlib.pyplot as mpl |
---|
| 3 | import ppplot |
---|
| 4 | import numpy as np |
---|
| 5 | import scipy.optimize as sciopt |
---|
| 6 | |
---|
| 7 | # -- functions for fitting |
---|
| 8 | # -- http://wiki.scipy.org/Cookbook/FittingData |
---|
| 9 | # power law |
---|
| 10 | def fitfunc(x,a,b): return a*(x**(-b)) |
---|
| 11 | # power law + constant |
---|
| 12 | def fitfunc3(x,a,b,c): return a*(x**(-b)) + c * (x**(-0.5)) |
---|
| 13 | # exponential law |
---|
| 14 | def fitfunc2(x,a,b): return a*np.exp(-b*x) |
---|
| 15 | |
---|
| 16 | ################################################################################ |
---|
[1197] | 17 | ### HISTODD |
---|
| 18 | ### namefile: text file to be analyzed |
---|
| 19 | ### drop: look at size (False) or pressure drop (True) |
---|
| 20 | ### typefit: use fitfunc above 1, 2, or 3 |
---|
| 21 | ### nbins: bins (we expect fit do not depend too much on this -- to be checked) |
---|
| 22 | ### limrest: restrict limit (multiple of dx) -- greater equal |
---|
| 23 | ### addtitle: add a name for the examined case |
---|
[1053] | 24 | ################################################################################ |
---|
[1197] | 25 | def histodd(namefile,drop=False,typefit=1,nbins=12,limrest=4,addtitle=""): |
---|
[1053] | 26 | |
---|
[1197] | 27 | # width adapted to number of bins |
---|
| 28 | widthbin = {7:3.,10:2.5,12:2.2,15:2.0,20:1.75,30:1.5,50:1.2} |
---|
| 29 | www = widthbin[nbins] |
---|
| 30 | |
---|
| 31 | # load data |
---|
| 32 | data = np.loadtxt(namefile,delimiter=";") |
---|
| 33 | t = data[:,0] ; s = data[:,1] ; d = data[:,2] |
---|
| 34 | i = data[:,3] ; j = data[:,4] # int? |
---|
| 35 | |
---|
| 36 | # a way to guess resolution |
---|
| 37 | dx = np.min(s)/2. |
---|
| 38 | |
---|
| 39 | # choose a variable |
---|
| 40 | if drop: var = d |
---|
| 41 | else: var = s |
---|
| 42 | |
---|
| 43 | # restrictions |
---|
| 44 | restrict = (s > 0) # initialization (True everywhere) |
---|
| 45 | restrict = restrict*(s >= limrest*dx) # remove lowest sizes (detection limit) |
---|
| 46 | restrict = restrict*(np.abs(i-j) <= 6.*dx) # condition sur i,j (width,height) pour ~round shape |
---|
| 47 | #restrict = restrict*(d > 0.9) # limit on drop for size |
---|
| 48 | # (casse la power law? seulement si keep smaller devils) |
---|
| 49 | #restrict = restrict*(d > 0.5) |
---|
| 50 | #restrict = restrict*(d > 0.3) |
---|
| 51 | poum=False |
---|
| 52 | if poum: |
---|
| 53 | out = var[np.logical_not(restrict)] |
---|
| 54 | outi = i[np.logical_not(restrict)] |
---|
| 55 | outj = j[np.logical_not(restrict)] |
---|
| 56 | print out, outi, outj |
---|
| 57 | print out.size |
---|
| 58 | var = var[restrict] |
---|
| 59 | |
---|
| 60 | ## define bins |
---|
| 61 | zebins = [np.min(var)] |
---|
| 62 | for i in range(0,nbins): zebins.append(zebins[i]*(www**0.5)) |
---|
| 63 | zebins = np.array(zebins) |
---|
| 64 | middle = 0.5*(zebins[1:] + zebins[:-1]) |
---|
| 65 | binwidth = zebins[1:] - zebins[:-1] |
---|
| 66 | total = var.shape[0] |
---|
| 67 | |
---|
| 68 | # plot histogram |
---|
| 69 | yeah = mpl.hist(var,log=True,bins=zebins,normed=True,color='white') ; mpl.xscale('log') |
---|
| 70 | #yeah = mpl.hist(var,bins=zebins,normed=True,color='white') |
---|
| 71 | |
---|
| 72 | # add error bars |
---|
| 73 | incertitude_nvortex = 10. |
---|
| 74 | if not drop: |
---|
| 75 | err = incertitude_nvortex/(yeah[0]*binwidth*total+0.0001) |
---|
| 76 | ind = err < 1000. ; err = err[ind] ; y = yeah[0][ind] ; x = middle[ind] |
---|
| 77 | err = y*err |
---|
| 78 | mpl.errorbar(x,y,yerr=[err,err],fmt='k.') |
---|
| 79 | |
---|
| 80 | ## print info |
---|
| 81 | #print "min %5.2e // max %5.2e" % (np.min(var),np.max(var)) |
---|
| 82 | #for iii in range(len(zebins)-1): |
---|
| 83 | # this = zebins[iii] ; next = zebins[iii+1] |
---|
| 84 | # print "%5.2e in [%5.0f %5.0f] %5.0f" % (yeah[0][iii],this,next,np.abs(next-this)) |
---|
| 85 | |
---|
| 86 | # fitting function to superimpose |
---|
| 87 | if typefit == 1: xx = sciopt.curve_fit(fitfunc, middle, yeah[0]) |
---|
| 88 | elif typefit == 2: xx = sciopt.curve_fit(fitfunc2, middle, yeah[0]) |
---|
| 89 | elif typefit == 3: xx = sciopt.curve_fit(fitfunc3, middle, yeah[0]) |
---|
| 90 | print "exponent",xx[0][1],"variance %",100.*xx[1][1][1]/xx[0][1] |
---|
| 91 | |
---|
| 92 | # label |
---|
| 93 | lablab = r"$\alpha=$%4.1f"%(xx[0][1]) |
---|
| 94 | titi = addtitle+"LES "+str(int(dx))+"m. "+str(total)+" detected vortices" |
---|
| 95 | |
---|
| 96 | # plot obtained fit along with actual points |
---|
| 97 | if typefit == 1: func = fitfunc(middle,xx[0][0],xx[0][1]) |
---|
| 98 | elif typefit == 2: func = fitfunc2(middle,xx[0][0],xx[0][1]) |
---|
| 99 | elif typefit == 3: func = fitfunc3(middle,xx[0][0],xx[0][1],xx[0][2]) |
---|
| 100 | func[func<0]=np.nan |
---|
| 101 | ind = yeah[0]>0 |
---|
| 102 | mpl.plot(middle[ind],yeah[0][ind],'k.') |
---|
| 103 | mpl.plot(middle[ind],func[ind],'r-',label=lablab) |
---|
| 104 | mpl.plot(middle[ind],func[ind],'r.') |
---|
| 105 | |
---|
| 106 | # display bin limits |
---|
| 107 | tata = '[bins:' |
---|
| 108 | yorgl = ind[np.where(ind)].size + 1 # to add the last limit |
---|
| 109 | for el in zebins[0:yorgl]: |
---|
| 110 | tata = tata + "%0.f "%(el) |
---|
| 111 | tata=tata+']' |
---|
| 112 | |
---|
| 113 | # print fit vs. actual populations |
---|
| 114 | fit = func*binwidth*total |
---|
| 115 | pop = yeah[0]*binwidth*total |
---|
| 116 | for iii in range(len(fit)): |
---|
| 117 | if fit[iii] > 0.99 or pop[iii] != 0: |
---|
| 118 | yorgl = 100.*np.abs(fit[iii]-pop[iii])/fit[iii] |
---|
| 119 | yargl = 100.*incertitude_nvortex/fit[iii] |
---|
| 120 | print "fit %4.0f real %4.0f pc %3.0f ipc %3.0f" % (fit[iii],pop[iii],yorgl,yargl) |
---|
| 121 | |
---|
| 122 | # plot settings |
---|
| 123 | ax = mpl.gca() ; ax.set_xbound(lower=np.min(zebins),upper=np.max(zebins)) |
---|
| 124 | if drop: |
---|
| 125 | mpl.xlabel("Pressure drop (Pa)") |
---|
| 126 | ax.set_xbound(lower=1.e-1,upper=10.) |
---|
| 127 | else: |
---|
| 128 | mpl.xlabel("Vortex size (m)") |
---|
| 129 | #ax.set_xbound(lower=30.,upper=3000.) |
---|
| 130 | ax.set_xbound(lower=30.,upper=1000.) |
---|
| 131 | ax.set_ybound(lower=5.e-6,upper=5.e-2) |
---|
| 132 | mpl.ylabel('Population density $n / N w_{bin}$') |
---|
| 133 | #mpl.title(titi+'\n '+tata) |
---|
| 134 | mpl.title(titi) |
---|
| 135 | mpl.legend(loc="upper right",fancybox=True) |
---|
| 136 | |
---|
| 137 | # show plot and end |
---|
| 138 | mpl.show() |
---|
[1053] | 139 | |
---|
[1197] | 140 | ################################################################################# |
---|
| 141 | ################################################################################# |
---|
| 142 | ################################################################################# |
---|
| 143 | # |
---|
| 144 | ### UNCOMMENT |
---|
| 145 | ###import plfit,plpva,plplot |
---|
| 146 | # |
---|
| 147 | ##[alpha, xmin, L] = plfit.plfit(var,'xmin',0.3) |
---|
| 148 | #[alpha, xmin, L] = plfit.plfit(var) |
---|
| 149 | #print alpha,xmin |
---|
| 150 | # |
---|
| 151 | ##a = plpva.plpva(var,0.75,'xmin',0.75) |
---|
| 152 | ##print a |
---|
| 153 | # |
---|
| 154 | # |
---|
| 155 | #h = plplot.plplot(var,xmin,alpha) |
---|
| 156 | # |
---|
| 157 | #ppplot.save(mode="png") |
---|
| 158 | # |
---|
| 159 | ##mpl.loglog(h[0], h[1], 'k--',linewidth=2) |
---|
| 160 | # |
---|
| 161 | ##mpl.show() |
---|
| 162 | # |
---|
| 163 | # |
---|
[1053] | 164 | |
---|