Geant4 Cross Reference |
1 // << 2 // ******************************************* 1 // ******************************************************************** 3 // * License and Disclaimer << 2 // * DISCLAIMER * 4 // * 3 // * * 5 // * The Geant4 software is copyright of th << 4 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 5 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 6 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 7 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 8 // * * 11 // * Neither the authors of this software syst 9 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 10 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 11 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 12 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 13 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 14 // * * 18 // * This code implementation is the result << 15 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 16 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 17 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 18 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 19 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 20 // ******************************************************************** 25 // 21 // >> 22 // $Id: G4TrajectoryDrawByCharge.cc,v 1.3 2005/11/23 20:24:15 tinslay Exp $ >> 23 // GEANT4 tag $Name: geant4-08-00-patch-01 $ 26 // 24 // 27 // Jane Tinslay, John Allison, Joseph Perl Nov 25 // Jane Tinslay, John Allison, Joseph Perl November 2005 >> 26 28 #include "G4TrajectoryDrawByCharge.hh" 27 #include "G4TrajectoryDrawByCharge.hh" >> 28 #include "G4Polyline.hh" >> 29 #include "G4Polymarker.hh" 29 #include "G4TrajectoryDrawerUtils.hh" 30 #include "G4TrajectoryDrawerUtils.hh" 30 #include "G4VisTrajContext.hh" << 31 #include "G4VisAttributes.hh" 31 #include "G4VTrajectory.hh" 32 #include "G4VTrajectory.hh" >> 33 #include "G4VVisManager.hh" 32 #include <sstream> 34 #include <sstream> 33 35 34 G4TrajectoryDrawByCharge::G4TrajectoryDrawByCh << 36 G4TrajectoryDrawByCharge::G4TrajectoryDrawByCharge(const G4String& name) 35 :G4VTrajectoryModel(name, context) << 37 :G4VTrajectoryModel(name) 36 { 38 { 37 // Default configuration 39 // Default configuration 38 fMap[Positive] = G4Colour::Blue(); << 40 fMap[Positive] = G4Color::Blue(); 39 fMap[Negative] = G4Colour::Red(); 41 fMap[Negative] = G4Colour::Red(); 40 fMap[Neutral] = G4Colour::Green(); 42 fMap[Neutral] = G4Colour::Green(); 41 } 43 } 42 44 43 G4TrajectoryDrawByCharge::G4TrajectoryDrawByCh 45 G4TrajectoryDrawByCharge::G4TrajectoryDrawByCharge(const G4String& name, 44 const G4Colour& positive, 46 const G4Colour& positive, 45 const G4Colour& negative, 47 const G4Colour& negative, 46 const G4Colour& neutral) 48 const G4Colour& neutral) 47 :G4VTrajectoryModel(name) 49 :G4VTrajectoryModel(name) 48 { 50 { 49 fMap[Positive] = positive; 51 fMap[Positive] = positive; 50 fMap[Negative] = negative; 52 fMap[Negative] = negative; 51 fMap[Neutral] = neutral; 53 fMap[Neutral] = neutral; 52 } 54 } 53 55 54 G4TrajectoryDrawByCharge::~G4TrajectoryDrawByC 56 G4TrajectoryDrawByCharge::~G4TrajectoryDrawByCharge() {} 55 57 56 void 58 void 57 G4TrajectoryDrawByCharge::Draw(const G4VTrajec << 59 G4TrajectoryDrawByCharge::Draw(const G4VTrajectory& traj, G4int i_mode) const 58 { 60 { 59 G4Colour colour; << 61 // If i_mode>=0, draws a trajectory as a polyline (default is blue for 60 << 62 // positive, red for negative, green for neutral) and, if i_mode!=0, 61 const G4double charge = traj.GetCharge(); << 63 // adds markers - yellow circles for step points and magenta squares 62 << 64 // for auxiliary points, if any - whose screen size in pixels is 63 if(charge>0.) fMap.GetColour(Positive, << 65 // given by std::abs(i_mode)/1000. E.g: i_mode = 5000 gives easily 64 else if(charge<0.) fMap.GetColour(Negative, << 66 // visible markers. 65 else fMap.GetColour(Neutral, c << 67 66 << 68 G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance(); 67 G4VisTrajContext myContext(GetContext()); << 69 if (0 == pVVisManager) return; 68 << 70 69 myContext.SetLineColour(colour); << 71 const G4double markerSize = std::abs(i_mode)/1000; 70 << 72 G4bool lineRequired (i_mode >= 0); 71 if (GetVerbose()) { << 73 G4bool markersRequired (markerSize > 0.); 72 G4cout<<"G4TrajectoryDrawByCharge drawer n << 74 73 G4cout<<", drawing trajectory with charge, << 75 // Return if don't need to do anything 74 G4cout<<", with configuration:"<<G4endl; << 76 if (!lineRequired && !markersRequired) return; 75 myContext.Print(G4cout); << 77 >> 78 // Get points to draw >> 79 G4Polyline trajectoryLine; >> 80 G4Polymarker stepPoints; >> 81 G4Polymarker auxiliaryPoints; >> 82 >> 83 G4TrajectoryDrawerUtils::GetPoints(traj, trajectoryLine, >> 84 auxiliaryPoints, stepPoints); >> 85 >> 86 if (lineRequired) { >> 87 G4Colour colour; >> 88 const G4double charge = traj.GetCharge(); >> 89 if(charge>0.) colour = fMap.find(Positive)->second; >> 90 else if(charge<0.) colour = fMap.find(Negative)->second; >> 91 else colour = fMap.find(Neutral)->second; >> 92 >> 93 G4VisAttributes trajectoryLineAttribs(colour); >> 94 trajectoryLine.SetVisAttributes(&trajectoryLineAttribs); >> 95 pVVisManager->Draw(trajectoryLine); 76 } 96 } 77 97 78 G4TrajectoryDrawerUtils::DrawLineAndPoints(t << 98 if (markersRequired) { >> 99 auxiliaryPoints.SetMarkerType(G4Polymarker::squares); >> 100 auxiliaryPoints.SetScreenSize(markerSize); >> 101 auxiliaryPoints.SetFillStyle(G4VMarker::filled); >> 102 G4VisAttributes auxiliaryPointsAttribs(G4Colour(0.,1.,1.)); // Magenta >> 103 auxiliaryPoints.SetVisAttributes(&auxiliaryPointsAttribs); >> 104 pVVisManager->Draw(auxiliaryPoints); >> 105 >> 106 stepPoints.SetMarkerType(G4Polymarker::circles); >> 107 stepPoints.SetScreenSize(markerSize); >> 108 stepPoints.SetFillStyle(G4VMarker::filled); >> 109 G4VisAttributes stepPointsAttribs(G4Colour(1.,1.,0.)); // Yellow. >> 110 stepPoints.SetVisAttributes(&stepPointsAttribs); >> 111 pVVisManager->Draw(stepPoints); >> 112 } 79 } 113 } 80 114 81 void 115 void 82 G4TrajectoryDrawByCharge::Print(std::ostream& 116 G4TrajectoryDrawByCharge::Print(std::ostream& ostr) const 83 { 117 { 84 ostr<<"G4TrajectoryDrawByCharge model "<< Na 118 ostr<<"G4TrajectoryDrawByCharge model "<< Name() <<" colour scheme: "<<std::endl; 85 fMap.Print(ostr); << 119 std::map<Charge, G4Colour>::const_iterator iter = fMap.begin(); 86 ostr<<"Default configuration:"<<G4endl; << 87 GetContext().Print(G4cout); << 88 } << 89 120 90 void << 121 while (iter != fMap.end()) { 91 G4TrajectoryDrawByCharge::Set(const Charge& ch << 122 ostr<< iter->first <<" : "<< iter->second <<G4endl; 92 { << 123 iter++; 93 fMap.Set(charge, colour); << 124 } 94 } 125 } 95 126 96 void 127 void 97 G4TrajectoryDrawByCharge::Set(const Charge& ch << 128 G4TrajectoryDrawByCharge::Set(Charge charge, const G4String& colour) 98 { 129 { 99 fMap[charge] = colour; << 130 G4Colour myColour(G4Colour::White()); 100 } << 101 131 102 void << 132 // Will not modify myColour if colour key does not exist 103 G4TrajectoryDrawByCharge::Set(const G4String& << 133 if (!G4Colour::GetColour(colour, myColour)) { 104 { << 134 std::ostringstream o; 105 Charge myCharge; << 135 o << "G4Colour with key "<<colour<<" does not exist "; 106 << 136 G4Exception 107 if (!ConvertToCharge(charge, myCharge)) { << 137 ("G4TrajectoryDrawByCharge::Set(Charge charge, const G4String& colour)", 108 G4ExceptionDescription ed; << 138 "NonExistentColour", JustWarning, o.str().c_str()); 109 ed << "Invalid charge "<<charge; << 110 G4Exception << 111 ("G4TrajectoryDrawByCharge::Set(const G4 << 112 return; << 113 } 139 } 114 140 115 return Set(myCharge, colour); << 141 Set(charge, myColour); 116 } 142 } 117 143 118 void 144 void 119 G4TrajectoryDrawByCharge::Set(const G4String& << 145 G4TrajectoryDrawByCharge::Set(Charge charge, const G4Colour& colour) 120 { << 121 Charge myCharge; << 122 << 123 if (!ConvertToCharge(charge, myCharge)) { << 124 G4ExceptionDescription ed; << 125 ed << "Invalid charge "<<charge; << 126 G4Exception << 127 ("G4TrajectoryDrawByCharge::Set(const G4 << 128 } << 129 << 130 return Set(myCharge, colour); << 131 } << 132 << 133 G4bool << 134 G4TrajectoryDrawByCharge::ConvertToCharge(cons << 135 { 146 { 136 bool result(true); << 147 fMap[charge] = colour; 137 << 138 G4int charge; << 139 std::istringstream is(string.c_str()); << 140 is >> charge; << 141 << 142 switch (charge) { << 143 case 1: << 144 myCharge = G4TrajectoryDrawByCharge::Posit << 145 break; << 146 case 0: << 147 myCharge = G4TrajectoryDrawByCharge::Neutr << 148 break; << 149 case -1: << 150 myCharge = G4TrajectoryDrawByCharge::Negat << 151 break; << 152 default: << 153 result = false; << 154 } << 155 << 156 return result; << 157 } 148 } 158 149