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 // ------------------------------------------------------------------- 27 // Nucl.Instrum.Meth.B260:20-27, 2007 << 27 // $Id: SteppingAction.cc,v 1.2 2008/01/25 20:49:24 sincerti Exp $ >> 28 // ------------------------------------------------------------------- 28 29 29 #include "SteppingAction.hh" 30 #include "SteppingAction.hh" 30 #include "G4AnalysisManager.hh" << 31 #include "G4SystemOfUnits.hh" << 32 31 33 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 34 33 35 SteppingAction::SteppingAction(RunAction* run, << 34 SteppingAction::SteppingAction(RunAction* run,DetectorConstruction* det,PrimaryGeneratorAction* pri) 36 :fRun(run),fDetector(det) << 35 :Run(run),Detector(det),Primary(pri) 37 {} << 36 { } 38 37 39 //....oooOO0OOooo........oooOO0OOooo........oo 38 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 40 39 41 SteppingAction::~SteppingAction() 40 SteppingAction::~SteppingAction() 42 {} << 41 { } 43 42 44 //....oooOO0OOooo........oooOO0OOooo........oo 43 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 45 44 46 void SteppingAction::UserSteppingAction(const << 45 void SteppingAction::UserSteppingAction(const G4Step* s) 47 46 48 { 47 { 49 48 50 G4AnalysisManager* man = G4AnalysisManager::In << 51 49 52 << 50 if ( (s->GetTrack()->GetDynamicParticle()->GetDefinition() ->GetParticleName() == "proton") 53 if ( (step->GetTrack()->GetDynamicParticle()- << 54 G4Proton::ProtonDefinition()) << 55 51 56 /* 52 /* 57 // for doublet 53 // for doublet 58 54 59 && (step->GetPostStepPoint()->GetPosition( << 55 && (s->GetTrack()->GetPosition().z()>-3230.2) 60 && (step->GetPostStepPoint()->GetPosi << 56 && (s->GetTrack()->GetPosition().z()<-3229.8) 61 */ 57 */ 62 58 63 // for triplet and whole line 59 // for triplet and whole line 64 60 65 && (step->GetPostStepPoint()->GetPosi << 61 && (s->GetTrack()->GetPosition().z()>249.99999) 66 && (step->GetPostStepPoint()->GetPosi << 62 && (s->GetTrack()->GetPosition().z()<250.00001) 67 && (step->GetPreStepPoint()->GetTouch << 63 && (s->GetPreStepPoint()->GetPhysicalVolume()->GetName() == "Vol") 68 GetLogicalVolume()->GetName << 64 && (s->GetPostStepPoint()->GetPhysicalVolume()->GetName() == "World") 69 && (step->GetPostStepPoint()->GetTouc << 65 ) 70 GetLogicalVolume()->GetName( << 66 71 ) << 72 << 73 { 67 { 74 fXIn = step->GetPostStepPoint()->GetP << 68 xIn = s->GetTrack()->GetPosition().x(); 75 fYIn = step->GetPostStepPoint()->GetP << 69 yIn = s->GetTrack()->GetPosition().y(); 76 fZIn = step->GetPostStepPoint()->GetP << 70 zIn = s->GetTrack()->GetPosition().z(); 77 fE = step->GetTrack()->GetKineticEn << 71 E = s->GetTrack()->GetKineticEnergy(); 78 << 72 79 G4ThreeVector angleIn; << 73 G4ThreeVector angleIn; 80 angleIn = step->GetTrack()->GetMoment << 74 angleIn = s->GetTrack()->GetMomentumDirection(); 81 << 75 82 fThetaIn = std::asin(angleIn[0]/std:: << 76 thetaIn = std::asin(angleIn[0]/std::sqrt(angleIn[0]*angleIn[0]+angleIn[1]*angleIn[1]+angleIn[2]*angleIn[2])); 83 *angleIn[0]+angleIn[1]*angl << 77 phiIn = std::asin(angleIn[1]/std::sqrt(angleIn[0]*angleIn[0]+angleIn[1]*angleIn[1]+angleIn[2]*angleIn[2])); 84 fPhiIn = std::asin(angleIn[1]/std::sq << 78 85 *angleIn[0]+angleIn[1]*angl << 79 G4cout << " =>IMAGE : X(microns)=" << xIn/micrometer <<" Y(microns)="<< yIn/micrometer << " THETA(mrad)=" << (thetaIn/mrad) << " PHI(mrad)=" << (phiIn/mrad) << G4endl; 86 << 80 G4cout << G4endl; 87 G4cout << " =>IMAGE : X(microns)=" << 81 88 <<" Y(microns)="<< fYIn/microm << 82 FILE *myFile1; 89 << (fThetaIn/mrad) << " PHI(mr << 83 myFile1=fopen ("results/x.txt","a"); 90 G4cout << G4endl; << 84 fprintf(myFile1,"%e \n",xIn*1000); 91 << 85 fclose (myFile1); 92 if (fDetector->GetCoef()==1) << 86 93 { << 87 FILE *myFile2; 94 fRun->AddRow(); << 88 myFile2=fopen ("results/y.txt","a"); 95 fRun->AddToXVector(fXIn/um); << 89 fprintf(myFile2,"%e \n",yIn*1000); 96 fRun->AddToYVector(fYIn/um); << 90 fclose (myFile2); 97 fRun->AddToThetaVector(fThetaIn/mra << 91 98 fRun->AddToPhiVector(fPhiIn/mrad); << 92 FILE *myFile3; 99 } << 93 myFile3=fopen ("results/theta.txt","a"); 100 << 94 fprintf(myFile3,"%e \n",thetaIn*1000); 101 //Fill ntuple 3 << 95 fclose (myFile3); 102 man->FillNtupleDColumn(3,0,fXIn/um); << 96 103 man->FillNtupleDColumn(3,1,fYIn/um); << 97 FILE *myFile4; 104 man->FillNtupleDColumn(3,2,fThetaIn/mrad); << 98 myFile4=fopen ("results/phi.txt","a"); 105 man->FillNtupleDColumn(3,3,fPhiIn/mrad); << 99 fprintf(myFile4,"%e \n",phiIn*1000); 106 man->AddNtupleRow(3); << 100 fclose (myFile4); >> 101 >> 102 FILE *myFile5; >> 103 myFile5=fopen ("results/image.txt","a"); >> 104 fprintf(myFile5,"%e %e\n",xIn*1000, yIn*1000); >> 105 fclose (myFile5); 107 106 108 } 107 } 109 108 110 if (fDetector->GetProfile()==1) << 109 if (Detector->GetProfile()==1) 111 { 110 { 112 111 113 if ( << 112 if ( 114 (step->GetTrack()->GetDynamicParti << 113 (s->GetTrack()->GetDynamicParticle()->GetDefinition() ->GetParticleName() == "proton") 115 && (step->GetPreStepPoint()->GetTouch << 114 && (s->GetPreStepPoint()->GetPhysicalVolume()->GetName() == "Vol") 116 ->GetVolume()->GetLogicalVolume() << 115 && (s->GetPostStepPoint()->GetPhysicalVolume()->GetName() == "Vol") ) 117 && (step->GetPostStepPoint()->GetTouc << 116 { 118 ->GetVolume()->GetLogicalVolume()- << 117 xIn = s->GetTrack()->GetPosition().x(); 119 ) << 118 yIn = s->GetTrack()->GetPosition().y(); 120 { << 119 zIn = s->GetTrack()->GetPosition().z(); 121 fXIn = step->GetPostStepPoint()->GetP << 120 FILE *myFile6; 122 fYIn = step->GetPostStepPoint()->GetP << 121 myFile6=fopen ("results/profile.txt","a"); 123 fZIn = step->GetPostStepPoint()->GetP << 122 fprintf(myFile6,"%e %e %e\n",xIn*1000, yIn*1000, zIn); 124 << 123 fclose (myFile6); 125 //Fill ntuple 1 << 124 } 126 man->FillNtupleDColumn(1,0,fXIn/um); << 125 127 man->FillNtupleDColumn(1,1,fYIn/um); << 128 man->FillNtupleDColumn(1,2,fZIn/um); << 129 man->AddNtupleRow(1); << 130 } << 131 } 126 } 132 << 127 133 if (fDetector->GetGrid()==1) << 128 if (Detector->GetGrid()==1) 134 { 129 { 135 130 136 if ( << 131 if ( 137 (step->GetTrack()->GetDynamicParti << 132 (s->GetTrack()->GetDynamicParticle()->GetDefinition() ->GetParticleName() == "proton") 138 && (step->GetPreStepPoint()->GetTouch << 133 && (s->GetPreStepPoint()->GetPhysicalVolume()->GetName() == "ControlVol_GridShadow") 139 ->GetVolume()->GetLogicalVolume() << 134 && (s->GetPostStepPoint()->GetPhysicalVolume()->GetName() == "World") ) 140 && (step->GetPostStepPoint()->GetTouc << 135 { 141 ->GetVolume()->GetLogicalVolume() << 136 xIn = s->GetTrack()->GetPosition().x(); 142 ) << 137 yIn = s->GetTrack()->GetPosition().y(); 143 { << 138 E = s->GetTrack()->GetKineticEnergy(); 144 fXIn = step->GetPostStepPoint()->GetP << 139 FILE *myFile7; 145 fYIn = step->GetPostStepPoint()->GetP << 140 myFile7=fopen ("results/grid.txt","a"); 146 fE = step->GetTrack()->GetKineticEn << 141 fprintf(myFile7,"%e %e %e\n",xIn*1000, yIn*1000, E); 147 << 142 fclose (myFile7); 148 //Fill ntuple 2 << 143 } 149 man->FillNtupleDColumn(2,0,fXIn/um); << 144 150 man->FillNtupleDColumn(2,1,fYIn/um); << 145 } 151 man->FillNtupleDColumn(2,2,fE/MeV); << 152 man->AddNtupleRow(2); << 153 } << 154 } << 155 146 156 // end 147 // end 157 } 148 } 158 149