Geant4 Cross Reference |
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 // 26 // 27 // -------------------------------------------------------------- 28 // GEANT 4 - Underground Dark Matter Detector Advanced Example 29 // 30 // For information related to this code contact: Alex Howard 31 // e-mail: alexander.howard@cern.ch 32 // -------------------------------------------------------------- 33 // Comments 34 // 35 // Underground Advanced 36 // by A. Howard and H. Araujo 37 // (27th November 2001) 38 // 39 // History: 40 // 21 Feb 2002 AH: Added Analysis 41 // 42 // SteppingAction program 43 // -------------------------------------------------------------- 44 45 #include "DMXSteppingAction.hh" 46 #include "DMXSteppingActionMessenger.hh" 47 48 #include "DMXEventAction.hh" 49 50 #include "G4AnalysisManager.hh" 51 #include "G4RunManager.hh" 52 #include "G4Track.hh" 53 #include "G4Step.hh" 54 #include "G4StepPoint.hh" 55 #include "G4TrackStatus.hh" 56 #include "G4ParticleDefinition.hh" 57 #include "G4ParticleTypes.hh" 58 #include "G4VVisManager.hh" 59 #include "G4Colour.hh" 60 #include "G4Polyline.hh" 61 #include "G4VisAttributes.hh" 62 #include "globals.hh" 63 #include "G4ios.hh" 64 65 66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 67 68 DMXSteppingAction::DMXSteppingAction() 69 : evtAction(0) { 70 71 steppingMessenger = new DMXSteppingActionMessenger(this); 72 73 // defaults for messenger 74 colourNeutronFlag = "magenta"; 75 colourGammaFlag = "cyan"; 76 colourOpticalFlag = "white"; 77 colourChargedPlusFlag = "red"; 78 colourChargedMinusFlag = "blue"; 79 80 } 81 82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 83 84 DMXSteppingAction::~DMXSteppingAction() 85 { 86 87 delete steppingMessenger; 88 89 } 90 91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 92 93 void DMXSteppingAction::UserSteppingAction(const G4Step* fStep) 94 { 95 if (!evtAction) 96 evtAction = 97 dynamic_cast<const DMXEventAction*> 98 (G4RunManager::GetRunManager()->GetUserEventAction()); 99 100 101 // removed 28/11/01 - unnecessary unless program "freezes" 102 // kill track if too many steps 103 // NB: This is set to DBL_MAX - therefore may cause program to "hang" 104 // G4int MaxNoSteps = DBL_MAX; 105 // G4int StepNo = fStep->GetTrack()->GetCurrentStepNumber(); 106 // if(StepNo >= MaxNoSteps) fStep->GetTrack()->SetTrackStatus(fStopAndKill); 107 108 G4int StepNo = fStep->GetTrack()->GetCurrentStepNumber(); 109 if(StepNo == 1) 110 { 111 G4double partEnergy = fStep->GetPreStepPoint()->GetKineticEnergy(); 112 G4ParticleDefinition* particleType = fStep->GetTrack()->GetDefinition(); 113 114 G4AnalysisManager* man = G4AnalysisManager::Instance(); 115 if (particleType == G4Gamma::Definition()) 116 man->FillH1(8,partEnergy); 117 else if (particleType == G4Neutron::Definition()) 118 man->FillH1(9,partEnergy); 119 else if (particleType == G4Electron::Definition()) 120 man->FillH1(10,partEnergy); 121 else if (particleType == G4Positron::Definition()) 122 man->FillH1(11,partEnergy); 123 else 124 man->FillH1(12,partEnergy); 125 } 126 127 128 // check what is to be drawn from EventAction/EventActionMessenger 129 G4String drawColsFlag = evtAction->GetDrawColsFlag(); 130 G4String drawTrksFlag = evtAction->GetDrawTrksFlag(); 131 132 // draw by step (here) instead of by event (event action) 133 if (drawColsFlag=="custom" && drawTrksFlag!="none") { 134 135 // check that VisManager exists 136 G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); 137 if(pVVisManager) { 138 139 // particle colour in a string 140 G4String name = fStep->GetTrack()->GetDefinition()->GetParticleName(); 141 G4String strColour; 142 if(name=="neutron") { 143 if(drawTrksFlag=="charged") return; 144 strColour = colourNeutronFlag; 145 } else if (name=="gamma") { 146 if(drawTrksFlag=="charged") return; 147 strColour = colourGammaFlag; 148 } else if (name=="opticalphoton") { 149 if(drawTrksFlag!="all") return; 150 strColour = colourOpticalFlag; 151 } 152 else if (name=="alpha" || name=="e+") 153 strColour = colourChargedPlusFlag; 154 else 155 strColour = colourChargedMinusFlag; 156 157 // convert string to G4Colour 158 G4Colour colour; 159 if (strColour=="white") colour=G4Colour(1.0, 1.0, 1.0); 160 else if(strColour=="grey" ) colour=G4Colour(0.5, 0.5, 0.5); 161 else if(strColour=="lgrey") colour=G4Colour(.75, .75, .75); 162 else if(strColour=="black") colour=G4Colour(0.0, 0.0, 0.0); 163 else if(strColour=="red") colour=G4Colour(1.0, 0.0, 0.0); 164 else if(strColour=="green") colour=G4Colour(0.0, 1.0, 0.0); 165 else if(strColour=="blue") colour=G4Colour(0.0, 0.0, 1.0); 166 else if(strColour=="cyan") colour=G4Colour(0.0, 1.0, 1.0); 167 else if(strColour=="magenta") colour=G4Colour(1.0, 0.0, 1.0); 168 else if(strColour=="yellow") colour=G4Colour(1.0, 1.0, 0.0); 169 else if(strColour=="lgreen") colour=G4Colour(0.0, .75, 0.0); 170 else if(strColour=="lblue") colour=G4Colour(0.0, 0.0, .75); 171 else colour=G4Colour(1.0, 1.0, 1.0); 172 173 // create line with colour 174 G4VisAttributes attribs(colour); 175 G4Polyline polyline; 176 polyline.SetVisAttributes(attribs); 177 178 // draw line 179 G4Point3D start(fStep->GetPreStepPoint()->GetPosition()); 180 G4Point3D end(fStep->GetPostStepPoint()->GetPosition()); 181 polyline.push_back(start); 182 polyline.push_back(end); 183 pVVisManager->Draw(polyline); 184 } 185 186 } 187 188 } 189 190 191