splitE=np.exp(np.linspace(np.log(ERange[0]),np.log(ERange[1]),n+1))[1:-1] splitE[1]=splitE[0]**(1-s**2)*splitE[3]**(s**2) splitE[2]=splitE[0]**(1-s**0.5)*splitE[3]**(s**0.5) print(splitE) conds.append(Flat(ERange,splitE=splitE).getCond(det)) print conds[-1] pl.subplot(111, xscale="linear", yscale="log") pl.plot(ss,conds) ''' spectrum=(CMSNeutrons.ERange, CMSNeutrons.fluence) #spectrum=((1e-11,1e0),lambda e:testSpectrum.fluence((1e-11,2e-1),1e-3,1.5,2,0.9,e)) errorEstimate=True print splitE model=Flat(ERange,splitE=splitE) resp=det(*spectrum) print('Expected detector responses:') for i in range(len(resp[0])): print((['No sphere']+milanoReference.names)[i]+' & %.1f'%resp[0][i]+' \\\\') if errorEstimate: guess=[] x=[] for i in range(50): r=(np.array(resp[0])+[np.random.normal()*ri for ri in resp[1]],resp[1]) x.append(unfold.unfold(det, r, model)) errors=np.std(x,axis=0) x=np.mean(x,axis=0)
import unfold import detector from spectrumModel import Flat, Linear import testSpectrum import CMSNeutrons import numpy as np #spectrum=(CMSNeutrons.ERange, CMSNeutrons.fluence) spectrum=((1e-11,1e0),lambda e:testSpectrum.fluence((1e-11,2e-1),1e-3,1.5,0,0.9,e)) errorEstimate=False det=detector.cr39 modelForGuess = Flat((1e-12,1e0),4) model = Linear((1e-12,1e0),4) #This is were the assumption on spectrum shape is made resp=det(*spectrum) print('Expected detector responses:') for r in resp[0]: print(str(r)) if errorEstimate: guess=[] x=[] for i in range(7): r=(np.array(resp[0])+[np.random.normal()*ri for ri in resp[1]],resp[1]) guess.append(unfold.unfold(det, r, modelForGuess)) x.append(unfold.unfold(det, r, model, guess=np.array(guess[-1])))
print('\\hline') for i in range(len(det.order)): print(str(det.order[i])+' & $%.3g'%(simResp[0][i]/1e5)+'\\pm%.3g\cdot 10^5$'%(simResp[0][i]*0.1/1e5)+' &$ %.3g'%(resp[0][i]/1e5)+'\\pm %.3g\cdot 10^5$'%(resp[1][i]/1e5)+' \\\\') #########################################Do unfolding################################ #number of parameters in model n=4 #energy range for model ERange=(5e-13,3e0) #first linear model, used for guess to nonlinear #modelForGuess = Flat(ERange,splitE=optimizeFlat.optimize(det,ERange,n)) #use this instead for pptimized base function shapes #modelForGuess = Flat(ERange,n) #second non-linear model, set to Flat also to get faster results, (or comment everywhere) model = Flat(ERange,n) guess=[] x=[] simx=[] for i in range(50): r=(np.array(resp[0])+[np.random.normal()*ri for ri in resp[1]],resp[1]) #guess.append([max(0,p) for p in unfold.unfold(det, r, modelForGuess)]) x.append(unfold.unfold(det, r, model)) r=(np.array(simResp[0])+[np.random.normal()*ri for ri in simResp[1]],simResp[1]) simx.append(unfold.unfold(det, r, model)) #guessErrors=np.std(guess,axis=0) errors=np.std(x,axis=0) simerrors=np.std(simx,axis=0) #guess=np.mean(guess,axis=0) x=np.mean(x,axis=0)