def test_isotopequantity_from_comparison(iq): """Test IsotopeQuantity.from_comparison calculation""" counts1 = 1e3 start = iq.ref_date stop = start + datetime.timedelta(seconds=3600) interval1 = (start, stop) iq2 = IsotopeQuantity.from_comparison(iq, counts1, interval1, counts1, interval1) assert iq2 == iq f = 3.1 counts2 = counts1 * f iq3 = IsotopeQuantity.from_comparison(iq, counts1, interval1, counts2, interval1) assert iq3 == iq * f if iq.half_life < 1000 * 3.156e7: dt = datetime.timedelta(seconds=iq.half_life) interval2 = (start + dt, stop + dt) iq4 = IsotopeQuantity.from_comparison(iq, counts1, interval1, counts1, interval2) assert iq4 == iq * 2 iq5 = IsotopeQuantity.from_comparison(iq, counts1, interval1, counts2, interval2) assert iq5 == iq * 2 * f interval3 = (start - dt, stop - dt) iq6 = IsotopeQuantity.from_comparison(iq, counts1, interval1, counts1, interval3) assert iq6 == iq / 2
def test_irradiation_activate_errors(): """Test NeutronIrradiation.activate() bad args""" iso0 = Isotope("Na-23") iso1 = Isotope("Na-24") iq0 = IsotopeQuantity(iso0, atoms=1e24) iq1 = IsotopeQuantity(iso1, atoms=1e24) start = datetime.datetime.now() stop = start n_cm2 = 1e15 ni = NeutronIrradiation(start, stop, n_cm2=n_cm2) barns = 10 with pytest.raises(NeutronIrradiationError): ni.activate(barns, initial=iq0, activated=iq1) with pytest.raises(NeutronIrradiationError): ni.activate(barns, initial=iso0, activated=iso1) with pytest.raises(TypeError): ni.activate(barns, initial=iq0, activated="asdf") iso2 = Isotope("Na-25") with pytest.raises(NotImplementedError): ni.activate(barns, initial=iq1, activated=iso2)
def test_isotopequantity_ref_atoms_stable(stable_isotope): """Test IsotopeQuantity.ref_atoms for a stable isotope""" atoms = 1e24 iq = IsotopeQuantity(stable_isotope, atoms=atoms) assert iq.ref_atoms == atoms g = 1e-5 iq = IsotopeQuantity(stable_isotope, g=g) assert iq.ref_atoms == g / stable_isotope.A * N_AV
def test_isotopequantity_init_stable(stable_isotope, iq_date, iq_kwargs): """Test IsotopeQuantity.__init__() for radioactive isotopes""" if "bq" in iq_kwargs or "uci" in iq_kwargs: with pytest.raises(IsotopeQuantityError): iq = IsotopeQuantity(stable_isotope, date=iq_date, **iq_kwargs) return None iq = IsotopeQuantity(stable_isotope, date=iq_date, **iq_kwargs) assert iq.isotope is stable_isotope assert iq.half_life == stable_isotope.half_life assert iq.decay_const == stable_isotope.decay_const
def test_isotopequantity_init_rad(radioisotope, iq_date, iq_kwargs): """Test IsotopeQuantity.__init__() for radioactive isotopes""" iq = IsotopeQuantity(radioisotope, date=iq_date, **iq_kwargs) assert iq.isotope is radioisotope assert iq.half_life == radioisotope.half_life assert iq.decay_const == radioisotope.decay_const # check string input iq = IsotopeQuantity(str(radioisotope), date=iq_date, **iq_kwargs) assert iq.isotope == radioisotope assert iq.half_life == radioisotope.half_life assert iq.decay_const == radioisotope.decay_const
def test_isotopequantity_from_decays(iq): """Test IsotopeQuantity.from_decays instantiation""" start = iq.ref_date stop = start + datetime.timedelta(seconds=3600) # qualitative IsotopeQuantity.from_decays( iq.isotope, n_decays=1000, start_time=start, stop_time=stop) # quantitative if iq.half_life < 1000 * 3.156e7: # floating point precision #65 n = iq.decays_from(start, stop) iq2 = IsotopeQuantity.from_decays( iq.isotope, n_decays=n, start_time=start, stop_time=stop) assert np.isclose(iq.atoms_at(start), iq2.atoms_at(start))
def test_irradiation_activate_extended(activation_pair): """Test NeutronIrradiation.activate() with decay""" start = datetime.datetime.now() t_irr = 3600 * 12 stop = start + datetime.timedelta(seconds=t_irr) n_cm2_s = 1e11 iso0, iso1 = activation_pair barns = 1 iq0 = IsotopeQuantity(iso0, date=start, atoms=1e24) expected_atoms = (n_cm2_s * barns * 1e-24 * iq0.ref_atoms * (1 - np.exp(-iso1.decay_const * t_irr))) ni = NeutronIrradiation(start, stop, n_cm2_s=n_cm2_s) # forward calculation iq1 = ni.activate(barns, initial=iq0, activated=iso1) assert iq1.ref_date == stop assert np.isclose(iq1.bq_at(iq1.ref_date), expected_atoms) # backward calculation iq0a = ni.activate(barns, initial=iso0, activated=iq1) assert iq0a.ref_date == start assert np.isclose(iq0a.ref_atoms, iq0.ref_atoms)
def test_isotopequantity_init_stable(stable_isotope, iq_date, iq_kwargs): """Test IsotopeQuantity.__init__() for radioactive isotopes""" if "bq" in iq_kwargs or "uci" in iq_kwargs: with pytest.raises(IsotopeQuantityError): iq = IsotopeQuantity(stable_isotope, date=iq_date, **iq_kwargs) return None iq = IsotopeQuantity(stable_isotope, date=iq_date, **iq_kwargs) assert iq.isotope is stable_isotope assert iq.half_life == stable_isotope.half_life assert iq.decay_const == stable_isotope.decay_const assert iq.bq_at() == iq.bq_at(iq.ref_date) == 0.0 assert iq.uci_at() == iq.uci_at(iq.ref_date) == 0.0 if "g" in iq_kwargs: assert np.isclose(iq.g_at(), iq_kwargs["g"]) if "atoms" in iq_kwargs: assert np.isclose(iq.atoms_at(), iq_kwargs["atoms"])
def test_isotopequantity_ref_date_rad(radioisotope, iq_date): """Test IsotopeQuantity.ref_date for a radioisotope""" iq = IsotopeQuantity(radioisotope, date=iq_date, atoms=1e24) if isinstance(iq_date, datetime.datetime): assert iq.ref_date == iq_date elif bq.core.utils.isstring(iq_date): assert iq.ref_date == dateutil_parse(iq_date) else: assert (datetime.datetime.now() - iq.ref_date).total_seconds() < 5
def test_isotopequantity_eq(iq): """Test IsotopeQuantity equality magic method""" iq2 = copy.deepcopy(iq) assert iq == iq2 dt_s = min(iq.half_life, 10 * 86400) date = iq.ref_date + datetime.timedelta(seconds=dt_s) iq3 = IsotopeQuantity(iq.isotope, date=date, atoms=iq.atoms_at(date)) assert iq == iq3
def test_isotopequantity_ref_date_stable(stable_isotope, iq_date): """Test IsotopeQuantity.ref_date for a stable isotope""" iq = IsotopeQuantity(stable_isotope, date=iq_date, atoms=1e24) if isinstance(iq_date, datetime.datetime): assert iq.ref_date == iq_date elif isinstance(iq_date, string_types): assert iq.ref_date == dateutil_parse(iq_date) else: assert (datetime.datetime.now() - iq.ref_date).total_seconds() < 5
def test_isotopequantity_ref_atoms_rad(radioisotope, iq_kwargs): """Test IsotopeQuantity.ref_atoms for a radioactive isotope""" iq = IsotopeQuantity(radioisotope, **iq_kwargs) if 'atoms' in iq_kwargs: assert iq.ref_atoms == iq_kwargs['atoms'] elif 'g' in iq_kwargs: assert iq.ref_atoms == (iq_kwargs['g'] / radioisotope.A * N_AV) elif 'bq' in iq_kwargs: assert iq.ref_atoms == iq_kwargs['bq'] / radioisotope.decay_const else: assert iq.ref_atoms == (iq_kwargs['uci'] * UCI_TO_BQ / radioisotope.decay_const)
def test_isotopequantity_ref_atoms_rad(radioisotope, iq_kwargs): """Test IsotopeQuantity.ref_atoms for a radioactive isotope""" iq = IsotopeQuantity(radioisotope, **iq_kwargs) if "atoms" in iq_kwargs: assert isclose(iq.ref_atoms, iq_kwargs["atoms"]) elif "g" in iq_kwargs: assert isclose(iq.ref_atoms, (iq_kwargs["g"] / radioisotope.A * N_AV)) elif "bq" in iq_kwargs: assert isclose(iq.ref_atoms, iq_kwargs["bq"] / radioisotope.decay_const) else: assert isclose(iq.ref_atoms, iq_kwargs["uci"] * UCI_TO_BQ / radioisotope.decay_const)
def test_irradiation_nan_g(): """Regression test for https://github.com/lbl-anp/becquerel/issues/325. From examples/isotopes.ipynb """ iso = Isotope("Na-23") iso2 = Isotope("Na-24") barns = 2.3 # making this up for now irradiation_start = "2017-04-30 10:32:00" irradiation_stop = "2017-04-30 11:32:00" flux = 3.1e11 ni = NeutronIrradiation(irradiation_start, irradiation_stop, n_cm2_s=flux) activated_qty = IsotopeQuantity(iso2, date="2017-05-01", bq=103.2) na23_qty = ni.activate(barns, initial=iso, activated=activated_qty) assert not np.isnan(na23_qty.g_at())
def test_irradiation_activate_pulse(activation_pair): """Test NeutronIrradiation.activate() for duration = 0""" start = datetime.datetime.now() stop = start n_cm2 = 1e15 iso0, iso1 = activation_pair barns = 1 iq0 = IsotopeQuantity(iso0, date=start, atoms=1e24) expected_atoms = n_cm2 * barns * 1e-24 * iq0.ref_atoms ni = NeutronIrradiation(start, stop, n_cm2=n_cm2) # forward calculation iq1 = ni.activate(barns, initial=iq0, activated=iso1) assert iq1.ref_date == stop assert np.isclose(iq1.ref_atoms, expected_atoms) # backward calculation iq0a = ni.activate(barns, activated=iq1, initial=iso0) assert iq0a.ref_date == start assert np.isclose(iq0a.ref_atoms, iq0.ref_atoms)
def iq(radioisotope): """An IsotopeQuantity object""" date = datetime.datetime.now() kwargs = {"uci": 10.047} return IsotopeQuantity(radioisotope, date=date, **kwargs)
Na_22_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Na_22_flat_against_detector_531.Spe') Mn_54_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Mn_54_flat_against_detector_1264-96-2.Spe') Co_57_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Co_57_flat_against_detector_1264-96-3.Spe') Cd_109_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Cd_109_flat_against_detector_1264-96-8.Spe') Th_228_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Th_228_flat_against_detector_1415-83.Spe') Eu_152_spec = Spectrum.from_file('/Users/jackiegasca/Documents/Ca_sources/Eu_152_flat_against_detector_1316-97-2.Spe') Na_22_start = Na_22_spec.start_time Mn_54_start = Mn_54_spec.start_time Co_57_start = Co_57_spec.start_time Cd_109_start = Cd_109_spec.start_time Th_228_start = Th_228_spec.start_time Eu_152_start = Eu_152_spec.start_time Na_22_init_act = IsotopeQuantity('na22', date=ca.Na_22.date, uci=ca.Na_22.init_act) Na_22_act = Na_22_init_act.bq_at(Na_22_start) Mn_54_init_act = IsotopeQuantity('mn54', date=ca.Mn_54.date, uci=ca.Mn_54.init_act) Mn_54_act = Mn_54_init_act.bq_at(Mn_54_start) Co_57_init_act = IsotopeQuantity('co57', date=ca.Co_57.date, uci=ca.Co_57.init_act) Co_57_act = Co_57_init_act.bq_at(Co_57_start) Cd_109_init_act = IsotopeQuantity('cd109', date=ca.Cd_109.date, uci=ca.Cd_109.init_act) Cd_109_act = Cd_109_init_act.bq_at(Cd_109_start) Th_228_init_act = IsotopeQuantity('th229', date=ca.Th_228.date, uci=ca.Th_228.init_act) Th_228_act = Th_228_init_act.bq_at(Th_228_start) Eu_152_init_act = IsotopeQuantity('eu152', date=ca.Eu_152.date, uci=ca.Eu_152.init_act) Eu_152_act = Eu_152_init_act.bq_at(Eu_152_start) Na_22_ener_spec = Na_22_spec.energies_kev[0:len(Na_22_spec)] Mn_54_ener_spec = Mn_54_spec.energies_kev[0:len(Mn_54_spec)] Co_57_ener_spec = Co_57_spec.energies_kev[0:len(Co_57_spec)]
def test_isotopequantity_quantity_at(radioisotope, iq_kwargs): """Test IsotopeQuantity.quantity_at for a radioactive isotope""" iq = IsotopeQuantity(radioisotope, **iq_kwargs) key = next(iter(iq_kwargs)) assert iq_kwargs[key] == iq.quantity_at(key, iq.ref_date)
def test_isotopequantity_time_when_error(stable_isotope): """Test error for time_when on a stable isotope""" iq = IsotopeQuantity(stable_isotope, g=10) with pytest.raises(IsotopeQuantityError): iq.time_when(g=5)
def test_isotopequantity_bad_init(iso, date, kwargs, error): """Test errors from Isotope.__init__()""" with pytest.raises(error): IsotopeQuantity(iso, date=date, **kwargs)
def Concentration(): conc = [] for i in range(len(iso_name)): c = iso_name[i].split('_') abb = c[0] A = int(c[1]) A_0 = A - 1 iso_2 = '{0}-{1}'.format(abb, A_0) iso_1 = '{0}-{1}'.format(abb, A) nuclide = Isotope(iso_1) def urlcreator(abb, A_0): A_num = str(A_0) if len(A_num) == 1: A_num = '00' + A_num elif len(A_num) == 2: A_num = '0' + A_num else: A_num = A_num url = 'http://wwwndc.jaea.go.jp/cgi-bin/Tab80WWW.cgi?/data' \ + '/JENDL/JENDL-4-prc/intern/' + abb + A_num + '.intern' html = urllib.request.urlopen(url) bslink = BeautifulSoup(html, 'lxml') return(bslink) bslink = urlcreator(abb, A_0) def tabledata(bslink): '''extracts data from the jaea website''' table = bslink.table table_rows = table.find_all('tr') for tr in table_rows: td = tr.find_all('td') row = [i.text for i in td] if len(row) == 7: if row[0] == 'total ': x_sec = row[1] x_sec_s = x_sec.split(' ') x_val = float(x_sec_s[0]) barn = x_sec_s[1] if barn[1] == 'k': x_val = 10**(3) * x_val return(x_val) elif barn[1] == 'm': x_val = 10**(-3) * x_val return(x_val) elif barn[1] == '&': x_val = 10**(-6) * x_val return(x_val) else: x_val = x_val return(x_val) else: pass else: pass return(x_val) x_val = tabledata(bslink) #print(x_val) quantity = IsotopeQuantity(nuclide, date=spec_S1.start_time, bq=isotope_activities[i]) unc_quantity = IsotopeQuantity(nuclide, date=spec_S1.start_time, bq=stat_uncertainties[i]) irrad_quan = quantity.bq_at(irr_stop) unc_irrad_quan = unc_quantity.bq_at(irr_stop) irrad_act = IsotopeQuantity(nuclide, date=irr_stop, bq=irrad_quan) unc_irrad_act = IsotopeQuantity(nuclide, date=irr_stop, bq=unc_irrad_quan) ni = NeutronIrradiation(irr_start, irr_stop, n_cm2_s=flux) init_comp = ni.activate(x_val, initial=Isotope(iso_2), activated=irrad_act) unc_init_comp = ni.activate(x_val, initial=Isotope(iso_2), activated=unc_irrad_act) init_comp.is_stable = True unc_init_comp.is_stable = True sinit_comp = str(init_comp) sunc_init_comp = str(unc_init_comp) #print(sinit_comp, sunc_init_comp) s2 = sinit_comp.split(' ') s0 = s2[0] sunc2 = sunc_init_comp.split(' ') sunc0 = sunc2[0] isotope_type = ' ' + s2[1] + ' ' + s2[2] + ' ' + s2[3] print(s0+' +/- '+sunc0 +isotope_type)