Geant4  10.02
CexmcAngularRange.cc
Go to the documentation of this file.
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: CexmcAngularRange.cc
30  *
31  * Description: angular range object
32  *
33  * Version: 1.0
34  * Created: 28.12.2009 22:35:07
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * ============================================================================
42  */
43 
44 #include <algorithm>
45 #include <iostream>
46 #include <iomanip>
47 #include <cmath>
48 #include "CexmcAngularRange.hh"
49 
50 
52  CexmcAngularRangeList & dst )
53 {
54  dst = src;
55  if ( dst.size() < 2 )
56  return;
57 
58  std::sort( dst.begin(), dst.end() );
59 
60  const G4double epsilon( 1E-7 );
61 
62  for ( CexmcAngularRangeList::iterator k( dst.begin() + 1 );
63  k != dst.end(); )
64  {
65  if ( std::fabs( k->top - ( k - 1 )->top ) < epsilon ||
66  k->bottom + epsilon >= ( k - 1 )->bottom )
67  {
68  k = dst.erase( k );
69  continue;
70  }
71  if ( k->top + epsilon >= ( k - 1 )->bottom )
72  {
73  ( k - 1 )->bottom = k->bottom;
74  k = dst.erase( k );
75  continue;
76  }
77  ++k;
78  }
79 }
80 
81 
83  CexmcAngularRangeList & dst )
84 {
85  if ( src.empty() )
86  {
87  dst.push_back( CexmcAngularRange( 1.0, -1.0 , 0 ) );
88  return;
89  }
90 
91  CexmcAngularRangeList normalizedAngularRanges;
92  GetNormalizedAngularRange( src, normalizedAngularRanges );
93 
94  G4int index( 0 );
95  if ( normalizedAngularRanges[ 0 ].top < 1.0 )
96  dst.push_back( CexmcAngularRange(
97  1.0, normalizedAngularRanges[ 0 ].top, index++ ) );
98 
99  for ( CexmcAngularRangeList::iterator
100  k( normalizedAngularRanges.begin() );
101  k != normalizedAngularRanges.end(); ++k )
102  {
103  if ( k + 1 == normalizedAngularRanges.end() )
104  break;
105  dst.push_back( CexmcAngularRange(
106  k->bottom, ( k + 1 )->top, index++ ) );
107  }
108 
109  if ( normalizedAngularRanges.back().bottom > -1.0 )
110  dst.push_back( CexmcAngularRange(
111  normalizedAngularRanges.back().bottom, -1.0, index ) );
112 }
113 
114 
115 std::ostream & operator<<( std::ostream & out,
116  const CexmcAngularRange & angularRange )
117 {
118  std::ostream::fmtflags savedFlags( out.flags() );
119  std::streamsize prec( out.precision() );
120 
121  out.precision( 4 );
122  out.flags( std::ios::fixed );
123 
124  out << std::setw( 2 ) << angularRange.index + 1 << " [" << std::setw( 7 ) <<
125  angularRange.top << ", " << std::setw( 7 ) << angularRange.bottom <<
126  ")";
127 
128  out.precision( prec );
129  out.flags( savedFlags );
130 
131  return out;
132 }
133 
134 
135 std::ostream & operator<<( std::ostream & out,
136  const CexmcAngularRangeList & angularRanges )
137 {
138  out << std::endl;
139  for ( CexmcAngularRangeList::const_iterator k( angularRanges.begin() );
140  k != angularRanges.end(); ++k )
141  {
142  out << " " << *k << std::endl;
143  }
144 
145  return out;
146 }
147 
int G4int
Definition: G4Types.hh:78
std::ostream & operator<<(std::ostream &out, const CexmcAngularRange &angularRange)
static const double prec
Definition: RanecuEngine.cc:58
void GetNormalizedAngularRange(const CexmcAngularRangeList &src, CexmcAngularRangeList &dst)
void GetAngularGaps(const CexmcAngularRangeList &src, CexmcAngularRangeList &dst)
std::vector< CexmcAngularRange > CexmcAngularRangeList
double G4double
Definition: G4Types.hh:76
double epsilon(double density, double temperature)