from scipy import optimize as scopt
from utils.shared_functions import *
[docs]class ABCI:
"""
This class contains functions for writing the cavity geometry in a format readable by ABCI
The type of cavity geometry it writes is regular elliptical cavity geometry with mid-cup dimensions equal
and end cups different. Geometry type shown in the figure below:
.. image:: ../images/Cavity_parametrised.png
:width: 800
:alt: Cavity parametrised model
Note
-----
Considering renaming to better reflect this purpose.
"""
def __init__(self, left_beam_pipe, left_end_cell, mid_cell, right_end_cell, right_beam_pipe):
"""
Parameters
----------
left_beam_pipe: list, array like
left_end_cell: list, array like
mid_cell: list, array like
right_end_cell: list, array like
right_beam_pipe: list, array like
"""
self.left_end_cell = left_end_cell
self.mid_cell = mid_cell
self.right_end_cell = right_end_cell
self.left_beam_pipe = left_beam_pipe
self.right_beam_pipe = right_beam_pipe
# First Ellipse data
self.Req_L = self.left_end_cell[0]
self.ri_L = self.left_end_cell[1]
self.L_L = self.left_end_cell[2]
self.A_L = self.left_end_cell[3]
self.B_L = self.left_end_cell[4]
self.a_L = self.left_end_cell[5]
self.b_L = self.left_end_cell[6]
# Right
self.Req_R = self.right_end_cell[0]
self.ri_R = self.right_end_cell[1]
self.L_R = self.right_end_cell[2]
self.A_R = self.right_end_cell[3]
self.B_R = self.right_end_cell[4]
self.a_R = self.right_end_cell[5]
self.b_R = self.right_end_cell[6]
# Middle
self.Req_M = self.mid_cell[0]
self.ri_M = self.mid_cell[1]
self.L_M = self.mid_cell[2]
self.A_M = self.mid_cell[3]
self.B_M = self.mid_cell[4]
self.a_M = self.mid_cell[5]
self.b_M = self.mid_cell[6]
# beam pipe
self.Rbp_L = self.left_beam_pipe[0]
self.at_L = self.left_beam_pipe[1]
self.bt_L = self.left_beam_pipe[2]
self.c_L = self.left_beam_pipe[3]
self.x_L = self.left_beam_pipe[4]
self.Rbp_R = self.right_beam_pipe[0]
self.at_R = self.right_beam_pipe[1]
self.bt_R = self.right_beam_pipe[2]
self.c_R = self.right_beam_pipe[3]
self.x_R = self.right_beam_pipe[4]
[docs] def abci_bp_L(self, n, zr12_BPL, WG_L, f):
"""Writes the left beam pipe dimensions to a geometry file
Parameters
----------
n: int
Number of cavity cells
zr12_BPL: list, array like
WG_L: float
Length of left beam pipe
f: file
Geometry <filename>.geo file to be written to
Note
-----
Consider renaming zr12_BPL to reflect what the variable is.
Variable n is unused by the function. Consider removing
Returns
-------
"""
# N1 Z R Alfa Mesh_thick Jx Jy BC_sign Vol_sign
# print("\t\tABCI_BPL::It got here")
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Rbp_L - self.c_L, WG_L - self.x_L))
f.write('{} {}\n'.format(zr12_BPL[0][1], WG_L - self.x_L + zr12_BPL[0][0]))
f.write('{} {}\n'.format(zr12_BPL[1][1], WG_L - self.x_L + zr12_BPL[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_L + self.bt_L, WG_L - self.x_L + self.x_L))
f.write('{} {}\n'.format(self.ri_L, WG_L - self.x_L + self.x_L))
[docs] def abci_n1_L(self, n, zr12_L, WG_L, f):
"""Writes the left end cup dimensions to a geometry file
Parameters
----------
n: int
Number of cavity cells.
zr12_L: float
WG_L: float
Length of left beam pipe
f: file
Geometry <filename>.geo file to be written to
Note
-----
Consider renaming zr12_R to reflect what the variable is.
Variable n is unused by the function. Consider removing
Returns
-------
"""
# print("\t\tABCI_N1_L::It got here")
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_L + self.b_L, WG_L))
f.write('{} {}\n'.format(zr12_L[1][1], WG_L + self.L_L - zr12_L[1][0]))
f.write('{} {}\n'.format(zr12_L[0][1], WG_L + self.L_L - zr12_L[0][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_L - self.B_L, WG_L + self.L_L))
f.write('{} {}\n'.format(self.Req_L, WG_L + self.L_L))
[docs] def abci_n1_R(self, n, zr12_R, WG_L, f):
"""Writes the right end cup dimensions to a geometry file
Parameters
----------
n: int
Number of cavity cells.
zr12_R: float
WG_L: float
Length of left beam pipe
f: file
Geometry <filename>.geo file to be written to
Note
-----
Consider renaming zr12_R to reflect what the variable is.
Returns
-------
"""
# N1 Z R Alfa Mesh_thick Jx Jy BC_sign Vol_sign
# print("\t\tABCI_N1_R::It got here")
if n == 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_L - self.B_R, WG_L + self.L_L))
f.write('{} {}\n'.format(zr12_R[0][1], WG_L + self.L_L + zr12_R[0][0]))
f.write('{} {}\n'.format(zr12_R[1][1], WG_L + self.L_L + zr12_R[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_R + self.b_R, WG_L + self.L_L + self.L_R))
f.write('{} {}\n'.format(self.ri_R, WG_L + self.L_L + self.L_R))
if n > 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_R - self.B_R, WG_L + self.L_L + 2 * (n - 1) * self.L_M))
f.write('{} {}\n'.format(zr12_R[0][1], WG_L + self.L_L + 2 * (n - 1) * self.L_M + zr12_R[0][0]))
f.write('{} {}\n'.format(zr12_R[1][1], WG_L + self.L_L + 2 * (n - 1) * self.L_M + zr12_R[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_R + self.b_R, WG_L + self.L_L + 2 * (n - 1) * self.L_M + self.L_R))
f.write('{} {}\n'.format(self.ri_R, WG_L + self.L_L + 2 * (n - 1) * self.L_M + self.L_R))
[docs] def abci_bp_R(self, n, zr12_BPR, WG_L, f):
"""Writes the right beam pipe dimensions to a geometry file
Parameters
----------
n: int
Number of cavity cells.
zr12_BPR: float
WG_L: float
Length of left beam pipe
f: file
Geometry <filename>.geo file to be written to
Note
-----
Consider renaming zr12_BPR to reflect what the variable is.
Returns
-------
"""
# N1 Z R Alfa Mesh_thick Jx Jy BC_sign Vol_sign
# print("\t\tABCI_BPR::It got here")
if n == 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_R + self.bt_R, WG_L + self.L_L + self.L_R))
f.write('{} {}\n'.format(zr12_BPR[1][1], WG_L + self.L_L + self.L_R + self.x_R - zr12_BPR[1][0]))
f.write('{} {}\n'.format(zr12_BPR[0][1], WG_L + self.L_L + self.L_R + self.x_R - zr12_BPR[0][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Rbp_R - self.c_R, WG_L + self.L_L + self.L_R + self.x_R))
f.write('{} {}\n'.format(self.Rbp_R, WG_L + self.L_L + self.L_R + self.x_R))
if n > 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_R + self.bt_R, WG_L + self.L_L + self.L_R + 2 * (n - 1) * self.L_M))
f.write('{} {}\n'.format(zr12_BPR[1][1],
WG_L + self.L_L + self.L_R + self.x_R - zr12_BPR[1][0] + 2 * (n - 1) * self.L_M))
f.write('{} {}\n'.format(zr12_BPR[0][1],
WG_L + self.L_L + self.L_R + self.x_R - zr12_BPR[0][0] + 2 * (n - 1) * self.L_M))
f.write('-3., 0.000\n')
f.write(
'{} {}\n'.format(self.Rbp_R - self.c_R, WG_L + self.L_L + self.L_R + self.x_R + 2 * (n - 1) * self.L_M))
f.write('{} {}\n'.format(self.Rbp_R, WG_L + self.L_L + self.L_R + self.x_R + 2 * (n - 1) * self.L_M))
[docs] def abci_M(self, n, zr12_M, WG_L, f, i, end_type):
"""Writes the mid cup dimensions to a geometry file
Parameters
----------
n: int
Number of cavity cells.
zr12_M: float
WG_L: float
Length of left beam pipe
f: file
Geometry <filename>.geo file to be written to
i: int
Cell index
end_type: int
if end_type = 1 the end HALF cell is changed for tuning.
I don't know what this means. Never had need for it.
Note
-----
Consider renaming zr12_R to reflect what the variable is.
Returns
-------
"""
# print("\t\tABCI_M::It got here")
# Left and right Cell
# First Half cell
if i == 1 and end_type == 1:
zr12_LM, alpha_LM = self.rz_conjug('mid') # zr12_R first column is z , second column is r
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_L - self.B_M, WG_L + self.L_L + (2 * i - 2) * self.L_M))
f.write('{} {}\n'.format(zr12_LM[0][1], WG_L + self.L_L + (2 * i - 2) * self.L_M + zr12_LM[0][0]))
f.write('{} {}\n'.format(zr12_LM[1][1], WG_L + self.L_L + (2 * i - 2) * self.L_M + zr12_LM[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
f.write('{} {}\n'.format(self.ri_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
elif i == 1 and end_type != 1:
zr12_L, alpha_L = self.rz_conjug('left') # zr12_R first column is z , second column is r
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_L - self.B_L, WG_L + self.L_L + (2 * i - 2) * self.L_M))
f.write('{} {}\n'.format(zr12_L[0][1], WG_L + self.L_L + (2 * i - 2) * self.L_L + zr12_L[0][0]))
f.write('{} {}\n'.format(zr12_L[1][1], WG_L + self.L_L + (2 * i - 2) * self.L_L + zr12_L[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_L, WG_L + self.L_L + (2 * i - 1) * self.L_L))
f.write('{} {}\n'.format(self.ri_M, WG_L + self.L_L + (2 * i - 1) * self.L_L))
if i != 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_M - self.B_M, WG_L + self.L_L + (2 * i - 2) * self.L_M))
f.write('{} {}\n'.format(zr12_M[0][1], WG_L + self.L_L + (2 * i - 2) * self.L_M + zr12_M[0][0]))
f.write('{} {}\n'.format(zr12_M[1][1], WG_L + self.L_L + (2 * i - 2) * self.L_M + zr12_M[1][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
f.write('{} {}\n'.format(self.ri_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
# Second half cells
if i == n - 1 and end_type == 1:
zr12_RM, alpha_RM = self.rz_conjug('mid') # zr12_R first column is z , second column is r
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
f.write(
'{} {}\n'.format(zr12_RM[1][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_M - zr12_RM[1][0]))
f.write(
'{} {}\n'.format(zr12_RM[0][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_M - zr12_RM[0][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_R - self.B_M, WG_L + self.L_L + (2 * i) * self.L_M))
f.write('{} {}\n'.format(self.Req_R, WG_L + self.L_L + (2 * i) * self.L_M))
elif i == n - 1 and end_type != 1:
zr12_R, alpha_R = self.rz_conjug('right') # zr12_R first column is z , second column is r
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_R, WG_L + self.L_L + (2 * i - 1) * self.L_M))
f.write('{} {}\n'.format(zr12_R[1][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_R - zr12_R[1][0]))
f.write('{} {}\n'.format(zr12_R[0][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_R - zr12_R[0][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_R - self.B_R, WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_R))
f.write('{} {}\n'.format(self.Req_R, WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_R))
if i != n - 1:
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.ri_M + self.b_M, WG_L + self.L_L + (2 * i - 1) * self.L_M))
f.write('{} {}\n'.format(zr12_M[1][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_M - zr12_M[1][0]))
f.write('{} {}\n'.format(zr12_M[0][1], WG_L + self.L_L + (2 * i - 1) * self.L_M + self.L_M - zr12_M[0][0]))
f.write('-3., 0.000\n')
f.write('{} {}\n'.format(self.Req_M - self.B_M, WG_L + self.L_L + (2 * i) * self.L_M))
f.write('{} {}\n'.format(self.Req_M, WG_L + self.L_L + (2 * i) * self.L_M))
[docs] def rz_conjug(self, cell):
"""Calculate shift in geoemetric values
Parameters
----------
cell: {"left", "right", "mid"}
Specifies the cell cup type.
Returns
-------
zr12: list
Maybe it's a shift of some sort calculated from the coordinates of the tangent of the ellipses
comprising the cavity
alpha: float
Angle of the line tangent to the iris and equator ellipses.
"""
# global data
if cell == 'left':
data = [self.A_L, self.B_L, self.Req_L, self.ri_L, self.L_L, self.a_L, self.b_L]
elif cell == 'right':
data = [self.A_R, self.B_R, self.Req_R, self.ri_R, self.L_R, self.a_R, self.b_R]
else:
data = [self.A_M, self.B_M, self.Req_M, self.ri_M, self.L_M, self.a_M, self.b_M]
A = data[0] # ellipse x
B = data[1] # ellipse y
Req = data[2] # equator radius
ri = data[3] # iris radius
L = data[4] # quarter length
a = data[5] # cone ellipse x
b = data[6] # cone ellipse y
df = tangent_coords(A, B, a, b, ri, L, Req, 0)
x1, y1, x2, y2 = df[0]
xy_cross = np.array([x1, y1, x2, y2])
xy_L_ell = np.zeros(shape=(4, 2))
xy_L_ell[0][:] = xy_cross[0:2]
xy_L_ell[1][:] = xy_cross[2:4]
xy_L_ell[2][:] = [-xy_cross[2] + 2 * L, xy_cross[3]]
xy_L_ell[3][:] = [-xy_cross[0] + 2 * L, xy_cross[1]]
rz_coor = xy_L_ell
alpha = 180 - np.arctan2(y2 - y1, (x2 - x1)) * 180 / np.pi
zr12 = [[rz_coor[2][0] - L, rz_coor[2][1]], [rz_coor[3][0] - L, rz_coor[3][1]]]
return zr12, alpha