ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4PhononReflection.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4PhononReflection.cc
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 //
28 //
29 // This process handles the interaction of phonons with
30 // boundaries. Implementation of this class is highly
31 // geometry dependent.Currently, phonons are killed when
32 // they reach a boundary. If the other side of the
33 // boundary was Al, a hit is registered.
34 //
35 //
36 // 20131115 Throw exception if track's polarization state is invalid.
37 
38 #include "G4PhononReflection.hh"
39 #include "G4ExceptionSeverity.hh"
40 #include "G4GeometryTolerance.hh"
41 #include "G4LatticePhysical.hh"
42 #include "G4PhononLong.hh"
43 #include "G4PhononTransFast.hh"
44 #include "G4PhononTransSlow.hh"
45 #include "G4PhysicalConstants.hh"
46 #include "G4Step.hh"
47 #include "G4StepPoint.hh"
48 #include "G4SystemOfUnits.hh"
49 #include "G4VParticleChange.hh"
50 
51 
53  : G4VPhononProcess(aName),
54  kCarTolerance(G4GeometryTolerance::GetInstance()->GetSurfaceTolerance()) {;}
55 
57 
58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
59 
60 // Always return DBL_MAX and Forced. This ensures that the process is
61 // called at the end of every step. In PostStepDoIt the process
62 // decides whether the step encountered a volume boundary and a
63 // reflection should be applied
64 
67  *condition = Forced;
68  return DBL_MAX;
69 }
70 
71 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
72 
73 // This process handles the interaction of phonons with
74 // boundaries. Implementation of this class is highly geometry
75 // dependent.Currently, phonons are killed when they reach a
76 // boundary. If the other side of the boundary was Al, a hit is
77 // registered.
78 
80  const G4Step& aStep) {
82 
83  //Check if current step is limited by a volume boundary
84  G4StepPoint* postStepPoint = aStep.GetPostStepPoint();
85  if (postStepPoint->GetStepStatus()!=fGeomBoundary) {
86  //make sure that correct phonon velocity is used after the step
87  int pol = GetPolarization(aTrack);
88  if (pol < 0 || pol > 2) {
89  G4Exception("G4PhononReflection::PostStepDoIt","Phonon001",
90  EventMustBeAborted, "Track is not a phonon");
91  return &aParticleChange; // NOTE: Will never get here
92  }
93 
94  // FIXME: This should be using wave-vector, shouldn't it?
95  G4double vg = theLattice->MapKtoV(pol, aTrack.GetMomentumDirection());
96 
97  //Since step was not a volume boundary, just set correct phonon velocity and return
99  return &aParticleChange;
100  }
101 
102  // do nothing but return is the step is too short
103  // This is to allow actual reflection where after
104  // the first boundary crossing a second, infinitesimal
105  // step occurs crossing back into the original volume
106  if (aTrack.GetStepLength()<=kCarTolerance/2) {
107  return &aParticleChange;
108  }
109 
110  G4double eKin = aTrack.GetKineticEnergy();
113 
114  return &aParticleChange;
115 }
116 
117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
118 
119