scint.py
Go to the documentation of this file.
1 from atomicdata import *
2 from util import *
3 
4 # This composition is a further refinement of the update reported
5 # on in doc-15338, "Detector Simulation Technote".
6 
7 compositions = {
8  # pseudocumeme was required to have less than 1e-6 sulfur
9  # as per doc-13014. So 0.3e-6 is a reasonable guess. That's by
10  # weight, so 0.15e-6 by count. Assume similar N and O.
11  'Pseudocumene' : { 'C':9, 'H':12, 'S':0.15e-6, 'N': 0.3e-6, 'O': 0.3e-6 },
12 
13  # As per doc-13911. Analysis seems questionable to me, as it
14  # excludes odd-numbered chains, except, bizzarely, for chains of
15  # length 19. But short of getting a new analysis, I don't see
16  # any way to correct for this.
17  #
18  # And it is "Virtually free of nitrogen, sulfur, oxygen and aromatic
19  # hydrocarbons." says the Renoil brochure. Use the pseudocumeme
20  # tolerance as a guide. Just a guess.
21  'Oil' : { 'C':1, 'H':2.0555, 'S': 0.15e-6, 'N': 0.3e-6, 'O': 0.3e-6},
22 
23  'PPO' : { 'C':15, 'H':11, 'N':1, 'O':1 },
24 
25  'Bis-MSB' : { 'C':24, 'H':22 },
26 
27  # Assuming an even mix of alpha, beta, gamma and delta tocopherols.
28  # It hardly makes a difference. The variation is from C27H46O2 to
29  # C29H50O2.
30  'Vitamin E':{ 'C':28, 'H':48, 'O':2 },
31 
32  # Obsessively model Stadis-425 even though it is only 0.001%. Not
33  # *too* obsessively. Take what Wikipedia says about the average chain
34  # length of heavy naptha, assume 1:1 mix of straight and branched and
35  # move on.
36  'Stadis - heavy naptha': { 'C': 9, 'H': 9*2+1},
37 
38  # Easy.
39  'Stadis - o-xylene': { 'C': 8, 'H': 10},
40 
41  # Again take Wikipedia's statement about average chain length
42  'Stadis - kerosene': { 'C': 11, 'H': 11*2+1},
43 
44  'Stadis - acid': { 'C': 18, 'H': 30, 'O': 3, 'S':1 },
45 
46  # Trade secrets... Just guessing something vaguely sensible
47  'Stadis - secret with sulfur' : { 'C':1, 'H':2, 'S':1 },
48  'Stadis - secret with nitrogen': { 'C':1, 'H':2, 'N':1 },
49 
50  # A contaminant
51  'Water': { 'H':2, 'O':1},
52 
53  # Dissolved
54  'Nitrogen': { 'N': 2},
55  'Oxygen': { 'O': 2},
56 
57  # Since the MC does not model the fiber, mix it in such that the
58  # scintillator is really a scintillator+fiber soup
59  # From doc-2665
60 
61  # Ignore wavelength shifter, which is a very small fraction of a very small
62  # fraction and involves ruthenium, which I don't want to put in
63  'Fiber core': { 'C':1, 'H': 1 },
64 
65  # We know what PMMA is, so use the formula instead of their atom counts
66  # (which agree with the formula, but are rounded off)
67  'Fiber inner cladding': { 'C':5, 'H': 8, 'O': 2 },
68 
69  # This is "flourinated polymer". Assume teflon, CF2, and then ignore the flourine
70  # since I don't want to add another element with a tiny fraction.
71  'Fiber outer cladding': { 'C':1 },
72 }
73 
74 # Most of the blends of scintillator, with higher pseudocumene and PPO
75 # concentrations.
76 fractions_late = {
77  # in kg
78  'Oil': 7658656, # doc-13014-v5, blends 3-25
79  'Pseudocumene': 423278,
80  'PPO' : 11331,
81  'Bis-MSB' : 129,
82 
83  'Stadis - kerosene': 81*0.65,
84  'Stadis - o-xylene': 81*0.15,
85  'Stadis - acid': 81*0.05,
86  'Stadis - heavy naptha': 81*0.05,
87  'Stadis - secret with sulfur' : 81*0.05,
88  'Stadis - secret with nitrogen': 81*0.05,
89 
90  'Vitamin E': 78,
91 
92  # As per doc-13014, limit is 50ppm, so guess 15ppm. Is it silly to include
93  # this? Maybe, but there is more water in the scintillator (best estimate)
94  # than either Stadis or vitamin E.
95  'Water': 8000000 * 15e-6,
96 
97  # As suggested by doc-7236, but assuming full saturation based on comments
98  # received at a Detsim meeting. This is the biggest contribution of oxygen
99  # in the scintillator.
100  'Oxygen': 8000000 * 2*atomic_weight['O']/(19*atomic_weight['C'] + (19*2+1)*atomic_weight['H']) * 5.048e-3,
101 
102  # Two shady sources, jbc.org/content/72/2/545.full.pdf and
103  # nttworldwide.com/docs/dga2102.pdf suggest that the solubility of nitrogen
104  # is very close to half that of oxygen, and it should be fully saturated.
105  # This is the biggest contribution of nitrogen in the scintillator.
106  'Nitrogen': 8000000 * 2*atomic_weight['N']/(19*atomic_weight['C'] + (19*2+1)*atomic_weight['H']) * 5.048e-3 / 2,
107 
108  # Assume 26 blocks worth of fiber -- not yet sure of the exact number (but
109  # also not that important). Using fiber mass from doc-11905, fractions
110  # derived from doc-2665. Corrected down by 6% to account for the difference
111  # between the mass of blended scintillator above vs. amount in the relevant
112  # FD volume.
113  'Fiber core': 0.94 * 0.4505 * 12 * 32 * 26 * 0.86, # about 5000kg
114  'Fiber inner cladding': 0.94 * 0.4505 * 12 * 32 * 26 * 0.06,
115 
116  # Deweight by the ignored flourine
117  'Fiber outer cladding': 0.94 * 0.4505 * 12 * 32 * 26 * 0.08 *
118  atomic_weight['C']/(atomic_weight['C'] + 2 * atomic_weight['F']),
119 }
120 
121 
122 # The first two blends of scintillator, with lower pseudocumene and PPO
123 # concentrations.
124 fractions_early = {
125  # in kg
126  'Oil': 691179, # doc-13014-v5, blends 1-2
127  'Pseudocumene': 36266.7, # corrected typo in doc-13014-v5
128  'PPO' : 801,
129  'Bis-MSB' : 11.7,
130 
131  'Stadis - kerosene': 7.3*0.65,
132  'Stadis - o-xylene': 7.3*0.15,
133  'Stadis - acid': 7.3*0.05,
134  'Stadis - heavy naptha': 7.3*0.05,
135  'Stadis - secret with sulfur' : 7.3*0.05,
136  'Stadis - secret with nitrogen': 7.3*0.05,
137 
138  'Vitamin E': 7.1,
139 
140  'Water': 700000 * 15e-6,
141 
142  'Oxygen': 700000 * 2*atomic_weight['O']/(19*atomic_weight['C'] + (19*2+1)*atomic_weight['H']) * 5.048e-3,
143 
144  'Nitrogen': 700000 * 2*atomic_weight['N']/(19*atomic_weight['C'] + (19*2+1)*atomic_weight['H']) * 5.048e-3 / 2,
145 
146  # Assume 2 blocks worth of fiber -- not yet sure of the exact number
147  # (but also not that important)
148  'Fiber core': 0.94 * 0.4505 * 12 * 32 * 2 * 0.86,
149  'Fiber inner cladding': 0.94 * 0.4505 * 12 * 32 * 2 * 0.06,
150  'Fiber outer cladding': 0.94 * 0.4505 * 12 * 32 * 2 * 0.08 *
151  atomic_weight['C']/(atomic_weight['C'] + 2 * atomic_weight['F']),
152 }
153 
154 
155 def tot_weight(compos):
156  weight = 0
157  for element, number in compos.items():
158  weight += number * atomic_weight[element]
159  return weight
160 
161 def tot_fractions():
162  tions = 0
163  for material, fraction in fractions.items():
164  tions += fraction
165  return tions
166 
167 def elem_frac(compos, elem):
168  if elem in compos:
169  return compos[elem] * atomic_weight[elem] / tot_weight(compos)
170  else:
171  return 0
172 
173 def elem_frac_total(elem):
174  frac = 0
175  for material, compos in compositions.items():
176  frac += elem_frac(compos, elem) * fractions[material]
177  return frac / tot_fractions()
178 
179 def scint_composition_late():
180  return make_composition("scint", fractions_late, compositions)
181 
182 def scint_composition_early():
183  return make_composition("scint", fractions_early, compositions)
def elem_frac_total(elem)
Definition: air.py:43
def tot_weight(compos)
Definition: air.py:25
def tot_fractions()
Definition: air.py:31
def make_composition(name, fractions, compositions)
Definition: util.py:46
def elem_frac(compos, elem)
Definition: air.py:37