Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcRunAction.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 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 /*
 27  * ============================================================================
 28  *
 29  *       Filename:  CexmcRunAction.cc
 30  *
 31  *    Description:  run action
 32  *
 33  *        Version:  1.0
 34  *        Created:  20.12.2009 00:18:05
 35  *       Revision:  none
 36  *       Compiler:  gcc
 37  *
 38  *         Author:  Alexey Radkov (), 
 39  *        Company:  PNPI
 40  *
 41  * ============================================================================
 42  */
 43 
 44 #include <limits>
 45 #include <vector>
 46 #include <string>
 47 #include <iostream>
 48 #include <iomanip>
 49 #include "CexmcRunAction.hh"
 50 #include "CexmcPhysicsManager.hh"
 51 #include "CexmcProductionModel.hh"
 52 #include "CexmcAngularRange.hh"
 53 #include "CexmcException.hh"
 54 
 55 
 56 CexmcRunAction::CexmcRunAction( CexmcPhysicsManager *  physicsManager_ ) :
 57     physicsManager( physicsManager_ )
 58 {
 59 }
 60 
 61 
 62 G4Run *  CexmcRunAction::GenerateRun( void )
 63 {
 64     return new CexmcRun;
 65 }
 66 
 67 
 68 void  CexmcRunAction::PrintResults(
 69                     const CexmcNmbOfHitsInRanges &  nmbOfHitsSampled,
 70                     const CexmcNmbOfHitsInRanges &  nmbOfHitsSampledFull,
 71                     const CexmcNmbOfHitsInRanges &  nmbOfHitsTriggeredRealRange,
 72                     const CexmcNmbOfHitsInRanges &  nmbOfHitsTriggeredRecRange,
 73                     const CexmcNmbOfHitsInRanges &  nmbOfOrphanHits,
 74                     const CexmcAngularRangeList &  angularRanges,
 75                     G4int  nmbOfFalseHitsTriggeredEDT,
 76                     G4int  nmbOfFalseHitsTriggeredRec )
 77 {
 78     /* there are 7 auxiliary columns:
 79      * 1. acc real, [floating point number]
 80      * 2. triggered real,
 81      * 3. total hits sampled and monitored,
 82      * 4. acc reconstructed, [floating point number]
 83      * 5. triggered reconstructed,
 84      * 6. total hits sampled and monitored (identical with #3),
 85      * 7. total hits sampled.
 86      * As far as #3 and #6 are identical, nmbOfAuxColumns = 6 */
 87     const size_t                               nmbOfAuxColumns( 6 );
 88     const std::streamsize                      prec( 8 );
 89     std::vector< std::vector< std::string > >  auxStrings;
 90     size_t                                     maxSize[ nmbOfAuxColumns ];
 91 
 92     for ( size_t  i( 0 ); i < nmbOfAuxColumns; ++i )
 93         maxSize[ i ] = 0;
 94 
 95     /* addition of 2 (for '0.') for acceptances, that are floating point
 96      * numbers, is correct as far as ios::fixed will be used, and no negative
 97      * values are expected, and values will be less than 1. */
 98     maxSize[ 0 ] = prec + 2;
 99     maxSize[ 3 ] = prec + 2;
100 
101     for ( CexmcAngularRangeList::const_iterator  k( angularRanges.begin() );
102                                                 k != angularRanges.end(); ++k )
103     {
104         G4int     total( 0 );
105         G4int     totalFull( 0 );
106         G4int     triggered( 0 );
107         G4double  acc( std::numeric_limits< G4double >::quiet_NaN() );
108 
109         CexmcNmbOfHitsInRanges::const_iterator  found(
110                                         nmbOfHitsSampled.find( k->index ) );
111         if ( found != nmbOfHitsSampled.end() )
112         {
113             total = found->second;
114             acc = 0;
115         }
116 
117         found = nmbOfHitsSampledFull.find( k->index );
118         if ( found != nmbOfHitsSampledFull.end() )
119         {
120             totalFull = found->second;
121         }
122 
123         G4double  accSave( acc );
124         found = nmbOfHitsTriggeredRealRange.find( k->index );
125         if ( found != nmbOfHitsTriggeredRealRange.end() )
126         {
127             triggered = found->second;
128             if ( total > 0 )
129                 acc = G4double( triggered ) / total;
130         }
131 
132         std::ostringstream  auxStringStream[ nmbOfAuxColumns ];
133 
134         for ( size_t  i( 0 ); i < nmbOfAuxColumns; ++i )
135         {
136             auxStringStream[ i ].precision( prec );
137             auxStringStream[ i ].flags( std::ios::fixed );
138         }
139 
140         G4int  i( 0 );
141 
142         auxStringStream[ i ] << acc;
143         auxStringStream[ ++i ] << triggered;
144         size_t  size( auxStringStream[ i ].str().size() );
145         maxSize[ i ] = maxSize[ i ] > size ? maxSize[ i ] : size;
146         auxStringStream[ ++i ] << total;
147         size = auxStringStream[ i ].str().size();
148         maxSize[ i ] = maxSize[ i ] > size ? maxSize[ i ] : size;
149 
150         triggered = 0;
151         acc = accSave;
152         found = nmbOfHitsTriggeredRecRange.find( k->index );
153         if ( found != nmbOfHitsTriggeredRecRange.end() )
154         {
155             triggered = found->second;
156             if ( total > 0 )
157                 acc = G4double( triggered ) / total;
158         }
159 
160         auxStringStream[ ++i ] << acc;
161         auxStringStream[ ++i ] << triggered;
162         size = auxStringStream[ i ].str().size();
163         maxSize[ i ] = maxSize[ i ] > size ? maxSize[ i ] : size;
164         auxStringStream[ ++i ] << totalFull;
165         size = auxStringStream[ i ].str().size();
166         maxSize[ i ] = maxSize[ i ] > size ? maxSize[ i ] : size;
167 
168         std::vector< std::string >  auxString( nmbOfAuxColumns );
169 
170         for ( size_t  j( 0 ); j < nmbOfAuxColumns; ++j )
171             auxString[ j ] = auxStringStream[ j ].str();
172 
173         auxStrings.push_back( auxString );
174     }
175 
176     G4cout << " --- Setup acceptances (range | real (trg / mon) | "
177               "rec (trg / mon / all)):" << G4endl;
178 
179     G4int  i( 0 );
180     for ( CexmcAngularRangeList::const_iterator  k( angularRanges.begin() );
181                                                 k != angularRanges.end(); ++k )
182     {
183         G4cout << "       " << *k;
184         G4int  j( 0 );
185         G4cout << "  | " << std::setw( maxSize[ j ] );
186         G4cout << auxStrings[ i ][ j++ ];
187         G4cout << " ( " << std::setw( maxSize[ j ] );
188         G4cout << auxStrings[ i ][ j++ ];
189         G4cout << " / " << std::setw( maxSize[ j ] );
190         G4cout << auxStrings[ i ][ j++ ];
191         G4cout << " )  | " << std::setw( maxSize[ j ] );
192         G4cout << auxStrings[ i ][ j++ ];
193         G4cout << " ( " << std::setw( maxSize[ j ] );
194         G4cout << auxStrings[ i ][ j++ ];
195         G4cout << " / " << std::setw( maxSize[ 2 ] );
196         G4cout << auxStrings[ i ][ 2 ];
197         G4cout << " / " << std::setw( maxSize[ j ] );
198         G4cout << auxStrings[ i++ ][ j++ ] << " )" << G4endl;
199     }
200 
201     CexmcAngularRangeList  angularGaps;
202     GetAngularGaps( angularRanges, angularGaps );
203 
204     if ( ! angularGaps.empty() )
205     {
206         G4cout << "    orphans detected: " << G4endl;
207         for ( CexmcAngularRangeList::const_iterator  k( angularGaps.begin() );
208                                                 k != angularGaps.end(); ++k )
209         {
210             G4cout << "       " << *k;
211             G4int     total( 0 );
212 
213             CexmcNmbOfHitsInRanges::const_iterator  found(
214                                             nmbOfOrphanHits.find( k->index ) );
215             if ( found != nmbOfHitsSampled.end() )
216             {
217                 total = found->second;
218             }
219             G4cout << " " << total << G4endl;
220         }
221     }
222 
223     G4cout << "       ---" << G4endl;
224     G4cout << "       False hits (edt | rec):  " <<
225         nmbOfFalseHitsTriggeredEDT << " | " << nmbOfFalseHitsTriggeredRec <<
226         G4endl;
227 }
228 
229 
230 void  CexmcRunAction::EndOfRunAction( const G4Run *  run )
231 {
232     const CexmcRun *  theRun( static_cast< const CexmcRun * >( run ) );
233 
234     const CexmcNmbOfHitsInRanges &  nmbOfHitsSampled(
235                                         theRun->GetNmbOfHitsSampled() );
236     const CexmcNmbOfHitsInRanges &  nmbOfHitsSampledFull(
237                                         theRun->GetNmbOfHitsSampledFull() );
238     const CexmcNmbOfHitsInRanges &  nmbOfHitsTriggeredRealRange(
239                                     theRun->GetNmbOfHitsTriggeredRealRange() );
240     const CexmcNmbOfHitsInRanges &  nmbOfHitsTriggeredRecRange(
241                                     theRun->GetNmbOfHitsTriggeredRecRange() );
242     const CexmcNmbOfHitsInRanges &  nmbOfOrphanHits(
243                                         theRun->GetNmbOfOrphanHits() );
244 
245     CexmcProductionModel *          productionModel(
246                                         physicsManager->GetProductionModel() );
247     if ( ! productionModel )
248             throw CexmcException( CexmcWeirdException );
249 
250     const CexmcAngularRangeList &  angularRanges(
251                                         productionModel->GetAngularRanges() );
252 
253     G4cout << G4endl;
254     PrintResults( nmbOfHitsSampled, nmbOfHitsSampledFull,
255                   nmbOfHitsTriggeredRealRange, nmbOfHitsTriggeredRecRange,
256                   nmbOfOrphanHits, angularRanges,
257                   theRun->GetNmbOfFalseHitsTriggeredEDT(),
258                   theRun->GetNmbOfFalseHitsTriggeredRec() );
259     G4cout << G4endl;
260 }
261 
262