Go to the documentation of this file.00001 #ifndef MaterialAccountingStep_h
00002 #define MaterialAccountingStep_h
00003
00004 #include <utility>
00005 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00006
00007
00008
00009 class MaterialAccountingStep {
00010 public:
00011 MaterialAccountingStep( void ) :
00012 m_length(0.),
00013 m_radiationLengths(0.),
00014 m_energyLoss(0.),
00015 m_in(),
00016 m_out()
00017 { }
00018
00019 MaterialAccountingStep( double position, double radlen, double loss, const GlobalPoint & in, const GlobalPoint & out ) :
00020 m_length( position ),
00021 m_radiationLengths( radlen ),
00022 m_energyLoss( loss ),
00023 m_in( in ),
00024 m_out( out )
00025 { }
00026
00027 void clear( void ) {
00028 m_length = 0.;
00029 m_radiationLengths = 0.;
00030 m_energyLoss = 0.;
00031 m_in = GlobalPoint();
00032 m_out = GlobalPoint();
00033 }
00034
00035 private:
00036 double m_length;
00037 double m_radiationLengths;
00038 double m_energyLoss;
00039 GlobalPoint m_in;
00040 GlobalPoint m_out;
00041
00042 public:
00043 double length(void) const {
00044 return m_length;
00045 }
00046
00047 double radiationLengths(void) const {
00048 return m_radiationLengths;
00049 }
00050
00051 double energyLoss(void) const {
00052 return m_energyLoss;
00053 }
00054
00055 const GlobalPoint & in(void) const {
00056 return m_in;
00057 }
00058
00059 const GlobalPoint & out(void) const {
00060 return m_out;
00061 }
00062
00064 std::pair<MaterialAccountingStep, MaterialAccountingStep> split( double fraction ) const {
00065
00066 GlobalPoint limit(
00067 m_in.x() * fraction + m_out.x() * (1. - fraction),
00068 m_in.y() * fraction + m_out.y() * (1. - fraction),
00069 m_in.z() * fraction + m_out.z() * (1. - fraction)
00070 );
00071
00072 MaterialAccountingStep part1( fraction * m_length,
00073 fraction * m_radiationLengths,
00074 fraction * m_energyLoss,
00075 m_in,
00076 limit );
00077
00078 MaterialAccountingStep part2( (1 - fraction) * m_length,
00079 (1 - fraction) * m_radiationLengths,
00080 (1 - fraction) * m_energyLoss,
00081 limit,
00082 m_out );
00083 return std::make_pair( part1, part2 );
00084 }
00085
00087 MaterialAccountingStep & operator=( const MaterialAccountingStep & step ) {
00088 m_length = step.m_length;
00089 m_radiationLengths = step.m_radiationLengths;
00090 m_energyLoss = step.m_energyLoss;
00091 m_in = step.m_in;
00092 m_out = step.m_out;
00093 return *this;
00094 }
00095
00097 MaterialAccountingStep & operator+=( const MaterialAccountingStep & step ) {
00098 m_length += step.m_length;
00099 m_radiationLengths += step.m_radiationLengths;
00100 m_energyLoss += step.m_energyLoss;
00101
00102
00103 if ((m_in.perp2() == 0.0) or (step.m_in.perp2() < m_in.perp2()))
00104 m_in = step.m_in;
00105
00106 if ((m_out.perp2() == 0.0) or (step.m_out.perp2() > m_out.perp2()))
00107 m_out = step.m_out;
00108
00109 return *this;
00110 }
00111
00113 MaterialAccountingStep & operator-=( const MaterialAccountingStep & step ) {
00114 m_length -= step.m_length;
00115 m_radiationLengths -= step.m_radiationLengths;
00116 m_energyLoss -= step.m_energyLoss;
00117
00118
00119 if ((step.m_in.perp2() <= m_in.perp2()) and (step.m_out.perp2() >= m_in.perp2()))
00120 m_in = step.m_out;
00121
00122 if ((step.m_out.perp2() >= m_out.perp2()) and (step.m_in.perp2() <= m_out.perp2()))
00123 m_out = step.m_in;
00124
00125 return *this;
00126 }
00127
00129 MaterialAccountingStep & operator*=( const MaterialAccountingStep & step ) {
00130 m_length *= step.m_length;
00131 m_radiationLengths *= step.m_radiationLengths;
00132 m_energyLoss *= step.m_energyLoss;
00133 return *this;
00134 }
00135
00137 MaterialAccountingStep & operator*=( double x ) {
00138 m_length *= x;
00139 m_radiationLengths *= x;
00140 m_energyLoss *= x;
00141 return *this;
00142 }
00143
00145 MaterialAccountingStep & operator/=( double x ) {
00146 m_length /= x;
00147 m_radiationLengths /= x;
00148 m_energyLoss /= x;
00149 return *this;
00150 }
00151 };
00152
00153 inline
00154 MaterialAccountingStep operator+( const MaterialAccountingStep & x, const MaterialAccountingStep & y ) {
00155 MaterialAccountingStep step(x);
00156 step += y;
00157 return step;
00158 }
00159
00160 inline
00161 MaterialAccountingStep operator-( const MaterialAccountingStep & x, const MaterialAccountingStep & y ) {
00162 MaterialAccountingStep step(x);
00163 step -= y;
00164 return step;
00165 }
00166
00167 inline
00168 MaterialAccountingStep operator*( const MaterialAccountingStep & x, const MaterialAccountingStep & y ) {
00169 MaterialAccountingStep step(x);
00170 step *= y;
00171 return step;
00172 }
00173
00174 inline
00175 MaterialAccountingStep operator*( const MaterialAccountingStep & x, double y ) {
00176 MaterialAccountingStep step(x);
00177 step *= y;
00178 return step;
00179 }
00180
00181 inline
00182 MaterialAccountingStep operator*( double y, const MaterialAccountingStep & x ) {
00183 MaterialAccountingStep step(x);
00184 step *= y;
00185 return step;
00186 }
00187
00188 inline
00189 MaterialAccountingStep operator/( const MaterialAccountingStep & x, double y ) {
00190 MaterialAccountingStep step(x);
00191 step /= y;
00192 return step;
00193 }
00194
00195 #endif // MaterialAccountingStep_h