// // ******************************************************************** // * DISCLAIMER * // * * // * The following disclaimer summarizes all the specific disclaimers * // * of contributors to this software. The specific disclaimers,which * // * govern, are listed with their locations in: * // * http://cern.ch/geant4/license * // * * // * 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. * // * * // * This code implementation is the intellectual property of the * // * GEANT4 collaboration. * // * By copying, distributing or modifying the Program (or any work * // * based on the Program) you indicate your acceptance of this * // * statement, and all its terms. * // ******************************************************************** // // // $Id: G4TouchableHistory.icc,v 1.7 2002/07/23 08:50:36 gcosmo Exp $ // GEANT4 tag $Name: geant4-05-01 $ // // // class G4TouchableHistory inline implementation // ******************************************************************** inline G4TouchableHistory::G4TouchableHistory() : frot(G4RotationMatrix()), ftlate(G4ThreeVector(0.,0.,0.)), fhistory() { } inline G4TouchableHistory::G4TouchableHistory( const G4NavigationHistory &history ) : fhistory(history) { G4AffineTransform tf(fhistory.GetTopTransform().Inverse()); ftlate = tf.NetTranslation(); frot = tf.NetRotation(); } inline void G4TouchableHistory::UpdateYourself( G4VPhysicalVolume* pPhysVol, const G4NavigationHistory* pHistory ) { fhistory = *pHistory; G4AffineTransform tf(fhistory.GetTopTransform().Inverse()); if( pPhysVol == 0 ) { // This means that the track has left the World Volume. // Since the Navigation History does not already reflect this, // we must correct this problem here. // fhistory.SetFirstEntry(pPhysVol); } ftlate = tf.NetTranslation(); frot = tf.NetRotation(); } inline G4int G4TouchableHistory::CalculateHistoryIndex( G4int stackDepth ) const { return (fhistory.GetDepth()-stackDepth); // was -1 } inline G4VPhysicalVolume* G4TouchableHistory::GetVolume( G4int depth ) const { return fhistory.GetVolume(CalculateHistoryIndex(depth)); } inline G4VSolid* G4TouchableHistory::GetSolid( G4int depth ) const { return fhistory.GetVolume(CalculateHistoryIndex(depth)) ->GetLogicalVolume()->GetSolid(); } inline G4int G4TouchableHistory::GetReplicaNumber( G4int depth ) const { return fhistory.GetReplicaNo(CalculateHistoryIndex(depth)); } inline G4int G4TouchableHistory::GetHistoryDepth() const { return fhistory.GetDepth(); } inline G4int G4TouchableHistory::MoveUpHistory( G4int num_levels ) { G4NavigationHistory* nHistory= &fhistory; G4int maxLevelsMove = nHistory->GetDepth(); G4int minLevelsMove = 0; // Cannot redescend today! // Soon it will be possible // by adding a data member here // fCurrentDepth; if( num_levels > maxLevelsMove ) { num_levels = maxLevelsMove; } else if( num_levels < minLevelsMove ) { num_levels = minLevelsMove; } nHistory->BackLevel( num_levels ); return num_levels; } inline const G4NavigationHistory* G4TouchableHistory::GetHistory() const { return &fhistory; }