00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 inline G4FieldTrack::
00034 G4ChargeState::G4ChargeState(G4double charge,
00035 G4double magnetic_dipole_moment,
00036 G4double electric_dipole_moment,
00037 G4double magnetic_charge)
00038 {
00039 fCharge= charge;
00040 fMagn_dipole= magnetic_dipole_moment;
00041 fElec_dipole= electric_dipole_moment;
00042 fMagneticCharge= magnetic_charge;
00043 }
00044
00045 inline G4FieldTrack::
00046 G4ChargeState::G4ChargeState(
00047 const G4FieldTrack::G4ChargeState& right )
00048 {
00049 fCharge= right.fCharge;
00050 fMagn_dipole= right.fMagn_dipole;
00051 fElec_dipole= right.fElec_dipole;
00052 fMagneticCharge= right.fMagneticCharge;
00053 }
00054
00055 inline G4FieldTrack::G4ChargeState& G4FieldTrack::
00056 G4ChargeState::operator = ( const G4FieldTrack::G4ChargeState& right )
00057 {
00058 if (&right == this) return *this;
00059
00060 fCharge= right.fCharge;
00061 fMagn_dipole= right.fMagn_dipole;
00062 fElec_dipole= right.fElec_dipole;
00063 fMagneticCharge= right.fMagneticCharge;
00064
00065 return *this;
00066 }
00067
00068 inline void
00069 G4FieldTrack::InitialiseSpin( const G4ThreeVector& Spin )
00070 {
00071
00072
00073 fSpin = Spin;
00074
00075
00076 }
00077
00078 inline void G4FieldTrack::
00079 G4ChargeState::SetChargeAndMoments(G4double charge,
00080 G4double magnetic_dipole_moment,
00081 G4double electric_dipole_moment,
00082 G4double magnetic_charge )
00083
00084
00085 {
00086 fCharge= charge;
00087 if( magnetic_dipole_moment < DBL_MAX) fMagn_dipole= magnetic_dipole_moment;
00088 if( electric_dipole_moment < DBL_MAX) fElec_dipole= electric_dipole_moment;
00089 if( magnetic_charge < DBL_MAX) fMagneticCharge= magnetic_charge;
00090 }
00091
00092 inline
00093 G4FieldTrack::G4FieldTrack( const G4FieldTrack& rStVec )
00094 : fDistanceAlongCurve( rStVec.fDistanceAlongCurve),
00095 fKineticEnergy( rStVec.fKineticEnergy ),
00096 fRestMass_c2( rStVec.fRestMass_c2),
00097 fLabTimeOfFlight( rStVec.fLabTimeOfFlight ),
00098 fProperTimeOfFlight( rStVec.fProperTimeOfFlight ),
00099
00100 fSpin( rStVec.fSpin ),
00101 fMomentumDir( rStVec.fMomentumDir ),
00102 fChargeState( rStVec.fChargeState )
00103 {
00104 SixVector[0]= rStVec.SixVector[0];
00105 SixVector[1]= rStVec.SixVector[1];
00106 SixVector[2]= rStVec.SixVector[2];
00107 SixVector[3]= rStVec.SixVector[3];
00108 SixVector[4]= rStVec.SixVector[4];
00109 SixVector[5]= rStVec.SixVector[5];
00110
00111
00112
00113
00114 }
00115
00116 inline
00117 G4FieldTrack::~G4FieldTrack()
00118 {
00119
00120 }
00121
00122 inline G4FieldTrack&
00123 G4FieldTrack::SetCurvePnt(const G4ThreeVector& pPosition,
00124 const G4ThreeVector& pMomentum,
00125 G4double s_curve )
00126 {
00127 SixVector[0] = pPosition.x();
00128 SixVector[1] = pPosition.y();
00129 SixVector[2] = pPosition.z();
00130
00131 SixVector[3] = pMomentum.x();
00132 SixVector[4] = pMomentum.y();
00133 SixVector[5] = pMomentum.z();
00134
00135 fMomentumDir = pMomentum.unit();
00136
00137 fDistanceAlongCurve= s_curve;
00138
00139 return *this;
00140 }
00141
00142 inline
00143 G4ThreeVector G4FieldTrack::GetPosition() const
00144 {
00145 G4ThreeVector myPosition( SixVector[0], SixVector[1], SixVector[2] );
00146 return myPosition;
00147 }
00148
00149 inline
00150 void G4FieldTrack::SetPosition( G4ThreeVector pPosition)
00151 {
00152 SixVector[0] = pPosition.x();
00153 SixVector[1] = pPosition.y();
00154 SixVector[2] = pPosition.z();
00155 }
00156
00157 inline
00158 const G4ThreeVector& G4FieldTrack::GetMomentumDir() const
00159 {
00160
00161
00162 return fMomentumDir;
00163 }
00164
00165 inline
00166 G4ThreeVector G4FieldTrack::GetMomentumDirection() const
00167 {
00168 return fMomentumDir;
00169 }
00170
00171 inline
00172 G4double G4FieldTrack::GetCurveLength() const
00173 {
00174 return fDistanceAlongCurve;
00175 }
00176
00177 inline
00178 void G4FieldTrack::SetCurveLength(G4double nCurve_s)
00179 {
00180 fDistanceAlongCurve= nCurve_s;
00181 }
00182
00183 inline
00184 G4double G4FieldTrack::GetKineticEnergy() const
00185 {
00186 return fKineticEnergy;
00187 }
00188
00189 inline
00190 void G4FieldTrack::SetKineticEnergy(G4double newKinEnergy)
00191 {
00192 fKineticEnergy=newKinEnergy;
00193 }
00194
00195 inline
00196 G4ThreeVector G4FieldTrack::GetSpin() const
00197 {
00198 return fSpin;
00199 }
00200
00201 inline
00202 void G4FieldTrack::SetSpin(G4ThreeVector nSpin)
00203 {
00204 fSpin=nSpin;
00205 }
00206
00207 inline
00208 G4double G4FieldTrack::GetLabTimeOfFlight() const
00209 {
00210 return fLabTimeOfFlight;
00211 }
00212
00213 inline
00214 void G4FieldTrack::SetLabTimeOfFlight(G4double nTOF)
00215 {
00216 fLabTimeOfFlight=nTOF;
00217 }
00218
00219 inline
00220 G4double G4FieldTrack::GetProperTimeOfFlight() const
00221 {
00222 return fProperTimeOfFlight;
00223 }
00224
00225 inline
00226 void G4FieldTrack::SetProperTimeOfFlight(G4double nTOF)
00227 {
00228 fProperTimeOfFlight=nTOF;
00229 }
00230
00231 inline
00232 void G4FieldTrack::SetMomentumDir(G4ThreeVector newMomDir)
00233 {
00234 fMomentumDir= newMomDir;
00235 }
00236
00237 inline
00238 G4ThreeVector G4FieldTrack::GetMomentum() const
00239 {
00240 return G4ThreeVector( SixVector[3], SixVector[4], SixVector[5] );
00241 }
00242
00243 inline
00244 void G4FieldTrack::SetMomentum(G4ThreeVector pMomentum)
00245 {
00246 SixVector[3] = pMomentum.x();
00247 SixVector[4] = pMomentum.y();
00248 SixVector[5] = pMomentum.z();
00249
00250 fMomentumDir = pMomentum.unit();
00251 }
00252
00253 inline
00254 G4double G4FieldTrack::GetCharge() const
00255 {
00256 return fChargeState.GetCharge();
00257 }
00258
00259
00260
00261
00262
00263 inline
00264 void G4FieldTrack::DumpToArray(G4double valArr[ncompSVEC] ) const
00265 {
00266 valArr[0]=SixVector[0];
00267 valArr[1]=SixVector[1];
00268 valArr[2]=SixVector[2];
00269 valArr[3]=SixVector[3];
00270 valArr[4]=SixVector[4];
00271 valArr[5]=SixVector[5];
00272
00273 G4ThreeVector Momentum(valArr[3],valArr[4],valArr[5]);
00274
00275
00276
00277
00278
00279
00280 valArr[6]= fKineticEnergy;
00281
00282
00283 valArr[7]=fLabTimeOfFlight;
00284 valArr[8]=fProperTimeOfFlight;
00285 valArr[9]=fSpin.x();
00286 valArr[10]=fSpin.y();
00287 valArr[11]=fSpin.z();
00288
00289
00290
00291
00292 }
00293
00294
00295
00296
00297
00298 inline
00299 void G4FieldTrack::LoadFromArray(const G4double valArrIn[ncompSVEC], G4int noVarsIntegrated)
00300 {
00301 G4int i;
00302
00303
00304 static G4double valArr[ncompSVEC];
00305 for( i=0; i<noVarsIntegrated; i++){
00306 valArr[i]= valArrIn[i];
00307 }
00308 for( i=noVarsIntegrated; i<ncompSVEC; i++) {
00309 valArr[i]= 0.0;
00310 }
00311
00312 SixVector[0]=valArr[0];
00313 SixVector[1]=valArr[1];
00314 SixVector[2]=valArr[2];
00315 SixVector[3]=valArr[3];
00316 SixVector[4]=valArr[4];
00317 SixVector[5]=valArr[5];
00318
00319 G4ThreeVector Momentum(valArr[3],valArr[4],valArr[5]);
00320
00321 G4double momentum_square= Momentum.mag2();
00322 fMomentumDir= Momentum.unit();
00323
00324 fKineticEnergy = momentum_square /
00325 (std::sqrt(momentum_square+fRestMass_c2*fRestMass_c2)
00326 + fRestMass_c2 );
00327
00328
00329
00330
00331
00332
00333 fLabTimeOfFlight=valArr[7];
00334 fProperTimeOfFlight=valArr[8];
00335 fSpin=G4ThreeVector(valArr[9],valArr[10],valArr[11]);
00336
00337
00338 }
00339
00340 inline
00341 G4FieldTrack & G4FieldTrack::operator = ( const G4FieldTrack& rStVec )
00342 {
00343 if (&rStVec == this) return *this;
00344
00345 SixVector[0]= rStVec.SixVector[0];
00346 SixVector[1]= rStVec.SixVector[1];
00347 SixVector[2]= rStVec.SixVector[2];
00348 SixVector[3]= rStVec.SixVector[3];
00349 SixVector[4]= rStVec.SixVector[4];
00350 SixVector[5]= rStVec.SixVector[5];
00351 SetCurveLength( rStVec.GetCurveLength() );
00352
00353 fKineticEnergy= rStVec.fKineticEnergy;
00354 SetLabTimeOfFlight( rStVec.GetLabTimeOfFlight() );
00355 SetProperTimeOfFlight( rStVec.GetProperTimeOfFlight() );
00356 SetSpin( rStVec.GetSpin() );
00357 fMomentumDir= rStVec.fMomentumDir;
00358
00359 fChargeState= rStVec.fChargeState;
00360
00361
00362 return *this;
00363 }
00364
00365 inline void
00366 G4FieldTrack::UpdateFourMomentum( G4double kineticEnergy,
00367 const G4ThreeVector& momentumDirection )
00368 {
00369 G4double momentum_mag = std::sqrt(kineticEnergy*kineticEnergy
00370 +2.0*fRestMass_c2*kineticEnergy);
00371 G4ThreeVector momentumVector= momentum_mag * momentumDirection;
00372
00373
00374 SixVector[3] = momentumVector.x();
00375 SixVector[4] = momentumVector.y();
00376 SixVector[5] = momentumVector.z();
00377
00378 fMomentumDir= momentumDirection;
00379 fKineticEnergy= kineticEnergy;
00380 }
00381
00382 inline void G4FieldTrack::UpdateState( const G4ThreeVector& position,
00383 G4double laboratoryTimeOfFlight,
00384 const G4ThreeVector& momentumDirection,
00385 G4double kineticEnergy
00386 )
00387 {
00388
00389 SetPosition( position);
00390 fLabTimeOfFlight= laboratoryTimeOfFlight;
00391 fDistanceAlongCurve= 0.0;
00392
00393 UpdateFourMomentum( kineticEnergy, momentumDirection);
00394 }