// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // $Id: G4FieldTrack.icc,v 1.21 2006/11/13 18:24:35 gcosmo Exp $ // GEANT4 tag $Name: $ // // ------------------------------------------------------------------- // Implementation methods for the embedded class G4ChargeState // ---------------------------- inline G4FieldTrack:: G4ChargeState::G4ChargeState(G4double charge, G4double magnetic_dipole_moment, G4double electric_dipole_moment, G4double magnetic_charge) { fCharge= charge; fMagn_dipole= magnetic_dipole_moment; fElec_dipole= electric_dipole_moment; fMagneticCharge= magnetic_charge; } inline G4FieldTrack:: G4ChargeState::G4ChargeState( const G4FieldTrack::G4ChargeState& right ) { fCharge= right.fCharge; fMagn_dipole= right.fMagn_dipole; fElec_dipole= right.fElec_dipole; fMagneticCharge= right.fMagneticCharge; } inline void G4FieldTrack::InitialiseSpin( const G4ThreeVector& Spin ) { // static G4ThreeVector ZeroVec(0.0, 0.0, 0.0); fSpin = Spin; // New Member ?? G4bool fHasSpin; // fHasSpin = (fSpin != ZeroVec); } inline void G4FieldTrack:: G4ChargeState::SetChargeAndMoments(G4double charge, G4double magnetic_dipole_moment, G4double electric_dipole_moment, G4double magnetic_charge ) // Revise the charge and potentially all moments. // By default do not change mdm, edm, mag charge. { fCharge= charge; if( magnetic_dipole_moment < DBL_MAX) fMagn_dipole= magnetic_dipole_moment; if( electric_dipole_moment < DBL_MAX) fElec_dipole= electric_dipole_moment; if( magnetic_charge < DBL_MAX) fMagneticCharge= magnetic_charge; } inline G4FieldTrack::G4FieldTrack( const G4FieldTrack& rStVec ) : fDistanceAlongCurve( rStVec.fDistanceAlongCurve), fKineticEnergy( rStVec.fKineticEnergy ), fRestMass_c2( rStVec.fRestMass_c2), fLabTimeOfFlight( rStVec.fLabTimeOfFlight ), fProperTimeOfFlight( rStVec.fProperTimeOfFlight ), // fMomentumModulus( rStVec.fMomentumModulus ), fSpin( rStVec.fSpin ), fMomentumDir( rStVec.fMomentumDir ), fChargeState( rStVec.fChargeState ) { SixVector[0]= rStVec.SixVector[0]; SixVector[1]= rStVec.SixVector[1]; SixVector[2]= rStVec.SixVector[2]; SixVector[3]= rStVec.SixVector[3]; SixVector[4]= rStVec.SixVector[4]; SixVector[5]= rStVec.SixVector[5]; // fpChargeState= new G4ChargeState( *rStVec.fpChargeState ); // Can share charge state only when using handles etc // fpChargeState = rStVec.fpChargeState; } inline G4FieldTrack::~G4FieldTrack() { // delete fpChargeState; } inline G4FieldTrack& G4FieldTrack::SetCurvePnt(const G4ThreeVector& pPosition, const G4ThreeVector& pMomentum, G4double s_curve ) { SixVector[0] = pPosition.x(); SixVector[1] = pPosition.y(); SixVector[2] = pPosition.z(); SixVector[3] = pMomentum.x(); SixVector[4] = pMomentum.y(); SixVector[5] = pMomentum.z(); fMomentumDir = pMomentum.unit(); fDistanceAlongCurve= s_curve; return *this; } inline G4ThreeVector G4FieldTrack::GetPosition() const { G4ThreeVector myPosition( SixVector[0], SixVector[1], SixVector[2] ); return myPosition; } inline void G4FieldTrack::SetPosition( G4ThreeVector pPosition) { SixVector[0] = pPosition.x(); SixVector[1] = pPosition.y(); SixVector[2] = pPosition.z(); } inline const G4ThreeVector& G4FieldTrack::GetMomentumDir() const { // G4ThreeVector myMomentum( SixVector[3], SixVector[4], SixVector[5] ); // return myVelocity; return fMomentumDir; } inline G4ThreeVector G4FieldTrack::GetMomentumDirection() const { return fMomentumDir; } inline G4double G4FieldTrack::GetCurveLength() const { return fDistanceAlongCurve; } inline void G4FieldTrack::SetCurveLength(G4double nCurve_s) { fDistanceAlongCurve= nCurve_s; } inline G4double G4FieldTrack::GetKineticEnergy() const { return fKineticEnergy; } inline void G4FieldTrack::SetKineticEnergy(G4double newKinEnergy) { fKineticEnergy=newKinEnergy; } inline G4ThreeVector G4FieldTrack::GetSpin() const { return fSpin; } inline void G4FieldTrack::SetSpin(G4ThreeVector nSpin) { fSpin=nSpin; } inline G4double G4FieldTrack::GetLabTimeOfFlight() const { return fLabTimeOfFlight; } inline void G4FieldTrack::SetLabTimeOfFlight(G4double nTOF) { fLabTimeOfFlight=nTOF; } inline G4double G4FieldTrack::GetProperTimeOfFlight() const { return fProperTimeOfFlight; } inline void G4FieldTrack::SetProperTimeOfFlight(G4double nTOF) { fProperTimeOfFlight=nTOF; } inline void G4FieldTrack::SetMomentumDir(G4ThreeVector newMomDir) { fMomentumDir= newMomDir; } inline G4ThreeVector G4FieldTrack::GetMomentum() const { return G4ThreeVector( SixVector[3], SixVector[4], SixVector[5] ); } inline void G4FieldTrack::SetMomentum(G4ThreeVector pMomentum) { SixVector[3] = pMomentum.x(); SixVector[4] = pMomentum.y(); SixVector[5] = pMomentum.z(); fMomentumDir = pMomentum.unit(); } inline G4double G4FieldTrack::GetCharge() const { return fChargeState.GetCharge(); } // Dump values to array // // note that momentum direction is not saved inline void G4FieldTrack::DumpToArray(G4double valArr[ncompSVEC] ) const { valArr[0]=SixVector[0]; valArr[1]=SixVector[1]; valArr[2]=SixVector[2]; valArr[3]=SixVector[3]; valArr[4]=SixVector[4]; valArr[5]=SixVector[5]; G4ThreeVector Momentum(valArr[3],valArr[4],valArr[5]); // G4double mass_in_Kg; // mass_in_Kg = fEnergy / velocity_mag_sq * (1-velocity_mag_sq/c_squared); // valArr[6]= mass_in_Kg; // The following components may or may not be integrated. valArr[6]= fKineticEnergy; // valArr[6]=fEnergy; // When it is integrated over, do this ... valArr[7]=fLabTimeOfFlight; valArr[8]=fProperTimeOfFlight; valArr[9]=fSpin.x(); valArr[10]=fSpin.y(); valArr[11]=fSpin.z(); // valArr[13]=fMomentumDir.x(); // valArr[14]=fMomentumDir.y(); // valArr[15]=fMomentumDir.z(); // valArr[]=fDistanceAlongCurve; } // Load values from array // // note that momentum direction must-be/is normalised inline void G4FieldTrack::LoadFromArray(const G4double valArrIn[ncompSVEC], G4int noVarsIntegrated) { G4int i; // Fill the variables not integrated with zero -- so it's clear !! static G4double valArr[ncompSVEC]; for( i=0; i