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 // Please cite the following paper if you use 26 // Please cite the following paper if you use this software 27 // Nucl.Instrum.Meth.B260:20-27, 2007 27 // Nucl.Instrum.Meth.B260:20-27, 2007 28 28 29 #include "SteppingAction.hh" 29 #include "SteppingAction.hh" 30 #include "G4AnalysisManager.hh" << 30 #include "Analysis.hh" 31 #include "G4SystemOfUnits.hh" 31 #include "G4SystemOfUnits.hh" 32 32 33 //....oooOO0OOooo........oooOO0OOooo........oo 33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 34 34 35 SteppingAction::SteppingAction(RunAction* run, 35 SteppingAction::SteppingAction(RunAction* run,DetectorConstruction* det) 36 :fRun(run),fDetector(det) 36 :fRun(run),fDetector(det) 37 {} 37 {} 38 38 39 //....oooOO0OOooo........oooOO0OOooo........oo 39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 40 40 41 SteppingAction::~SteppingAction() 41 SteppingAction::~SteppingAction() 42 {} 42 {} 43 43 44 //....oooOO0OOooo........oooOO0OOooo........oo 44 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 45 45 46 void SteppingAction::UserSteppingAction(const 46 void SteppingAction::UserSteppingAction(const G4Step* step) 47 47 48 { 48 { 49 49 50 G4AnalysisManager* man = G4AnalysisManager::In 50 G4AnalysisManager* man = G4AnalysisManager::Instance(); 51 51 52 52 53 if ( (step->GetTrack()->GetDynamicParticle()- 53 if ( (step->GetTrack()->GetDynamicParticle()->GetDefinition() == 54 G4Proton::ProtonDefinition()) 54 G4Proton::ProtonDefinition()) 55 55 56 /* 56 /* 57 // for doublet 57 // for doublet 58 58 59 && (step->GetPostStepPoint()->GetPosition( 59 && (step->GetPostStepPoint()->GetPosition().z()/mm>-3230.2) 60 && (step->GetPostStepPoint()->GetPosi 60 && (step->GetPostStepPoint()->GetPosition().z()/mm<-3229.8) 61 */ 61 */ 62 62 63 // for triplet and whole line 63 // for triplet and whole line 64 64 65 && (step->GetPostStepPoint()->GetPosi 65 && (step->GetPostStepPoint()->GetPosition().z()/mm>249.99999) 66 && (step->GetPostStepPoint()->GetPosi 66 && (step->GetPostStepPoint()->GetPosition().z()/mm<250.00001) 67 && (step->GetPreStepPoint()->GetTouch 67 && (step->GetPreStepPoint()->GetTouchableHandle()->GetVolume()-> 68 GetLogicalVolume()->GetName 68 GetLogicalVolume()->GetName() == fDetector->GetLogicalVol()->GetName()) 69 && (step->GetPostStepPoint()->GetTouc 69 && (step->GetPostStepPoint()->GetTouchableHandle()->GetVolume()-> 70 GetLogicalVolume()->GetName( 70 GetLogicalVolume()->GetName() == fDetector->GetLogicalWorld()->GetName()) 71 ) 71 ) 72 72 73 { 73 { 74 fXIn = step->GetPostStepPoint()->GetP 74 fXIn = step->GetPostStepPoint()->GetPosition().x(); 75 fYIn = step->GetPostStepPoint()->GetP 75 fYIn = step->GetPostStepPoint()->GetPosition().y(); 76 fZIn = step->GetPostStepPoint()->GetP 76 fZIn = step->GetPostStepPoint()->GetPosition().z(); 77 fE = step->GetTrack()->GetKineticEn 77 fE = step->GetTrack()->GetKineticEnergy(); 78 78 79 G4ThreeVector angleIn; 79 G4ThreeVector angleIn; 80 angleIn = step->GetTrack()->GetMoment 80 angleIn = step->GetTrack()->GetMomentumDirection(); 81 81 82 fThetaIn = std::asin(angleIn[0]/std:: 82 fThetaIn = std::asin(angleIn[0]/std::sqrt(angleIn[0] 83 *angleIn[0]+angleIn[1]*angl 83 *angleIn[0]+angleIn[1]*angleIn[1]+angleIn[2]*angleIn[2])); 84 fPhiIn = std::asin(angleIn[1]/std::sq 84 fPhiIn = std::asin(angleIn[1]/std::sqrt(angleIn[0] 85 *angleIn[0]+angleIn[1]*angl 85 *angleIn[0]+angleIn[1]*angleIn[1]+angleIn[2]*angleIn[2])); 86 86 87 G4cout << " =>IMAGE : X(microns)=" 87 G4cout << " =>IMAGE : X(microns)=" << fXIn/micrometer 88 <<" Y(microns)="<< fYIn/microm 88 <<" Y(microns)="<< fYIn/micrometer << " THETA(mrad)=" 89 << (fThetaIn/mrad) << " PHI(mr 89 << (fThetaIn/mrad) << " PHI(mrad)=" << (fPhiIn/mrad) << G4endl; 90 G4cout << G4endl; 90 G4cout << G4endl; 91 91 92 if (fDetector->GetCoef()==1) 92 if (fDetector->GetCoef()==1) 93 { 93 { 94 fRun->AddRow(); 94 fRun->AddRow(); 95 fRun->AddToXVector(fXIn/um); 95 fRun->AddToXVector(fXIn/um); 96 fRun->AddToYVector(fYIn/um); 96 fRun->AddToYVector(fYIn/um); 97 fRun->AddToThetaVector(fThetaIn/mra 97 fRun->AddToThetaVector(fThetaIn/mrad); 98 fRun->AddToPhiVector(fPhiIn/mrad); 98 fRun->AddToPhiVector(fPhiIn/mrad); 99 } 99 } 100 100 101 //Fill ntuple 3 101 //Fill ntuple 3 102 man->FillNtupleDColumn(3,0,fXIn/um); 102 man->FillNtupleDColumn(3,0,fXIn/um); 103 man->FillNtupleDColumn(3,1,fYIn/um); 103 man->FillNtupleDColumn(3,1,fYIn/um); 104 man->FillNtupleDColumn(3,2,fThetaIn/mrad); 104 man->FillNtupleDColumn(3,2,fThetaIn/mrad); 105 man->FillNtupleDColumn(3,3,fPhiIn/mrad); 105 man->FillNtupleDColumn(3,3,fPhiIn/mrad); 106 man->AddNtupleRow(3); 106 man->AddNtupleRow(3); 107 107 108 } 108 } 109 109 110 if (fDetector->GetProfile()==1) 110 if (fDetector->GetProfile()==1) 111 { 111 { 112 112 113 if ( 113 if ( 114 (step->GetTrack()->GetDynamicParti 114 (step->GetTrack()->GetDynamicParticle()->GetDefinition()== G4Proton::ProtonDefinition()) 115 && (step->GetPreStepPoint()->GetTouch 115 && (step->GetPreStepPoint()->GetTouchableHandle() 116 ->GetVolume()->GetLogicalVolume() 116 ->GetVolume()->GetLogicalVolume()->GetName() == fDetector->GetLogicalVol()->GetName()) 117 && (step->GetPostStepPoint()->GetTouc 117 && (step->GetPostStepPoint()->GetTouchableHandle() 118 ->GetVolume()->GetLogicalVolume()- 118 ->GetVolume()->GetLogicalVolume()->GetName() == fDetector->GetLogicalVol()->GetName()) 119 ) 119 ) 120 { 120 { 121 fXIn = step->GetPostStepPoint()->GetP 121 fXIn = step->GetPostStepPoint()->GetPosition().x(); 122 fYIn = step->GetPostStepPoint()->GetP 122 fYIn = step->GetPostStepPoint()->GetPosition().y(); 123 fZIn = step->GetPostStepPoint()->GetP 123 fZIn = step->GetPostStepPoint()->GetPosition().z(); 124 124 125 //Fill ntuple 1 125 //Fill ntuple 1 126 man->FillNtupleDColumn(1,0,fXIn/um); 126 man->FillNtupleDColumn(1,0,fXIn/um); 127 man->FillNtupleDColumn(1,1,fYIn/um); 127 man->FillNtupleDColumn(1,1,fYIn/um); 128 man->FillNtupleDColumn(1,2,fZIn/um); 128 man->FillNtupleDColumn(1,2,fZIn/um); 129 man->AddNtupleRow(1); 129 man->AddNtupleRow(1); 130 } 130 } 131 } 131 } 132 132 133 if (fDetector->GetGrid()==1) 133 if (fDetector->GetGrid()==1) 134 { 134 { 135 135 136 if ( 136 if ( 137 (step->GetTrack()->GetDynamicParti 137 (step->GetTrack()->GetDynamicParticle()->GetDefinition()== G4Proton::ProtonDefinition()) 138 && (step->GetPreStepPoint()->GetTouch 138 && (step->GetPreStepPoint()->GetTouchableHandle() 139 ->GetVolume()->GetLogicalVolume() 139 ->GetVolume()->GetLogicalVolume()->GetName() == fDetector->GetLogicalGrid()->GetName()) 140 && (step->GetPostStepPoint()->GetTouc 140 && (step->GetPostStepPoint()->GetTouchableHandle() 141 ->GetVolume()->GetLogicalVolume() 141 ->GetVolume()->GetLogicalVolume()->GetName() == fDetector->GetLogicalWorld()->GetName()) 142 ) 142 ) 143 { 143 { 144 fXIn = step->GetPostStepPoint()->GetP 144 fXIn = step->GetPostStepPoint()->GetPosition().x(); 145 fYIn = step->GetPostStepPoint()->GetP 145 fYIn = step->GetPostStepPoint()->GetPosition().y(); 146 fE = step->GetTrack()->GetKineticEn 146 fE = step->GetTrack()->GetKineticEnergy(); 147 147 148 //Fill ntuple 2 148 //Fill ntuple 2 149 man->FillNtupleDColumn(2,0,fXIn/um); 149 man->FillNtupleDColumn(2,0,fXIn/um); 150 man->FillNtupleDColumn(2,1,fYIn/um); 150 man->FillNtupleDColumn(2,1,fYIn/um); 151 man->FillNtupleDColumn(2,2,fE/MeV); 151 man->FillNtupleDColumn(2,2,fE/MeV); 152 man->AddNtupleRow(2); 152 man->AddNtupleRow(2); 153 } 153 } 154 } 154 } 155 155 156 // end 156 // end 157 } 157 } 158 158