00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "G4Analyser.hh"
00033 #include <cmath>
00034 #include <iomanip>
00035
00036 G4Analyser::G4Analyser()
00037 : verboseLevel(0), eventNumber(0.0), averageMultiplicity(0.0),
00038 averageProtonNumber(0.0), averageNeutronNumber(0.0),
00039 averagePionNumber(0.0), averageNucleonKinEnergy(0.0),
00040 averageProtonKinEnergy(0.0), averageNeutronKinEnergy(0.0),
00041 averagePionKinEnergy(0.0), averageExitationEnergy(0.0),
00042 averageOutgoingNuclei(0.0), fissy_prob(0.0), averagePionPl(0.0),
00043 averagePionMin(0.0), averagePion0(0.0), averageA(0.0), averageZ(0.0),
00044 inel_csec(0.0), withNuclei(false) {
00045 if (verboseLevel > 3) {
00046 G4cout << " >>> G4Analyser::G4Analyser" << G4endl;
00047 }
00048 }
00049
00050 void G4Analyser::setInelCsec(G4double csec, G4bool withn) {
00051
00052 if (verboseLevel > 3) {
00053 G4cout << " >>> G4Analyser::setInelCsec" << G4endl;
00054 }
00055
00056 inel_csec = csec;
00057 withNuclei = withn;
00058
00059 if (verboseLevel > 3) {
00060 G4cout << " total inelastic " << inel_csec << G4endl;
00061 }
00062 }
00063
00064 void G4Analyser::setWatchers(const std::vector<G4NuclWatcher>& watchers) {
00065
00066 if (verboseLevel > 3) {
00067 G4cout << " >>> G4Analyser::setWatchers" << G4endl;
00068 }
00069
00070 ana_watchers = watchers;
00071 if (verboseLevel > 3) {
00072 G4cout << " watchers set " << watchers.size() << G4endl;
00073 }
00074 }
00075
00076 void G4Analyser::try_watchers(G4int a, G4int z, G4bool if_nucl) {
00077
00078 if (verboseLevel > 3) {
00079 G4cout << " >>> G4Analyser::try_watchers" << G4endl;
00080 }
00081
00082 for (G4int iw = 0; iw < G4int(ana_watchers.size()); iw++) {
00083
00084 if (if_nucl) {
00085
00086 if (ana_watchers[iw].look_forNuclei()) ana_watchers[iw].watch(a, z);
00087
00088 } else {
00089
00090 if (!ana_watchers[iw].look_forNuclei()) ana_watchers[iw].watch(a, z);
00091 }
00092 }
00093 }
00094
00095
00096 void G4Analyser::analyse(const G4CollisionOutput& output) {
00097
00098 if (verboseLevel > 3) {
00099 G4cout << " >>> G4Analyser::analyse" << G4endl;
00100 }
00101
00102 if (withNuclei) {
00103 const std::vector<G4InuclNuclei>& nucleus = output.getOutgoingNuclei();
00104
00105
00106 if (nucleus.size() > 0) {
00107 G4int nbig = 0;
00108 averageOutgoingNuclei += nucleus.size();
00109
00110 for (G4int in = 0; in < G4int(nucleus.size()); in++) {
00111 averageExitationEnergy += nucleus[in].getExitationEnergy();
00112
00113 G4int a = nucleus[in].getA();
00114 G4int z = nucleus[in].getZ();
00115
00116 if (in == 0) {
00117 averageA += a;
00118 averageZ += z;
00119 };
00120
00121 if (a > 10) nbig++;
00122 try_watchers(a, z, true);
00123 };
00124
00125 if (nbig > 1) fissy_prob += 1.0;
00126 eventNumber += 1.0;
00127 const std::vector<G4InuclElementaryParticle>& particles =
00128 output.getOutgoingParticles();
00129 averageMultiplicity += particles.size();
00130
00131 for (G4int i = 0; i < G4int(particles.size()); i++) {
00132 G4int ap = 0;
00133 G4int zp = 0;
00134
00135 if (particles[i].nucleon()) {
00136 averageNucleonKinEnergy += particles[i].getKineticEnergy();
00137
00138 if (particles[i].type() == 1) {
00139 zp = 1;
00140 ap = 1;
00141 averageProtonNumber += 1.0;
00142 averageProtonKinEnergy += particles[i].getKineticEnergy();
00143
00144 } else {
00145 ap = 1;
00146 zp = 0;
00147 averageNeutronNumber += 1.0;
00148 averageNeutronKinEnergy += particles[i].getKineticEnergy();
00149 };
00150
00151 } else if (particles[i].pion()) {
00152 averagePionKinEnergy += particles[i].getKineticEnergy();
00153 averagePionNumber += 1.0;
00154 ap = 0;
00155
00156 if (particles[i].type() == 3) {
00157 zp = 1;
00158 averagePionPl += 1.0;
00159
00160 } else if (particles[i].type() == 5) {
00161 zp = -1;
00162 averagePionMin += 1.0;
00163
00164 } else if (particles[i].type() == 7) {
00165 zp = 0;
00166 averagePion0 += 1.0;
00167 };
00168 };
00169 try_watchers(ap, zp, false);
00170 };
00171 };
00172
00173 } else {
00174 eventNumber += 1.0;
00175 const std::vector<G4InuclElementaryParticle>& particles =
00176 output.getOutgoingParticles();
00177 averageMultiplicity += particles.size();
00178
00179 for (G4int i = 0; i < G4int(particles.size()); i++) {
00180
00181 if (particles[i].nucleon()) {
00182 averageNucleonKinEnergy += particles[i].getKineticEnergy();
00183
00184 if (particles[i].type() == 1) {
00185 averageProtonNumber += 1.0;
00186 averageProtonKinEnergy += particles[i].getKineticEnergy();
00187
00188 } else {
00189 averageNeutronNumber += 1.0;
00190 averageNeutronKinEnergy += particles[i].getKineticEnergy();
00191 }
00192
00193 } else if (particles[i].pion()) {
00194 averagePionKinEnergy += particles[i].getKineticEnergy();
00195 averagePionNumber += 1.0;
00196 }
00197 }
00198 }
00199 }
00200
00201 void G4Analyser::printResultsSimple() {
00202
00203 if (verboseLevel > 3) {
00204 G4cout << " >>> G4Analyser::printResultsSimple" << G4endl;
00205 }
00206
00207 G4cout << " Number of events " << G4int(eventNumber + 0.1) << G4endl
00208 << " average multiplicity " << averageMultiplicity / eventNumber << G4endl
00209 << " average proton number " << averageProtonNumber / eventNumber << G4endl
00210 << " average neutron number " << averageNeutronNumber / eventNumber << G4endl
00211 << " average nucleon Ekin " << averageNucleonKinEnergy /
00212 (averageProtonNumber + averageNeutronNumber) << G4endl
00213 << " average proton Ekin " << averageProtonKinEnergy / (averageProtonNumber +
00214 1.0e-10) << G4endl
00215 << " average neutron Ekin " << averageNeutronKinEnergy / (averageNeutronNumber +
00216 1.0e-10) << G4endl
00217 << " average pion number " << averagePionNumber / eventNumber << G4endl
00218 << " average pion Ekin " << averagePionKinEnergy / (averagePionNumber +
00219 1.0e-10) << G4endl;
00220 if (withNuclei) {
00221 G4cout
00222 << " average Exitation Energy " <<
00223 averageExitationEnergy / averageOutgoingNuclei << G4endl
00224 << " average num of fragments " << averageOutgoingNuclei / eventNumber << G4endl;
00225 G4cout << " fission prob. " << fissy_prob / eventNumber << " c.sec " <<
00226 inel_csec * fissy_prob / eventNumber << G4endl;
00227 }
00228 }
00229
00230 void G4Analyser::printResults() {
00231
00232 if (verboseLevel > 3) {
00233 G4cout << " >>> G4Analyser::printResults" << G4endl;
00234 }
00235
00236 G4cout << " Number of events " << G4int(eventNumber + 0.1) << G4endl
00237 << " average multiplicity " << averageMultiplicity / eventNumber << G4endl
00238 << " average proton number " << averageProtonNumber / eventNumber << G4endl
00239 << " average neutron number " << averageNeutronNumber / eventNumber << G4endl
00240 << " average nucleon Ekin " << averageNucleonKinEnergy /
00241 (averageProtonNumber + averageNeutronNumber) << G4endl
00242 << " average proton Ekin " << averageProtonKinEnergy / (averageProtonNumber +
00243 1.0e-10) << G4endl
00244 << " average neutron Ekin " << averageNeutronKinEnergy / (averageNeutronNumber +
00245 1.0e-10) << G4endl
00246 << " average pion number " << averagePionNumber / eventNumber << G4endl
00247 << " average pion Ekin " << averagePionKinEnergy / (averagePionNumber +
00248 1.0e-10) << G4endl
00249 << " average pi+ " << averagePionPl / eventNumber << G4endl
00250 << " average pi- " << averagePionMin / eventNumber << G4endl
00251 << " average pi0 " << averagePion0 / eventNumber << G4endl;
00252
00253 if (withNuclei) {
00254 G4cout
00255 << " average A " << averageA / eventNumber << G4endl
00256 << " average Z " << averageZ / eventNumber << G4endl
00257 << " average Exitation Energy " <<
00258 averageExitationEnergy / averageOutgoingNuclei << G4endl
00259 << " average num of fragments " << averageOutgoingNuclei / eventNumber << G4endl;
00260 G4cout << " fission prob. " << fissy_prob / eventNumber << " c.sec " <<
00261 inel_csec * fissy_prob / eventNumber << G4endl;
00262 handleWatcherStatistics();
00263 }
00264 }
00265
00266 void G4Analyser::handleWatcherStatistics() {
00267
00268 if (verboseLevel > 3) {
00269 G4cout << " >>> G4Analyser::handleWatcherStatistics" << G4endl;
00270 }
00271
00272
00273
00274 if (verboseLevel > 3) {
00275 G4cout << " >>>Izotop analysis:" << G4endl;
00276 };
00277
00278 G4double fgr = 0.0;
00279 G4double averat = 0.0;
00280 G4double ave_err = 0.0;
00281 G4double gl_chsq = 0.0;
00282 G4double tot_exper = 0.0;
00283 G4double tot_exper_err = 0.0;
00284 G4double tot_inucl = 0.0;
00285 G4double tot_inucl_err = 0.0;
00286 G4double checked = 0.0;
00287
00288 for (G4int iw = 0; iw < G4int(ana_watchers.size()); iw++) {
00289 ana_watchers[iw].setInuclCs(inel_csec, G4int(eventNumber));
00290 ana_watchers[iw].print();
00291
00292 if (ana_watchers[iw].to_check()) {
00293 std::pair<G4double, G4double> rat_err = ana_watchers[iw].getAverageRatio();
00294 averat += rat_err.first;
00295 ave_err += rat_err.second;
00296 gl_chsq += ana_watchers[iw].getChsq();
00297 std::pair<G4double, G4double> cs_err = ana_watchers[iw].getExpCs();
00298 tot_exper += cs_err.first;
00299 tot_exper_err += cs_err.second;
00300 std::pair<G4double, G4double> inucl_cs_err = ana_watchers[iw].getInuclCs();
00301 tot_inucl += inucl_cs_err.first;
00302 tot_inucl_err += inucl_cs_err.second;
00303 G4double iz_checked = ana_watchers[iw].getNmatched();
00304
00305 if (iz_checked > 0.0) {
00306 fgr += ana_watchers[iw].getLhood();
00307 checked += iz_checked;
00308 };
00309 };
00310 };
00311
00312 if (checked > 0.0) {
00313 gl_chsq = std::sqrt(gl_chsq) / checked;
00314 averat /= checked;
00315 ave_err /= checked;
00316 fgr = std::pow(10.0, std::sqrt(fgr / checked));
00317 };
00318
00319 if (verboseLevel > 3) {
00320 G4cout << " total exper c.s. " << tot_exper << " err " << tot_exper_err <<
00321 " tot inucl c.s. " << tot_inucl << " err " << tot_inucl_err << G4endl;
00322 G4cout << " checked total " << checked << " lhood " << fgr << G4endl
00323 << " average ratio " << averat << " err " << ave_err << G4endl
00324 << " global chsq " << gl_chsq << G4endl;
00325 }
00326 }
00327
00328 void G4Analyser::printResultsNtuple() {
00329
00330 if (verboseLevel > 3) {
00331 G4cout << " >>> G4Analyser::printResultsNtuple" << G4endl;
00332 }
00333
00334
00335
00336 G4cout <<
00337 std::setw(15) << int(eventNumber + 0.1) <<
00338 std::setw(15) << averageMultiplicity / eventNumber <<
00339 std::setw(15) << averageProtonNumber / eventNumber <<
00340 std::setw(15) << averageNeutronNumber / eventNumber << " " <<
00341 std::setw(15) << averageNucleonKinEnergy / (averageProtonNumber + averageNeutronNumber) << " " <<
00342 std::setw(15) << averageProtonKinEnergy / (averageProtonNumber + 1.0e-10) << " " <<
00343 std::setw(15) << averageNeutronKinEnergy / (averageNeutronNumber + 1.0e-10) << " " <<
00344 std::setw(15) << averagePionNumber / eventNumber << " " <<
00345 std::setw(15) << averagePionKinEnergy / (averagePionNumber + 1.0e-10) << G4endl;
00346 }