Skip to content
Snippets Groups Projects
Commit 9570134d authored by lorenzennio's avatar lorenzennio
Browse files

Merged and started testing with new fitting

parent e2630b16
No related branches found
No related tags found
No related merge requests found
...@@ -9,11 +9,11 @@ class Layer: ...@@ -9,11 +9,11 @@ class Layer:
#Newton-method to calculate the hit time #Newton-method to calculate the hit time
def f(self, x, vector): def f(self, x, vector):
Omega = vector.q * self.BField / vector.m Omega = vector.q * self.BField / vector.m
return -vector.vz/Omega * np.sin(Omega * x)+vector.vy/Omega * (np.cos(Omega * x)-1)-self.Position return vector.vz/Omega * np.sin(Omega * x)+vector.vy/Omega * (np.cos(Omega * x)-1)-self.Position
def df(self, x, vector): def df(self, x, vector):
Omega = vector.q * self.BField / vector.m Omega = vector.q * self.BField / vector.m
return -vector.vz * np.cos(Omega* x)+vector.vy * np.sin(Omega * x) return vector.vz * np.cos(Omega* x)+vector.vy * np.sin(Omega * x)
def dx(self, x, vector): def dx(self, x, vector):
return abs(0-self.f(x, vector)) return abs(0-self.f(x, vector))
...@@ -66,7 +66,7 @@ class Layer: ...@@ -66,7 +66,7 @@ class Layer:
else: else:
return ((None, None), (None, None), (self.Position, self.Position)) return ((None, None), (None, None), (self.Position, self.Position))
return ((xHigh, xLow), (yHigh, yLow), (self.Position, self.Position)) return ((xHigh, xLow), (yHigh, yLow), (self.Position+0.005, self.Position-0.005))
...@@ -85,7 +85,7 @@ class Detector: ...@@ -85,7 +85,7 @@ class Detector:
"""Calculate for a given particle class the hit grid. The class needs the membervalues: vx, vy, vz, q, m - Velocity in 3 dimensions, charge, mass. """Calculate for a given particle class the hit grid. The class needs the membervalues: vx, vy, vz, q, m - Velocity in 3 dimensions, charge, mass.
Returns the known passed volumes or "None" if one Layer is not hitted""" Returns the known passed volumes or "None" if one Layer is not hitted"""
result = np.array([[(0,0),(0,0),(0,0)]]) result = np.array([[(0+0.0001,0-0.0001),(0+0.0001,0-0.0001),(0+0.0001,0-0.0001)]])
for Layer in [self.Layer1, self.Layer2, self.Layer3, self.Layer4, self.Layer5]: for Layer in [self.Layer1, self.Layer2, self.Layer3, self.Layer4, self.Layer5]:
result = np.append(result, [Layer.detect(particle)], axis = 0) result = np.append(result, [Layer.detect(particle)], axis = 0)
...@@ -93,4 +93,4 @@ class Detector: ...@@ -93,4 +93,4 @@ class Detector:
return None return None
return result return result
\ No newline at end of file
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import matplotlib as plt import matplotlib.pyplot as plt
from scipy.optimize import curve_fit from scipy.optimize import curve_fit
from scipy import odr
class Analysis: class Analysis:
...@@ -11,12 +12,15 @@ class Analysis: ...@@ -11,12 +12,15 @@ class Analysis:
The results can then be visualized with two plots. The results can then be visualized with two plots.
""" """
def __init__(self, bounds): def __init__(self):
""" """
The class is initialized with the angles from the detector results The class is initialized with the angles from the detector results
and then automatically deletes 'None' entries and computes the minimum and then automatically deletes 'None' entries and computes the minimum
range of angles and the error. range of angles and the error.
""" """
...
def fill(self, bounds):
self.xBounds = pd.Series({'High' : bounds[:,0,0], self.xBounds = pd.Series({'High' : bounds[:,0,0],
'Low' : bounds[:,0,1]}) 'Low' : bounds[:,0,1]})
self.yBounds = pd.Series({'High' : bounds[:,1,0], self.yBounds = pd.Series({'High' : bounds[:,1,0],
...@@ -41,8 +45,16 @@ class Analysis: ...@@ -41,8 +45,16 @@ class Analysis:
'Error': (bounds[:,1,0] - bounds[:,1,1])/2.}) 'Error': (bounds[:,1,0] - bounds[:,1,1])/2.})
self.zPoints = pd.DataFrame({'Mean': (bounds[:,2,0] + bounds[:,2,1])/2., self.zPoints = pd.DataFrame({'Mean': (bounds[:,2,0] + bounds[:,2,1])/2.,
'Error': (bounds[:,2,0] - bounds[:,2,1])/2.}) 'Error': (bounds[:,2,0] - bounds[:,2,1])/2.})
self.fit()
print(self.results) print(self.xPoints)
print(self.yPoints)
print(self.zPoints)
#plt.plot(self.zPoints['Mean'], self.xPoints['Mean'])
#plt.show()
#self.xFit()
#self.yFit()
#print(self.results)
#TODO: Plot #TODO: Plot
def rmNone(self): def rmNone(self):
...@@ -55,15 +67,30 @@ class Analysis: ...@@ -55,15 +67,30 @@ class Analysis:
self.yBounds['High'] = np.array([x for x in self.yBounds['High'] if x is not None]) self.yBounds['High'] = np.array([x for x in self.yBounds['High'] if x is not None])
self.yBounds['Low'] = np.array([x for x in self.yBounds['Low'] if x is not None]) self.yBounds['Low'] = np.array([x for x in self.yBounds['Low'] if x is not None])
def xEOM(self, x, w, Vx, Vy, Vz): def xEOM(self, B, x):
z = (1/w)*(-Vy*(1-np.cos(x*w/Vx)) + Vz*np.sin(x*w/Vx)) """
B= [w, Vx, Vy, Vz]
"""
z = (1/B[0])*(-B[2]*(1-np.cos(x*B[0]/B[1])) + B[3]*np.sin(x*B[0]/B[1]))
return z return z
def yEOM(self, z, R, y0, z0): def yEOM(self, B, z):
y = y0 + np.sqrt(R**2 - (z-z0)**2) """
B = [R, y0, z0]
"""
y = B[1] + np.sqrt(B[0]**2 - (z-B[2])**2)
return y return y
def fit(self): def xFit(self):
xModel = odr.Model(self.xEOM)
xData = odr.RealData(self.xPoints['Mean'],
self.zPoints['Mean'],
sx = self.xPoints['Error'],
sy = self.zPoints['Error'])
xODR = odr.ODR(xData, xModel, beta0=[1, 1, 1, 1])
xOUT = xODR.run()
xOUT.pprint()
"""
xPopt, xPcov = curve_fit(self.xEOM, xPopt, xPcov = curve_fit(self.xEOM,
self.xPoints['Mean'], self.xPoints['Mean'],
self.zPoints['Mean'] self.zPoints['Mean']
...@@ -79,20 +106,35 @@ class Analysis: ...@@ -79,20 +106,35 @@ class Analysis:
self.results['Vy'][1] = xPerr[2] self.results['Vy'][1] = xPerr[2]
self.results['Vz'][0] = xPopt[3] self.results['Vz'][0] = xPopt[3]
self.results['Vz'][1] = xPerr[3] self.results['Vz'][1] = xPerr[3]
"""
def yFit(self):
"""
yPopt, yPcov = curve_fit(self.yEOM, yPopt, yPcov = curve_fit(self.yEOM,
self.zPoints['Mean'], self.zPoints['Mean'],
self.yPoints['Mean'], self.yPoints['Mean'],
sigma=self.yPoints['Error'], #sigma=self.yPoints['Error'],
p0=[10^3, 1, 1],
absolute_sigma=True) absolute_sigma=True)
yPerr = np.sqrt(np.diag(xPcov)) yPerr = np.sqrt(np.diag(xPcov))
"""
#ODR
yModel = odr.Model(self.yEOM)
yData = odr.RealData(self.zPoints['Mean'],
self.yPoints['Mean'],
sx = self.zPoints['Error'],
sy = self.yPoints['Error'])
yODR = odr.ODR(yData, yModel, beta0=[1e3, 1, 1])
yOUT = yODR.run()
yOUT.pprint()
"""
self.results['R'][0] = yPopt[0] self.results['R'][0] = yPopt[0]
self.results['R'][1] = yPerr[0] self.results['R'][1] = yPerr[0]
self.results['y0'][0] = yPopt[1] self.results['y0'][0] = yPopt[1]
self.results['y0'][1] = yPerr[1] self.results['y0'][1] = yPerr[1]
self.results['z0'][0] = yPopt[2] self.results['z0'][0] = yPopt[2]
self.results['z0'][1] = yPerr[2] self.results['z0'][1] = yPerr[2]
"""
""" """
def yEOM(self, t, w, yVel, zVel): def yEOM(self, t, w, yVel, zVel):
y = zVel + (1./w)*(-zVel*np.cos(w*t) + yVel*np.sin(w*t)) y = zVel + (1./w)*(-zVel*np.cos(w*t) + yVel*np.sin(w*t))
......
test.py 0 → 100644
from analysis import Analysis
from Detector import Detector
class Particle:
def __init__(self):
self.vx = 1
self.vy = 1
self.vz = 300
self.m = 0.522
self.q = 1
DET = Detector()
DETRes = DET.detect(Particle())
ANA = Analysis(DETRes)
import unittest import unittest
import numpy as np import numpy as np
from analysis import Analysis from analysis import Analysis
import matplotlib.pyplot as plt
class testAnalysis(unittest.TestCase): class testAnalysis(unittest.TestCase):
""" """
A simple test to check the angle means ans error computation. A simple test to check the angle means ans error computation.
""" """
def test(self): def test(self):
ang = np.array([6,5,6,5,8,4,8,4,7,1,7,1,10,3,10,3,None,None,None,None]) #ang = np.array([6,5,6,5,8,4,8,4,7,1,7,1,10,3,10,3,None,None,None,None])
ang = np.reshape(ang, (5,2,2)) #ang = np.reshape(ang, (5,2,2))
A = Analysis(ang) A = Analysis()
self.assertEqual(A.results['Mean'][0], 5.5) #self.assertEqual(A.results['Mean'][0], 5.5)
self.assertEqual(A.results['Error'][0], 0.5) #self.assertEqual(A.results['Error'][0], 0.5)
z = np.arange(30)
y = A.yEOM([100,1,1], z)
#plt.plot(z,y)
#plt.show()
Data = []
for i in range(0,len(z)):
err = np.random.random(size=(4))
print(err)
Data.append([[0,0], [y[i]+err[0],y[i]-err[1]], [z[i]+err[2], z[i]-err[3]]])
#np.concatenate((Data,
# [[0,0], [y[i]+0.1,y[i]-0.1], [z[i]+0.1, z[i]-0.1]]), axis=0)
Data = np.array(Data)
A.fill(Data)
A.yFit()
#print(y)
#print(z)
#print(Data)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment