7 FILE *file = fopen(f.c_str(),
"ra");
8 if (file == NULL) { std::cout <<
"Scheme file " << f <<
" does not exist!" << std::endl;
return; }
13 double branches[100][100];
14 double branch_errs[100][100];
15 for (
int i=0; i<100; ++i) {
16 for (
int j=0; j<100; ++j) {
18 branch_errs[i][j] = 0;
21 while(std::fgets(cline,
sizeof cline, file)!=NULL) {
22 std::string line(cline);
23 if (line.size() == 0) {
continue; }
24 if (line[0] ==
'#') {
continue; }
25 if (line[0] ==
';') {
continue; }
40 ss >>
id >> name >> tau >> tau_err >> eff >> eff_err >> N0;
41 AddNucleus(name, tau, eff, tau_err, eff_err, N0);
43 else if (type ==
"B") {
46 ss >> id1 >> id2 >> br >> br_err;
47 branches[id1][id2] = br;
48 branch_errs[id1][id2] = br_err;
52 for (
int i=0; i<100; ++i) {
53 for (
int j=0; j<100; ++j) {
54 if (branches[i][j] == 0) {
continue; }
56 nuclei[j]->branches.push_back(branches[i][j]);
57 nuclei[j]->branch_errs.push_back(branch_errs[i][j]);
69 for (
int j=0; j<
nuclei.size(); ++j) {
72 for (
int j=0; j<
nuclei.size(); ++j) {
78 double branches[100][100];
79 double branch_errs[100][100];
80 for (
int i=0; i<100; ++i) {
81 for (
int j=0; j<100; ++j) {
83 branch_errs[i][j] = 0;
87 for (
int j=0; j<
nuclei.size(); ++j) {
88 for (
int i=0; i<
nuclei[j]->feeders.size(); ++i) {
90 branch_errs[
nuclei[j]->feeders[i]->index][
nuclei[j]->index] =
nuclei[j]->branch_errs[i];
94 for (
int j=0; j<
nuclei.size(); ++j) {
95 nuclei[j]->feeders.clear();
96 nuclei[j]->branches.clear();
97 nuclei[j]->branch_errs.clear();
100 for (
int i=0; i<100; ++i) {
102 for (
int j=0; j<100; ++j) {
103 if (branches[i][j] == 0) {
continue; }
104 br_tot += branches[i][j];
108 for (
int j=0; j<100; ++j) {
109 if (branches[i][j] == 0) {
continue; }
110 double br = branches[i][j]/br_tot;
112 for (
int k=0; k<100; ++k) {
113 if (branches[i][k] == 0) {
continue; }
114 if (j == k ) {
continue; }
115 err_tot += std::pow(branches[i][j]/(br_tot*br_tot) * branch_errs[i][k], 2);
118 double br_err = std::sqrt(std::pow((br_tot - branches[i][j])/(br_tot*br_tot) * branch_errs[i][j], 2) + err_tot);
120 nuclei[j]->branches.push_back(br);
121 nuclei[j]->branch_errs.push_back(br_err);
128 for (
int i=0; i<x.size(); ++i) {
129 dxdt[i] = -(1.0/
nuclei[i]->lifetime) * x[i];
130 for (
int j=0; j<
nuclei[i]->feeders.size(); ++j) {
131 dxdt[i] +=
nuclei[i]->branches[j] * (1.0/
nuclei[i]->feeders[j]->lifetime) * x[
nuclei[i]->feeders[j]->index];
137 for (
int i=0; i<
nuclei.size(); ++i) {
146 stream << time <<
" ";
147 for (
int j=0; j<
nuclei.size(); ++j) {
148 stream <<
nuclei[j]->population[i] <<
" ";
160 stream << time <<
" ";
161 for (
int j=0; j<
nuclei.size(); ++j) {
162 stream <<
nuclei[j]->population[i] * 1.0/
nuclei[j]->lifetime <<
" ";
173 if (t >= solver.
max_time) { std::cout <<
"Evaluation ouside bounds!" << std::endl;
return -1; }
174 if (t < 0 ) { std::cout <<
"Evaluation ouside bounds!" << std::endl;
return -1; }
176 if (t >= time && t < time+solver.
stepsize) {
break; }
184 for (
int j=0; j<
nuclei.size(); ++j) {
188 double frac = (t - time)/solver.
stepsize;
189 return n0+frac*(n1-n0);
195 if (t >= solver.
max_time) { std::cout <<
"Evaluation ouside bounds!" << std::endl;
return -1; }
196 if (t < 0 ) { std::cout <<
"Evaluation ouside bounds!" << std::endl;
return -1; }
198 if (t >= time && t < time+solver.
stepsize) {
break; }
206 n0 =
nuclei[indx]->efficiency *
nuclei[indx]->population[i] * 1.0/
nuclei[indx]->lifetime;
207 n1 +=
nuclei[indx]->efficiency *
nuclei[indx]->population[i+1] * 1.0/
nuclei[indx]->lifetime;
208 double frac = (t - time)/solver.
stepsize;
209 return n0+frac*(n1-n0);
void ss(std::vector< int > indexes, TCanvas *canvas, Option_t *option)
std::vector< Nucleus * > nuclei
void PrintDecays(std::ostream &stream, Solver &solver)
void PrintSummary(std::ostream &stream)
void ReadScheme(std::string f)
void AddNucleus(std::string n, double lt, double eff, double lt_err, double eff_err, double N0)
void operator()(const std::vector< double > &x, std::vector< double > &dxdt, const double)
double Get(int indx, double t, Solver &solver)
double GetTotal(double t, Solver &solver)
void PrintPops(std::ostream &stream, Solver &solver)