├── .gitignore
├── LICENSE.md
├── README.md
├── activities
├── .ipynb_checkpoints
│ ├── TUTORIAL_relativistic_kinematics-checkpoint.ipynb
│ ├── ppp_experiment_000_cms-checkpoint.ipynb
│ ├── ppp_experiment_001_cleo-checkpoint.ipynb
│ ├── ppp_experiment_002_babar-checkpoint.ipynb
│ └── ppp_physicsbkg_000_specialrelativity-checkpoint.ipynb
├── activity00_cms_muons.ipynb
├── activity01_cms_dimuons.ipynb
├── activity02_cleo_dmesons.ipynb
├── activity03_cms_topquark.ipynb
├── codebkg_DataInterfacing.ipynb
├── codebkg_DownloadData.ipynb
├── experiment_babar.ipynb
├── experiment_cleo.ipynb
├── experiment_cms.ipynb
├── images
│ ├── BaBar-detector.jpg
│ ├── babar.jpg
│ ├── babar2.jpg
│ ├── cern_cms_endon.jpg
│ ├── chi_square_sketch.jpeg
│ ├── cleo_det_proc.jpg
│ ├── dimuons_sketch.jpeg
│ ├── dimuons_sketch.jpg
│ ├── discovering_sketch_A.jpeg
│ ├── discovering_sketch_B.jpeg
│ ├── discovering_sketch_D.jpg
│ ├── kpipi_color_enhanced-resized.png
│ ├── muons_sketch.jpeg
│ ├── muons_sketch.jpg
│ ├── sketch_mean_points.jpeg
│ ├── slac.jpg
│ └── small_cms1.png
├── physicsbkg_Lifetimes.ipynb
├── physicsbkg_SpecialRelativity.ipynb
└── scratch
│ ├── chi_square_fitting_1.ipynb
│ ├── discovering_more_particles_1.ipynb
│ ├── invariant_mass_0.ipynb
│ └── learning_about_particles_1.ipynb
├── data
├── dimuons.csv
├── dimuons_1000_collisions.hdf5
├── dimuons_100k.hdf5
├── dimuons_hepfile.h5
├── small_BaBar_test_file.hdf5
├── small_CLEO_test_file.hdf5
└── small_cms_test_file.hdf5
├── requirements.txt
└── tools
├── babar_tools.py
├── cleo_tools.py
├── cms_tools.py
└── test_babar.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # Big data files
7 | *LARGE.dat
8 |
9 | # C extensions
10 | *.so
11 |
12 | # Distribution / packaging
13 | .Python
14 | env/
15 | build/
16 | develop-eggs/
17 | dist/
18 | downloads/
19 | eggs/
20 | .eggs/
21 | lib/
22 | lib64/
23 | parts/
24 | sdist/
25 | var/
26 | *.egg-info/
27 | .installed.cfg
28 | *.egg
29 | *.ipynb_checkpoints/*
30 |
31 | # PyInstaller
32 | # Usually these files are written by a python script from a template
33 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
34 | *.manifest
35 | *.spec
36 |
37 | # Installer logs
38 | pip-log.txt
39 | pip-delete-this-directory.txt
40 |
41 | # Unit test / coverage reports
42 | htmlcov/
43 | .tox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *,cover
50 |
51 | # Translations
52 | *.mo
53 | *.pot
54 |
55 | # Django stuff:
56 | *.log
57 |
58 | # Sphinx documentation
59 | docs/_build/
60 |
61 | # PyBuilder
62 | target/
63 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015-current, Matt Bellis, Particle Physics Playground
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](http://dx.doi.org/10.5281/zenodo.17257)
2 |
3 | [](http://mybinder.org/repo/particle-physics-playground/playground)
4 |
5 | Particle-Physics-Playground
6 | ===========================
7 |
8 | Repo to hold subsets of particle physics data from CMS and other experiments, as well as code and tutorials on how to interact with these data.
9 |
10 | http://particle-physics-playground.github.io/
11 |
--------------------------------------------------------------------------------
/activities/.ipynb_checkpoints/TUTORIAL_relativistic_kinematics-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Relativistic Kinematics Tutorial"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "## Brief Intro to Special Relativity and General Relativity"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "Before talking about relativisic kinematics, let's briefly run through Einstein's theories of Special and General Relavitity. Einstein's theory of special relativity was derived from the following two postulates:\n",
22 | "\n",
23 | "* Postulate 1: The laws of physics are the same in all inertial reference frames.\n",
24 | "* Postulate 2: The speed of light in a vacuum is equal to the value c, independent of the motion of the source\n",
25 | "\n",
26 | "To summarize, the laws of physics do not change regardless of what your perspective is. Nothing can go faster than the speed of light in the universe. Everyone *always* measures the speed of light to be the speed of light regardless of how fast or slow one is moving. \n",
27 | "\n",
28 | "However, this theory of relativity does not take into account acceleration. It took Einstein another 10 years to develop his General Theory of Relativity.\n",
29 | "\n",
30 | "General Relativity tells us:\n",
31 | "* Space and time are interwoven into a 4-dimensional fabric known as space-time. This fabric can be bent and stretched which causes changes in how we perceive time.\n",
32 | "* Massive objects like black holes cause distortions in space-time.\n",
33 | "\n",
34 | "***Keep these ideas in mind***"
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "metadata": {},
40 | "source": [
41 | "## What is Relativistic Kinematics?"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "metadata": {
47 | "collapsed": true
48 | },
49 | "source": [
50 | "Relativistic kinematics sounds like a complicated term that the average person would be intimidated by. However, it basically means how the laws of physics operate at incredibly fast speeds. But what is considered a fast speed? You might have heard before that the speed of light is the speed limit of the universe. This means that no object that has mass can reach or exceed that speed (**Sidenote**: This law only says that anything *inside* space cannot exceed this speed. Space itself is actually expanding at an accelerated rate that is faster than the speed of light!). What can reach the speed of light? Only particles that have a mass of zero can reach the speed of light, therefore only photons, the particles of light, are able to reach this speed. Before we go any further, we need to define a term known as the Lorentz factor which plays a key role in understanding relativistic kinematics. The Lorentz factor tells us how time, length, and relativistic mass change for an object in motion. \n",
51 | "\n",
52 | "$$\\gamma = \\frac{1}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\frac{1}{\\sqrt{1-\\beta^2}}$$ $\\beta = \\frac{v}{c}$ tells you the percentage of light speed that the object of interest is moving at. "
53 | ]
54 | },
55 | {
56 | "cell_type": "markdown",
57 | "metadata": {},
58 | "source": [
59 | "## Time Dilation"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {},
65 | "source": [
66 | "What is time dilation? To start off, time isn't the same for everyone as you might have thought. Time changes depending on how fast you are travelling as well as the gravitational bodies you are near. The formula to calculate time dilation is: $$\\Delta t = \\frac{\\Delta t'}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\gamma \\Delta t' = \\gamma \\tau$$ $\\Delta t' = \\tau$ is known as the proper time which is the time measured in the reference frame in which the clock is at rest. $\\Delta t$ is defined as the time dilation. From this formula, we can tell that the time that an observer measures in a moving reference frame will always be longer unless that particle is moving at the speed of light. This is because we are multiplying $\\tau$ by a number larger than one! As you travel at higher speeds, the Lorentz factor decreases, which makes sense because v/c is getting larger. The smallest the Lorentz factor can be is 1, which occurs when the velocity is equal to the speed of light. Here is a video below that might help you understand this mind-boggling concept better!"
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "metadata": {},
72 | "source": [
73 | "Time Dilation and the Twin \"Paradox\"\n",
74 | "\n",
75 | "
"
77 | ]
78 | },
79 | {
80 | "cell_type": "markdown",
81 | "metadata": {},
82 | "source": [
83 | "Time can also be dilated by massive objects. If you have seen the movie *Interstellar* then you have witnessed the effects of general relativity. Being close to a massive object like a black hole (which is millions to billions times the mass of the sun) causes space-time to be stretched massively! Because of this, time happens a lot slower than it would if you were on Earth. The more massive the object, the more space-time is stretched. The more space-time is stretched, the longer it is going to take for time to occur for you.\n",
84 | "\n",
85 | "Fun Fact: Since sea level is closer to the center of the Earth where gravity is the strongest, time is technically happening slower than it is on a mountatin. The time difference is infinitesimal, but still not the same!\n",
86 | "\n",
87 | "Check out this great visual below of the effect mass has on space-time!\n"
88 | ]
89 | },
90 | {
91 | "cell_type": "code",
92 | "execution_count": 7,
93 | "metadata": {
94 | "collapsed": false
95 | },
96 | "outputs": [
97 | {
98 | "data": {
99 | "text/html": [
100 | "
"
101 | ],
102 | "text/plain": [
103 | ""
104 | ]
105 | },
106 | "execution_count": 7,
107 | "metadata": {},
108 | "output_type": "execute_result"
109 | }
110 | ],
111 | "source": [
112 | "from IPython.display import Image\n",
113 | "from IPython.core.display import HTML \n",
114 | "Image(url= \"http://sci.esa.int/science-e-media/img/72/ESA_LISA-Pathfinder_spacetime_curvature_above_orig.jpg\")"
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "# Length Contraction"
122 | ]
123 | },
124 | {
125 | "cell_type": "markdown",
126 | "metadata": {},
127 | "source": [
128 | "As objects approach the speed of light, they contract in the direction of motion! In other words, when a stationary observer measures the length of a rod moving at near the speed of light, they see it as smaller than it is in its actual reference frame. In the reference frame of the rod, the rod is its actual length and time runs normally. It's only when we observe moving reference frames that we notice these differences. The equation to calculate length contraction is:\n",
129 | "\n",
130 | "$$L=\\frac{1}{\\gamma}L_p = \\sqrt{1-\\frac{v^2}{c^2}} L_p$$\n",
131 | "\n",
132 | "where $L_p$ is the proper length, or the length of the object at rest in a reference frame. It makes sense mathematically that the length is smaller in a moving reference frame because we are dividing by gamma, which is always greater than 1 unless v=c. The effect speed has on length contraction is shown with the baseball figure below."
133 | ]
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 8,
138 | "metadata": {
139 | "collapsed": false
140 | },
141 | "outputs": [
142 | {
143 | "data": {
144 | "text/html": [
145 | "
"
146 | ],
147 | "text/plain": [
148 | ""
149 | ]
150 | },
151 | "execution_count": 8,
152 | "metadata": {},
153 | "output_type": "execute_result"
154 | }
155 | ],
156 | "source": [
157 | "from IPython.display import Image\n",
158 | "from IPython.core.display import HTML \n",
159 | "Image(url= \"http://www.patana.ac.th/secondary/science/anrophysics/relativity_option/images/length_cont1.JPG\")"
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {},
165 | "source": [
166 | "# Relativistic Energy and Momentum"
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "Many of you have probably heard of Albert Einstein's famous equation: $E=mc^2$ It turns out that this isn't always true. $E=mc^2$ is only true for objects at rest! The equation for objects in motion is $E=\\gamma m c^2$ where the Lorentz factor comes into play again. When we multiply $mc^2$ by the Lorentz factor, the mass increases. Therefore, as objects approach the speed of light, they become more massive.\n",
174 | "\n",
175 | "Our Newtonian understanding of momentum is also incorrect. In general physics classes, we learn that $p=mv$, however the relativistic momentum changes at near light speeds. Therefore our new formula for momentum is: $$p =\\gamma mv$$ \n",
176 | "\n",
177 | "In particle physics, we often don't know the masses of particles, but know the energies and momenta in the x, y, and z directions. CERN can reach energies of up to 13 TeV! At particle accelerators like CERN, we are able to use machines that can accelerate particles to near the speed of light and then collide them. We then study the byproducts of these collisions. Since some particles have shorter lifetimes than others, it is possible that some decay before they reach our detectors. We then have to trace our decay products back to something called the displaced vertex (where the original particle was in space right before it decayed). We are able to calculate the invariant mass (mass of particles at rest in their reference frame) using the following formula:\n",
178 | "\n",
179 | "$$E^2=m^2c^4+p^2c^2$$\n",
180 | "\n",
181 | "This equation allows us to calculate the masses of particles that arise from these collisions. \n",
182 | "\n",
183 | "This equation also proves that although photons have no mass, they still have a momentum! The energy for photons is defined as: $$E = pc$$ We can manipulate the formula and solve for the rest mass as follows:\n",
184 | "\n",
185 | "$$m = \\sqrt{E^2 - (p^2_x + p^2_y + p_z^2)}$$\n",
186 | "\n",
187 | "Now we can apply our knowledge of time dilation! Since these particles are moving at near the speed of light, time is happening slower for them relative to us. Essentially, particles will have a longer lifetime when they travel at higher speeds. Because of this, they are able to travel greater distances! We can utilize time dilation to observe some particles before they decay and therefore learn more about them.\n",
188 | "\n",
189 | "##### Fun Fact: There are other ways of measuring masses of particles\n",
190 | "\n",
191 | "In some cases, particles can move faster than the speed of light in different materials! When this happens, a cone of light is given off in the form of Cherenkov radiation. The angle at which this light is given off is directly related to the velocity. Knowing the velocity combined with the momentum, we can measure the mass. "
192 | ]
193 | },
194 | {
195 | "cell_type": "markdown",
196 | "metadata": {},
197 | "source": [
198 | "Here is a great video explaining how the Large Hadron Collider works at CERN in Geneva, Switzerland\n",
199 | "\n",
200 | "
\n"
202 | ]
203 | },
204 | {
205 | "cell_type": "markdown",
206 | "metadata": {},
207 | "source": [
208 | "#### Some things to keep in mind\n",
209 | "* When we calculate masses of particles, we write them in terms of $MeV/c^2$ instead of multiplying by $c^2$"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "metadata": {},
215 | "source": [
216 | "### Summary"
217 | ]
218 | },
219 | {
220 | "cell_type": "markdown",
221 | "metadata": {},
222 | "source": [
223 | "* The speed of light is the same for all observers.\n",
224 | "* Massive objects bend the fabric of space-time.\n",
225 | "* Crazy things begin to happen when you approach the speed of light! \n",
226 | " * Time happens slower\n",
227 | " * Objects contract in length \n",
228 | " * Mass increases \n",
229 | "* We can measure masses of particles given energies and momenta"
230 | ]
231 | },
232 | {
233 | "cell_type": "markdown",
234 | "metadata": {},
235 | "source": [
236 | "This is a lot to take in all at once, which is why we have provided some great resources below that you can check out to make more sense of these mind-blowing laws of physics! To learn more about the math behind some of these formulas check out Paul Avery's University of Florida lecture notes below."
237 | ]
238 | },
239 | {
240 | "cell_type": "markdown",
241 | "metadata": {},
242 | "source": [
243 | "Here's a cool link to a video about Special Relativity. The image is also a link.\n",
244 | "\n",
245 | "
"
247 | ]
248 | },
249 | {
250 | "cell_type": "markdown",
251 | "metadata": {},
252 | "source": [
253 | "## Other resources\n",
254 | "\n",
255 | "* [Great source explaining Einstein's theories of special and general relativity as well as E=mc^2](http://www.emc2-explained.info/)\n",
256 | "* [Relativisitc Kinematics I (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_1.pdf)\n",
257 | "* [Relativisitc Kinematics II (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_2.pdf)\n",
258 | "* [Relativistic Mechanics (Wikipedia)](https://en.wikipedia.org/wiki/Relativistic_mechanics)"
259 | ]
260 | }
261 | ],
262 | "metadata": {
263 | "anaconda-cloud": {},
264 | "kernelspec": {
265 | "display_name": "Python 2",
266 | "language": "python",
267 | "name": "python2"
268 | },
269 | "language_info": {
270 | "codemirror_mode": {
271 | "name": "ipython",
272 | "version": 2
273 | },
274 | "file_extension": ".py",
275 | "mimetype": "text/x-python",
276 | "name": "python",
277 | "nbconvert_exporter": "python",
278 | "pygments_lexer": "ipython2",
279 | "version": "2.7.11"
280 | }
281 | },
282 | "nbformat": 4,
283 | "nbformat_minor": 1
284 | }
285 |
--------------------------------------------------------------------------------
/activities/.ipynb_checkpoints/ppp_physicsbkg_000_specialrelativity-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Relativistic Kinematics Tutorial"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "## Brief Intro to Special Relativity"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "Before talking about relativisic kinematics, let's briefly run through Einstein's theories of Special and General Relavitity. Einstein's theory of special relativity was derived from the following two postulates:\n",
22 | "\n",
23 | "* Postulate 1: The laws of physics are the same in all inertial reference frames.\n",
24 | "* Postulate 2: The speed of light in a vacuum is equal to the value $c$, independent of the motion of the source\n",
25 | "\n",
26 | "To summarize, the laws of physics do not change regardless of what your perspective is. Nothing can go faster than the speed of light in the universe. Everyone *always* measures the speed of light to be $c$ ($\\approx 3\\times 10^8$ m/s) regardless of how fast or slow one is moving. \n",
27 | "\n",
28 | "One consequence of this is that we find that space and time are interwoven into a 4-dimensional fabric known as space-time. This fabric can be bent and stretched which causes changes in how we perceive time.\n",
29 | "\n",
30 | "***Keep these ideas in mind***"
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "## What is Relativistic Kinematics?"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {
43 | "collapsed": true
44 | },
45 | "source": [
46 | "Relativistic kinematics sounds like a complicated term that the average person would be intimidated by. However, it basically it is just a precise way of calculating things like velocity, momentum, and energy. Usually, we only need to worry about this level of precision when we are dealing with objects moving at incredibly fast speeds. \n",
47 | "\n",
48 | "But what is considered a fast speed? \n",
49 | "\n",
50 | "You might have heard before that the speed of light is the speed limit of the universe. This means that no object that has mass can reach or exceed that speed (**Sidenote**: This law only says that anything *inside* space cannot exceed this speed. Space itself is actually expanding at an accelerated rate that can be faster than the speed of light!). What can reach the speed of light? Only particles that have a mass of zero can reach the speed of light, therefore only photons, the particles of light, are able to reach this speed. \n",
51 | "\n",
52 | "Before we go any further, we need to define a term known as the Lorentz factor which plays a key role in understanding relativistic kinematics. The Lorentz factor tells us how time, length, and relativistic mass change for an object in motion. \n",
53 | "\n",
54 | "$$\\gamma = \\frac{1}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\frac{1}{\\sqrt{1-\\beta^2}}$$ $\\beta = \\frac{v}{c}$ tells you the fraction of light speed that the object of interest is moving at. "
55 | ]
56 | },
57 | {
58 | "cell_type": "markdown",
59 | "metadata": {},
60 | "source": [
61 | "## Time Dilation"
62 | ]
63 | },
64 | {
65 | "cell_type": "markdown",
66 | "metadata": {},
67 | "source": [
68 | "What is time dilation? To start off, time isn't the same for everyone as you might have thought. Time changes depending on how fast you are travelling as well as the gravitational bodies you are near. The formula to calculate time dilation (considering only speed and not gravitational effects) is: $$\\Delta t = \\frac{\\Delta t'}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\gamma \\Delta t' = \\gamma \\tau$$ $\\Delta t' = \\tau$ is known as the proper time which is the time measured in the reference frame in which the clock is at rest. $\\Delta t$ is defined as the time dilation. \n",
69 | "\n",
70 | "From this formula, we can tell that the time that an observer measures in a moving reference frame will always be longer unless that particle is moving at the speed of light. This is because we are multiplying $\\tau$ by a number larger than one! As you travel at higher speeds, the Lorentz factor decreases, which makes sense because v/c is getting larger. The smallest the Lorentz factor can be is 1, which occurs when the velocity is 0. The largest this factor can be is undefined, or approaching infinity, which occurs when the velocity is equal to the speed of light. Here is a video below that might help you understand this mind-boggling concept better!"
71 | ]
72 | },
73 | {
74 | "cell_type": "markdown",
75 | "metadata": {},
76 | "source": [
77 | "Time Dilation and the Twin \"Paradox\"\n",
78 | "\n",
79 | "
"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "## A brief aside on General Relativity\n",
88 | "\n",
89 | "General relativity is the theory that Einstein developed during the years 1905-1915 and explains the motion of objects due to gravitational effects. It can be summarized as such:\n",
90 | "\n",
91 | "*\"Matter tells space how to curve and space tells matter how to move\"* - John Archibald Wheeler\n",
92 | "\n",
93 | "This theory tells us that time is also dilated by massive objects. If you have seen the movie *Interstellar* then you have witnessed the effects of general relativity. Being close to a massive object like a stellar black hole (which can be anywhere from a few times to a few millions times the mass of the sun) causes space-time to be stretched massively! Because of this, time happens a lot slower than it would if you were on Earth. The more massive the object, the more space-time is stretched. The more space-time is stretched, the longer it is going to take for time to occur for you.\n",
94 | "\n",
95 | "Fun Fact: Since sea level is closer to the center of the Earth where gravity is the strongest, time is technically happening slower than it is on a mountatin. The time difference is infinitesimal, but still not the same!\n",
96 | "\n",
97 | "Check out this great visual below of the effect mass has on space-time!\n"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": 7,
103 | "metadata": {
104 | "collapsed": false
105 | },
106 | "outputs": [
107 | {
108 | "data": {
109 | "text/html": [
110 | "
"
111 | ],
112 | "text/plain": [
113 | ""
114 | ]
115 | },
116 | "execution_count": 7,
117 | "metadata": {},
118 | "output_type": "execute_result"
119 | }
120 | ],
121 | "source": [
122 | "from IPython.display import Image\n",
123 | "from IPython.core.display import HTML \n",
124 | "Image(url= \"http://sci.esa.int/science-e-media/img/72/ESA_LISA-Pathfinder_spacetime_curvature_above_orig.jpg\")"
125 | ]
126 | },
127 | {
128 | "cell_type": "markdown",
129 | "metadata": {},
130 | "source": [
131 | "# Length Contraction"
132 | ]
133 | },
134 | {
135 | "cell_type": "markdown",
136 | "metadata": {},
137 | "source": [
138 | "As objects approach the speed of light, they contract in the direction of motion! In other words, when a stationary observer measures the length of a rod moving at near the speed of light, they see it as smaller than it is in its actual reference frame. In the reference frame of the rod, the rod is its actual length and time runs normally. It's only when we observe moving reference frames that we notice these differences. The equation to calculate length contraction is:\n",
139 | "\n",
140 | "$$L=\\frac{1}{\\gamma}L_p = \\sqrt{1-\\frac{v^2}{c^2}} L_p$$\n",
141 | "\n",
142 | "where $L_p$ is the proper length, or the length of the object at rest in a reference frame. It makes sense mathematically that the length is smaller in a moving reference frame because we are dividing by gamma, which is always greater than 1 unless v=c. The effect speed has on length contraction is shown with the baseball figure below."
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 8,
148 | "metadata": {
149 | "collapsed": false
150 | },
151 | "outputs": [
152 | {
153 | "data": {
154 | "text/html": [
155 | "
"
156 | ],
157 | "text/plain": [
158 | ""
159 | ]
160 | },
161 | "execution_count": 8,
162 | "metadata": {},
163 | "output_type": "execute_result"
164 | }
165 | ],
166 | "source": [
167 | "from IPython.display import Image\n",
168 | "from IPython.core.display import HTML \n",
169 | "Image(url= \"http://www.patana.ac.th/secondary/science/anrophysics/relativity_option/images/length_cont1.JPG\")"
170 | ]
171 | },
172 | {
173 | "cell_type": "markdown",
174 | "metadata": {},
175 | "source": [
176 | "# Relativistic Energy and Momentum"
177 | ]
178 | },
179 | {
180 | "cell_type": "markdown",
181 | "metadata": {},
182 | "source": [
183 | "Many of you have probably heard of Albert Einstein's famous equation: $E=mc^2$ It turns out that this isn't always true. $E=mc^2$ is only true for objects at rest! The equation for objects in motion is $E=\\gamma m c^2$ where the Lorentz factor comes into play again. When we multiply $mc^2$ by the Lorentz factor, the mass increases. Therefore, as objects approach the speed of light, they become more massive.\n",
184 | "\n",
185 | "Our Newtonian understanding of momentum is also incorrect. In general physics classes, we learn that $p=mv$, however the relativistic momentum changes at near light speeds. Therefore our new formula for momentum is: $$p =\\gamma mv$$ \n",
186 | "\n",
187 | "In particle physics, we often don't know the masses of particles, but know the energies and momenta in the x, y, and z directions. CERN can reach energies of up to 13 TeV! At particle accelerators like CERN, we are able to use machines that can accelerate particles to near the speed of light and then collide them. We then study the byproducts of these collisions. Since some particles have shorter lifetimes than others, it is possible that some decay before they reach our detectors. We then have to trace our decay products back to something called the displaced vertex (where the original particle was in space right before it decayed). We are able to calculate the invariant mass (mass of particles at rest in their reference frame) using the following formula:\n",
188 | "\n",
189 | "$$E^2=m^2c^4+p^2c^2$$\n",
190 | "\n",
191 | "This equation allows us to calculate the masses of particles that arise from these collisions. \n",
192 | "\n",
193 | "This equation also proves that although photons have no mass, they still have a momentum! The energy for photons is defined as: $$E = pc$$ We can manipulate the formula and solve for the rest mass as follows:\n",
194 | "\n",
195 | "$$m = \\sqrt{E^2 - (p^2_x + p^2_y + p_z^2)}$$\n",
196 | "\n",
197 | "Now we can apply our knowledge of time dilation! Since these particles are moving at near the speed of light, time is happening slower for them relative to us. Essentially, particles will have a longer lifetime when they travel at higher speeds. Because of this, they are able to travel greater distances! We can utilize time dilation to observe some particles before they decay and therefore learn more about them.\n",
198 | "\n",
199 | "##### Fun Fact: There are other ways of measuring masses of particles\n",
200 | "\n",
201 | "In some cases, particles can move faster than the speed of light in different materials! When this happens, a cone of light is given off in the form of Cherenkov radiation. The angle at which this light is given off is directly related to the velocity. Knowing the velocity combined with the momentum, we can measure the mass. "
202 | ]
203 | },
204 | {
205 | "cell_type": "markdown",
206 | "metadata": {},
207 | "source": [
208 | "Here is a great video explaining how the Large Hadron Collider works at CERN in Geneva, Switzerland\n",
209 | "\n",
210 | "
\n",
212 | "Photo credit: CERN (https://www.flickr.com/photos/11304375@N07/2046228644)\n"
213 | ]
214 | },
215 | {
216 | "cell_type": "markdown",
217 | "metadata": {},
218 | "source": [
219 | "#### Some things to keep in mind\n",
220 | "* When we calculate masses of particles, we write them in terms of $MeV/c^2$ instead of multiplying by $c^2$"
221 | ]
222 | },
223 | {
224 | "cell_type": "markdown",
225 | "metadata": {},
226 | "source": [
227 | "### Summary"
228 | ]
229 | },
230 | {
231 | "cell_type": "markdown",
232 | "metadata": {},
233 | "source": [
234 | "* The speed of light is the same for all observers.\n",
235 | "* Massive objects bend the fabric of space-time.\n",
236 | "* Crazy things begin to happen when you approach the speed of light! \n",
237 | " * Time happens slower\n",
238 | " * Objects contract in length \n",
239 | " * Mass increases \n",
240 | "* We can measure masses of particles given energies and momenta"
241 | ]
242 | },
243 | {
244 | "cell_type": "markdown",
245 | "metadata": {},
246 | "source": [
247 | "This is a lot to take in all at once, which is why we have provided some great resources below that you can check out to make more sense of these mind-blowing laws of physics! To learn more about the math behind some of these formulas check out Paul Avery's University of Florida lecture notes below."
248 | ]
249 | },
250 | {
251 | "cell_type": "markdown",
252 | "metadata": {},
253 | "source": [
254 | "Here's a cool link to a video about Special Relativity. The image is also a link.\n",
255 | "\n",
256 | "
"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "metadata": {},
263 | "source": [
264 | "## Other resources\n",
265 | "\n",
266 | "* [Great source explaining Einstein's theories of special and general relativity as well as E=mc^2](http://www.emc2-explained.info/)\n",
267 | "* [Relativisitc Kinematics I (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_1.pdf)\n",
268 | "* [Relativisitc Kinematics II (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_2.pdf)\n",
269 | "* [Relativistic Mechanics (Wikipedia)](https://en.wikipedia.org/wiki/Relativistic_mechanics)"
270 | ]
271 | }
272 | ],
273 | "metadata": {
274 | "anaconda-cloud": {},
275 | "kernelspec": {
276 | "display_name": "Python 2",
277 | "language": "python",
278 | "name": "python2"
279 | },
280 | "language_info": {
281 | "codemirror_mode": {
282 | "name": "ipython",
283 | "version": 2
284 | },
285 | "file_extension": ".py",
286 | "mimetype": "text/x-python",
287 | "name": "python",
288 | "nbconvert_exporter": "python",
289 | "pygments_lexer": "ipython2",
290 | "version": "2.7.11"
291 | }
292 | },
293 | "nbformat": 4,
294 | "nbformat_minor": 1
295 | }
296 |
--------------------------------------------------------------------------------
/activities/activity00_cms_muons.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Relativistic kinematics"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Learning goals
\n",
15 | "\n",
16 | " - Relativistic kinematics.\n",
17 | "
- Standard model particles.\n",
18 | "
"
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "Background\n",
26 | "\n",
27 | "If you know the mass of a particle, most of the time you know what that particle is. However, there is no way to just build a single detector that gives you the mass. You need to be clever and make use of Special relativity, specifically relativistic kinematics.\n",
28 | "\n",
29 | "To determine the mass ($m$) of a particle you need to know the 4-momenta of the particles ($\\mathbf{P}$) that are detected after the collision: the energy ($E$), the momentum in the x direction ($p_x$), the momentum in the y direction ($p_y$), the momentum in the z direction ($p_z$).\n",
30 | "\n",
31 | "$$\\mathbf{P} = (E,p_x,p_y,p_z)$$\n",
32 | "\n",
33 | "\n",
34 | "\\begin{equation*} m = \\sqrt{E^2-(p_x^2+p_y^2 + p_z^2)} \\end{equation*}\n"
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "metadata": {},
40 | "source": [
41 | "Let's code!\n",
42 | "\n",
43 | "Here is some sample code that reads in data from a small sample file from the CMS experiment. It loops over data from many different proton-proton collisions. \n",
44 | "\n",
45 | "If you haven't already, you will want to go through the [data model](https://github.com/particle-physics-playground/playground/blob/master/activities/codebkg_DataInterfacing.ipynb) (also included when you cloned this directory) exercise so you know how to pull out the relevant information. \n",
46 | "\n",
47 | "For each collision, you can get the 4-momenta of the jets, muons, electrons, and photons produced in these collisions. "
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": null,
53 | "metadata": {},
54 | "outputs": [],
55 | "source": [
56 | "# Import standard libraries #\n",
57 | "import numpy as np\n",
58 | "import matplotlib.pylab as plt\n",
59 | "%matplotlib notebook\n",
60 | "\n",
61 | "# Import custom tools # \n",
62 | "import h5hep \n",
63 | "import pps_tools as pps\n",
64 | "\n",
65 | "# Download the file #\n",
66 | "file = 'dimuons_1000_collisions.hdf5'\n",
67 | "pps.download_drive_file(file)\n",
68 | "print(\"Reading in the data....\")\n",
69 | "\n",
70 | "# Read the data in as a list #\n",
71 | "infile = '../data/dimuons_1000_collisions.hdf5'\n",
72 | "collisions = pps.get_collisions(infile,experiment='CMS',verbose=False)\n",
73 | " \n",
74 | "print(len(collisions)) \n"
75 | ]
76 | },
77 | {
78 | "cell_type": "markdown",
79 | "metadata": {},
80 | "source": [
81 | "Challenge!
\n",
82 | "\n",
83 | "Copy this sample code and use it to calculate the mass of the muons. Make a histogram of this quantity. \n",
84 | "\n",
85 | "Hint!\n",
86 | "\n",
87 | "Make sure you do this for all the muons! Each collision can produce differing numbers of muons, so take care when you code this up."
88 | ]
89 | },
90 | {
91 | "cell_type": "markdown",
92 | "metadata": {},
93 | "source": [
94 | "Your histogram should look something like the following sketch, though the peak will be at different values. \n",
95 | "\n",
96 | "The value of the peak, should be the mass of the particle Check your answer! \n",
97 | "\n",
98 | "You should also make histograms of the energy and magnitude of momentum ($|p|$). You should see a pretty wide range of values for these, and yet the mass is a very specific number. "
99 | ]
100 | },
101 | {
102 | "cell_type": "code",
103 | "execution_count": null,
104 | "metadata": {},
105 | "outputs": [],
106 | "source": [
107 | "from IPython.display import Image\n",
108 | "Image(filename='images/muons_sketch.jpeg')"
109 | ]
110 | },
111 | {
112 | "cell_type": "code",
113 | "execution_count": null,
114 | "metadata": {},
115 | "outputs": [],
116 | "source": [
117 | "# Your code here"
118 | ]
119 | },
120 | {
121 | "cell_type": "markdown",
122 | "metadata": {},
123 | "source": [
124 | "Suppose we didn't know anything about special relativity and we tried calculating the mass from what we know about classical physics. \n",
125 | "\n",
126 | "$$KE = \\frac{1}{2}mv^2 \\qquad KE = \\frac{p^2}{2m} \\qquad m = \\frac{p^2}{2KE}$$\n",
127 | "\n",
128 | "Let's interpret the energy from the CMS data as the kinetic energy ($KE$). Use classical mechanics then to calculate the mass of the muon, given the energy/KE and the momentum. What does that histogram look like?\n",
129 | "\n",
130 | "*Your histogram should not look like the last one! We know that the Classical description of kinematics is not accurate for particle moving at high energies, so don't worry if the two histograms are different. That's the point! :)*"
131 | ]
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": null,
136 | "metadata": {},
137 | "outputs": [],
138 | "source": [
139 | "# Your code here"
140 | ]
141 | }
142 | ],
143 | "metadata": {
144 | "kernelspec": {
145 | "display_name": "Python 3",
146 | "language": "python",
147 | "name": "python3"
148 | },
149 | "language_info": {
150 | "codemirror_mode": {
151 | "name": "ipython",
152 | "version": 3
153 | },
154 | "file_extension": ".py",
155 | "mimetype": "text/x-python",
156 | "name": "python",
157 | "nbconvert_exporter": "python",
158 | "pygments_lexer": "ipython3",
159 | "version": "3.6.5"
160 | }
161 | },
162 | "nbformat": 4,
163 | "nbformat_minor": 1
164 | }
165 |
--------------------------------------------------------------------------------
/activities/activity01_cms_dimuons.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Looking at the dimuon spectrum over a wide energy range"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Learning goals
\n",
15 | "\n",
16 | " - Relativistic kinematics.\n",
17 | "
- Mesons.\n",
18 | "
"
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "Background\n",
26 | "\n",
27 | "To determine the mass ($m$) of a particle you need to know the 4-momenta of the particles ($\\mathbf{P}$) that are detected after the collision: the energy ($E$), the momentum in the x direction ($p_x$), the momentum in the y direction ($p_y$), the momentum in the z direction ($p_z$).\n",
28 | "\n",
29 | "$$\\mathbf{P} = (E,p_x,p_y,p_z)$$\n",
30 | "\n",
31 | "\n",
32 | "\\begin{equation*} m = \\sqrt{E^2-(p_x^2+p_y^2 + p_z^2)} \\end{equation*}\n",
33 | "\n",
34 | "Some particles are very unstable and decay (turn into) to two or more other particles. In fact, they can decay so quickly, that they never interact with your detector! Yikes!\n",
35 | "\n",
36 | "However, we can reconstruct the parent particle (sometimes referred to as the initial state particle) and its 4-momentum by adding the 4-momenta of the child particles (sometimes referred to as the decay products). \n",
37 | "\n",
38 | "$$\\mathbf{P_{\\rm parent}} = \\mathbf{P_{\\rm child 0}} + \\mathbf{P_{\\rm child 1}} + \\mathbf{P_{\\rm child 2}} + ...$$\n",
39 | "\n",
40 | "\n",
41 | "\n",
42 | "which breaks down into...\n",
43 | "\n",
44 | "$$E_{\\rm parent} = E_{\\rm child 0} + E_{\\rm child 1} + E_{\\rm child 2} + ...$$\n",
45 | "\n",
46 | "$$p_{\\rm x parent} = p_{\\rm x child 0} + p_{\\rm x child 1} + p_{\\rm x child 2} + ...$$\n",
47 | "\n",
48 | "$$p_{\\rm y parent} = p_{\\rm y child 0} + p_{\\rm y child 1} + p_{\\rm y child 2} + ...$$\n",
49 | "\n",
50 | "$$p_{\\rm z parent} = p_{\\rm z child 0} + p_{\\rm y child 1} + p_{\\rm z child 2} + ...$$\n"
51 | ]
52 | },
53 | {
54 | "cell_type": "markdown",
55 | "metadata": {},
56 | "source": [
57 | "Let's code!\n",
58 | "\n",
59 | "Here is some very, very basic starter code. It reads in data from the CMS experiment. \n",
60 | "\n",
61 | "If you haven't already, you will want to go through the [Data Interfacing model](https://github.com/particle-physics-playground/playground/blob/master/activities/codebkg_DataInterfacing.ipynb) (also included when you cloned this directory) exercise so you know how to pull out the relevant information. \n",
62 | "\n",
63 | "In order to see the full physics of the dimuon system, we need a larger data file than the one used for the previous activity (this one has 100,000 collisions rather than 1,000). The code for doing so is shown below, but for more details on how to download other files, see the [download more data](https://github.com/particle-physics-playground/playground/blob/master/activities/codebkg_DownloadData.ipynb) exercise, also included in this repository."
64 | ]
65 | },
66 | {
67 | "cell_type": "code",
68 | "execution_count": null,
69 | "metadata": {},
70 | "outputs": [],
71 | "source": [
72 | "import numpy as np\n",
73 | "import matplotlib.pylab as plt\n",
74 | "%matplotlib notebook\n",
75 | "\n",
76 | "import h5hep \n",
77 | "import pps_tools as hep\n",
78 | "from file_download_tools import download_file\n",
79 | "\n",
80 | "infile = \"../data/dimuons_1000_collisions.hdf5\"\n",
81 | "print(\"Reading in the data....\")\n",
82 | "collisions = hep.get_collisions(infile,experiment='CMS',verbose=False)\n",
83 | " \n",
84 | "print(len(collisions)) \n"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "Challenge!
\n",
92 | "\n",
93 | "Use the sample code to find the mass of the particle that the two muons came from (parent particle). \n",
94 | "\n",
95 | "To do this, you will need to loop over all pairs of muons for each collision, sum their 4-momenta (energy, px, py, and pz) and then use that to calculate the invariant mass. \n",
96 | "\n",
97 | "Do this for all possible pairs and in addition, break it down so that you calculate the invariant mass for the cases where:\n",
98 | "* Both muons are positively charged.\n",
99 | "* Both muons are negatively charged.\n",
100 | "* The muons have opposite charges.\n",
101 | "\n",
102 | "Be careful. Some collisions may have more than 2 muons, so write your code such that it calculates all possible pairs of muons in a given collisions. For example, if there are 3 muons in a collision, there are 3 possible pairs that you can make. \n",
103 | "\n",
104 | "Hint!\n",
105 | "\n",
106 | "It is very likely that a particle exists where there is a peak in the data. However, this is not always true. \n",
107 | "A peak in the data is most likely the mass of a particle. You can look at the approximate mass to figure out which particle \n",
108 | "is found in the data."
109 | ]
110 | },
111 | {
112 | "cell_type": "markdown",
113 | "metadata": {},
114 | "source": [
115 | "Your histogram should look something like the following sketch. The value of the peaks should be the mass of a particle. You should be able to find two particles in their ground state. Check your answer for the first particle! Check your answer for the second particle! "
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": null,
121 | "metadata": {},
122 | "outputs": [],
123 | "source": [
124 | "from IPython.display import Image\n",
125 | "Image(filename='images/dimuons_sketch.jpeg')"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "execution_count": null,
131 | "metadata": {},
132 | "outputs": [],
133 | "source": [
134 | "#your code here"
135 | ]
136 | },
137 | {
138 | "cell_type": "markdown",
139 | "metadata": {},
140 | "source": [
141 | "#### Comments"
142 | ]
143 | },
144 | {
145 | "cell_type": "markdown",
146 | "metadata": {},
147 | "source": [
148 | "Depending on which file you ran over, you may see hints of particles below 20 GeV/c$^2$. It is possible you see signs of other particles at even higher energies. Plot your masses over a wide range of values, but then zoom in (change the plotting range) on different mass ranges to see if you can identify these particles. "
149 | ]
150 | }
151 | ],
152 | "metadata": {
153 | "kernelspec": {
154 | "display_name": "Python 3",
155 | "language": "python",
156 | "name": "python3"
157 | },
158 | "language_info": {
159 | "codemirror_mode": {
160 | "name": "ipython",
161 | "version": 3
162 | },
163 | "file_extension": ".py",
164 | "mimetype": "text/x-python",
165 | "name": "python",
166 | "nbconvert_exporter": "python",
167 | "pygments_lexer": "ipython3",
168 | "version": "3.6.5"
169 | }
170 | },
171 | "nbformat": 4,
172 | "nbformat_minor": 1
173 | }
174 |
--------------------------------------------------------------------------------
/activities/activity02_cleo_dmesons.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Reconstructing $D$ mesons"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Learning goals
\n",
15 | "\n",
16 | " - Relativistic kinematics.\n",
17 | "
- Mesons.\n",
18 | "
"
19 | ]
20 | },
21 | {
22 | "cell_type": "markdown",
23 | "metadata": {},
24 | "source": [
25 | "To prepare for this activity, you should already have looked at the activity on [reconstructing particles from their decay products](https://github.com/particle-physics-playground/playground/blob/master/activities/activity01_cms_dimuons.ipynb).\n",
26 | "\n",
27 | "After you are familiar with those activities, use the [download more data notebook](https://github.com/particle-physics-playground/playground/blob/master/activities/codebkg_DownloadData.ipynb) and grab the Monte Carlo file that simulates the following decay:\n",
28 | "\n",
29 | "$$D^+ \\rightarrow K^- \\pi^+ \\pi^+$$ \n",
30 | "Also grab the CLEO data file. \n",
31 | "\n",
32 | "Your challenge is to reconstruct the $D^+$ meson in the Monte Carlo and then go to the data and see if you can find the $D^+$ in the same decay mode. Things to think about:\n",
33 | "\n",
34 | "* Make sure you deal with all possible $K\\pi\\pi$ combinations.\n",
35 | "* How much background is there under the peak in the data? How might you eliminate it? Can you eliminate all of it?\n",
36 | "* Is there \"structure\" in the $K\\pi$ systems? That is, when you plot the invariant mass of the $K\\pi$ system, do you see any peaks?\n",
37 | "* Can you find the other decay modes in the data that you have MC for? \n",
38 | "\n",
39 | "Have fun and good luck!"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": null,
45 | "metadata": {},
46 | "outputs": [],
47 | "source": [
48 | "# Your code here"
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": null,
54 | "metadata": {},
55 | "outputs": [],
56 | "source": []
57 | }
58 | ],
59 | "metadata": {
60 | "kernelspec": {
61 | "display_name": "Python 3",
62 | "language": "python",
63 | "name": "python3"
64 | },
65 | "language_info": {
66 | "codemirror_mode": {
67 | "name": "ipython",
68 | "version": 3
69 | },
70 | "file_extension": ".py",
71 | "mimetype": "text/x-python",
72 | "name": "python",
73 | "nbconvert_exporter": "python",
74 | "pygments_lexer": "ipython3",
75 | "version": "3.6.5"
76 | }
77 | },
78 | "nbformat": 4,
79 | "nbformat_minor": 1
80 | }
81 |
--------------------------------------------------------------------------------
/activities/activity03_cms_topquark.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "Background\n",
8 | "\n",
9 | "When a parent particle decays, it sometimes produces a spray of jets. Jets are a cone of hadrons that are produced from a collision. You can add together the 4-momenta of the jets to find the mass of the parent particle. \n",
10 | "\n",
11 | "$$\\mathbf{P_{\\rm parent}} = \\mathbf{P_{\\rm jet 0}} + \\mathbf{P_{\\rm jet 1}} + \\mathbf{P_{\\rm jet 2}} + ...$$"
12 | ]
13 | },
14 | {
15 | "cell_type": "markdown",
16 | "metadata": {},
17 | "source": [
18 | "Challenge!
\n",
19 | "\n",
20 | "Using the same method as for the previous reconstruction activities, add the 4-vectors of the jets and determine the mass and type of the parent particle. Make a histogram of the mass. Do this for the raw data file `data.hdf5` and the top quark MC file `ttbar.hdf5` at least, but consider doing the same for all the rest of the CMS MC files to see if there is any similar structure. The process of downloading these files is discussed in the [DownloadData notebook](https://github.com/particle-physics-playground/playground/blob/master/activities/codebkg_DownloadData.ipynb). \n",
21 | "\n",
22 | "Hint!\n",
23 | "\n",
24 | "Make sure you do this for all the combinations of jets! Each collision can produce differing numbers of jets, find all the three combinations of jets to find the parent particle."
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "Your histogram should look something like the following sketch. The value of the peak should be the mass of the parent particle. Check your answer! "
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": null,
37 | "metadata": {},
38 | "outputs": [],
39 | "source": [
40 | "from IPython.display import Image\n",
41 | "Image(filename='images/discovering_sketch_B.jpeg')"
42 | ]
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": null,
47 | "metadata": {},
48 | "outputs": [],
49 | "source": [
50 | "# Your code here"
51 | ]
52 | },
53 | {
54 | "cell_type": "code",
55 | "execution_count": null,
56 | "metadata": {},
57 | "outputs": [],
58 | "source": [
59 | "# Your code here"
60 | ]
61 | }
62 | ],
63 | "metadata": {
64 | "kernelspec": {
65 | "display_name": "Python 3",
66 | "language": "python",
67 | "name": "python3"
68 | },
69 | "language_info": {
70 | "codemirror_mode": {
71 | "name": "ipython",
72 | "version": 3
73 | },
74 | "file_extension": ".py",
75 | "mimetype": "text/x-python",
76 | "name": "python",
77 | "nbconvert_exporter": "python",
78 | "pygments_lexer": "ipython3",
79 | "version": "3.6.5"
80 | }
81 | },
82 | "nbformat": 4,
83 | "nbformat_minor": 1
84 | }
85 |
--------------------------------------------------------------------------------
/activities/codebkg_DataInterfacing.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "colab_type": "text",
7 | "id": "mas4lT9b-Wpd"
8 | },
9 | "source": [
10 | "This notebook describes how to use the provided tools to interface with the data. It goes over the process of installing the tools, retrieving the data, and opening the data within a notebook.\n",
11 | "
\n",
12 | "
\n",
13 | "\n",
14 | "# Importing the tools and data#\n",
15 | "[Video Tutorial on how to import tools into Jupyter](https://www.youtube.com/watch?v=dWzWwhLmJgw)\n",
16 | "
\n",
17 | "
\n",
18 | "If you have worked with python notebooks before, you are probably familiar with the more basic included libraries. While you may not use all of their functionality for every activity, they are a very useful option to have available. We can bring them in with the standard `import` command.\n",
19 | "\n"
20 | ]
21 | },
22 | {
23 | "cell_type": "code",
24 | "execution_count": null,
25 | "metadata": {
26 | "colab": {
27 | "autoexec": {
28 | "startup": false,
29 | "wait_interval": 0
30 | }
31 | },
32 | "colab_type": "code",
33 | "id": "pbG3iafL-Q3G"
34 | },
35 | "outputs": [],
36 | "source": [
37 | "import numpy as np\n",
38 | "import matplotlib.pylab as plt\n",
39 | "%matplotlib notebook"
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {
45 | "colab_type": "text",
46 | "id": "OBd1E0INk29w"
47 | },
48 | "source": [
49 | "Now we need the particle physics specific libraries. If you installed the libraries from the command shell properly as shown in the [local setup tutorial](https://www.youtube.com/watch?v=oQXFZU9RuCY), then most of the work needed to use these should already be done. From here it should be as simple as using the `import` command like for the included libraries."
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": null,
55 | "metadata": {
56 | "colab": {
57 | "autoexec": {
58 | "startup": false,
59 | "wait_interval": 0
60 | }
61 | },
62 | "colab_type": "code",
63 | "id": "Agx3j5tIk2hi",
64 | "scrolled": true
65 | },
66 | "outputs": [],
67 | "source": [
68 | "import h5hep \n",
69 | "import pps_tools as pps"
70 | ]
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "With all of the tools imported, we now need our data files. Included in `pps_tools` are several functions for this purpose. Currently all of the files for the activities are located in [this Google Drive folder](https://drive.google.com/drive/u/0/folders/1qK8HL070jpQ6AJllsGHDDdUbjerDqG-c). The function you will need to download files from this Drive is `download_drive_file`, for which the argument is simply the file name. You can also use the function `download_file_from_google_drive` if you want to save the file you download under a different name, _or_ if for some reason you need to download a file from Google Drive that is not included, in which case you will need to put the file's id tag instead of the filename.\n",
77 | "\n",
78 | "
\n",
79 | "In the case that you want to download a file from a different location online, you would need to use the `download_file` function, for which the argument is the url of the file you need. (This tool will not work for Google Drive files).\n",
80 | "\n",
81 | "
\n",
82 | "Once you download a file, it should permenantly reside in the directory you downloaded it to, so you only have to do it once."
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": null,
88 | "metadata": {},
89 | "outputs": [],
90 | "source": [
91 | "filename = 'dimuons_1000_collisions.hdf5'\n",
92 | "pps.download_drive_file(filename)\n",
93 | "\n",
94 | "### Other examples: ###\n",
95 | "#pps.download_file_from_google_drive('dimuons_1000_collisions.hdf5','data/file.hdf5')\n",
96 | "#pps.download_file_from_google_drive('','data/file.hdf5')\n",
97 | "\n",
98 | "#pps.download_file('https://github.com/particle-physics-playground/playground/blob/master/data/dimuons_1000_collisions.hdf5')"
99 | ]
100 | },
101 | {
102 | "cell_type": "markdown",
103 | "metadata": {
104 | "colab_type": "text",
105 | "id": "3VrrK-TZDBG1"
106 | },
107 | "source": [
108 | "With the tools imported and files downloaded, you should now have everything you need to start interfacing with the data!\n",
109 | "
\n",
110 | "
\n",
111 | "# Interfacing with the data#\n",
112 | "[Video overview on data interfacing](https://www.youtube.com/watch?v=tI2foOcuRVM)\n",
113 | "
\n",
114 | "## Reading data and navigating lists##\n",
115 | "The ```h5hep``` tools we used to unpack the data files puts the data all into lists that are accessible with dictionaries. You can view all the of the dictionary entries the data is tagged with using the following command (this is entirely optional, and simply gives you an idea of what kind of data the file may have contained)."
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": null,
121 | "metadata": {
122 | "colab": {
123 | "autoexec": {
124 | "startup": false,
125 | "wait_interval": 0
126 | }
127 | },
128 | "colab_type": "code",
129 | "id": "nfjWqWiDDBLT"
130 | },
131 | "outputs": [],
132 | "source": [
133 | "# Print the keys to see what is in the dictionary OPTIONAL\n",
134 | "for key in event.keys():\n",
135 | " print(key)"
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {
141 | "colab_type": "text",
142 | "id": "W4zWeTnmDBRA"
143 | },
144 | "source": [
145 | "To organize the data in a way that makes it easy to find what you need, you will need to use the ```hep``` tools we imported. This can be done in several ways. \n",
146 | "
\n",
147 | "### Simple way###\n",
148 | "The first way uses less commands, but gives you less control over how much data you are using. This command organizes ALL of the data, so if you are using a large data file, this can take a long time. However, it is usually the best choice if you want to use all the data. \n",
149 | "
\n",
150 | "
\n",
151 | "NOTE: This command will need to change depending on which experiment your activity is aligned with. For instance, the top quark activity uses CMS tools, so for the ```experiment``` argument in ```get_collisions```, we put ```'CMS'```. The other possible arguments would be ```'CLEO'``` and ```'BaBar'```."
152 | ]
153 | },
154 | {
155 | "cell_type": "code",
156 | "execution_count": null,
157 | "metadata": {
158 | "colab": {
159 | "autoexec": {
160 | "startup": false,
161 | "wait_interval": 0
162 | }
163 | },
164 | "colab_type": "code",
165 | "id": "65dDlZPpDBWJ"
166 | },
167 | "outputs": [],
168 | "source": [
169 | "infile = '../data/dimuons_1000_collisions.hdf5'\n",
170 | "\n",
171 | "collisions = pps.get_collisions(infile,experiment='CMS',verbose=False)\n",
172 | "print(len(collisions), \" collisions\") # This line is optional, and simply tells you how many events are in the file."
173 | ]
174 | },
175 | {
176 | "cell_type": "markdown",
177 | "metadata": {
178 | "colab_type": "text",
179 | "id": "GB81s26YJ4Ql"
180 | },
181 | "source": [
182 | "This returns a list called ```collisions``` which has all of the collision events as entries. Each event is in turn its own list whose entries are the different types of particles involved in that collision. These are also lists, containing each individual particle of that particular type as entries, which are also lists of the four-momentum and other characteristics of each particle. \n",
183 | "
\n",
184 | "This can be a bit complicated until you learn to work with it, so we'll try a visualization as an example:"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": null,
190 | "metadata": {
191 | "colab": {
192 | "autoexec": {
193 | "startup": false,
194 | "wait_interval": 0
195 | }
196 | },
197 | "colab_type": "code",
198 | "id": "cEbVWQsyJ4Ud"
199 | },
200 | "outputs": [],
201 | "source": [
202 | "second_collision = collisions[1] # the second event (list indexes start at 0)\n",
203 | "print(\"Second event: \",second_collision)\n",
204 | "all_muons = second_collision['muons'] # all of the jets in the first event\n",
205 | "print(\"All muons: \",all_muons)\n",
206 | "first_muon = all_muons[0] # the first jet in the first event\n",
207 | "print(\"First muon: \",first_muon) \n",
208 | "muon_energy = first_muon['e'] # the energy of the first photon\n",
209 | "print(\"First muon's energy: \",muon_energy)"
210 | ]
211 | },
212 | {
213 | "cell_type": "markdown",
214 | "metadata": {
215 | "colab_type": "text",
216 | "id": "towgZNaXJ4aD"
217 | },
218 | "source": [
219 | "You might notice that each individual event is callable from all collisions by is entry number, as are the individual particles from within their lists of particle types. However, the particle types themselves are only callable from the event list by their names. The characteristics of each particle are also only callable from their lists by the name of the characteristic. The exact dictionary entry needed to call them can be referenced by printing ```event.keys``` as above."
220 | ]
221 | },
222 | {
223 | "cell_type": "markdown",
224 | "metadata": {
225 | "colab_type": "text",
226 | "id": "ku6h5-c9kY1-"
227 | },
228 | "source": [
229 | "Because ```get_collisions``` puts ALL of the data in a list, to do you analysis, you can simply call everything you need from this one list. For instance, if we wanted to find the energies of all the jets in the entire list of collisions, we could do so using loops:"
230 | ]
231 | },
232 | {
233 | "cell_type": "code",
234 | "execution_count": null,
235 | "metadata": {
236 | "colab": {
237 | "autoexec": {
238 | "startup": false,
239 | "wait_interval": 0
240 | }
241 | },
242 | "colab_type": "code",
243 | "id": "YFnpDXwHJ4e3"
244 | },
245 | "outputs": [],
246 | "source": [
247 | "energies = []\n",
248 | "\n",
249 | "for collision in collisions: # loops over all the events in the file\n",
250 | " jets = collision['jets'] # gets the list of all photons in the event\n",
251 | " \n",
252 | " for jet in jets: # loops over each photon in the current event\n",
253 | " e = jet['e'] # gets the energy of the photon\n",
254 | " \n",
255 | " energies.append(e) # puts the energy in a list"
256 | ]
257 | },
258 | {
259 | "cell_type": "markdown",
260 | "metadata": {
261 | "colab_type": "text",
262 | "id": "M-v4vyHWJ4iz"
263 | },
264 | "source": [
265 | "### More involved way###\n",
266 | "Alternatively, you can use the following series of commands to organize the data. It is a little more involved, but gives you more control over the data. For instance, it gives you the ability to only use some of the events rather than all of them, which also would decrease some of the computing time. \n",
267 | "\n"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": null,
273 | "metadata": {
274 | "colab": {
275 | "autoexec": {
276 | "startup": false,
277 | "wait_interval": 0
278 | }
279 | },
280 | "colab_type": "code",
281 | "id": "WMN46ZjzJ4m2"
282 | },
283 | "outputs": [],
284 | "source": [
285 | "infile = '../data/dimuons_1000_collisions.hdf5' \n",
286 | "\n",
287 | "alldata = pps.get_all_data(infile,verbose=False)\n",
288 | "nentries = pps.get_number_of_entries(alldata)\n",
289 | "\n",
290 | "print(\"# entries: \",nentries) # This optional line tells you how many events are in the file\n"
291 | ]
292 | },
293 | {
294 | "cell_type": "markdown",
295 | "metadata": {
296 | "colab_type": "text",
297 | "id": "rVVNlP7IuGq6"
298 | },
299 | "source": [
300 | "The above commands do not actually make the data directly usable, we need one more step for that, which is the ```get_collision``` function. This function is different from the ```get_collisions``` function used in the simpler method in that it only pulls out the information of a single event rather than all of them. This means that to get information from multiple events, you will need to use this command in a loop, for which you can define a range that determines what events you actualy want to use.\n",
301 | "
\n",
302 | "
\n",
303 | "NOTE: Depending on which activity you are doing, you will have to change the ```experiment``` argument to ```'CMS'```, ```'CLEO'```, or ```'BaBar'```. You will also need to change the ```entry_number``` argument to be the same variable you call in the loop.\n",
304 | "\n"
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": null,
310 | "metadata": {
311 | "colab": {
312 | "autoexec": {
313 | "startup": false,
314 | "wait_interval": 0
315 | }
316 | },
317 | "colab_type": "code",
318 | "id": "_rQDLaoduGvN"
319 | },
320 | "outputs": [],
321 | "source": [
322 | "for entry in range(nentries): # This range will loop over ALL of the events\n",
323 | " collision = pps.get_collision(alldata,entry_number=entry,experiment='CMS')\n",
324 | "\n",
325 | "for entry in range(0,int(nentries/2)): # This range will loop over the first half of the events\n",
326 | " collision = pps.get_collision(alldata,entry_number=entry,experiment='CMS')\n",
327 | " \n",
328 | "for entry in range(int(nentries/2),nentries): # This range will loop over the second half of the events\n",
329 | " collision = pps.get_collision(alldata,entry_number=entry,experiment='CMS')\n",
330 | " "
331 | ]
332 | },
333 | {
334 | "cell_type": "markdown",
335 | "metadata": {
336 | "colab_type": "text",
337 | "id": "bjqPYKQjuGzo"
338 | },
339 | "source": [
340 | "Other than that `get_collision` only gets the information from one event rather than all of them, it essentially organizes the information in the same way that `get_collisions` does. You can interact with this data the same way you would for any individual event from the big list of events that `get_collisions` would give you. \n",
341 | "\n",
342 | "For instance, to find the energies of all jets in the events we were looking at like we did for the simpler method, it would look very similar. However, you will notice that because we already have to loop over each event to use the `get_collision` function, we can simply nest the rest of our code within this loop."
343 | ]
344 | },
345 | {
346 | "cell_type": "code",
347 | "execution_count": null,
348 | "metadata": {
349 | "colab": {
350 | "autoexec": {
351 | "startup": false,
352 | "wait_interval": 0
353 | }
354 | },
355 | "colab_type": "code",
356 | "id": "0DDqEKcduG3q"
357 | },
358 | "outputs": [],
359 | "source": [
360 | "energies = []\n",
361 | "\n",
362 | "for event in range(0,int(nentries/3)): # Loops over first 3rd of all events\n",
363 | " \n",
364 | " collision = pps.get_collision(alldata,entry_number=event,experiment='CMS') # organizes the data so you can interface with it\n",
365 | " jets = collision['jets'] # gets the list of all photons in the current event\n",
366 | " \n",
367 | " for jet in jets: # loops over all photons in the event\n",
368 | " e = jet['e'] # gets the energy of the photon\n",
369 | " \n",
370 | " energies.append(e) # adds the energy to a list\n",
371 | " \n",
372 | " "
373 | ]
374 | },
375 | {
376 | "cell_type": "code",
377 | "execution_count": null,
378 | "metadata": {},
379 | "outputs": [],
380 | "source": []
381 | }
382 | ],
383 | "metadata": {
384 | "colab": {
385 | "default_view": {},
386 | "name": "ppp_codebkg_000_datainterfacing.ipynb",
387 | "provenance": [],
388 | "version": "0.3.2",
389 | "views": {}
390 | },
391 | "kernelspec": {
392 | "display_name": "Python 3",
393 | "language": "python",
394 | "name": "python3"
395 | },
396 | "language_info": {
397 | "codemirror_mode": {
398 | "name": "ipython",
399 | "version": 3
400 | },
401 | "file_extension": ".py",
402 | "mimetype": "text/x-python",
403 | "name": "python",
404 | "nbconvert_exporter": "python",
405 | "pygments_lexer": "ipython3",
406 | "version": "3.6.5"
407 | }
408 | },
409 | "nbformat": 4,
410 | "nbformat_minor": 1
411 | }
412 |
--------------------------------------------------------------------------------
/activities/codebkg_DownloadData.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "This notebook provides a way to download data files using the Python requests library. You'll need to have this library installed on your system to do any work. \n",
8 | "\n",
9 | "The first thing we do is import some local helper code that allows us to to download a data file(s), given the url(s).\n",
10 | "\n",
11 | "We also define where those data files can be found. \n",
12 | "\n",
13 | "***Make sure you execute the cell below before trying download any of the CLEO or CMS data!***"
14 | ]
15 | },
16 | {
17 | "cell_type": "code",
18 | "execution_count": 3,
19 | "metadata": {},
20 | "outputs": [],
21 | "source": [
22 | "import pps_tools as pps\n",
23 | "\n",
24 | "#pps.download_drive_file()\n",
25 | "#pps.download_file()"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "All of the data files for Particle Physics Playground are currently hosted in [this Google Drive folder](https://drive.google.com/drive/u/0/folders/1qK8HL070jpQ6AJllsGHDDdUbjerDqG-c). To download them, you will need the `download_drive_file` function, which takes the file name (with proper file ending) as an argument, and downloads it as a file of the same name to the 'data' directory included when you cloned Playground.\n",
33 | "\n",
34 | "The `download_file` function can be used to download files from the web that aren't on Google Drive. This function takes a url address as an argument. Though this functionality is provided, it should be unnecessary for all of the included activities."
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "metadata": {},
40 | "source": [
41 | "# CLEO data"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "metadata": {},
47 | "source": [
48 | "Here is a list of Monte Carlo (MC) and data files from CLEO. The MC files are for specific decays of $D$ mesons, both charged and neutral. For any given file, there are always (CHECK THIS!!!!!!) two D mesons produced. One decays according to the measured branching fractions, and the other decays through a very specific process. The specific decay is in the name of the file. For example, \n",
49 | "\n",
50 | " Single_D0_to_Kpi_LARGE.dat\n",
51 | " \n",
52 | "would be simulating the following process:\n",
53 | "\n",
54 | "$$e^+e^- \\rightarrow D^0 \\bar{D}^0$$\n",
55 | "$$D^0 \\rightarrow \\textrm{standard decays}$$\n",
56 | "$$\\bar{D^0} \\rightarrow K^- \\pi^+$$\n",
57 | "\n",
58 | "where the $D^0$ and $\\bar{D}^0$ can be exchanged. "
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": null,
64 | "metadata": {},
65 | "outputs": [],
66 | "source": [
67 | "cleo_MC_files = ['Single_D0B_to_KK_ISR_LARGE.dat',\n",
68 | "'Single_D0B_to_Kenu_ISR_LARGE.dat',\n",
69 | "'Single_D0B_to_Kpipi0_ISR_LARGE.dat',\n",
70 | "'Single_D0B_to_Kstenu_ISR_LARGE.dat',\n",
71 | "'Single_D0B_to_phigamma_ISR_LARGE.dat',\n",
72 | "'Single_D0B_to_pipi_ISR_LARGE.dat',\n",
73 | "'Single_D0_to_KK_ISR_LARGE.dat',\n",
74 | "'Single_D0_to_Kenu_ISR_LARGE.dat',\n",
75 | "'Single_D0_to_Kpi_LARGE.dat',\n",
76 | "'Single_D0_to_Kpipi0_ISR_LARGE.dat',\n",
77 | "'Single_D0_to_Kstenu_ISR_LARGE.dat',\n",
78 | "'Single_D0_to_phigamma_ISR_LARGE.dat',\n",
79 | "'Single_D0_to_pipi_ISR_LARGE.dat',\n",
80 | "'Single_Dm_to_Kpipi_ISR_LARGE.dat',\n",
81 | "'Single_Dp_to_Kpipi_ISR_LARGE.dat']\n",
82 | "\n",
83 | "cleo_data_files = ['data31_100k_LARGE.dat']"
84 | ]
85 | },
86 | {
87 | "cell_type": "markdown",
88 | "metadata": {},
89 | "source": [
90 | "# Download the data here!"
91 | ]
92 | },
93 | {
94 | "cell_type": "markdown",
95 | "metadata": {},
96 | "source": [
97 | "The snippet below can be used to download as much or as little of the extra data as you like. It is currently commented now and is set up to download the first two CLEO MC files, but you can edit it to grab whatever data you like. \n",
98 | "\n",
99 | "Have fun!"
100 | ]
101 | },
102 | {
103 | "cell_type": "code",
104 | "execution_count": null,
105 | "metadata": {},
106 | "outputs": [],
107 | "source": [
108 | "'''\n",
109 | "for filename in cleo_MC_files[0:2]: \n",
110 | " pps.download_drive_file(filename)\n",
111 | "''';"
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "metadata": {
117 | "collapsed": true
118 | },
119 | "source": [
120 | "# CMS data"
121 | ]
122 | },
123 | {
124 | "cell_type": "markdown",
125 | "metadata": {},
126 | "source": [
127 | "## CMS dimuon data"
128 | ]
129 | },
130 | {
131 | "cell_type": "code",
132 | "execution_count": null,
133 | "metadata": {},
134 | "outputs": [],
135 | "source": [
136 | "cms_data_files = ['dimuons_100k.dat']"
137 | ]
138 | },
139 | {
140 | "cell_type": "code",
141 | "execution_count": null,
142 | "metadata": {},
143 | "outputs": [],
144 | "source": [
145 | "'''\n",
146 | "pps.download_drive_file(cms_data_files[0])\n",
147 | "''';"
148 | ]
149 | },
150 | {
151 | "cell_type": "markdown",
152 | "metadata": {
153 | "collapsed": true
154 | },
155 | "source": [
156 | "## CMS data for top-quark reconstruction exercise"
157 | ]
158 | },
159 | {
160 | "cell_type": "code",
161 | "execution_count": null,
162 | "metadata": {},
163 | "outputs": [],
164 | "source": [
165 | "cms_top_quark_files = ['data.zip',\n",
166 | " 'ttbar.zip',\n",
167 | " 'wjets.zip',\n",
168 | " 'dy.zip',\n",
169 | " 'ww.zip',\n",
170 | " 'wz.zip',\n",
171 | " 'zz.zip',\n",
172 | " 'single_top.zip',\n",
173 | " 'qcd.zip']"
174 | ]
175 | },
176 | {
177 | "cell_type": "code",
178 | "execution_count": null,
179 | "metadata": {},
180 | "outputs": [],
181 | "source": [
182 | "'''\n",
183 | "for filename in cms_top_quark_files[0:2]:\n",
184 | " pps.download_drive_file(filename)\n",
185 | "''';"
186 | ]
187 | },
188 | {
189 | "cell_type": "markdown",
190 | "metadata": {
191 | "collapsed": true
192 | },
193 | "source": [
194 | "# [BaBar](https://en.wikipedia.org/wiki/BaBar_experiment) data "
195 | ]
196 | },
197 | {
198 | "cell_type": "code",
199 | "execution_count": null,
200 | "metadata": {},
201 | "outputs": [],
202 | "source": [
203 | "babar_data_files = ['basicPID_R24-AllEvents-Run1-OnPeak-R24-38.hdf5',\n",
204 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-388.hdf5',\n",
205 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-1133.hdf5',\n",
206 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-1552.hdf5',\n",
207 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-1694.hdf5',\n",
208 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-1920.hdf5',\n",
209 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-2026.hdf5',\n",
210 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-2781.hdf5',\n",
211 | " 'basicPID_R24-AllEvents-Run1-OnPeak-R24-2835.hdf5']"
212 | ]
213 | },
214 | {
215 | "cell_type": "code",
216 | "execution_count": null,
217 | "metadata": {},
218 | "outputs": [],
219 | "source": [
220 | "'''\n",
221 | "for filename in babar_data_files[0:2]:\n",
222 | " pps.download_drive_file(filename)\n",
223 | "''';"
224 | ]
225 | }
226 | ],
227 | "metadata": {
228 | "kernelspec": {
229 | "display_name": "Python 3",
230 | "language": "python",
231 | "name": "python3"
232 | },
233 | "language_info": {
234 | "codemirror_mode": {
235 | "name": "ipython",
236 | "version": 3
237 | },
238 | "file_extension": ".py",
239 | "mimetype": "text/x-python",
240 | "name": "python",
241 | "nbconvert_exporter": "python",
242 | "pygments_lexer": "ipython3",
243 | "version": "3.6.5"
244 | }
245 | },
246 | "nbformat": 4,
247 | "nbformat_minor": 1
248 | }
249 |
--------------------------------------------------------------------------------
/activities/images/BaBar-detector.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/BaBar-detector.jpg
--------------------------------------------------------------------------------
/activities/images/babar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/babar.jpg
--------------------------------------------------------------------------------
/activities/images/babar2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/babar2.jpg
--------------------------------------------------------------------------------
/activities/images/cern_cms_endon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/cern_cms_endon.jpg
--------------------------------------------------------------------------------
/activities/images/chi_square_sketch.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/chi_square_sketch.jpeg
--------------------------------------------------------------------------------
/activities/images/cleo_det_proc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/cleo_det_proc.jpg
--------------------------------------------------------------------------------
/activities/images/dimuons_sketch.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/dimuons_sketch.jpeg
--------------------------------------------------------------------------------
/activities/images/dimuons_sketch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/dimuons_sketch.jpg
--------------------------------------------------------------------------------
/activities/images/discovering_sketch_A.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/discovering_sketch_A.jpeg
--------------------------------------------------------------------------------
/activities/images/discovering_sketch_B.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/discovering_sketch_B.jpeg
--------------------------------------------------------------------------------
/activities/images/discovering_sketch_D.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/discovering_sketch_D.jpg
--------------------------------------------------------------------------------
/activities/images/kpipi_color_enhanced-resized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/kpipi_color_enhanced-resized.png
--------------------------------------------------------------------------------
/activities/images/muons_sketch.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/muons_sketch.jpeg
--------------------------------------------------------------------------------
/activities/images/muons_sketch.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/muons_sketch.jpg
--------------------------------------------------------------------------------
/activities/images/sketch_mean_points.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/sketch_mean_points.jpeg
--------------------------------------------------------------------------------
/activities/images/slac.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/slac.jpg
--------------------------------------------------------------------------------
/activities/images/small_cms1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/activities/images/small_cms1.png
--------------------------------------------------------------------------------
/activities/physicsbkg_Lifetimes.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Lifetimes"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Learning goals
\n",
15 | "\n",
16 | " - Relativistic kinematics.\n",
17 | "
- Standard model particles.\n",
18 | "
- Special Relativity.\n",
19 | "
"
20 | ]
21 | },
22 | {
23 | "cell_type": "markdown",
24 | "metadata": {},
25 | "source": [
26 | "Background\n",
27 | "\n",
28 | "Every type of particle has different characteristics. They each have different masses, lifetimes, decay methods and many other properties. \n",
29 | "\n",
30 | "To find the distance a particle travels in one lifetime, you need to know the lifetime of the particle and the speed of the particle. Classically, the formula to find the distance travelled in one lifetime is $ d= vt. $ Where $v$ is the speed of light and $t$ is the time the particle lives before it decays. \n",
31 | "\n",
32 | "However, in many particle physics experiments, the particles are moving close to (but always less than!) the speed of light and this means that they experience [time dilation](https://en.wikipedia.org/wiki/Time_dilation), which means their internal clocks run more slowly. \n",
33 | "\n",
34 | "Suppose a particle lives for the length of time equal to its [mean lifetime](http://hyperphysics.phy-astr.gsu.edu/hbase/nuclear/meanlif.html). This quantity is defined in the particle's rest frame, which means that the time that we measure in the lab (in our particle physics experiment) is generally longer. The really useful quantity we are looking for is the flight-length: the distance the particle travels between the time it is created and the time it decays. This flight-length is longer in the lab, because of the time dilation effect. The distance measured in the lab is the [mean free path](http://geant4.web.cern.ch/geant4/G4UsersDocuments/UsersGuides/PhysicsReferenceManual/html/node13.html) and is given by\n",
35 | "\n",
36 | "$$d = \\gamma \\beta c \\tau$$\n",
37 | "\n",
38 | "where $\\beta = v/c$ and $\\gamma = \\frac{1}{\\sqrt{1-\\beta^2}}$."
39 | ]
40 | },
41 | {
42 | "cell_type": "markdown",
43 | "metadata": {},
44 | "source": [
45 | "Let's code!\n",
46 | "\n",
47 | "Here is a sample code that creates a table of the lifetime and distance traveled in one lifetime for three different particles, but the distance is calculated incorrectly. "
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": null,
53 | "metadata": {
54 | "collapsed": false
55 | },
56 | "outputs": [],
57 | "source": [
58 | "particles = [\"B+/-\",\"D+/-\",\"J/Psi\"]\n",
59 | "\n",
60 | "lifetimes = [1.64e-12,1.4e-12,7e-21]\n",
61 | "\n",
62 | "c = 3e8 # m/s\n",
63 | "\n",
64 | "v = c\n",
65 | "\n",
66 | "for p,l in zip(particles,lifetimes):\n",
67 | " distance = v*l\n",
68 | " print \"%-5s lifetime=%4.2e s distance traveled=%4.2e m\" % (p,l,distance)"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "Particles
\n",
76 | "\n",
77 | "- $\\mu^\\pm$\n",
78 | "
- $\\tau^\\pm$\n",
79 | "
- $\\pi^\\pm$\n",
80 | "
- $\\pi^0$\n",
81 | "
- $\\rho^0$\n",
82 | "
- $K^\\pm$\n",
83 | "
- $K^0_{\\rm short}$\n",
84 | "
- $K^0_{\\rm long}$\n",
85 | "
- $K^*(892)$\n",
86 | "
- $D^\\pm$\n",
87 | "
- $B^\\pm$\n",
88 | "
- $B0$\n",
89 | "
- $J/ \\psi$\n",
90 | "
- $\\Upsilon(1S)$\n",
91 | "
- proton\n",
92 | "
- neutron\n",
93 | "
- $\\Delta^+$\n",
94 | "
- $\\Lambda^0$\n",
95 | "
- $\\Lambda_c$\n",
96 | "
"
97 | ]
98 | },
99 | {
100 | "cell_type": "markdown",
101 | "metadata": {},
102 | "source": [
103 | "Challenge!
\n",
104 | "\n",
105 | "Finish the table for every particle listed above with an output of the particle's name, the lifetime, the mass, the momentum, and how far they travel in one lifetime assuming a momentum of 1 GeV/c, 10 GeV/c, and 100 GeV/c. You may need the following relativistic relationships. \n",
106 | "\n",
107 | "$$\\vec{\\beta} = \\frac{\\vec{pc}}{E} \\qquad \\qquad E^2 = (mc^2)^2 + (pc)^2$$"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": null,
113 | "metadata": {
114 | "collapsed": false
115 | },
116 | "outputs": [],
117 | "source": [
118 | "# Your code here"
119 | ]
120 | },
121 | {
122 | "cell_type": "markdown",
123 | "metadata": {},
124 | "source": [
125 | "The scale of many modern physics detectors ranges from the order of centimeters to 10's of meters. Given that information, what particles do you think will actually live long enough to travel through parts of the detector?"
126 | ]
127 | },
128 | {
129 | "cell_type": "code",
130 | "execution_count": null,
131 | "metadata": {
132 | "collapsed": false
133 | },
134 | "outputs": [],
135 | "source": [
136 | "# Your code here"
137 | ]
138 | },
139 | {
140 | "cell_type": "markdown",
141 | "metadata": {},
142 | "source": [
143 | "Which particles will decay (on average) before they reach the detectors? This means that these particles have to be reconstructed from their decay products. \n"
144 | ]
145 | },
146 | {
147 | "cell_type": "code",
148 | "execution_count": null,
149 | "metadata": {
150 | "collapsed": false
151 | },
152 | "outputs": [],
153 | "source": [
154 | "# Your code here"
155 | ]
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "metadata": {
160 | "collapsed": false
161 | },
162 | "source": [
163 | "Make a plot where the x-axis is the names of the above particles (or a number corresponding to each, where the number/particle relationship is clearly identified) and the y-axis is the lifetime of the particle. Color code the data points according to whether the primary decay is EM, weak, or strong. {\\it Do not plot the proton and neutron on this plot}. Do you see the \"pattern\"? You may need to use a log-scale for the y-axis. "
164 | ]
165 | },
166 | {
167 | "cell_type": "code",
168 | "execution_count": null,
169 | "metadata": {
170 | "collapsed": true
171 | },
172 | "outputs": [],
173 | "source": [
174 | "# Your code here"
175 | ]
176 | }
177 | ],
178 | "metadata": {
179 | "anaconda-cloud": {},
180 | "kernelspec": {
181 | "display_name": "Python 2",
182 | "language": "python",
183 | "name": "python2"
184 | },
185 | "language_info": {
186 | "codemirror_mode": {
187 | "name": "ipython",
188 | "version": 2
189 | },
190 | "file_extension": ".py",
191 | "mimetype": "text/x-python",
192 | "name": "python",
193 | "nbconvert_exporter": "python",
194 | "pygments_lexer": "ipython2",
195 | "version": "2.7.12"
196 | }
197 | },
198 | "nbformat": 4,
199 | "nbformat_minor": 0
200 | }
201 |
--------------------------------------------------------------------------------
/activities/physicsbkg_SpecialRelativity.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Relativistic Kinematics Tutorial"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "## Brief Intro to Special Relativity"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "Before talking about relativisic kinematics, let's briefly run through Einstein's theories of Special and General Relavitity. Einstein's theory of special relativity was derived from the following two postulates:\n",
22 | "\n",
23 | "* Postulate 1: The laws of physics are the same in all inertial reference frames.\n",
24 | "* Postulate 2: The speed of light in a vacuum is equal to the value $c$, independent of the motion of the source\n",
25 | "\n",
26 | "To summarize, the laws of physics do not change regardless of what your perspective is. Nothing can go faster than the speed of light in the universe. Everyone *always* measures the speed of light to be $c$ ($\\approx 3\\times 10^8$ m/s) regardless of how fast or slow one is moving. \n",
27 | "\n",
28 | "One consequence of this is that we find that space and time are interwoven into a 4-dimensional fabric known as space-time. This fabric can be bent and stretched which causes changes in how we perceive time.\n",
29 | "\n",
30 | "***Keep these ideas in mind***"
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "## What is Relativistic Kinematics?"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {
43 | "collapsed": true
44 | },
45 | "source": [
46 | "Relativistic kinematics sounds like a complicated term that the average person would be intimidated by. However, it basically it is just a precise way of calculating things like velocity, momentum, and energy. Usually, we only need to worry about this level of precision when we are dealing with objects moving at incredibly fast speeds. \n",
47 | "\n",
48 | "But what is considered a fast speed? \n",
49 | "\n",
50 | "You might have heard before that the speed of light is the speed limit of the universe. This means that no object that has mass can reach or exceed that speed (**Sidenote**: This law only says that anything *inside* space cannot exceed this speed. Space itself is actually expanding at an accelerated rate that can be faster than the speed of light!). What can reach the speed of light? Only particles that have a mass of zero can reach the speed of light, therefore only photons, the particles of light, are able to reach this speed. \n",
51 | "\n",
52 | "Before we go any further, we need to define a term known as the Lorentz factor which plays a key role in understanding relativistic kinematics. The Lorentz factor tells us how time, length, and relativistic mass change for an object in motion. \n",
53 | "\n",
54 | "$$\\gamma = \\frac{1}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\frac{1}{\\sqrt{1-\\beta^2}}$$ $\\beta = \\frac{v}{c}$ tells you the fraction of light speed that the object of interest is moving at. "
55 | ]
56 | },
57 | {
58 | "cell_type": "markdown",
59 | "metadata": {},
60 | "source": [
61 | "## Time Dilation"
62 | ]
63 | },
64 | {
65 | "cell_type": "markdown",
66 | "metadata": {},
67 | "source": [
68 | "What is time dilation? To start off, time isn't the same for everyone as you might have thought. Time changes depending on how fast you are travelling as well as the gravitational bodies you are near. The formula to calculate time dilation (considering only speed and not gravitational effects) is: $$\\Delta t = \\frac{\\Delta t'}{\\sqrt{1-\\frac{v^2}{c^2}}} = \\gamma \\Delta t' = \\gamma \\tau$$ $\\Delta t' = \\tau$ is known as the proper time which is the time measured in the reference frame in which the clock is at rest. $\\Delta t$ is defined as the time dilation. \n",
69 | "\n",
70 | "From this formula, we can tell that the time that an observer measures in a moving reference frame will always be longer unless that particle is moving at the speed of light. This is because we are multiplying $\\tau$ by a number larger than one! As you travel at higher speeds, the Lorentz factor decreases, which makes sense because v/c is getting larger. The smallest the Lorentz factor can be is 1, which occurs when the velocity is 0. The largest this factor can be is undefined, or approaching infinity, which occurs when the velocity is equal to the speed of light. Here is a video below that might help you understand this mind-boggling concept better!"
71 | ]
72 | },
73 | {
74 | "cell_type": "markdown",
75 | "metadata": {},
76 | "source": [
77 | "Time Dilation and the Twin \"Paradox\"\n",
78 | "\n",
79 | "
"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "## A brief aside on General Relativity\n",
88 | "\n",
89 | "General relativity is the theory that Einstein developed during the years 1905-1915 and explains the motion of objects due to gravitational effects. It can be summarized as such:\n",
90 | "\n",
91 | "*\"Matter tells space how to curve and space tells matter how to move\"* - John Archibald Wheeler\n",
92 | "\n",
93 | "This theory tells us that time is also dilated by massive objects. If you have seen the movie *Interstellar* then you have witnessed the effects of general relativity. Being close to a massive object like a stellar black hole (which can be anywhere from a few times to a few millions times the mass of the sun) causes space-time to be stretched massively! Because of this, time happens a lot slower than it would if you were on Earth. The more massive the object, the more space-time is stretched. The more space-time is stretched, the longer it is going to take for time to occur for you.\n",
94 | "\n",
95 | "Fun Fact: Since sea level is closer to the center of the Earth where gravity is the strongest, time is technically happening slower than it is on a mountatin. The time difference is infinitesimal, but still not the same!\n",
96 | "\n",
97 | "Check out this great visual below of the effect mass has on space-time!\n"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": 7,
103 | "metadata": {
104 | "collapsed": false
105 | },
106 | "outputs": [
107 | {
108 | "data": {
109 | "text/html": [
110 | "
"
111 | ],
112 | "text/plain": [
113 | ""
114 | ]
115 | },
116 | "execution_count": 7,
117 | "metadata": {},
118 | "output_type": "execute_result"
119 | }
120 | ],
121 | "source": [
122 | "from IPython.display import Image\n",
123 | "from IPython.core.display import HTML \n",
124 | "Image(url= \"http://sci.esa.int/science-e-media/img/72/ESA_LISA-Pathfinder_spacetime_curvature_above_orig.jpg\")"
125 | ]
126 | },
127 | {
128 | "cell_type": "markdown",
129 | "metadata": {},
130 | "source": [
131 | "# Length Contraction"
132 | ]
133 | },
134 | {
135 | "cell_type": "markdown",
136 | "metadata": {},
137 | "source": [
138 | "As objects approach the speed of light, they contract in the direction of motion! In other words, when a stationary observer measures the length of a rod moving at near the speed of light, they see it as smaller than it is in its actual reference frame. In the reference frame of the rod, the rod is its actual length and time runs normally. It's only when we observe moving reference frames that we notice these differences. The equation to calculate length contraction is:\n",
139 | "\n",
140 | "$$L=\\frac{1}{\\gamma}L_p = \\sqrt{1-\\frac{v^2}{c^2}} L_p$$\n",
141 | "\n",
142 | "where $L_p$ is the proper length, or the length of the object at rest in a reference frame. It makes sense mathematically that the length is smaller in a moving reference frame because we are dividing by gamma, which is always greater than 1 unless v=c. The effect speed has on length contraction is shown with the baseball figure below."
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 8,
148 | "metadata": {
149 | "collapsed": false
150 | },
151 | "outputs": [
152 | {
153 | "data": {
154 | "text/html": [
155 | "
"
156 | ],
157 | "text/plain": [
158 | ""
159 | ]
160 | },
161 | "execution_count": 8,
162 | "metadata": {},
163 | "output_type": "execute_result"
164 | }
165 | ],
166 | "source": [
167 | "from IPython.display import Image\n",
168 | "from IPython.core.display import HTML \n",
169 | "Image(url= \"http://www.patana.ac.th/secondary/science/anrophysics/relativity_option/images/length_cont1.JPG\")"
170 | ]
171 | },
172 | {
173 | "cell_type": "markdown",
174 | "metadata": {},
175 | "source": [
176 | "# Relativistic Energy and Momentum"
177 | ]
178 | },
179 | {
180 | "cell_type": "markdown",
181 | "metadata": {},
182 | "source": [
183 | "Many of you have probably heard of Albert Einstein's famous equation: $E=mc^2$ It turns out that this isn't always true. $E=mc^2$ is only true for objects at rest! The equation for objects in motion is $E=\\gamma m c^2$ where the Lorentz factor comes into play again. When we multiply $mc^2$ by the Lorentz factor, the mass increases. Therefore, as objects approach the speed of light, they become more massive.\n",
184 | "\n",
185 | "Our Newtonian understanding of momentum is also incorrect. In general physics classes, we learn that $p=mv$, however the relativistic momentum changes at near light speeds. Therefore our new formula for momentum is: $$p =\\gamma mv$$ \n",
186 | "\n",
187 | "In particle physics, we often don't know the masses of particles, but know the energies and momenta in the x, y, and z directions. CERN can reach energies of up to 13 TeV! At particle accelerators like CERN, we are able to use machines that can accelerate particles to near the speed of light and then collide them. We then study the byproducts of these collisions. Since some particles have shorter lifetimes than others, it is possible that some decay before they reach our detectors. We then have to trace our decay products back to something called the displaced vertex (where the original particle was in space right before it decayed). We are able to calculate the invariant mass (mass of particles at rest in their reference frame) using the following formula:\n",
188 | "\n",
189 | "$$E^2=m^2c^4+p^2c^2$$\n",
190 | "\n",
191 | "This equation allows us to calculate the masses of particles that arise from these collisions. \n",
192 | "\n",
193 | "This equation also proves that although photons have no mass, they still have a momentum! The energy for photons is defined as: $$E = pc$$ We can manipulate the formula and solve for the rest mass as follows:\n",
194 | "\n",
195 | "$$m = \\sqrt{E^2 - (p^2_x + p^2_y + p_z^2)}$$\n",
196 | "\n",
197 | "Now we can apply our knowledge of time dilation! Since these particles are moving at near the speed of light, time is happening slower for them relative to us. Essentially, particles will have a longer lifetime when they travel at higher speeds. Because of this, they are able to travel greater distances! We can utilize time dilation to observe some particles before they decay and therefore learn more about them.\n",
198 | "\n",
199 | "##### Fun Fact: There are other ways of measuring masses of particles\n",
200 | "\n",
201 | "In some cases, particles can move faster than the speed of light in different materials! When this happens, a cone of light is given off in the form of Cherenkov radiation. The angle at which this light is given off is directly related to the velocity. Knowing the velocity combined with the momentum, we can measure the mass. "
202 | ]
203 | },
204 | {
205 | "cell_type": "markdown",
206 | "metadata": {},
207 | "source": [
208 | "Here is a great video explaining how the Large Hadron Collider works at CERN in Geneva, Switzerland\n",
209 | "\n",
210 | "
\n",
212 | "Photo credit: CERN (https://www.flickr.com/photos/11304375@N07/2046228644)\n"
213 | ]
214 | },
215 | {
216 | "cell_type": "markdown",
217 | "metadata": {},
218 | "source": [
219 | "#### Some things to keep in mind\n",
220 | "* When we calculate masses of particles, we write them in terms of $MeV/c^2$ instead of multiplying by $c^2$"
221 | ]
222 | },
223 | {
224 | "cell_type": "markdown",
225 | "metadata": {},
226 | "source": [
227 | "### Summary"
228 | ]
229 | },
230 | {
231 | "cell_type": "markdown",
232 | "metadata": {},
233 | "source": [
234 | "* The speed of light is the same for all observers.\n",
235 | "* Massive objects bend the fabric of space-time.\n",
236 | "* Crazy things begin to happen when you approach the speed of light! \n",
237 | " * Time happens slower\n",
238 | " * Objects contract in length \n",
239 | " * Mass increases \n",
240 | "* We can measure masses of particles given energies and momenta"
241 | ]
242 | },
243 | {
244 | "cell_type": "markdown",
245 | "metadata": {},
246 | "source": [
247 | "This is a lot to take in all at once, which is why we have provided some great resources below that you can check out to make more sense of these mind-blowing laws of physics! To learn more about the math behind some of these formulas check out Paul Avery's University of Florida lecture notes below."
248 | ]
249 | },
250 | {
251 | "cell_type": "markdown",
252 | "metadata": {},
253 | "source": [
254 | "Here's a cool link to a video about Special Relativity. The image is also a link.\n",
255 | "\n",
256 | "
"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "metadata": {},
263 | "source": [
264 | "## Other resources\n",
265 | "\n",
266 | "* [Great source explaining Einstein's theories of special and general relativity as well as E=mc^2](http://www.emc2-explained.info/)\n",
267 | "* [Relativisitc Kinematics I (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_1.pdf)\n",
268 | "* [Relativisitc Kinematics II (Paul Avery - University of Florida)](http://www.phys.ufl.edu/~avery/course/4390/f2015/lectures/relativistic_kinematics_2.pdf)\n",
269 | "* [Relativistic Mechanics (Wikipedia)](https://en.wikipedia.org/wiki/Relativistic_mechanics)"
270 | ]
271 | }
272 | ],
273 | "metadata": {
274 | "anaconda-cloud": {},
275 | "kernelspec": {
276 | "display_name": "Python 2",
277 | "language": "python",
278 | "name": "python2"
279 | },
280 | "language_info": {
281 | "codemirror_mode": {
282 | "name": "ipython",
283 | "version": 2
284 | },
285 | "file_extension": ".py",
286 | "mimetype": "text/x-python",
287 | "name": "python",
288 | "nbconvert_exporter": "python",
289 | "pygments_lexer": "ipython2",
290 | "version": "2.7.11"
291 | }
292 | },
293 | "nbformat": 4,
294 | "nbformat_minor": 1
295 | }
296 |
--------------------------------------------------------------------------------
/activities/scratch/discovering_more_particles_1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "metadata": {
3 | "name": "",
4 | "signature": "sha256:496bf60a778de8c85639a4cfd21210edc25aa8a1f0fb82f53e5d3c8f87e976a4"
5 | },
6 | "nbformat": 3,
7 | "nbformat_minor": 0,
8 | "worksheets": [
9 | {
10 | "cells": [
11 | {
12 | "cell_type": "heading",
13 | "level": 1,
14 | "metadata": {},
15 | "source": [
16 | "How to discover more particles"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "Learning goals
\n",
24 | "\n",
25 | " - Relativistic kinematics.\n",
26 | "
- Mesons.\n",
27 | "
"
28 | ]
29 | },
30 | {
31 | "cell_type": "markdown",
32 | "metadata": {},
33 | "source": [
34 | "Background\n",
35 | "\n",
36 | "To determine the mass ($m$) of a particle you need to know the 4-momenta of the particles ($\\mathbf{P}$) that are detected after the collision: the energy ($E$), the momentum in the x direction ($p_x$), the momentum in the y direction ($p_y$), the momentum in the z direction ($p_z$).\n",
37 | "\n",
38 | "$$\\mathbf{P} = (E,p_x,p_y,p_z)$$\n",
39 | "\n",
40 | "\n",
41 | "\\begin{equation*} m = \\sqrt{E^2-(p_x^2+p_y^2 + p_z^2)} \\end{equation*}\n",
42 | "\n",
43 | "Some particles are very unstable and decay (turn into) to two or more other particles. In fact, they can decay so quickly, that they never interact with your detector! Yikes!\n",
44 | "\n",
45 | "However, we can reconstruct the parent particle (sometimes referred to as the initial state particle) and its 4-momentum by adding the 4-momenta of the child particles (sometimes referred to as the decay products). \n",
46 | "\n",
47 | "$$\\mathbf{P_{\\rm parent}} = \\mathbf{P_{\\rm child 0}} + \\mathbf{P_{\\rm child 1}} + \\mathbf{P_{\\rm child 2}} + ...$$"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "Let's code!\n",
55 | "\n",
56 | "Here is the same sample code from the previous exercise. It reads in data from a CMS experiment. Below is only a small version of the text file\n",
57 | "released from CMS. Click here to access the full data file. "
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "collapsed": false,
63 | "input": [
64 | "inFile = open(\"../data/dimuons_1000_collisions.txt\", \"r\")\n",
65 | "\n",
66 | "import sys\n",
67 | "sys.path.append(\"../tools/\")\n",
68 | "import cms_tools\n",
69 | "\n",
70 | "print \"Reading in the data....\"\n",
71 | "collisions = cms_tools.get_collisions(inFile)\n",
72 | " \n",
73 | "print len(collisions)\n",
74 | "\n",
75 | "count = 0\n",
76 | "for collision in collisions:\n",
77 | " \n",
78 | " jets,muons,electrons,photons,met = collision\n",
79 | " \n",
80 | " count += 1\n",
81 | " \n",
82 | " # To access the information about the particles.\n",
83 | "\n",
84 | " for jet in jets:\n",
85 | " energy,px,py,pz,btag = jet\n",
86 | "\n",
87 | " for muon in muons:\n",
88 | " energy,px,py,pz,charge = muon\n",
89 | "\n",
90 | " for electron in electrons:\n",
91 | " energy,px,py,pz,charge = electron\n",
92 | " \n",
93 | " for photon in photons:\n",
94 | " energy,px,py,pz = photon\n",
95 | " \n",
96 | " # For this exercise we will not work with MET (Missing Energy in the Transverse plane)"
97 | ],
98 | "language": "python",
99 | "metadata": {},
100 | "outputs": [
101 | {
102 | "output_type": "stream",
103 | "stream": "stdout",
104 | "text": [
105 | "Reading in the data....\n",
106 | "1000\n"
107 | ]
108 | }
109 | ],
110 | "prompt_number": 1
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "Challenge!
\n",
117 | "\n",
118 | "Copy this sample code and use it to find the mass of the particle that the two muons came from. Do this for all the di-muons; but also do it when the muons are both positively charged, both negatively charged, and have opposite charges. Make a histogram of the masses. \n",
119 | "\n",
120 | "Hint!\n",
121 | "\n",
122 | "It is very likely that a particle exists where there is a peak in the data. However, this is not always true. \n",
123 | "A peak in the data is most likely the mass of a particle. You can look at the approximate mass to figure out which particle \n",
124 | "is found in the data."
125 | ]
126 | },
127 | {
128 | "cell_type": "markdown",
129 | "metadata": {},
130 | "source": [
131 | "Your histogram should look something like the following sketch. The value of the peaks should be the mass of a particle. You should be able to find two particles in their ground state. Check your answer for the first particle! Check your answer for the second particle! "
132 | ]
133 | },
134 | {
135 | "cell_type": "code",
136 | "collapsed": false,
137 | "input": [
138 | "from IPython.display import Image\n",
139 | "Image(filename='images/dimuons_sketch.jpeg')"
140 | ],
141 | "language": "python",
142 | "metadata": {},
143 | "outputs": [
144 | {
145 | "jpeg": "/9j/4Q/+RXhpZgAATU0AKgAAAAgACQEPAAIAAAAGAAAAegEQAAIAAAAKAAAAgAEaAAUAAAABAAAA\nigEbAAUAAAABAAAAkgEoAAMAAAABAAIAAAExAAIAAAAENy4xAAEyAAIAAAAUAAAAmgITAAMAAAAB\nAAEAAIdpAAQAAAABAAAArgAAAABBcHBsZQBpUGhvbmUgNWMAAAAASAAAAAEAAABIAAAAATIwMTQ6\nMDY6MTEgMTA6MDQ6MjEAAB+CmgAFAAAAAQAAAiiCnQAFAAAAAQAAAjCIIgADAAAAAQACAACIJwAD\nAAAAAQBAAACQAAAHAAAABDAyMjGQAwACAAAAFAAAAjiQBAACAAAAFAAAAkyRAQAHAAAABAECAwCS\nAQAKAAAAAQAAAmCSAgAFAAAAAQAAAmiSAwAKAAAAAQAAAnCSBwADAAAAAQAFAACSCQADAAAAAQAQ\nAACSCgAFAAAAAQAAAniSFAADAAAABAAAAoCSfAAHAAAAxAAAAoiSkQACAAAABDM1MQCSkgACAAAA\nBDM1MQCgAAAHAAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAADMCgAwAEAAAAAQAACZCiFwAD\nAAAAAQACAACjAQAHAAAAAQEAAACkAgADAAAAAQAAAACkAwADAAAAAQAAAACkBQADAAAAAQAhAACk\nBgADAAAAAQAAAACkMgAFAAAABAAAA0ykMwACAAAABgAAA2ykNAACAAAAIwAAA3IAAAAAAAAAAQAA\nABQAAAAMAAAABTIwMTQ6MDY6MTEgMTA6MDQ6MjEAMjAxNDowNjoxMSAxMDowNDoyMQAAAA7XAAAD\nbwAAEu0AAAd+AAAQpQAABLkAAABnAAAAGQZfBMcHAwQ1QXBwbGUgaU9TAAABTU0ABgABAAkAAAAB\nAAAAAAADAAcAAABoAAAAXAAEAAkAAAABAAAAAQAFAAkAAAABAAABAAAGAAkAAAABAAABAgAHAAkA\nAAABAAAAAQAAAABicGxpc3QwMNQBAgMEBQYHCFl0aW1lc2NhbGVVZXBvY2hVdmFsdWVVZmxhZ3MS\nO5rKABAAEwAAKlzgaUDTEAEIERshJy0yND0AAAAAAAABAQAAAAAAAAAJAAAAAAAAAAAAAAAAAAAA\nPwAAAGcAAAAZAAAAZwAAABkAAAAMAAAABQAAAAwAAAAFQXBwbGUAaVBob25lIDVjIGJhY2sgY2Ft\nZXJhIDQuMTJtbSBmLzIuNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9sAhAAB\nAQEBAQEBAQEBAQEBAQIEAgICAgIEAwMCBAUFBgYFBQUFBgcJBwYGCAYFBQgKCAgJCQoKCgYHCwwL\nCgwJCgoJAQEBAQICAgQCAgQJBgUGCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ\nCQkJCQkJCQkJCQkJCQn/3QAEABP/wAARCAFAATgDASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAA\nAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgj\nQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz\ndHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX\n2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgEC\nBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcY\n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\n",
146 | "metadata": {},
147 | "output_type": "pyout",
148 | "prompt_number": 2,
149 | "text": [
150 | ""
151 | ]
152 | }
153 | ],
154 | "prompt_number": 2
155 | },
156 | {
157 | "cell_type": "code",
158 | "collapsed": false,
159 | "input": [
160 | "#your code here"
161 | ],
162 | "language": "python",
163 | "metadata": {},
164 | "outputs": [],
165 | "prompt_number": 5
166 | },
167 | {
168 | "cell_type": "code",
169 | "collapsed": false,
170 | "input": [],
171 | "language": "python",
172 | "metadata": {},
173 | "outputs": []
174 | }
175 | ],
176 | "metadata": {}
177 | }
178 | ]
179 | }
--------------------------------------------------------------------------------
/activities/scratch/learning_about_particles_1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "metadata": {
3 | "name": "",
4 | "signature": "sha256:8c0725eb8f29a99715cd1965a4261b1c47d505b22589f5b911e17829a6e55565"
5 | },
6 | "nbformat": 3,
7 | "nbformat_minor": 0,
8 | "worksheets": [
9 | {
10 | "cells": [
11 | {
12 | "cell_type": "heading",
13 | "level": 1,
14 | "metadata": {},
15 | "source": [
16 | "Lifetimes of the particles"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "Learning goals
\n",
24 | "\n",
25 | " - Relativistic kinematics.\n",
26 | "
- Standard model particles.\n",
27 | "
- Special Relativity.\n",
28 | "
"
29 | ]
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {},
34 | "source": [
35 | "Background\n",
36 | "\n",
37 | "Every particle is unique. They each have different masses, lifetimes, decay methods and many other properties. \n",
38 | "\n",
39 | "To find the distance a particle travels in one lifetime, you need to know the lifetime of the particle and the speed of light. The formula to find the distance travelled in one lifetime is $ d= vt. $ Where $v$ is the speed of light and $t$ is the lifetime of the particle. The speed of light is $3\\times10^8$ m/s$^2$. \n",
40 | "\n",
41 | "To find the distance travelled with different momenta you need to know, the particles momentum, mass, and lifetime. \n",
42 | "\n",
43 | "One concept in Einstein's special relativity is time dilation. This means moving clocks are measured to tick more slowly than an observer's \"stationary\" clock. This concept needs to be kept in mind when solving for the distance travelled at high velocities. \n",
44 | "\n",
45 | "Some important equations you need to know are:\n",
46 | "\n",
47 | "$E = \\sqrt{(pc)^2 + (mc^2)^2}$\n",
48 | "\n",
49 | "$\\beta = \\frac{v}{c}$\n",
50 | "\n",
51 | "$\\frac{p}{E} = \\frac{\\beta}{c}$\n",
52 | "\n",
53 | "$\\gamma = \\frac{1}{\\sqrt{1-\\beta^2}}$\n",
54 | "\n",
55 | "$t = \\gamma t_0$"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "Let's code!\n",
63 | "\n",
64 | "Here is a sample code that creates a table of the lifetime and distance traveled in one lifetime for three different particles."
65 | ]
66 | },
67 | {
68 | "cell_type": "code",
69 | "collapsed": false,
70 | "input": [
71 | "particles = [\"B+/-\",\"D+/-\",\"J/Psi\"]\n",
72 | "\n",
73 | "lifetimes = [1.64e-12,1.4e-12,7e-21]\n",
74 | "\n",
75 | "c = 3e8 # m/s\n",
76 | "\n",
77 | "for p,l in zip(particles,lifetimes):\n",
78 | " distance = c*l\n",
79 | " print \"%-5s lifetime=%4.2f s distance=%4.2e m\" % (p,l,distance)"
80 | ],
81 | "language": "python",
82 | "metadata": {},
83 | "outputs": [
84 | {
85 | "output_type": "stream",
86 | "stream": "stdout",
87 | "text": [
88 | "B+/- lifetime=0.00 s distance=4.92e-04 m\n",
89 | "D+/- lifetime=0.00 s distance=4.20e-04 m\n",
90 | "J/Psi lifetime=0.00 s distance=2.10e-12 m\n"
91 | ]
92 | }
93 | ],
94 | "prompt_number": 1
95 | },
96 | {
97 | "cell_type": "markdown",
98 | "metadata": {},
99 | "source": [
100 | "Particles
\n",
101 | "\n",
102 | "- $\\mu^\\pm$\n",
103 | "
- $\\tau^\\pm$\n",
104 | "
- $\\pi^\\pm$\n",
105 | "
- $\\pi^0$\n",
106 | "
- $K^\\pm$\n",
107 | "
- $K^0_{\\rm short}$\n",
108 | "
- $K^0_{\\rm long}$\n",
109 | "
- $D^\\pm$\n",
110 | "
- $B^\\pm$\n",
111 | "
- $B0$\n",
112 | "
- $J/ \\psi$\n",
113 | "
- $\\Upsilon(1S)$\n",
114 | "
"
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "Challenge!
\n",
122 | "\n",
123 | "Finish the table for every particle listed above with an output of the particles name, the lifetime, the mass, the distance travelled in one lifetime, the momentum, and how far the travel in one lifetime given different momentum. "
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "collapsed": false,
129 | "input": [
130 | "# Your code here"
131 | ],
132 | "language": "python",
133 | "metadata": {},
134 | "outputs": [],
135 | "prompt_number": 11
136 | },
137 | {
138 | "cell_type": "markdown",
139 | "metadata": {},
140 | "source": [
141 | "The scale of many modern physics detectors ranges from the order of centimeters to 10's of meters. Given that information, what particles do you think will actually live long enough to travel through parts of the detector? "
142 | ]
143 | },
144 | {
145 | "cell_type": "code",
146 | "collapsed": false,
147 | "input": [
148 | "# Your answer here"
149 | ],
150 | "language": "python",
151 | "metadata": {},
152 | "outputs": [],
153 | "prompt_number": 2
154 | },
155 | {
156 | "cell_type": "markdown",
157 | "metadata": {},
158 | "source": [
159 | "Which particles will decay (on average) before they reach the detectors? This means that these particles have to be reconstructed from their decay products. "
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "collapsed": false,
165 | "input": [
166 | "# Your answere here."
167 | ],
168 | "language": "python",
169 | "metadata": {},
170 | "outputs": [],
171 | "prompt_number": 3
172 | },
173 | {
174 | "cell_type": "code",
175 | "collapsed": false,
176 | "input": [],
177 | "language": "python",
178 | "metadata": {},
179 | "outputs": []
180 | }
181 | ],
182 | "metadata": {}
183 | }
184 | ]
185 | }
--------------------------------------------------------------------------------
/data/dimuons_1000_collisions.hdf5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/dimuons_1000_collisions.hdf5
--------------------------------------------------------------------------------
/data/dimuons_100k.hdf5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/dimuons_100k.hdf5
--------------------------------------------------------------------------------
/data/dimuons_hepfile.h5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/dimuons_hepfile.h5
--------------------------------------------------------------------------------
/data/small_BaBar_test_file.hdf5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/small_BaBar_test_file.hdf5
--------------------------------------------------------------------------------
/data/small_CLEO_test_file.hdf5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/small_CLEO_test_file.hdf5
--------------------------------------------------------------------------------
/data/small_cms_test_file.hdf5:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/particle-physics-playground/playground/8c102df199caf03be46bd6f0b8e9eea606ea1446/data/small_cms_test_file.hdf5
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy==1.7.1
2 | matplotlib==2.1
3 |
--------------------------------------------------------------------------------
/tools/babar_tools.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pylab as plt
3 | import matplotlib.patches as mpatches
4 | import matplotlib.lines as mlines
5 | import mpl_toolkits.mplot3d.art3d as a3
6 |
7 | ################################################################################
8 | ################################################################################
9 | def get_collisions(infile,verbose=False):
10 |
11 | collisions = []
12 |
13 | not_at_end = True
14 | collision_count = 0
15 | new_collision = True
16 | while ( not_at_end ):
17 |
18 | ############################################################################
19 | # Read in one collision
20 | ############################################################################
21 | line = infile.readline()
22 |
23 | # When the data is read in as a zipfile, readline will
24 | # always return bytes, rather than strings and the find()
25 | # member function doesn't work.
26 | if type(line)==bytes:
27 | line = line.decode()
28 |
29 | if collision_count%1000==0 and verbose:
30 | print("collision count: ",collision_count)
31 |
32 | if line=="":
33 | not_at_end = False
34 |
35 | if line.find("Event")>=0:
36 | new_collision = True
37 |
38 | if new_collision==True:
39 |
40 | # Read in the pion info for this collision.
41 | pions = []
42 | line = infile.readline()
43 | npions = int(line)
44 | for i in range(npions):
45 | line = infile.readline()
46 | vals = line.split()
47 | e = float(vals[0])
48 | px = float(vals[1])
49 | py = float(vals[2])
50 | pz = float(vals[3])
51 | q = int(float(vals[4]))
52 | beta = float(vals[5])
53 | dedx = float(vals[6])
54 | pions.append([e,px,py,pz,q,beta,dedx])
55 |
56 | # Read in the kaon info for this collision.
57 | kaons = []
58 | line = infile.readline()
59 | nkaons = int(line)
60 | for i in range(nkaons):
61 | line = infile.readline()
62 | vals = line.split()
63 | e = float(vals[0])
64 | px = float(vals[1])
65 | py = float(vals[2])
66 | pz = float(vals[3])
67 | q = int(float(vals[4]))
68 | beta = float(vals[5])
69 | dedx = float(vals[6])
70 | kaons.append([e,px,py,pz,q,beta,dedx])
71 |
72 | # Read in the proton info for this collision.
73 | protons = []
74 | line = infile.readline()
75 | nprotons = int(line)
76 | for i in range(nprotons):
77 | line = infile.readline()
78 | vals = line.split()
79 | e = float(vals[0])
80 | px = float(vals[1])
81 | py = float(vals[2])
82 | pz = float(vals[3])
83 | q = int(float(vals[4]))
84 | beta = float(vals[5])
85 | dedx = float(vals[6])
86 | protons.append([e,px,py,pz,q,beta,dedx])
87 |
88 |
89 | # Read in the muon info for this collision.
90 | muons = []
91 | line = infile.readline()
92 | nmuons = int(line)
93 | for i in range(nmuons):
94 | line = infile.readline()
95 | vals = line.split()
96 | e = float(vals[0])
97 | px = float(vals[1])
98 | py = float(vals[2])
99 | pz = float(vals[3])
100 | q = int(float(vals[4]))
101 | beta = float(vals[5])
102 | dedx = float(vals[6])
103 | muons.append([e,px,py,pz,q,beta,dedx])
104 |
105 | # Read in the electron info for this collision.
106 | electrons = []
107 | line = infile.readline()
108 | nelectrons = int(line)
109 | for i in range(nelectrons):
110 | line = infile.readline()
111 | vals = line.split()
112 | e = float(vals[0])
113 | px = float(vals[1])
114 | py = float(vals[2])
115 | pz = float(vals[3])
116 | q = int(float(vals[4]))
117 | beta = float(vals[5])
118 | dedx = float(vals[6])
119 | electrons.append([e,px,py,pz,q,beta,dedx])
120 |
121 | # Read in the photon info for this collision.
122 | photons = []
123 | line = infile.readline()
124 | nphotons = int(line)
125 | for i in range(nphotons):
126 | line = infile.readline()
127 | vals = line.split()
128 | e = float(vals[0])
129 | px = float(vals[1])
130 | py = float(vals[2])
131 | pz = float(vals[3])
132 | photons.append([e,px,py,pz])
133 |
134 |
135 | # Read in the information about the missing transverse energy (MET) in the collision.
136 | # This is really the x and y direction for the missing momentum.
137 | #line = infile.readline()
138 | #vals = line.split()
139 | #met_px = float(vals[0])
140 | #met_py = float(vals[1])
141 |
142 | new_collision = False
143 | collision_count += 1
144 |
145 | collisions.append([pions,kaons,protons,muons,electrons,photons])
146 |
147 | return collisions
148 |
149 | ################################################################################
150 | ################################################################################
151 | def draw_jet(origin=(0,0),angle=90,length=0.5,opening_angle=20,ntracks=5,show_tracks=False):
152 |
153 | lines = []
154 | patches = []
155 |
156 | # Edges of cone
157 | width_at_top = length*np.deg2rad(opening_angle)
158 | for side in [-1,1]:
159 | theta0 = np.deg2rad(angle+(side*opening_angle/2.0))
160 | x1 = length*np.cos(theta0)
161 | y1 = length*np.sin(theta0)
162 | #print x1,y1
163 | line = mlines.Line2D((origin[0],x1), (origin[1],y1), lw=2., alpha=0.4,color='red',markeredgecolor='red')
164 | lines.append(line)
165 |
166 | # End of cone
167 | arad = np.deg2rad(angle)
168 | center = (origin[0]+np.cos(arad)*length,origin[1]+np.sin(arad)*length)
169 | #print center
170 | p = mpatches.Ellipse(center, width_at_top+0.01, width_at_top/2.0,facecolor='red',alpha=0.4,edgecolor='gray',angle=abs(angle+90))
171 | patches.append(p)
172 |
173 | return patches,lines
174 |
175 |
176 |
177 |
178 | ################################################################################
179 | ################################################################################
180 | def draw_jets(origins=[(0,0)],angles=[90],lengths=[0.5],opening_angles=[20],ntrackss=[5],show_trackss=[False]):
181 |
182 | alllines = []
183 | allpatches = []
184 |
185 | # Edges of cone
186 | for origin,angle,length,opening_angle,ntracks,show_tracks in zip(origins,angles,lengths,opening_angles,ntrackss,show_trackss):
187 | patches,lines = draw_jet(origin=origin,angle=angle,length=length,opening_angle=opening_angle,ntracks=ntracks,show_tracks=show_tracks)
188 | allpatches += patches
189 | alllines += lines
190 |
191 |
192 | return allpatches,alllines
193 |
194 |
195 |
196 | ################################################################################
197 | ################################################################################
198 | def draw_line3D(origin=[(0,0,0)],pmom=[(1,1,1)],color='red',ls='-',lw=2.0):
199 |
200 | lines = []
201 |
202 | #print pmom
203 | for o,p in zip(origin,pmom):
204 | #x1 = p[0]
205 | #y1 = p[1]
206 | #z1 = p[2]
207 | x1 = p[2]
208 | y1 = p[0]
209 | z1 = p[1]
210 | #print x1,y1,z1
211 | line = a3.Line3D((o[0],x1),(o[1],y1),(o[0],z1), lw=lw, ls=ls, alpha=0.9,color=color,markeredgecolor=color)
212 | lines.append(line)
213 |
214 | return lines
215 |
216 |
217 | ################################################################################
218 | ################################################################################
219 | def draw_beams():
220 |
221 | lines = draw_line3D(origin=[(0,0,-0.1),(0,0,0.1)],pmom=[(0,0,-5.0),(0,0,5.0)],color='green',lw=1)
222 |
223 | return lines
224 |
225 | ################################################################################
226 | ################################################################################
227 | def draw_jet3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
228 |
229 | neworg = origin.copy()
230 | newmom = pmom.copy()
231 |
232 | offset = [[0.05,0.05,0.05],
233 | [0.05,0.05,-0.05],
234 | [0.05,-0.05,0.05],
235 | [0.05,-0.05,-0.05],
236 | [-0.05,0.05,0.05],
237 | [-0.05,0.05,-0.05],
238 | [-0.05,-0.05,0.05],
239 | [-0.05,-0.05,-0.05],
240 | ]
241 |
242 | offset = np.array(offset)
243 | offset *= 50
244 |
245 | for p in pmom:
246 | for o in offset:
247 | #print p.copy(),o
248 | pnew = p.copy() + o
249 | #print pnew
250 | newmom = np.vstack((newmom,pnew))
251 | neworg = np.vstack((neworg,(0,0,0)))
252 |
253 | lines = draw_line3D(origin=neworg,pmom=newmom,color='orange',lw=1)
254 |
255 | return lines
256 |
257 | ################################################################################
258 | ################################################################################
259 | def draw_pion3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
260 |
261 | lines = draw_line3D(origin=origin,pmom=pmom,color='red',lw=5)
262 |
263 | return lines
264 |
265 | ################################################################################
266 | def draw_kaon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
267 |
268 | lines = draw_line3D(origin=origin,pmom=pmom,color='orange',lw=5)
269 |
270 | return lines
271 |
272 | ################################################################################
273 | ################################################################################
274 | def draw_proton3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
275 |
276 | lines = draw_line3D(origin=origin,pmom=pmom,color='purple',lw=5)
277 |
278 | return lines
279 |
280 | ################################################################################
281 | ################################################################################
282 | def draw_muon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
283 |
284 | lines = draw_line3D(origin=origin,pmom=pmom,color='blue',lw=5)
285 |
286 | return lines
287 |
288 | ################################################################################
289 | ################################################################################
290 | def draw_electron3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
291 |
292 | lines = draw_line3D(origin=origin,pmom=pmom,color='green',lw=2)
293 |
294 | return lines
295 |
296 |
297 | ################################################################################
298 | ################################################################################
299 | def draw_photon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
300 |
301 | lines = draw_line3D(origin=origin,pmom=pmom,color='gray',ls='-',lw=4)
302 |
303 | return lines
304 |
305 | ################################################################################
306 | ################################################################################
307 | def display_collision3D(collision):
308 |
309 | pions,kaons,protons,muons,electrons,photons = collision
310 |
311 | lines = draw_beams()
312 |
313 | pmom = np.array(pions).transpose()[1:4].transpose()
314 | origin = np.zeros((len(pions),3))
315 | lines += draw_pion3D(origin=origin,pmom=pmom)
316 |
317 | pmom = np.array(kaons).transpose()[1:4].transpose()
318 | origin = np.zeros((len(kaons),3))
319 | lines += draw_kaon3D(origin=origin,pmom=pmom)
320 |
321 | pmom = np.array(protons).transpose()[1:4].transpose()
322 | origin = np.zeros((len(protons),3))
323 | lines += draw_proton3D(origin=origin,pmom=pmom)
324 |
325 | pmom = np.array(muons).transpose()[1:4].transpose()
326 | origin = np.zeros((len(muons),3))
327 | lines += draw_muon3D(origin=origin,pmom=pmom)
328 |
329 | pmom = np.array(electrons).transpose()[1:4].transpose()
330 | origin = np.zeros((len(electrons),3))
331 | lines += draw_electron3D(origin=origin,pmom=pmom)
332 |
333 | pmom = np.array(photons).transpose()[1:4].transpose()
334 | origin = np.zeros((len(photons),3))
335 | lines += draw_photon3D(origin=origin,pmom=pmom)
336 |
337 | fig = plt.figure(figsize=(7,5),dpi=100)
338 | ax = fig.add_subplot(1,1,1)
339 | ax = fig.gca(projection='3d')
340 | plt.subplots_adjust(top=0.98,bottom=0.02,right=0.98,left=0.02)
341 |
342 | for l in lines:
343 | ax.add_line(l)
344 |
345 | # This effectively sets the scale for the expected momentum of the particles.
346 | ax.set_xlim(-2,2)
347 | ax.set_ylim(-2,2)
348 | ax.set_zlim(-2,2)
349 |
350 | #return lines,fig,ax
351 |
352 |
--------------------------------------------------------------------------------
/tools/cleo_tools.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pylab as plt
3 | import matplotlib.patches as mpatches
4 | import matplotlib.lines as mlines
5 | import mpl_toolkits.mplot3d.art3d as a3
6 |
7 | ################################################################################
8 | ################################################################################
9 | def get_collisions(infile,verbose=False):
10 |
11 | collisions = []
12 |
13 | not_at_end = True
14 | collision_count = 0
15 | new_collision = True
16 | while ( not_at_end ):
17 |
18 | ############################################################################
19 | # Read in one collision
20 | ############################################################################
21 | line = infile.readline()
22 |
23 | # When the data is read in as a zipfile, readline will
24 | # always return bytes, rather than strings and the find()
25 | # member function doesn't work.
26 | if type(line)==bytes:
27 | line = line.decode()
28 |
29 | if collision_count%1000==0 and verbose:
30 | print("collision count: ",collision_count)
31 |
32 | if line=="":
33 | not_at_end = False
34 |
35 | if line.find("Event")>=0:
36 | new_collision = True
37 |
38 | if new_collision==True:
39 |
40 | # Read in the pion info for this collision.
41 | pions = []
42 | line = infile.readline()
43 | npions = int(line)
44 | for i in range(npions):
45 | line = infile.readline()
46 | vals = line.split()
47 | e = float(vals[0])
48 | px = float(vals[1])
49 | py = float(vals[2])
50 | pz = float(vals[3])
51 | q = int(vals[4])
52 | sigpi = float(vals[5])
53 | sigka = float(vals[6])
54 | likpi = float(vals[7])
55 | likka = float(vals[8])
56 | nphopi = int(vals[9])
57 | nphoka = int(vals[10])
58 | depthmu = float(vals[11])
59 | cluster_energy = float(vals[12])
60 | pions.append([e,px,py,pz,q,sigpi,sigka,likpi,likka,nphopi,nphoka,depthmu,cluster_energy])
61 |
62 | # Read in the kaon info for this collision.
63 | kaons = []
64 | line = infile.readline()
65 | nkaons = int(line)
66 | for i in range(nkaons):
67 | line = infile.readline()
68 | vals = line.split()
69 | e = float(vals[0])
70 | px = float(vals[1])
71 | py = float(vals[2])
72 | pz = float(vals[3])
73 | q = int(vals[4])
74 | sigpi = float(vals[5])
75 | sigka = float(vals[6])
76 | likpi = float(vals[7])
77 | likka = float(vals[8])
78 | nphopi = int(vals[9])
79 | nphoka = int(vals[10])
80 | depthmu = float(vals[11])
81 | cluster_energy = float(vals[12])
82 | kaons.append([e,px,py,pz,q,sigpi,sigka,likpi,likka,nphopi,nphoka,depthmu,cluster_energy])
83 |
84 | # Read in the muon info for this collision.
85 | muons = []
86 | line = infile.readline()
87 | nmuons = int(line)
88 | for i in range(nmuons):
89 | line = infile.readline()
90 | vals = line.split()
91 | e = float(vals[0])
92 | px = float(vals[1])
93 | py = float(vals[2])
94 | pz = float(vals[3])
95 | q = int(vals[4])
96 | sigpi = float(vals[5])
97 | sigka = float(vals[6])
98 | likpi = float(vals[7])
99 | likka = float(vals[8])
100 | nphopi = int(vals[9])
101 | nphoka = int(vals[10])
102 | depthmu = float(vals[11])
103 | cluster_energy = float(vals[12])
104 | muons.append([e,px,py,pz,q,sigpi,sigka,likpi,likka,nphopi,nphoka,depthmu,cluster_energy])
105 |
106 | # Read in the electron info for this collision.
107 | electrons = []
108 | line = infile.readline()
109 | nelectrons = int(line)
110 | for i in range(nelectrons):
111 | line = infile.readline()
112 | vals = line.split()
113 | e = float(vals[0])
114 | px = float(vals[1])
115 | py = float(vals[2])
116 | pz = float(vals[3])
117 | q = int(vals[4])
118 | sigpi = float(vals[5])
119 | sigka = float(vals[6])
120 | likpi = float(vals[7])
121 | likka = float(vals[8])
122 | nphopi = int(vals[9])
123 | nphoka = int(vals[10])
124 | depthmu = float(vals[11])
125 | cluster_energy = float(vals[12])
126 | electrons.append([e,px,py,pz,q,sigpi,sigka,likpi,likka,nphopi,nphoka,depthmu,cluster_energy])
127 |
128 |
129 | # Read in the photon info for this collision.
130 | photons = []
131 | line = infile.readline()
132 | nphotons = int(line)
133 | for i in range(nphotons):
134 | line = infile.readline()
135 | vals = line.split()
136 | e = float(vals[0])
137 | px = float(vals[1])
138 | py = float(vals[2])
139 | pz = float(vals[3])
140 | photons.append([e,px,py,pz])
141 |
142 |
143 | # Read in the information about the missing transverse energy (MET) in the collision.
144 | # This is really the x and y direction for the missing momentum.
145 | #line = infile.readline()
146 | #vals = line.split()
147 | #met_px = float(vals[0])
148 | #met_py = float(vals[1])
149 |
150 | new_collision = False
151 | collision_count += 1
152 |
153 | collisions.append([pions,kaons,muons,electrons,photons])
154 |
155 | return collisions
156 |
157 | ################################################################################
158 | ################################################################################
159 | def draw_jet(origin=(0,0),angle=90,length=0.5,opening_angle=20,ntracks=5,show_tracks=False):
160 |
161 | lines = []
162 | patches = []
163 |
164 | # Edges of cone
165 | width_at_top = length*np.deg2rad(opening_angle)
166 | for side in [-1,1]:
167 | theta0 = np.deg2rad(angle+(side*opening_angle/2.0))
168 | x1 = length*np.cos(theta0)
169 | y1 = length*np.sin(theta0)
170 | #print x1,y1
171 | line = mlines.Line2D((origin[0],x1), (origin[1],y1), lw=2., alpha=0.4,color='red',markeredgecolor='red')
172 | lines.append(line)
173 |
174 | # End of cone
175 | arad = np.deg2rad(angle)
176 | center = (origin[0]+np.cos(arad)*length,origin[1]+np.sin(arad)*length)
177 | #print center
178 | p = mpatches.Ellipse(center, width_at_top+0.01, width_at_top/2.0,facecolor='red',alpha=0.4,edgecolor='gray',angle=abs(angle+90))
179 | patches.append(p)
180 |
181 | return patches,lines
182 |
183 |
184 |
185 |
186 | ################################################################################
187 | ################################################################################
188 | def draw_jets(origins=[(0,0)],angles=[90],lengths=[0.5],opening_angles=[20],ntrackss=[5],show_trackss=[False]):
189 |
190 | alllines = []
191 | allpatches = []
192 |
193 | # Edges of cone
194 | for origin,angle,length,opening_angle,ntracks,show_tracks in zip(origins,angles,lengths,opening_angles,ntrackss,show_trackss):
195 | patches,lines = draw_jet(origin=origin,angle=angle,length=length,opening_angle=opening_angle,ntracks=ntracks,show_tracks=show_tracks)
196 | allpatches += patches
197 | alllines += lines
198 |
199 |
200 | return allpatches,alllines
201 |
202 |
203 |
204 | ################################################################################
205 | ################################################################################
206 | def draw_line3D(origin=[(0,0,0)],pmom=[(1,1,1)],color='red',ls='-',lw=2.0):
207 |
208 | lines = []
209 |
210 | #print pmom
211 | for o,p in zip(origin,pmom):
212 | #x1 = p[0]
213 | #y1 = p[1]
214 | #z1 = p[2]
215 | x1 = p[2]
216 | y1 = p[0]
217 | z1 = p[1]
218 | #print x1,y1,z1
219 | line = a3.Line3D((o[0],x1),(o[1],y1),(o[0],z1), lw=lw, ls=ls, alpha=0.9,color=color,markeredgecolor=color)
220 | lines.append(line)
221 |
222 | return lines
223 |
224 |
225 | ################################################################################
226 | ################################################################################
227 | def draw_beams():
228 |
229 | lines = draw_line3D(origin=[(0,0,-0.1),(0,0,0.1)],pmom=[(0,0,-1.0),(0,0,1.0)],color='green',lw=1)
230 |
231 | return lines
232 |
233 | ################################################################################
234 | ################################################################################
235 | def draw_jet3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
236 |
237 | neworg = origin.copy()
238 | newmom = pmom.copy()
239 |
240 | offset = [[0.05,0.05,0.05],
241 | [0.05,0.05,-0.05],
242 | [0.05,-0.05,0.05],
243 | [0.05,-0.05,-0.05],
244 | [-0.05,0.05,0.05],
245 | [-0.05,0.05,-0.05],
246 | [-0.05,-0.05,0.05],
247 | [-0.05,-0.05,-0.05],
248 | ]
249 |
250 | offset = np.array(offset)
251 | offset *= 50
252 |
253 | for p in pmom:
254 | for o in offset:
255 | #print p.copy(),o
256 | pnew = p.copy() + o
257 | #print pnew
258 | newmom = np.vstack((newmom,pnew))
259 | neworg = np.vstack((neworg,(0,0,0)))
260 |
261 | lines = draw_line3D(origin=neworg,pmom=newmom,color='orange',lw=1)
262 |
263 | return lines
264 |
265 | ################################################################################
266 | ################################################################################
267 | def draw_pion3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
268 |
269 | lines = draw_line3D(origin=origin,pmom=pmom,color='red',lw=5)
270 |
271 | return lines
272 |
273 | ################################################################################
274 | def draw_kaon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
275 |
276 | lines = draw_line3D(origin=origin,pmom=pmom,color='orange',lw=5)
277 |
278 | return lines
279 |
280 | ################################################################################
281 | ################################################################################
282 | def draw_muon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
283 |
284 | lines = draw_line3D(origin=origin,pmom=pmom,color='blue',lw=5)
285 |
286 | return lines
287 |
288 | ################################################################################
289 | ################################################################################
290 | def draw_electron3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
291 |
292 | lines = draw_line3D(origin=origin,pmom=pmom,color='green',lw=2)
293 |
294 | return lines
295 |
296 |
297 | ################################################################################
298 | ################################################################################
299 | def draw_photon3D(origin=[(0,0,0)],pmom=[(1,1,1)]):
300 |
301 | lines = draw_line3D(origin=origin,pmom=pmom,color='gray',ls='-',lw=4)
302 |
303 | return lines
304 |
305 | ################################################################################
306 | ################################################################################
307 | def display_collision3D(collision):
308 |
309 | pions,kaons,muons,electrons,photons = collision
310 |
311 | lines = draw_beams()
312 |
313 | pmom = np.array(pions).transpose()[1:4].transpose()
314 | origin = np.zeros((len(pions),3))
315 | lines += draw_pion3D(origin=origin,pmom=pmom)
316 |
317 | pmom = np.array(kaons).transpose()[1:4].transpose()
318 | origin = np.zeros((len(kaons),3))
319 | lines += draw_kaon3D(origin=origin,pmom=pmom)
320 |
321 | pmom = np.array(muons).transpose()[1:4].transpose()
322 | origin = np.zeros((len(muons),3))
323 | lines += draw_muon3D(origin=origin,pmom=pmom)
324 |
325 | pmom = np.array(electrons).transpose()[1:4].transpose()
326 | origin = np.zeros((len(electrons),3))
327 | lines += draw_electron3D(origin=origin,pmom=pmom)
328 |
329 | pmom = np.array(photons).transpose()[1:4].transpose()
330 | origin = np.zeros((len(photons),3))
331 | lines += draw_photon3D(origin=origin,pmom=pmom)
332 |
333 | fig = plt.figure(figsize=(7,5),dpi=100)
334 | ax = fig.add_subplot(1,1,1)
335 | ax = fig.gca(projection='3d')
336 | plt.subplots_adjust(top=0.98,bottom=0.02,right=0.98,left=0.02)
337 |
338 | for l in lines:
339 | ax.add_line(l)
340 |
341 | ax.set_xlim(-1,1)
342 | ax.set_ylim(-1,1)
343 | ax.set_zlim(-1,1)
344 |
345 | #return lines,fig,ax
346 |
347 |
--------------------------------------------------------------------------------
/tools/cms_tools.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pylab as plt
3 | import matplotlib.patches as mpatches
4 | import matplotlib.lines as mlines
5 | import mpl_toolkits.mplot3d.art3d as a3
6 |
7 | from IPython.display import clear_output,display
8 | import time
9 |
10 | import zipfile
11 |
12 | ################################################################################
13 | def get_collisions_from_filename(infilename,verbose=False):
14 |
15 | infile = None
16 | if zipfile.is_zipfile(infilename) is True:
17 | z = zipfile.ZipFile(infilename,'r')
18 | infile = z.open(z.namelist()[0],'r')
19 | else:
20 | infile = open(infilename)
21 |
22 | collisions = get_collisions(infile,verbose)
23 |
24 | return collisions
25 |
26 | ################################################################################
27 | def get_collisions(infile,verbose=False):
28 |
29 | collisions = []
30 |
31 | not_at_end = True
32 | collision_count = 0
33 | new_collision = True
34 | while ( not_at_end ):
35 |
36 | ############################################################################
37 | # Read in one collision
38 | ############################################################################
39 | line = infile.readline()
40 |
41 | # When the data is read in as a zipfile, readline will
42 | # always return bytes, rather than strings and the find()
43 | # member function doesn't work.
44 | if type(line)==bytes:
45 | line = line.decode()
46 |
47 | if collision_count%1000==0 and verbose:
48 | print("collision count: ",collision_count)
49 |
50 | if line=="":
51 | not_at_end = False
52 |
53 | if line.find("Event")>=0:
54 | new_collision = True
55 |
56 | if new_collision==True:
57 |
58 | # Read in the jet info for this collision.
59 | jets = []
60 | line = infile.readline()
61 | njets = int(line)
62 | for i in range(njets):
63 | line = infile.readline()
64 | vals = line.split()
65 | e = float(vals[0])
66 | px = float(vals[1])
67 | py = float(vals[2])
68 | pz = float(vals[3])
69 | bquark_jet_tag = float(vals[4])
70 | jets.append([e,px,py,pz,bquark_jet_tag])
71 |
72 | # Read in the muon info for this collision.
73 | muons = []
74 | line = infile.readline()
75 | nmuons = int(line)
76 | num_mu=0
77 | for i in range(nmuons):
78 | line = infile.readline()
79 | vals = line.split()
80 | e = float(vals[0])
81 | px = float(vals[1])
82 | py = float(vals[2])
83 | pz = float(vals[3])
84 | charge = int(vals[4])
85 | muons.append([e,px,py,pz,charge])
86 | num_mu+=1
87 |
88 |
89 | # Read in the electron info for this collision.
90 | electrons = []
91 | line = infile.readline()
92 | nelectrons = int(line)
93 | for i in range(nelectrons):
94 | line = infile.readline()
95 | vals = line.split()
96 | e = float(vals[0])
97 | px = float(vals[1])
98 | py = float(vals[2])
99 | pz = float(vals[3])
100 | charge = int(vals[4])
101 | electrons.append([e,px,py,pz,charge])
102 |
103 | # Read in the photon info for this collision.
104 | photons = []
105 | line = infile.readline()
106 | nphotons = int(line)
107 | for i in range(nphotons):
108 | line = infile.readline()
109 | vals = line.split()
110 | e = float(vals[0])
111 | px = float(vals[1])
112 | py = float(vals[2])
113 | pz = float(vals[3])
114 | photons.append([e,px,py,pz])
115 |
116 |
117 | # Read in the information about the missing transverse energy (MET) in the collision.
118 | # This is really the x and y direction for the missing momentum.
119 | line = infile.readline()
120 | vals = line.split()
121 | met_px = float(vals[0])
122 | met_py = float(vals[1])
123 |
124 | new_collision = False
125 | collision_count += 1
126 |
127 | collisions.append([jets,muons,electrons,photons,[met_px,met_py]])
128 |
129 | return collisions
130 |
131 | ################################################################################
132 | ################################################################################
133 | def draw_jet(origin=(0,0),angle=90,length=0.5,opening_angle=20,ntracks=5,show_tracks=False):
134 |
135 | lines = []
136 | patches = []
137 |
138 | # Edges of cone
139 | width_at_top = length*np.deg2rad(opening_angle)
140 | for side in [-1,1]:
141 | theta0 = np.deg2rad(angle+(side*opening_angle/2.0))
142 | x1 = length*np.cos(theta0)
143 | y1 = length*np.sin(theta0)
144 | #print x1,y1
145 | line = mlines.Line2D((origin[0],x1), (origin[1],y1), lw=2., alpha=0.4,color='red',markeredgecolor='red')
146 | lines.append(line)
147 |
148 | # End of cone
149 | arad = np.deg2rad(angle)
150 | center = (origin[0]+np.cos(arad)*length,origin[1]+np.sin(arad)*length)
151 | #print center
152 | p = mpatches.Ellipse(center, width_at_top+0.01, width_at_top/2.0,facecolor='red',alpha=0.4,edgecolor='gray',angle=abs(angle+90))
153 | patches.append(p)
154 |
155 | return patches,lines
156 |
157 |
158 |
159 |
160 | ################################################################################
161 | ################################################################################
162 | def draw_jets(origins=[(0,0)],angles=[90],lengths=[0.5],opening_angles=[20],ntrackss=[5],show_trackss=[False]):
163 |
164 | alllines = []
165 | allpatches = []
166 |
167 | # Edges of cone
168 | for origin,angle,length,opening_angle,ntracks,show_tracks in zip(origins,angles,lengths,opening_angles,ntrackss,show_trackss):
169 | patches,lines = draw_jet(origin=origin,angle=angle,length=length,opening_angle=opening_angle,ntracks=ntracks,show_tracks=show_tracks)
170 | allpatches += patches
171 | alllines += lines
172 |
173 |
174 | return allpatches,alllines
175 |
176 |
177 |
178 | ################################################################################
179 | ################################################################################
180 | def draw_line3D(origin=[(0,0,0)],pmom=[(1,1,1)],color='red',lw=2.0,ls='solid'):
181 |
182 | lines = []
183 |
184 | #print pmom
185 | for o,p in zip(origin,pmom):
186 | #x1 = p[0]
187 | #y1 = p[1]
188 | #z1 = p[2]
189 | x1 = p[2]
190 | y1 = p[0]
191 | z1 = p[1]
192 | #print x1,y1,z1
193 | line = a3.Line3D((o[0],x1),(o[1],y1),(o[0],z1), lw=lw, alpha=0.9,color=color,markeredgecolor=color, linestyle = ls)
194 | lines.append(line)
195 |
196 | return lines
197 |
198 |
199 | ################################################################################
200 | ################################################################################
201 | def draw_beams():
202 |
203 | lines = draw_line3D(origin=[(0,0,-0.1),(0,0,0.1)],pmom=[(0,0,-200.0),(0,0,200.0)],color='red',lw=1)
204 |
205 | return lines
206 |
207 | ################################################################################
208 | ################################################################################
209 | def draw_jet3D(origin=[(0,0,0)],pmom=[(1,1,1)],ls='solid',color='orange'):
210 |
211 | neworg = origin.copy()
212 | newmom = pmom.copy()
213 |
214 | offset = [[0.05,0.05,0.05],
215 | [0.05,0.05,-0.05],
216 | [0.05,-0.05,0.05],
217 | [0.05,-0.05,-0.05],
218 | [-0.05,0.05,0.05],
219 | [-0.05,0.05,-0.05],
220 | [-0.05,-0.05,0.05],
221 | [-0.05,-0.05,-0.05],
222 | ]
223 |
224 | offset = np.array(offset)
225 | offset *= 50
226 |
227 | for p in pmom:
228 | for o in offset:
229 | #print p.copy(),o
230 | pnew = p.copy() + o
231 | #print pnew
232 | newmom = np.vstack((newmom,pnew))
233 | neworg = np.vstack((neworg,(0,0,0)))
234 |
235 | lines = draw_line3D(origin=neworg,pmom=newmom,color=color,lw=1,ls=ls)
236 | ##lines += draw_line3D(origin=neworg,pmom=newmom,color='gray',lw=.25,ls='solid')
237 |
238 | return lines
239 |
240 | ################################################################################
241 | ################################################################################
242 | def draw_muon3D(origin=[(0,0,0)],pmom=[(1,1,1)],ls='solid',color='blue'):
243 |
244 | lines = draw_line3D(origin=origin,pmom=pmom,color=color,lw=5,ls=ls)
245 | ##lines += draw_line3D(origin=origin,pmom=pmom,color='gray',lw=.25,ls='solid')
246 |
247 | return lines
248 |
249 | ################################################################################
250 | ################################################################################
251 | def draw_electron3D(origin=[(0,0,0)],pmom=[(1,1,1)],ls='solid',color='green'):
252 |
253 | lines = draw_line3D(origin=origin,pmom=pmom,color=color,lw=2,ls=ls)
254 | ##lines += draw_line3D(origin=origin,pmom=pmom,color='gray',lw=.25,ls='solid')
255 |
256 | return lines
257 |
258 |
259 | ################################################################################
260 | ################################################################################
261 | def draw_photon3D(origin=[(0,0,0)],pmom=[(1,1,1)],ls='solid',color='gray'):
262 |
263 | lines = draw_line3D(origin=origin,pmom=pmom,color=color,ls=ls,lw=4)
264 | ## lines += draw_line3D(origin=origin,pmom=pmom,color='gray',lw=.25,ls='solid')
265 |
266 | return lines
267 |
268 | ################################################################################
269 | ################################################################################
270 | def display_collision3D(collision,fig=None,ax=None,color_blind=False):
271 |
272 | if fig is None:
273 | fig = plt.figure(figsize=(6,4),dpi=100)
274 |
275 | if ax is None:
276 | ax = fig.add_subplot(1,1,1,projection='3d')
277 | #ax = fig.gca()
278 | plt.subplots_adjust(top=0.98,bottom=0.02,right=0.98,left=0.02)
279 |
280 | jets,muons,electrons,photons,met = collision
281 |
282 | lines = draw_beams()
283 | if(color_blind == False):
284 | pmom = np.array(jets).transpose()[1:4].transpose()
285 | origin = np.zeros((len(jets),3))
286 | lines += draw_jet3D(origin=origin,pmom=pmom)
287 |
288 | pmom = np.array(muons).transpose()[1:4].transpose()
289 | origin = np.zeros((len(muons),3))
290 | lines += draw_muon3D(origin=origin,pmom=pmom)
291 |
292 | pmom = np.array(electrons).transpose()[1:4].transpose()
293 | origin = np.zeros((len(electrons),3))
294 | lines += draw_electron3D(origin=origin,pmom=pmom)
295 |
296 | pmom = np.array(photons).transpose()[1:4].transpose()
297 | origin = np.zeros((len(photons),3))
298 | lines += draw_photon3D(origin=origin,pmom=pmom)
299 | if(color_blind == True):
300 | pmom = np.array(jets).transpose()[1:4].transpose()
301 | origin = np.zeros((len(jets),3))
302 | lines += draw_jet3D(origin=origin,pmom=pmom,ls='solid',color='gray')
303 |
304 | pmom = np.array(muons).transpose()[1:4].transpose()
305 | origin = np.zeros((len(muons),3))
306 | lines += draw_muon3D(origin=origin,pmom=pmom,ls='dashed',color='black')
307 |
308 | pmom = np.array(electrons).transpose()[1:4].transpose()
309 | origin = np.zeros((len(electrons),3))
310 | lines += draw_electron3D(origin=origin,pmom=pmom,ls='dashed',color='gray')
311 |
312 | pmom = np.array(photons).transpose()[1:4].transpose()
313 | origin = np.zeros((len(photons),3))
314 | lines += draw_photon3D(origin=origin,pmom=pmom,ls='solid',color='black')
315 |
316 | for l in lines:
317 | ax.add_line(l)
318 |
319 | ax.set_xlim(-200,200)
320 | ax.set_ylim(-200,200)
321 | ax.set_zlim(-200,200)
322 |
323 | #return lines,fig,ax
324 | ################################################################################
325 | ################################################################################
326 |
327 | def display_collision3D_animate(collisions,fig=None):
328 |
329 | if fig is None:
330 | fig = plt.figure(figsize=(6,4),dpi=100)
331 | ax = fig.add_subplot(1,1,1)
332 | ax = fig.gca(projection='3d')
333 | plt.subplots_adjust(top=0.98,bottom=0.02,right=0.98,left=0.02)
334 |
335 | if type(collisions[0][0][0]) is not list:
336 | collisions = [collisions]
337 |
338 | for collision in collisions:
339 | # For animations
340 | #fig.clear()
341 | clear_output()
342 | ax.clear();
343 |
344 | jets,muons,electrons,photons,met = collision
345 |
346 | lines = draw_beams()
347 |
348 | pmom = np.array(jets).transpose()[1:4].transpose()
349 | origin = np.zeros((len(jets),3))
350 | lines += draw_jet3D(origin=origin,pmom=pmom)
351 |
352 | pmom = np.array(muons).transpose()[1:4].transpose()
353 | origin = np.zeros((len(muons),3))
354 | lines += draw_muon3D(origin=origin,pmom=pmom)
355 |
356 | pmom = np.array(electrons).transpose()[1:4].transpose()
357 | origin = np.zeros((len(electrons),3))
358 | lines += draw_electron3D(origin=origin,pmom=pmom)
359 |
360 | pmom = np.array(photons).transpose()[1:4].transpose()
361 | origin = np.zeros((len(photons),3))
362 | lines += draw_photon3D(origin=origin,pmom=pmom)
363 |
364 |
365 | for l in lines:
366 | ax.add_line(l)
367 |
368 | ax.set_xlim(-200,200)
369 | ax.set_ylim(-200,200)
370 | ax.set_zlim(-200,200)
371 |
372 | display(ax)
373 | time.sleep(0.5)
374 |
375 | #return lines,fig,ax
376 |
377 |
378 |
--------------------------------------------------------------------------------
/tools/test_babar.py:
--------------------------------------------------------------------------------
1 | import matplotlib.pylab as plt
2 | import numpy as np
3 |
4 | import babar_tools as bbr
5 |
6 | import sys
7 |
8 | ################################################################################
9 | def inv_mass(p4s):
10 |
11 | tot_p4 = np.array([0.0, 0.0, 0.0, 0.0])
12 | for p4 in p4s:
13 | #print(tot_p4)
14 | tot_p4 += p4
15 | #print(tot_p4)
16 |
17 | m2 = tot_p4[0]*tot_p4[0] - \
18 | (tot_p4[1]*tot_p4[1] + \
19 | tot_p4[2]*tot_p4[2] + \
20 | tot_p4[3]*tot_p4[3])
21 |
22 | m = None
23 | if m2>=0:
24 | m = np.sqrt(m2)
25 | else:
26 | m = -np.sqrt(np.abs(m2))
27 |
28 | #print(m)
29 | return m
30 |
31 | ################################################################################
32 |
33 | collisions = bbr.get_collisions(open(sys.argv[1]))
34 |
35 | print(len(collisions))
36 |
37 | masses = []
38 | for count,collision in enumerate(collisions):
39 |
40 | if count%10000==0:
41 | print(count)
42 |
43 | pions,kaons,protons,muons,electrons,photons = collision
44 |
45 | '''
46 | npions = len(pions)
47 | for i in range(0,npions-1):
48 | p4i = np.array(pions[i][0:4])
49 | for j in range(i+1,npions):
50 | p4j = np.array(pions[j][0:4])
51 | m = inv_mass([p4i,p4j])
52 | masses.append(m)
53 | '''
54 |
55 | '''
56 | nmuons = len(muons)
57 | for i in range(0,nmuons-1):
58 | p4i = np.array(muons[i][0:4])
59 | for j in range(i+1,nmuons):
60 | p4j = np.array(muons[j][0:4])
61 | m = inv_mass([p4i,p4j])
62 | masses.append(m)
63 | '''
64 | '''
65 | nkaons = len(kaons)
66 | for i in range(0,nkaons-1):
67 | p4i = np.array(kaons[i][0:4])
68 | for j in range(i+1,nkaons):
69 | p4j = np.array(kaons[j][0:4])
70 | m = inv_mass([p4i,p4j])
71 | masses.append(m)
72 | '''
73 |
74 | '''
75 | # Look for D-->Kpipi
76 | nkaons = len(kaons)
77 | npions = len(pions)
78 | for k in range(0,nkaons):
79 | p4k = np.array(kaons[k][0:4])
80 | qk = kaons[k][4]
81 | for i in range(0,npions-1):
82 | p4i = np.array(pions[i][0:4])
83 | qi = pions[i][4]
84 | for j in range(i+1,npions):
85 | p4j = np.array(pions[j][0:4])
86 | qj = pions[j][4]
87 | if (qk==-qi and qi==qj):
88 | m = inv_mass([p4i,p4j,p4k])
89 | masses.append(m)
90 | '''
91 | nphotons = len(photons)
92 | #print(nphotons)
93 | for i in range(0,nphotons-1):
94 | p4i = np.array(photons[i][0:4])
95 | for j in range(i+1,nphotons):
96 | p4j = np.array(photons[j][0:4])
97 | m = inv_mass([p4i,p4j])
98 | masses.append(m)
99 |
100 |
101 | print(masses)
102 | plt.figure()
103 | plt.hist(masses,bins=100,range=(0.0,3.0))
104 | plt.show()
105 |
--------------------------------------------------------------------------------