-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMinkowskiPlotter.py
143 lines (116 loc) · 5.06 KB
/
MinkowskiPlotter.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import matplotlib.pyplot as plt
import numpy as np
import sys
L_pole = 1
L_barn = 1
# define relative speed of pole and farmer
beta_pole = 0.8
beta_farmer = -0.3
# Enables the farmer x'' and t'' axes
PlotFarmer = 1
# Checks to see if rapidities are greater than 1
if abs(beta_pole) >= 1 or abs(beta_farmer) >= 1:
sys.exit(f"\u03B2 = {beta_pole},{beta_farmer} >= 1. Lorentz factor is not defined.")
# Lorentz factor gamma for pole and farmer
g_pole = 1/np.sqrt(1 - beta_pole*beta_pole)
g_farmer = 1/np.sqrt(1 - beta_farmer*beta_farmer)
# Input x values, increase to larger value for more points on axes
num = np.arange(-50, 50+1)
# stretches the points for the S' and S'' reference frames appropriately
x_pole = g_pole*num
x_farmer = g_farmer*num
fig, ax = plt.subplots()
# Sets equal spacing, and introduces x, t grid.
ax.set_aspect('equal', adjustable='box')
# ax.grid()
# Restrict region of graph
Region = (-2, 5)
plt.ylim(Region)
plt.xlim(Region)
# Form of [Reference frame, left close, right close, left open, right open]
S_Array = [["S"], [0, L_pole/(g_pole*beta_pole)],
[L_barn, L_pole/(g_pole*beta_pole)],
[0, L_barn/beta_pole],
[L_barn, L_barn/beta_pole]]
S_Dash_Array = [["S\'"], [-L_pole, L_pole/beta_pole],
[g_pole*L_barn - L_pole,
L_pole/beta_pole - g_pole*beta_pole*L_barn],
[-g_pole*L_barn, g_pole*L_barn/beta_pole],
[0, g_pole*L_barn*(1/beta_pole - beta_pole)]]
S_D_Dash_Array = [["S\'\'"], [-g_farmer*beta_farmer*L_pole/(g_pole*beta_pole),
g_farmer*L_pole/(beta_pole*g_pole)],
[g_farmer*(L_barn - beta_farmer * L_pole / (g_pole*beta_pole)),
g_farmer*(L_pole/(g_pole*beta_pole) - beta_farmer*L_barn)],
[-g_farmer*beta_farmer*L_barn/beta_pole, g_farmer*L_barn/beta_pole],
[g_farmer*L_barn*(1 - beta_farmer/beta_pole),
g_farmer*L_barn*(1/beta_pole - beta_farmer)]]
# Creates a lightlike line of gradient m, through (x_0,y_0)
def CreateLightLine(m, x_0, y_0, col):
c = y_0 - m*x_0
ax.plot(num, m*num + c, color=col, linewidth=lightlikewidth)
# Plot Lightlike lines
lightlikewidth = 0.1
CreateLightLine(1, 0, 0, 'orange')
CreateLightLine(-1, 0, 0, 'orange')
# Plot points at (gamma,0) and (0,gamma).
ax.plot(g_pole, 0, marker='x', color='blue')
ax.plot(0, g_pole, marker='x', color='blue')
# Doors shut
ax.plot(0, L_pole/(g_pole*beta_pole), marker='x', color='hotpink', label='Close')
ax.plot(L_barn, L_pole/(g_pole*beta_pole), marker='x', color='hotpink')
# Doors open
ax.plot(0, L_barn/(beta_pole), marker='x', color='crimson', label='Open')
ax.plot(L_barn, L_barn/(beta_pole), marker='x', color='crimson')
# Plot x' axis
ax.plot(x_pole, beta_pole*x_pole,
color='green', marker='.',
label=r"$\beta_p=$"+f"{np.round(beta_pole,2)}")
# Plot t' axis
ax.plot(x_pole*beta_pole, x_pole, color='green', marker='.')
# plot right door at zero in S''
ax.plot(L_pole/L_barn * g_pole * g_farmer * (beta_farmer*beta_pole - 1), L_pole/L_barn * g_farmer * g_pole * (beta_farmer - beta_pole), marker="x")
if PlotFarmer == 1:
# Plot x'' axis
ax.plot(x_farmer, beta_farmer*x_farmer,
color='purple', marker='.',
label=r"$\beta_f=$"+f"{np.round(beta_farmer,2)}")
# Plot t'' axis
ax.plot(x_farmer*beta_farmer, x_farmer, color='purple', marker='.')
# Place y axis at zero
ax.spines['left'].set_position('zero')
# Place x axis at zero
ax.spines['bottom'].set_position('zero')
# Remove right line of graph
ax.spines['right'].set_color('none')
# Remove top line of graph
ax.spines['top'].set_color('none')
worldlinewidth = 0.5
# Plot barn back and front
plt.axvline(0, color='blue', linewidth=worldlinewidth)
plt.axvline(L_barn, color='blue', linewidth=worldlinewidth)
# Plot pole front and back
plt.plot(x_pole - L_pole/g_pole, x_pole/beta_pole,
color='orange', linewidth=worldlinewidth)
plt.plot(x_pole, x_pole/beta_pole, color='orange', linewidth=worldlinewidth)
plt.title(r"$L_p/L_b=$"+f"{round(L_pole/L_barn,3)}")
plt.legend()
# Saves as a high quality png
plt.savefig("MinkowskiDiagram.png", dpi=1000,
bbox_inches='tight', pad_inches=0.0)
# Saves as high quality pdf
plt.savefig("MinkowskiDiagram.pdf", bbox_inches='tight', pad_inches=0.0)
plt.show()
# Defines a matrix of all events.
Event_Matrix = [S_Array, S_Dash_Array, S_D_Dash_Array]
# Outputs into the console the reference frame and spacetime event coords
for X in Event_Matrix:
event_names = ['LC', 'RC', 'LO', 'RO']
alist = [X[1][1], X[2][1], X[3][1], X[4][1]]
alist, event_names = zip(*sorted(zip(alist, event_names)))
print(f"In reference frame {X[0]}")
print(f"Left Close {X[1]}")
print(f"Right Close {X[2]}")
print(f"Left Open {X[3]}")
print(f"Right Open {X[4]}")
print(event_names)
print()