G4Analyser.cc

Go to the documentation of this file.
00001 //
00002 // ********************************************************************
00003 // * License and Disclaimer                                           *
00004 // *                                                                  *
00005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
00006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
00007 // * conditions of the Geant4 Software License,  included in the file *
00008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
00009 // * include a list of copyright holders.                             *
00010 // *                                                                  *
00011 // * Neither the authors of this software system, nor their employing *
00012 // * institutes,nor the agencies providing financial support for this *
00013 // * work  make  any representation or  warranty, express or implied, *
00014 // * regarding  this  software system or assume any liability for its *
00015 // * use.  Please see the license in the file  LICENSE  and URL above *
00016 // * for the full disclaimer and the limitation of liability.         *
00017 // *                                                                  *
00018 // * This  code  implementation is the result of  the  scientific and *
00019 // * technical work of the GEANT4 collaboration.                      *
00020 // * By using,  copying,  modifying or  distributing the software (or *
00021 // * any work based  on the software)  you  agree  to acknowledge its *
00022 // * use  in  resulting  scientific  publications,  and indicate your *
00023 // * acceptance of all terms of the Geant4 Software license.          *
00024 // ********************************************************************
00025 //
00026 // $Id$
00027 //
00028 // 20100726  M. Kelsey -- Use references for fetched lists
00029 // 20101010  M. Kelsey -- Migrate to integer A and Z
00030 // 20101019  M. Kelsey -- CoVerity report, unitialized constructor
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; // mb
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     //    if (nucleus.size() >= 0) {
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   // const G4double small = 1.0e-10;
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   // Create one line of ACII data. 
00335   // Several runs should create ntuple for data-analysis 
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 }

Generated on Mon May 27 17:47:38 2013 for Geant4 by  doxygen 1.4.7