Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/electromagnetic/TestEm9/src/HistoManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /examples/extended/electromagnetic/TestEm9/src/HistoManager.cc (Version 11.3.0) and /examples/extended/electromagnetic/TestEm9/src/HistoManager.cc (Version 8.0.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 /// \file electromagnetic/TestEm9/src/HistoMan << 
 27 /// \brief Implementation of the HistoManager  << 
 28 //                                             << 
 29 //                                             << 
 30 //--------------------------------------------     23 //---------------------------------------------------------------------------
 31 //                                                 24 //
 32 // ClassName:   HistoManager                       25 // ClassName:   HistoManager
 33 //                                                 26 //
 34 //                                                 27 //
 35 // Author:      V.Ivanchenko 30/01/01              28 // Author:      V.Ivanchenko 30/01/01
 36 //                                                 29 //
 37 //--------------------------------------------     30 //----------------------------------------------------------------------------
 38 //                                                 31 //
 39                                                    32 
 40 //....oooOO0OOooo........oooOO0OOooo........oo     33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 41 //....oooOO0OOooo........oooOO0OOooo........oo     34 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 42                                                    35 
 43 #include "HistoManager.hh"                         36 #include "HistoManager.hh"
 44                                                << 
 45 #include "EmAcceptance.hh"                     << 
 46 #include "Histo.hh"                            << 
 47                                                << 
 48 #include "G4Electron.hh"                       << 
 49 #include "G4EmProcessSubType.hh"               << 
 50 #include "G4Gamma.hh"                          << 
 51 #include "G4GammaGeneralProcess.hh"            << 
 52 #include "G4MaterialCutsCouple.hh"             << 
 53 #include "G4Positron.hh"                       << 
 54 #include "G4SystemOfUnits.hh"                  << 
 55 #include "G4UnitsTable.hh"                         37 #include "G4UnitsTable.hh"
 56 #include "G4VEmProcess.hh"                     <<  38 #include "Histo.hh"
 57 #include "G4VEnergyLossProcess.hh"             <<  39 #include "EmAcceptance.hh"
 58 #include "G4VProcess.hh"                       << 
 59                                                    40 
 60 //....oooOO0OOooo........oooOO0OOooo........oo     41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 61                                                    42 
 62 HistoManager* HistoManager::fManager = nullptr <<  43 HistoManager* HistoManager::fManager = 0;
 63                                                    44 
 64 //....oooOO0OOooo........oooOO0OOooo........oo     45 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 65                                                    46 
 66 HistoManager* HistoManager::GetPointer()           47 HistoManager* HistoManager::GetPointer()
 67 {                                                  48 {
 68   if (nullptr == fManager) {                   <<  49   if(!fManager) {
 69     fManager = new HistoManager();                 50     fManager = new HistoManager();
 70   }                                                51   }
 71   return fManager;                                 52   return fManager;
 72 }                                                  53 }
 73                                                    54 
 74 //....oooOO0OOooo........oooOO0OOooo........oo     55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 75                                                    56 
 76 HistoManager::HistoManager()                       57 HistoManager::HistoManager()
 77   : fGamma(G4Gamma::Gamma()),                  <<  58 {
 78     fElectron(G4Electron::Electron()),         <<  59   verbose = 1;
 79     fPositron(G4Positron::Positron()),         <<  60   nEvt1   = -1;
 80     fHisto(new Histo())                        <<  61   nEvt2   = -1;
 81 {                                              <<  62   nmax    = 3;
 82   fVerbose = 1;                                <<  63   histo   = new Histo();
 83   fEvt1 = -1;                                  <<  64   bookHisto();
 84   fEvt2 = -1;                                  << 
 85   fNmax = 3;                                   << 
 86   fMaxEnergy = 50.0 * MeV;                     << 
 87   fBeamEnergy = 1. * GeV;                      << 
 88   fMaxEnergyAbs = 10. * MeV;                   << 
 89   fBinsE = 100;                                << 
 90   fBinsEA = 40;                                << 
 91   fBinsED = 100;                               << 
 92   fNHisto = 13;                                << 
 93                                                << 
 94   BookHisto();                                 << 
 95 }                                                  65 }
 96                                                    66 
 97 //....oooOO0OOooo........oooOO0OOooo........oo     67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 98                                                    68 
 99 HistoManager::~HistoManager()                      69 HistoManager::~HistoManager()
100 {                                                  70 {
101   delete fHisto;                               <<  71   delete histo;
102 }                                                  72 }
103                                                    73 
104 //....oooOO0OOooo........oooOO0OOooo........oo     74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
105                                                    75 
106 void HistoManager::BookHisto()                 <<  76 void HistoManager::bookHisto()
107 {                                                  77 {
108   fHisto->Add1D("10", "Evis/E0 in central crys <<  78   maxEnergy = 50.0*MeV;
109   fHisto->Add1D("11", "Evis/E0 in 3x3", fBinsE <<  79   beamEnergy= 1.*GeV;
110   fHisto->Add1D("12", "Evis/E0 in 5x5", fBinsE <<  80   maxEnergyAbs = 10.*MeV;
111   fHisto->Add1D("13", "Energy (MeV) of delta-e <<  81   thKinE    = 1.*MeV;
112   fHisto->Add1D("14", "Energy (MeV) of gammas" <<  82   nBinsE = 100;
113   fHisto->Add1D("15", "Energy (MeV) in abs1",  <<  83   nBinsEA= 40;
114   fHisto->Add1D("16", "Energy (MeV) in abs2",  <<  84   nBinsED= 100;
115   fHisto->Add1D("17", "Energy (MeV) in abs3",  <<  85   nTuple = false;
116   fHisto->Add1D("18", "Energy (MeV) in abs4",  <<  86   nHisto = 10;
117   fHisto->Add1D("19", "Number of vertex hits", <<  87 
118   fHisto->Add1D("20", "E1/E9 Ratio", fBinsED,  <<  88   for(G4int i=0; i<nmax; i++) {
119   fHisto->Add1D("21", "E1/E25 Ratio", fBinsED, <<  89     edep.push_back(0.0);
120   fHisto->Add1D("22", "E9/E25 Ratio", fBinsED, <<  90     erms.push_back(0.0);
                                                   >>  91     edeptrue.push_back(1.0);
                                                   >>  92     rmstrue.push_back(1.0);
                                                   >>  93     limittrue.push_back(DBL_MAX);
                                                   >>  94   }
                                                   >>  95 
                                                   >>  96   histo->add1D("10",
                                                   >>  97     "Energy deposit (MeV) in central crystal",nBinsED,0.0,beamEnergy,MeV);
                                                   >>  98 
                                                   >>  99   histo->add1D("11",
                                                   >> 100     "Energy deposit (MeV) in 3x3",nBinsED,0.0,beamEnergy,MeV);
                                                   >> 101 
                                                   >> 102   histo->add1D("12",
                                                   >> 103     "Energy deposit (MeV) in 5x5",nBinsED,0.0,beamEnergy,MeV);
                                                   >> 104 
                                                   >> 105   histo->add1D("13",
                                                   >> 106     "Energy (MeV) of delta-electrons",nBinsE,0.0,maxEnergy,MeV);
                                                   >> 107 
                                                   >> 108   histo->add1D("14",
                                                   >> 109     "Energy (MeV) of gammas",nBinsE,0.0,maxEnergy,MeV);
                                                   >> 110 
                                                   >> 111   histo->add1D("15",
                                                   >> 112     "Energy (MeV) in abs1",nBinsEA,0.0,maxEnergyAbs,MeV);
                                                   >> 113 
                                                   >> 114   histo->add1D("16",
                                                   >> 115     "Energy (MeV) in abs2",nBinsEA,0.0,maxEnergyAbs,MeV);
                                                   >> 116 
                                                   >> 117   histo->add1D("17",
                                                   >> 118     "Energy (MeV) in abs3",nBinsEA,0.0,maxEnergyAbs,MeV);
                                                   >> 119 
                                                   >> 120   histo->add1D("18",
                                                   >> 121     "Energy (MeV) in abs4",nBinsEA,0.0,maxEnergyAbs,MeV);
                                                   >> 122 
                                                   >> 123   histo->add1D("19",
                                                   >> 124     "Number of vertex hits",20,-0.5,19.5,1.0);
                                                   >> 125 
                                                   >> 126   if(nTuple) {
                                                   >> 127     histo->addTuple( "100", "Dose deposite","float r, z, e" );
                                                   >> 128   }
121 }                                                 129 }
122                                                   130 
123 //....oooOO0OOooo........oooOO0OOooo........oo    131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
124                                                   132 
125 void HistoManager::BeginOfRun()                   133 void HistoManager::BeginOfRun()
126 {                                                 134 {
127   // initilise scoring                         << 135   n_evt  = 0;
128   fEvt = 0;                                    << 136   n_elec = 0;
129   fElec = 0;                                   << 137   n_posit= 0;
130   fPosit = 0;                                  << 138   n_gam  = 0;
131   fGam = 0;                                    << 139   n_step = 0;
132   fStep = 0;                                   << 140   histo->book();
133   fLowe = 0;                                   << 
134                                                << 
135   for (G4int i = 0; i < 6; i++) {              << 
136     fStat[i] = 0;                              << 
137     fEdep[i] = 0.0;                            << 
138     fErms[i] = 0.0;                            << 
139     if (i < 3) {                               << 
140       fEdeptr[i] = 0.0;                        << 
141       fErmstr[i] = 0.0;                        << 
142     }                                          << 
143   }                                            << 
144                                                << 
145   // initialise counters                       << 
146   fBrem.resize(93, 0.0);                       << 
147   fPhot.resize(93, 0.0);                       << 
148   fComp.resize(93, 0.0);                       << 
149   fConv.resize(93, 0.0);                       << 
150                                                << 
151   // initialise acceptance - by default is not << 
152   for (G4int i = 0; i < fNmax; i++) {          << 
153     fEdeptrue[i] = 1.0;                        << 
154     fRmstrue[i] = 1.0;                         << 
155     fLimittrue[i] = 10.;                       << 
156   }                                            << 
157                                                << 
158   if (fHisto->IsActive()) {                    << 
159     for (G4int i = 0; i < fNHisto; ++i) {      << 
160       fHisto->Activate(i, true);               << 
161     }                                          << 
162     fHisto->Book();                            << 
163                                                   141 
164     if (fVerbose > 0) {                        << 142   if(verbose > 0) {
165       G4cout << "HistoManager: Histograms are  << 143     G4cout << "HistoManager: Histograms are booked and run has been started"
166     }                                          << 144            << G4endl;
167   }                                               145   }
168 }                                                 146 }
169                                                   147 
170 //....oooOO0OOooo........oooOO0OOooo........oo    148 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
171                                                   149 
172 void HistoManager::EndOfRun(G4int runID)       << 150 void HistoManager::EndOfRun()
173 {                                                 151 {
174   G4cout << "HistoManager: End of run actions  << 152 
175   G4String nam[6] = {"1x1", "3x3", "5x5", "E1/ << 153   G4cout << "HistoManager: End of run actions are started" << G4endl;
                                                   >> 154   G4String nam[3] = {"1x1", "3x3", "5x5"};
176                                                   155 
177   // average                                      156   // average
178                                                   157 
179   G4cout << "================================= << 158   G4cout<<"========================================================"<<G4endl;
180   G4double x = (G4double)fEvt;                 << 159   G4double x = (G4double)n_evt;
181   if (fEvt > 0) x = 1.0 / x;                   << 160   if(n_evt > 0) x = 1.0/x;
182   G4int j;                                        161   G4int j;
183   for (j = 0; j < fNmax; j++) {                << 162   for(j=0; j<nmax; j++) {
184     // total mean                              << 163     edep[j] *= x/beamEnergy;
185     fEdep[j] *= x;                             << 164     G4double y = erms[j]*x/(beamEnergy*beamEnergy) - edep[j]*edep[j];
186     G4double y = fErms[j] * x - fEdep[j] * fEd << 165     if(y < 0.0) y = 0.0;
187     if (y < 0.0) y = 0.0;                      << 166     erms[j] = std::sqrt(y);
188     fErms[j] = std::sqrt(y);                   << 167   }
189                                                << 168   G4double xe = x*(G4double)n_elec;
190     // trancated mean                          << 169   G4double xg = x*(G4double)n_gam;
191     G4double xx = G4double(fStat[j]);          << 170   G4double xp = x*(G4double)n_posit;
192     if (xx > 0.0) xx = 1.0 / xx;               << 171   G4double xs = x*(G4double)n_step;
193     fEdeptr[j] *= xx;                          << 
194     y = fErmstr[j] * xx - fEdeptr[j] * fEdeptr << 
195     if (y < 0.0) y = 0.0;                      << 
196     fErmstr[j] = std::sqrt(y);                 << 
197   }                                            << 
198   G4double xe = x * (G4double)fElec;           << 
199   G4double xg = x * (G4double)fGam;            << 
200   G4double xp = x * (G4double)fPosit;          << 
201   G4double xs = x * fStep;                     << 
202                                                   172 
203   G4double f = 100. * std::sqrt(fBeamEnergy /  << 173   G4double f = 100.*std::sqrt(beamEnergy/GeV);
204                                                   174 
205   G4cout << "Number of events             " << << 175   G4cout                         << "Number of events             " << n_evt <<G4endl;
206   G4cout << std::setprecision(4) << "Average n    176   G4cout << std::setprecision(4) << "Average number of e-         " << xe << G4endl;
207   G4cout << std::setprecision(4) << "Average n    177   G4cout << std::setprecision(4) << "Average number of gamma      " << xg << G4endl;
208   G4cout << std::setprecision(4) << "Average n    178   G4cout << std::setprecision(4) << "Average number of e+         " << xp << G4endl;
209   G4cout << std::setprecision(4) << "Average n    179   G4cout << std::setprecision(4) << "Average number of steps      " << xs << G4endl;
210                                                << 180   for(j=0; j<3; j++) {
211   for (j = 0; j < 3; ++j) {                    << 181     G4cout << std::setprecision(4) << "Edep " << nam[j] << " =                   " << edep[j]
212     G4double ex = fEdeptr[j];                  << 182            << " +- " << erms[j]*std::sqrt(x);
213     G4double sx = fErmstr[j];                  << 183     if(edep[j] > 0.0)
214     G4double xx = G4double(fStat[j]);          << 184       G4cout << "  res=  " << f*erms[j]/edep[j] << " %";
215     if (xx > 0.0) xx = 1.0 / xx;               << 
216     G4double r = sx * std::sqrt(xx);           << 
217     G4cout << std::setprecision(4) << "Edep "  << 
218            << r;                               << 
219     if (ex > 0.1) G4cout << "  res=  " << f *  << 
220     G4cout << G4endl;                          << 
221   }                                            << 
222   if (fLimittrue[0] < 10. || fLimittrue[1] < 1 << 
223     G4cout << "===========  Mean values withou << 
224     for (j = 0; j < fNmax; j++) {              << 
225       G4double ex = fEdep[j];                  << 
226       G4double sx = fErms[j];                  << 
227       G4double rx = sx * std::sqrt(x);         << 
228       G4cout << std::setprecision(4) << "Edep  << 
229              << rx;                            << 
230       if (ex > 0.0) G4cout << "  res=  " << f  << 
231       G4cout << G4endl;                        << 
232     }                                          << 
233   }                                            << 
234   G4cout << "===========  Ratios without tranc << 
235   for (j = 3; j < 6; ++j) {                    << 
236     G4double e = fEdep[j];                     << 
237     G4double xx = G4double(fStat[j]);          << 
238     if (xx > 0.0) xx = 1.0 / xx;               << 
239     e *= xx;                                   << 
240     G4double y = fErms[j] * xx - e * e;        << 
241     G4double r = 0.0;                          << 
242     if (y > 0.0) r = std::sqrt(y * xx);        << 
243     G4cout << "  " << nam[j] << " =            << 
244     G4cout << G4endl;                             185     G4cout << G4endl;
245   }                                               186   }
246   G4cout << std::setprecision(4) << "Beam Ener << 187   G4cout<<"========================================================"<<G4endl;
247          << G4endl;                            << 188   G4cout<<G4endl;
248   if (fLowe > 0) G4cout << "Number of events E << 
249   G4cout << "================================= << 
250   G4cout << G4endl;                            << 
251                                                   189 
252   // normalise histograms                         190   // normalise histograms
253   if (fHisto->IsActive()) {                    << 191   for(G4int i=0; i<nHisto; i++) {
254     for (G4int i = 0; i < fNHisto; ++i) {      << 192     histo->scale(i,x);
255       fHisto->ScaleH1(i, x);                   << 
256     }                                          << 
257     fHisto->Save();                            << 
258   }                                            << 
259   if (0 < runID) {                             << 
260     return;                                    << 
261   }                                               193   }
262                                                   194 
263   // Acceptance only for the first run         << 195   histo->save();
                                                   >> 196 
                                                   >> 197   // Acceptance
264   EmAcceptance acc;                               198   EmAcceptance acc;
265   G4bool isStarted = false;                       199   G4bool isStarted = false;
266   for (j = 0; j < fNmax; j++) {                << 200   for (j=0; j<nmax; j++) {
267     G4double ltrue = fLimittrue[j];            << 201 
                                                   >> 202     G4double ltrue = limittrue[j];
268     if (ltrue < DBL_MAX) {                        203     if (ltrue < DBL_MAX) {
269       if (!isStarted) {                           204       if (!isStarted) {
270         acc.BeginOfAcceptance("Crystal Calorim << 205         acc.BeginOfAcceptance("Crystal Calorimeter",n_evt);
271         isStarted = true;                         206         isStarted = true;
272       }                                           207       }
273       G4double etrue = fEdeptrue[j];           << 208       G4double etrue = edeptrue[j];
274       G4double rtrue = fRmstrue[j];            << 209       G4double rtrue = rmstrue[j];
275       acc.EmAcceptanceGauss("Edep" + nam[j], f << 210       acc.EmAcceptanceGauss("Edep"+nam[j],n_evt,edep[j],etrue,rtrue,ltrue);
276       acc.EmAcceptanceGauss("Erms" + nam[j], f << 211       acc.EmAcceptanceGauss("Erms"+nam[j],n_evt,erms[j],rtrue,rtrue,2.0*ltrue);
277     }                                          << 
278   }                                            << 
279   if (isStarted) acc.EndOfAcceptance();        << 
280                                                << 
281   // atom frequency                            << 
282   G4cout << "   Z  bremsstrahlung photoeffect  << 
283   for (j = 1; j < 93; ++j) {                   << 
284     G4int n1 = G4int(fBrem[j] * x);            << 
285     G4int n2 = G4int(fPhot[j] * x);            << 
286     G4int n3 = G4int(fComp[j] * x);            << 
287     G4int n4 = G4int(fConv[j] * x);            << 
288     if (n1 + n2 + n3 + n4 > 0) {               << 
289       G4cout << std::setw(4) << j << std::setw << 
290              << n3 << std::setw(12) << n4 << G << 
291     }                                             212     }
292   }                                               213   }
                                                   >> 214   if(isStarted) acc.EndOfAcceptance();
293 }                                                 215 }
294                                                   216 
295 //....oooOO0OOooo........oooOO0OOooo........oo    217 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
296                                                   218 
297 void HistoManager::BeginOfEvent()                 219 void HistoManager::BeginOfEvent()
298 {                                                 220 {
299   ++fEvt;                                      << 221   n_evt++;
300                                                   222 
301   fEabs1 = 0.0;                                << 223   Eabs1  = 0.0;
302   fEabs2 = 0.0;                                << 224   Eabs2  = 0.0;
303   fEabs3 = 0.0;                                << 225   Eabs3  = 0.0;
304   fEabs4 = 0.0;                                << 226   Eabs4  = 0.0;
305   fEvertex.clear();                            << 227   Evertex.clear();
306   fNvertex.clear();                            << 228   Nvertex.clear();
307   for (G4int i = 0; i < 25; i++) {             << 229   for (int i=0; i<25; i++) {
308     fE[i] = 0.0;                               << 230     E[i] = 0.0;
309   }                                               231   }
310 }                                                 232 }
311                                                   233 
312 //....oooOO0OOooo........oooOO0OOooo........oo    234 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
313                                                   235 
314 void HistoManager::EndOfEvent()                   236 void HistoManager::EndOfEvent()
315 {                                                 237 {
316   G4double e9 = 0.0;                              238   G4double e9 = 0.0;
317   G4double e25 = 0.0;                          << 239   G4double e25= 0.0;
318   for (G4int i = 0; i < 25; i++) {             << 240   for (int i=0; i<25; i++) {
319     fE[i] /= fBeamEnergy;                      << 241     e25 += E[i];
320     e25 += fE[i];                              << 242     if( ( 6<=i &&  8>=i) || (11<=i && 13>=i) || (16<=i && 18>=i)) e9 += E[i];
321     if ((6 <= i && 8 >= i) || (11 <= i && 13 > << 243   }
322   }                                            << 244   histo->fill(0,E[12],1.0);
323                                                << 245   histo->fill(1,e9,1.0);
324   if (1 < fVerbose && e25 < 0.8) {             << 246   histo->fill(2,e25,1.0);
325     ++fLowe;                                   << 247   histo->fill(5,Eabs1,1.0);
326     G4cout << "### in the event# " << fEvt <<  << 248   histo->fill(6,Eabs2,1.0);
327   }                                            << 249   histo->fill(7,Eabs3,1.0);
328                                                << 250   histo->fill(8,Eabs4,1.0);
329   // compute ratios                            << 251   float nn = (double)(Nvertex.size());
330   G4double e0 = fE[12];                        << 252   histo->fill(9,nn,1.0);
331   G4double e19 = 0.0;                          << 253 
332   G4double e125 = 0.0;                         << 254   edep[0] += E[12];
333   G4double e925 = 0.0;                         << 255   erms[0] += E[12]*E[12];
334   if (e9 > 0.0) {                              << 256   edep[1] += e9;
335     e19 = e0 / e9;                             << 257   erms[1] += e9*e9;
336     e125 = e0 / e25;                           << 258   edep[2] += e25;
337     e925 = e9 / e25;                           << 259   erms[2] += e25*e25;
338     fEdep[3] += e19;                           << 260 
339     fErms[3] += e19 * e19;                     << 261   if(nTuple) histo->addRow();
340     fEdep[4] += e125;                          << 262 
341     fErms[4] += e125 * e125;                   << 
342     fEdep[5] += e925;                          << 
343     fErms[5] += e925 * e925;                   << 
344     fStat[3] += 1;                             << 
345     fStat[4] += 1;                             << 
346     fStat[5] += 1;                             << 
347   }                                            << 
348                                                << 
349   // Fill histo                                << 
350   fHisto->Fill(0, e0, 1.0);                    << 
351   fHisto->Fill(1, e9, 1.0);                    << 
352   fHisto->Fill(2, e25, 1.0);                   << 
353   fHisto->Fill(5, fEabs1, 1.0);                << 
354   fHisto->Fill(6, fEabs2, 1.0);                << 
355   fHisto->Fill(7, fEabs3, 1.0);                << 
356   fHisto->Fill(8, fEabs4, 1.0);                << 
357   fHisto->Fill(9, G4double(fNvertex.size()), 1 << 
358   fHisto->Fill(10, e19, 1.0);                  << 
359   fHisto->Fill(11, e125, 1.0);                 << 
360   fHisto->Fill(12, e925, 1.0);                 << 
361                                                << 
362   // compute sums                              << 
363   fEdep[0] += e0;                              << 
364   fErms[0] += e0 * e0;                         << 
365   fEdep[1] += e9;                              << 
366   fErms[1] += e9 * e9;                         << 
367   fEdep[2] += e25;                             << 
368   fErms[2] += e25 * e25;                       << 
369                                                << 
370   // trancated mean                            << 
371   if (std::abs(e0 - fEdeptrue[0]) < fRmstrue[0 << 
372     fStat[0] += 1;                             << 
373     fEdeptr[0] += e0;                          << 
374     fErmstr[0] += e0 * e0;                     << 
375   }                                            << 
376   if (std::abs(e9 - fEdeptrue[1]) < fRmstrue[1 << 
377     fStat[1] += 1;                             << 
378     fEdeptr[1] += e9;                          << 
379     fErmstr[1] += e9 * e9;                     << 
380   }                                            << 
381   if (std::abs(e25 - fEdeptrue[2]) < fRmstrue[ << 
382     fStat[2] += 1;                             << 
383     fEdeptr[2] += e25;                         << 
384     fErmstr[2] += e25 * e25;                   << 
385   }                                            << 
386 }                                                 263 }
387                                                   264 
388 //....oooOO0OOooo........oooOO0OOooo........oo    265 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
389                                                   266 
390 void HistoManager::ScoreNewTrack(const G4Track    267 void HistoManager::ScoreNewTrack(const G4Track* aTrack)
391 {                                                 268 {
392   // Save primary parameters                   << 269   //Save primary parameters
393   ResetTrackLength();                             270   ResetTrackLength();
394   const G4ParticleDefinition* particle = aTrac    271   const G4ParticleDefinition* particle = aTrack->GetDefinition();
395   const G4DynamicParticle* dynParticle = aTrac    272   const G4DynamicParticle* dynParticle = aTrack->GetDynamicParticle();
396                                                << 273   G4String name = particle->GetParticleName();
397   G4int pid = aTrack->GetParentID();              274   G4int pid = aTrack->GetParentID();
398   G4double kinE = dynParticle->GetKineticEnerg    275   G4double kinE = dynParticle->GetKineticEnergy();
399   G4ThreeVector pos = aTrack->GetVertexPositio    276   G4ThreeVector pos = aTrack->GetVertexPosition();
400                                                   277 
401   // primary                                   << 278   if(0 == pid) {
402   if (0 == pid) {                              << 279 
                                                   >> 280     histo->fillTuple("TKIN", kinE/MeV);
                                                   >> 281 
403     G4double mass = 0.0;                          282     G4double mass = 0.0;
404     if (particle) {                            << 283     if(particle) {
405       mass = particle->GetPDGMass();              284       mass = particle->GetPDGMass();
                                                   >> 285       histo->fillTuple("MASS", mass/MeV);
                                                   >> 286       histo->fillTuple("CHAR",(particle->GetPDGCharge())/eplus);
                                                   >> 287       G4double beta = 1.;
                                                   >> 288   if(mass > 0.) {
                                                   >> 289           G4double gamma = kinE/mass + 1.;
                                                   >> 290           beta = std::sqrt(1. - 1./(gamma*gamma));
                                                   >> 291   }
406     }                                             292     }
407                                                   293 
408     G4ThreeVector dir = dynParticle->GetMoment    294     G4ThreeVector dir = dynParticle->GetMomentumDirection();
409     if (1 < fVerbose) {                        << 295     if(1 < verbose) {
410       G4cout << "TrackingAction: Primary kinE( << 296       G4cout << "TrackingAction: Primary kinE(MeV)= " << kinE/MeV
411              << "; pos= " << pos << ";  dir= " << 297            << "; m(MeV)= " << mass/MeV
412     }                                          << 298            << "; pos= " << pos << ";  dir= " << dir << G4endl;
413                                                << 
414     // secondary                               << 
415   }                                            << 
416   else {                                       << 
417     const G4VProcess* proc = aTrack->GetCreato << 
418     G4int type = proc->GetProcessSubType();    << 
419                                                << 
420     if (type == fBremsstrahlung) {             << 
421       auto elm = static_cast<const G4VEnergyLo << 
422       if (nullptr != elm) {                    << 
423         G4int Z = elm->GetZasInt();            << 
424         if (Z > 0 && Z < 93) {                 << 
425           fBrem[Z] += 1.0;                     << 
426         }                                      << 
427       }                                        << 
428     }                                          << 
429     else if (type == fPhotoElectricEffect) {   << 
430       auto elm = static_cast<const G4VEmProces << 
431       if (nullptr != elm) {                    << 
432         G4int Z = elm->GetZasInt();            << 
433         if (Z > 0 && Z < 93) {                 << 
434           fPhot[Z] += 1.0;                     << 
435         }                                      << 
436       }                                        << 
437     }                                          << 
438     else if (type == fGammaConversion) {       << 
439       auto elm = static_cast<const G4VEmProces << 
440       if (nullptr != elm) {                    << 
441         G4int Z = elm->GetZasInt();            << 
442         if (Z > 0 && Z < 93) {                 << 
443           fConv[Z] += 1.0;                     << 
444         }                                      << 
445       }                                        << 
446     }                                          << 
447     else if (type == fComptonScattering) {     << 
448       auto elm = static_cast<const G4VEmProces << 
449       if (nullptr != elm) {                    << 
450         G4int Z = elm->GetZasInt();            << 
451         if (Z > 0 && Z < 93) {                 << 
452           fComp[Z] += 1.0;                     << 
453         }                                      << 
454       }                                        << 
455     }                                             299     }
456                                                   300 
457     // delta-electron                             301     // delta-electron
458     if (particle == fElectron) {               << 302   } else if (0 < pid && "e-" == name) {
459       if (1 < fVerbose) {                      << 303     if(1 < verbose) {
460         G4cout << "TrackingAction: Secondary e << 304       G4cout << "TrackingAction: Secondary electron " << G4endl;
461       }                                        << 
462       AddDeltaElectron(dynParticle);           << 
463     }                                             305     }
464     else if (particle == fPositron) {          << 306     AddDeltaElectron(dynParticle);
465       if (1 < fVerbose) {                      << 307 
466         G4cout << "TrackingAction: Secondary p << 308   } else if (0 < pid && "e+" == name) {
467       }                                        << 309     if(1 < verbose) {
468       AddPositron(dynParticle);                << 310       G4cout << "TrackingAction: Secondary positron " << G4endl;
469     }                                             311     }
470     else if (particle == fGamma) {             << 312     AddPositron(dynParticle);
471       if (1 < fVerbose) {                      << 313 
472         G4cout << "TrackingAction: Secondary g << 314   } else if (0 < pid && "gamma" == name) {
473       }                                        << 315     if(1 < verbose) {
474       AddPhoton(dynParticle);                  << 316       G4cout << "TrackingAction: Secondary gamma; parentID= " << pid
                                                   >> 317              << " E= " << kinE << G4endl;
475     }                                             318     }
                                                   >> 319     AddPhoton(dynParticle);
                                                   >> 320 
476   }                                               321   }
477 }                                                 322 }
478                                                   323 
479 //....oooOO0OOooo........oooOO0OOooo........oo    324 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
480                                                   325 
481 void HistoManager::AddEnergy(G4double edep, G4    326 void HistoManager::AddEnergy(G4double edep, G4int volIndex, G4int copyNo)
482 {                                                 327 {
483   if (1 < fVerbose) {                          << 328   if(1 < verbose) {
484     G4cout << "HistoManager::AddEnergy: e(keV) << 329     G4cout << "HistoManager::AddEnergy: e(keV)= " << edep/keV
485            << "; copyNo= " << copyNo << G4endl << 330            << "; volIdx= " << volIndex
486   }                                            << 331            << "; copyNo= " << copyNo
487   if (0 == volIndex) {                         << 332            << G4endl;
488     fE[copyNo] += edep;                        << 333   }
489   }                                            << 334   if(0 == volIndex) {
490   else if (1 == volIndex) {                    << 335     E[copyNo] += edep;
491     fEabs1 += edep;                            << 336   } else if (1 == volIndex) {
492   }                                            << 337     Eabs1 += edep;
493   else if (2 == volIndex) {                    << 338   } else if (2 == volIndex) {
494     fEabs2 += edep;                            << 339     Eabs2 += edep;
495   }                                            << 340   } else if (3 == volIndex) {
496   else if (3 == volIndex) {                    << 341     Eabs3 += edep;
497     fEabs3 += edep;                            << 342   } else if (4 == volIndex) {
498   }                                            << 343     Eabs4 += edep;
499   else if (4 == volIndex) {                    << 344   } else if (5 == volIndex) {
500     fEabs4 += edep;                            << 345     G4int n = Nvertex.size();
501   }                                            << 
502   else if (5 == volIndex) {                    << 
503     G4int n = fNvertex.size();                 << 
504     G4bool newPad = true;                         346     G4bool newPad = true;
505     if (n > 0) {                                  347     if (n > 0) {
506       for (G4int i = 0; i < n; i++) {          << 348       for(G4int i=0; i<n; i++) {
507         if (copyNo == fNvertex[i]) {           << 349         if (copyNo == Nvertex[i]) {
508           newPad = false;                         350           newPad = false;
509           fEvertex[i] += edep;                 << 351           Evertex[i] += edep;
510           break;                                  352           break;
511         }                                         353         }
512       }                                           354       }
513     }                                             355     }
514     if (newPad) {                              << 356     if(newPad) {
515       fNvertex.push_back(copyNo);              << 357       Nvertex.push_back(copyNo);
516       fEvertex.push_back(edep);                << 358       Evertex.push_back(edep);
517     }                                             359     }
518   }                                               360   }
519 }                                                 361 }
520                                                   362 
521 //....oooOO0OOooo........oooOO0OOooo........oo    363 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
522                                                   364 
523 void HistoManager::AddDeltaElectron(const G4Dy    365 void HistoManager::AddDeltaElectron(const G4DynamicParticle* elec)
524 {                                                 366 {
525   G4double e = elec->GetKineticEnergy() / MeV; << 367   G4double e = elec->GetKineticEnergy()/MeV;
526   if (e > 0.0) {                               << 368   if(e > 0.0) n_elec++;
527     ++fElec;                                   << 369   histo->fill(3,e,1.0);
528     fHisto->Fill(3, e, 1.0);                   << 
529   }                                            << 
530 }                                                 370 }
531                                                   371 
532 //....oooOO0OOooo........oooOO0OOooo........oo    372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
533                                                   373 
534 void HistoManager::AddPhoton(const G4DynamicPa    374 void HistoManager::AddPhoton(const G4DynamicParticle* ph)
535 {                                                 375 {
536   G4double e = ph->GetKineticEnergy() / MeV;   << 376   G4double e = ph->GetKineticEnergy()/MeV;
537   if (e > 0.0) {                               << 377   if(e > 0.0) n_gam++;
538     ++fGam;                                    << 378   histo->fill(4,e,1.0);
539     fHisto->Fill(4, e, 1.0);                   << 
540   }                                            << 
541 }                                                 379 }
542                                                   380 
543 //....oooOO0OOooo........oooOO0OOooo........oo    381 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
544                                                   382 
545 void HistoManager::SetEdepAndRMS(G4int i, cons << 383 void HistoManager::SetEdepAndRMS(G4int i, G4ThreeVector val)
546 {                                                 384 {
547   if (i < fNmax && i >= 0) {                   << 385   if(i<nmax && i>=0) {
548     if (val[0] > 0.0) fEdeptrue[i] = val[0];   << 386     if(val[0] > 0.0) edeptrue[i] = val[0];
549     if (val[1] > 0.0) fRmstrue[i] = val[1];    << 387     if(val[1] > 0.0) rmstrue[i] = val[1];
550     if (val[2] > 0.0) fLimittrue[i] = val[2];  << 388     if(val[2] > 0.0) limittrue[i] = val[2];
551   }                                               389   }
552 }                                                 390 }
553                                                   391 
554 //....oooOO0OOooo........oooOO0OOooo........oo    392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 393 
555                                                   394