Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /// \file electromagnetic/TestEm5/src/Tracking << 27 /// \brief Implementation of the TrackingActio << 28 // << 29 // 26 // >> 27 // $Id: TrackingAction.cc,v 1.16 2007/11/28 12:37:57 maire Exp $ >> 28 // GEANT4 tag $Name: geant4-09-01 $ 30 // 29 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 //....oooOO0OOooo........oooOO0OOooo........oo 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 32 34 #include "TrackingAction.hh" 33 #include "TrackingAction.hh" 35 34 36 #include "DetectorConstruction.hh" 35 #include "DetectorConstruction.hh" >> 36 #include "RunAction.hh" 37 #include "EventAction.hh" 37 #include "EventAction.hh" 38 #include "HistoManager.hh" 38 #include "HistoManager.hh" 39 #include "Run.hh" << 40 39 41 #include "G4PhysicalConstants.hh" << 42 #include "G4RunManager.hh" << 43 #include "G4SystemOfUnits.hh" << 44 #include "G4Track.hh" 40 #include "G4Track.hh" 45 41 46 //....oooOO0OOooo........oooOO0OOooo........oo 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 47 43 48 TrackingAction::TrackingAction(DetectorConstru << 44 TrackingAction::TrackingAction(DetectorConstruction* DET,RunAction* RA, 49 : fDetector(det), fEventAction(event) << 45 EventAction* EA, HistoManager* HM) 50 {} << 46 :detector(DET), runaction(RA), eventaction(EA), histoManager(HM) 51 << 47 { } >> 48 52 //....oooOO0OOooo........oooOO0OOooo........oo 49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 53 50 54 void TrackingAction::PreUserTrackingAction(con << 51 void TrackingAction::PreUserTrackingAction(const G4Track* aTrack ) 55 { 52 { 56 // few initialisations 53 // few initialisations 57 // 54 // 58 if (aTrack->GetTrackID() == 1) { 55 if (aTrack->GetTrackID() == 1) { 59 fXstartAbs = fDetector->GetxstartAbs(); << 56 xstartAbs = detector->GetxstartAbs(); 60 fXendAbs = fDetector->GetxendAbs(); << 57 xendAbs = detector->GetxendAbs(); 61 fPrimaryCharge = aTrack->GetDefinition()-> << 58 primaryCharge = aTrack->GetDefinition()->GetPDGCharge(); 62 fDirX = aTrack->GetMomentumDirection().x() << 63 } 59 } 64 } 60 } 65 61 66 //....oooOO0OOooo........oooOO0OOooo........oo 62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 67 63 68 void TrackingAction::PostUserTrackingAction(co 64 void TrackingAction::PostUserTrackingAction(const G4Track* aTrack) 69 { 65 { 70 G4AnalysisManager* analysisManager = G4Analy << 71 << 72 Run* run = static_cast<Run*>(G4RunManager::G << 73 << 74 G4ThreeVector position = aTrack->GetPosition 66 G4ThreeVector position = aTrack->GetPosition(); 75 G4ThreeVector vertex = aTrack->GetVertexPosi << 67 G4double charge = aTrack->GetDefinition()->GetPDGCharge(); 76 G4double charge = aTrack->GetDefinition()->G << 68 77 G4double energy = aTrack->GetKineticEnergy() << 69 G4bool transmit = (position.x() >= xendAbs); 78 << 70 G4bool reflect = (position.x() <= xstartAbs); 79 G4bool transmit = << 80 (((fDirX >= 0.0 && position.x() >= fXendAb << 81 && energy > 0.0); << 82 G4bool reflect = << 83 (((fDirX >= 0.0 && position.x() <= fXstart << 84 && energy > 0.0); << 85 G4bool notabsor = (transmit || reflect); 71 G4bool notabsor = (transmit || reflect); 86 72 87 // transmitted + reflected particles counter << 73 //transmitted + reflected particles counter 88 // 74 // 89 G4int flag = 0; 75 G4int flag = 0; 90 if (charge == fPrimaryCharge) flag = 1; << 76 if (charge == primaryCharge) flag = 1; 91 if (aTrack->GetTrackID() == 1) flag = 2; 77 if (aTrack->GetTrackID() == 1) flag = 2; 92 if (transmit) fEventAction->SetTransmitFlag( << 78 if (transmit) eventaction->SetTransmitFlag(flag); 93 if (reflect) fEventAction->SetReflectFlag(fl << 79 if (reflect) eventaction->SetReflectFlag(flag); 94 << 80 95 // 81 // 96 // histograms << 82 //histograms 97 // 83 // 98 G4bool charged = (charge != 0.); << 84 G4int id = 0; >> 85 G4bool charged = (charge != 0.); 99 G4bool neutral = !charged; 86 G4bool neutral = !charged; 100 87 101 // energy spectrum at exit << 88 //energy spectrum at exit 102 // zero energy charged particle are not take << 103 // 89 // 104 G4int id = 0; << 90 if (transmit && charged) id = 10; 105 if (transmit && charged) << 91 else if (transmit && neutral) id = 20; 106 id = 10; << 92 else if (reflect && charged) id = 30; 107 else if (transmit && neutral) << 93 else if (reflect && neutral) id = 40; 108 id = 20; << 94 109 else if (reflect && charged) << 95 histoManager->FillHisto(id, aTrack->GetKineticEnergy()); 110 id = 30; << 96 111 else if (reflect && neutral) << 97 //energy leakage 112 id = 40; << 113 << 114 if (id > 0) { << 115 analysisManager->FillH1(id, energy); << 116 } << 117 << 118 // energy leakage << 119 // 98 // 120 if (notabsor) { 99 if (notabsor) { 121 G4int trackID = aTrack->GetTrackID(); 100 G4int trackID = aTrack->GetTrackID(); 122 G4int index = 0; << 101 G4int index = 0; if (trackID > 1) index = 1; //primary=0, secondaries=1 123 if (trackID > 1) index = 1; // primary=0, << 124 G4double eleak = aTrack->GetKineticEnergy( 102 G4double eleak = aTrack->GetKineticEnergy(); 125 if ((aTrack->GetDefinition() == G4Positron 103 if ((aTrack->GetDefinition() == G4Positron::Positron()) && (trackID > 1)) 126 eleak += 2 * electron_mass_c2; << 104 eleak += 2*electron_mass_c2; 127 run->AddEnergyLeak(eleak, index); << 105 runaction->AddEnergyLeak(eleak,index); 128 } << 129 << 130 // space angle distribution at exit : dN/dOm << 131 // << 132 G4ThreeVector direction = aTrack->GetMomentu << 133 id = 0; << 134 if (transmit && charged) << 135 id = 12; << 136 else if (transmit && neutral) << 137 id = 22; << 138 else if (reflect && charged) << 139 id = 32; << 140 else if (reflect && neutral) << 141 id = 42; << 142 << 143 if (id > 0 && std::abs(direction.x()) < 1.0) << 144 G4double theta = std::acos(direction.x()); << 145 if (theta > 0.0) { << 146 G4double dteta = analysisManager->GetH1W << 147 G4double unit = analysisManager->GetH1Un << 148 G4double weight = unit / (twopi * std::s << 149 /* << 150 G4cout << "theta, dteta, unit, weight: " << 151 << theta << " " << 152 << dteta << " " << 153 << unit << " " << 154 << weight << G4endl; << 155 */ << 156 analysisManager->FillH1(id, theta, weigh << 157 } << 158 } << 159 << 160 // energy fluence at exit : dE(MeV)/dOmega << 161 // << 162 id = 0; << 163 if (transmit && charged) << 164 id = 11; << 165 else if (reflect && charged) << 166 id = 31; << 167 else if (transmit && neutral) << 168 id = 21; << 169 else if (reflect && neutral) << 170 id = 41; << 171 << 172 if (id > 0 && std::abs(direction.x()) < 1.0) << 173 G4double theta = std::acos(direction.x()); << 174 if (theta > 0.0) { << 175 G4double dteta = analysisManager->GetH1W << 176 G4double unit = analysisManager->GetH1Un << 177 G4double weight = unit / (twopi * std::s << 178 weight *= (aTrack->GetKineticEnergy() / << 179 analysisManager->FillH1(id, theta, weigh << 180 } << 181 } << 182 << 183 // projected angles distribution at exit << 184 // << 185 id = 0; << 186 if (transmit && charged) << 187 id = 13; << 188 else if (transmit && neutral) << 189 id = 23; << 190 else if (reflect && charged) << 191 id = 33; << 192 else if (reflect && neutral) << 193 id = 43; << 194 << 195 if (id > 0) { << 196 if (direction.x() != 0.0) { << 197 G4double tet = std::atan(direction.y() / << 198 analysisManager->FillH1(id, tet); << 199 if (transmit && (flag == 2)) run->AddMsc << 200 << 201 tet = std::atan(direction.z() / std::fab << 202 analysisManager->FillH1(id, tet); << 203 if (transmit && (flag == 2)) run->AddMsc << 204 } << 205 } 106 } 206 107 207 // projected position and radius at exit << 108 //space angle distribution at exit : dN/dOmega 208 // 109 // 209 if (transmit && energy > 0.0) { << 110 if (transmit && charged) id = 12; >> 111 else if (transmit && neutral) id = 22; >> 112 else if (reflect && charged) id = 32; >> 113 else if (reflect && neutral) id = 42; >> 114 >> 115 G4ThreeVector direction = aTrack->GetMomentumDirection(); >> 116 if (histoManager->HistoExist(id)) { >> 117 G4double theta = std::acos(direction.x()); >> 118 G4double dteta = histoManager->GetBinWidth(id); >> 119 G4double unit = histoManager->GetHistoUnit(id); >> 120 G4double weight = (unit*unit)/(twopi*std::sin(theta)*dteta); >> 121 histoManager->FillHisto(id,theta,weight); >> 122 } >> 123 >> 124 //energy fluence at exit : dE(MeV)/dOmega >> 125 // >> 126 if (transmit && charged) id = 11; >> 127 else if (transmit && neutral) id = 21; >> 128 else if (reflect && charged) id = 31; >> 129 else if (reflect && neutral) id = 41; >> 130 >> 131 if (histoManager->HistoExist(id)) { >> 132 G4double theta = std::acos(direction.x()); >> 133 G4double dteta = histoManager->GetBinWidth(id); >> 134 G4double unit = histoManager->GetHistoUnit(id); >> 135 G4double weight = (unit*unit)/(twopi*std::sin(theta)*dteta); >> 136 weight *= (aTrack->GetKineticEnergy()/MeV); >> 137 histoManager->FillHisto(id,theta,weight); >> 138 } >> 139 >> 140 //projected angles distribution at exit >> 141 // >> 142 if (transmit && charged) id = 13; >> 143 else if (transmit && neutral) id = 23; >> 144 else if (reflect && charged) id = 33; >> 145 else if (reflect && neutral) id = 43; >> 146 >> 147 if(id>0) { >> 148 G4double tet = std::atan(direction.y()/std::fabs(direction.x())); >> 149 histoManager->FillHisto(id,tet); >> 150 if (transmit && (flag == 2)) runaction->AddMscProjTheta(tet); >> 151 >> 152 tet = std::atan(direction.z()/std::fabs(direction.x())); >> 153 histoManager->FillHisto(id,tet); >> 154 if (transmit && (flag == 2)) runaction->AddMscProjTheta(tet); >> 155 } >> 156 >> 157 //projected position and radius at exit >> 158 // >> 159 if (transmit && charged) id = 14; >> 160 >> 161 if (id>0) { 210 G4double y = position.y(), z = position.z( 162 G4double y = position.y(), z = position.z(); 211 G4double r = std::sqrt(y * y + z * z); << 163 G4double r = std::sqrt(y*y + z*z); 212 analysisManager->FillH1(14, y); << 164 histoManager->FillHisto(id, y); 213 analysisManager->FillH1(14, z); << 165 histoManager->FillHisto(id, z); 214 analysisManager->FillH1(15, r); << 166 histoManager->FillHisto(id+1, r); 215 } 167 } 216 << 168 217 // x-vertex of charged secondaries << 169 //x-vertex of charged secondaries 218 // 170 // 219 if ((aTrack->GetParentID() == 1) && charged) 171 if ((aTrack->GetParentID() == 1) && charged) { 220 G4double xVertex = (aTrack->GetVertexPosit 172 G4double xVertex = (aTrack->GetVertexPosition()).x(); 221 analysisManager->FillH1(6, xVertex); << 173 histoManager->FillHisto(4, xVertex); 222 if (notabsor) analysisManager->FillH1(7, x << 174 if (notabsor) histoManager->FillHisto(5, xVertex); 223 } 175 } 224 } 176 } 225 177 226 //....oooOO0OOooo........oooOO0OOooo........oo 178 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 179 227 180