Import Geant4 8.2.0 source tree
This commit is contained in:
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4TrajectoryDrawerUtils.cc,v 1.6 2006/06/29 21:33:12 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-01 $
|
||||
// $Id: G4TrajectoryDrawerUtils.cc,v 1.10 2006/08/30 10:32:14 allison Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
//
|
||||
// Jane Tinslay, John Allison, Joseph Perl November 2005
|
||||
//
|
||||
@@ -37,10 +37,12 @@
|
||||
#include "G4VisAttributes.hh"
|
||||
#include "G4VisTrajContext.hh"
|
||||
#include "G4VVisManager.hh"
|
||||
#include "G4UIcommand.hh"
|
||||
#include "G4AttValue.hh"
|
||||
|
||||
namespace G4TrajectoryDrawerUtils {
|
||||
|
||||
|
||||
|
||||
void GetPoints(const G4VTrajectory& traj, G4Polyline& trajectoryLine,
|
||||
G4Polymarker& auxiliaryPoints, G4Polymarker& stepPoints)
|
||||
{
|
||||
@@ -114,11 +116,231 @@ namespace G4TrajectoryDrawerUtils {
|
||||
|
||||
}
|
||||
|
||||
void DrawLineAndPoints(const G4VTrajectory& traj, const G4VisTrajContext& context, const G4int& i_mode)
|
||||
static void GetTimes(const G4VTrajectory& traj,
|
||||
std::vector<G4double>& trajectoryLineTimes,
|
||||
std::vector<G4double>& auxiliaryPointTimes,
|
||||
std::vector<G4double>& stepPointTimes)
|
||||
{
|
||||
// It is important check that the sizes of times vectors produced
|
||||
// by this function matches those of points vectors from
|
||||
// GetPoints. If not, assume that the time information is
|
||||
// invalid.
|
||||
|
||||
G4ThreeVector lastTrajectoryPointPosition;
|
||||
for (G4int i=0; i<traj.GetPointEntries(); i++) {
|
||||
G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i);
|
||||
|
||||
// Pre- and Post-Point times from the trajectory point...
|
||||
G4double trajectoryPointPreTime = -DBL_MAX;
|
||||
G4double trajectoryPointPostTime = DBL_MAX;
|
||||
std::vector<G4AttValue>* trajectoryPointAttValues =
|
||||
aTrajectoryPoint->CreateAttValues();
|
||||
if (!trajectoryPointAttValues) {
|
||||
G4cout << "G4TrajectoryDrawerUtils::GetTimes: no att values."
|
||||
<< G4endl;
|
||||
return;
|
||||
} else {
|
||||
G4bool foundPreTime = false, foundPostTime = false;
|
||||
for (std::vector<G4AttValue>::iterator i =
|
||||
trajectoryPointAttValues->begin();
|
||||
i != trajectoryPointAttValues->end(); ++i) {
|
||||
if (i->GetName() == "PreT") {
|
||||
trajectoryPointPreTime =
|
||||
G4UIcommand::ConvertToDimensionedDouble(i->GetValue());
|
||||
foundPreTime = true;
|
||||
}
|
||||
if (i->GetName() == "PostT") {
|
||||
trajectoryPointPostTime =
|
||||
G4UIcommand::ConvertToDimensionedDouble(i->GetValue());
|
||||
foundPostTime = true;
|
||||
}
|
||||
}
|
||||
if (!foundPreTime || !foundPostTime) {
|
||||
static G4bool warnedTimesNotFound = false;
|
||||
if (!warnedTimesNotFound) {
|
||||
G4cout <<
|
||||
"WARNING: G4TrajectoryDrawerUtils::GetTimes: times not found."
|
||||
<< G4endl;
|
||||
warnedTimesNotFound = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const G4ThreeVector& trajectoryPointPosition =
|
||||
aTrajectoryPoint->GetPosition();
|
||||
|
||||
const std::vector<G4ThreeVector>* auxiliaries
|
||||
= aTrajectoryPoint->GetAuxiliaryPoints();
|
||||
|
||||
if (0 != auxiliaries) {
|
||||
for (size_t iAux=0; iAux<auxiliaries->size(); ++iAux) {
|
||||
// Interpolate time for auxiliary points...
|
||||
const G4ThreeVector pos((*auxiliaries)[iAux]);
|
||||
G4double s1 = (pos - lastTrajectoryPointPosition).mag();
|
||||
G4double s2 = (trajectoryPointPosition - pos).mag();
|
||||
G4double t = trajectoryPointPreTime +
|
||||
(trajectoryPointPostTime - trajectoryPointPreTime) *
|
||||
(s1 / (s1 + s2));
|
||||
trajectoryLineTimes.push_back(t);
|
||||
auxiliaryPointTimes.push_back(t);
|
||||
}
|
||||
}
|
||||
|
||||
trajectoryLineTimes.push_back(trajectoryPointPostTime);
|
||||
stepPointTimes.push_back(trajectoryPointPostTime);
|
||||
|
||||
lastTrajectoryPointPosition = trajectoryPointPosition;
|
||||
}
|
||||
}
|
||||
|
||||
static void SliceLine(G4double timeIncrement,
|
||||
G4Polyline& trajectoryLine,
|
||||
std::vector<G4double>& trajectoryLineTimes)
|
||||
{
|
||||
// Assumes valid arguments from GetPoints and GetTimes.
|
||||
|
||||
G4Polyline newTrajectoryLine;
|
||||
std::vector<G4double> newTrajectoryLineTimes;
|
||||
|
||||
newTrajectoryLine.push_back(trajectoryLine[0]);
|
||||
newTrajectoryLineTimes.push_back(trajectoryLineTimes[0]);
|
||||
size_t lineSize = trajectoryLine.size();
|
||||
if (lineSize > 1) {
|
||||
for (size_t i = 1; i < trajectoryLine.size(); ++i) {
|
||||
G4double deltaT = trajectoryLineTimes[i] - trajectoryLineTimes[i - 1];
|
||||
if (deltaT > 0.) {
|
||||
G4double practicalTimeIncrement =
|
||||
std::max(timeIncrement, deltaT / 100.);
|
||||
for (G4double t =
|
||||
(int(trajectoryLineTimes[i - 1]/practicalTimeIncrement) + 1) *
|
||||
practicalTimeIncrement;
|
||||
t <= trajectoryLineTimes[i];
|
||||
t += practicalTimeIncrement) {
|
||||
G4ThreeVector pos = trajectoryLine[i - 1] +
|
||||
(trajectoryLine[i] - trajectoryLine[i - 1]) *
|
||||
((t - trajectoryLineTimes[i - 1]) / deltaT);
|
||||
newTrajectoryLine.push_back(pos);
|
||||
newTrajectoryLineTimes.push_back(t);
|
||||
}
|
||||
}
|
||||
newTrajectoryLine.push_back(trajectoryLine[i]);
|
||||
newTrajectoryLineTimes.push_back(trajectoryLineTimes[i]);
|
||||
}
|
||||
}
|
||||
|
||||
trajectoryLine = newTrajectoryLine;
|
||||
trajectoryLineTimes = newTrajectoryLineTimes;
|
||||
}
|
||||
|
||||
static void DrawWithoutTime(const G4VisTrajContext& myContext,
|
||||
G4Polyline& trajectoryLine,
|
||||
G4Polymarker& auxiliaryPoints,
|
||||
G4Polymarker& stepPoints)
|
||||
{
|
||||
// Draw without time slice information
|
||||
|
||||
G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
|
||||
if (0 == pVVisManager) return;
|
||||
|
||||
if (myContext.GetDrawLine()) {
|
||||
G4VisAttributes trajectoryLineAttribs(myContext.GetLineColour());
|
||||
trajectoryLineAttribs.SetVisibility(myContext.GetLineVisible());
|
||||
trajectoryLine.SetVisAttributes(&trajectoryLineAttribs);
|
||||
|
||||
pVVisManager->Draw(trajectoryLine);
|
||||
}
|
||||
|
||||
if (myContext.GetDrawAuxPts() && (auxiliaryPoints.size() > 0)) {
|
||||
auxiliaryPoints.SetMarkerType(myContext.GetAuxPtsType());
|
||||
auxiliaryPoints.SetScreenSize(myContext.GetAuxPtsSize());
|
||||
auxiliaryPoints.SetFillStyle(myContext.GetAuxPtsFillStyle());
|
||||
|
||||
G4VisAttributes auxiliaryPointsAttribs(myContext.GetAuxPtsColour());
|
||||
auxiliaryPointsAttribs.SetVisibility(myContext.GetAuxPtsVisible());
|
||||
auxiliaryPoints.SetVisAttributes(&auxiliaryPointsAttribs);
|
||||
|
||||
pVVisManager->Draw(auxiliaryPoints);
|
||||
}
|
||||
|
||||
if (myContext.GetDrawStepPts() && (stepPoints.size() > 0)) {
|
||||
stepPoints.SetMarkerType(myContext.GetStepPtsType());
|
||||
stepPoints.SetScreenSize(myContext.GetStepPtsSize());
|
||||
stepPoints.SetFillStyle(myContext.GetStepPtsFillStyle());
|
||||
|
||||
G4VisAttributes stepPointsAttribs(myContext.GetStepPtsColour());
|
||||
stepPointsAttribs.SetVisibility(myContext.GetStepPtsVisible());
|
||||
stepPoints.SetVisAttributes(&stepPointsAttribs);
|
||||
|
||||
pVVisManager->Draw(stepPoints);
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawWithTime(const G4VisTrajContext& myContext,
|
||||
G4Polyline& trajectoryLine,
|
||||
G4Polymarker& auxiliaryPoints,
|
||||
G4Polymarker& stepPoints,
|
||||
std::vector<G4double>& trajectoryLineTimes,
|
||||
std::vector<G4double>& auxiliaryPointTimes,
|
||||
std::vector<G4double>& stepPointTimes)
|
||||
{
|
||||
// Draw with time slice information
|
||||
|
||||
G4VVisManager* pVVisManager = G4VVisManager::GetConcreteInstance();
|
||||
if (0 == pVVisManager) return;
|
||||
|
||||
if (myContext.GetDrawLine()) {
|
||||
G4VisAttributes trajectoryLineAttribs(myContext.GetLineColour());
|
||||
trajectoryLineAttribs.SetVisibility(myContext.GetLineVisible());
|
||||
|
||||
for (size_t i = 1; i < trajectoryLine.size(); ++i ) {
|
||||
G4Polyline slice;
|
||||
slice.push_back(trajectoryLine[i -1]);
|
||||
slice.push_back(trajectoryLine[i]);
|
||||
trajectoryLineAttribs.SetStartTime(trajectoryLineTimes[i - 1]);
|
||||
trajectoryLineAttribs.SetEndTime(trajectoryLineTimes[i]);
|
||||
slice.SetVisAttributes(&trajectoryLineAttribs);
|
||||
pVVisManager->Draw(slice);
|
||||
}
|
||||
}
|
||||
|
||||
if (myContext.GetDrawAuxPts() && (auxiliaryPoints.size() > 0)) {
|
||||
G4VisAttributes auxiliaryPointsAttribs(myContext.GetAuxPtsColour());
|
||||
auxiliaryPointsAttribs.SetVisibility(myContext.GetAuxPtsVisible());
|
||||
|
||||
for (size_t i = 0; i < auxiliaryPoints.size(); ++i ) {
|
||||
G4Polymarker point;
|
||||
point.push_back(auxiliaryPoints[i]);
|
||||
point.SetMarkerType(myContext.GetAuxPtsType());
|
||||
point.SetScreenSize(myContext.GetAuxPtsSize());
|
||||
point.SetFillStyle(myContext.GetAuxPtsFillStyle());
|
||||
auxiliaryPointsAttribs.SetStartTime(auxiliaryPointTimes[i]);
|
||||
auxiliaryPointsAttribs.SetEndTime(auxiliaryPointTimes[i]);
|
||||
point.SetVisAttributes(&auxiliaryPointsAttribs);
|
||||
pVVisManager->Draw(point);
|
||||
}
|
||||
}
|
||||
|
||||
if (myContext.GetDrawStepPts() && (stepPoints.size() > 0)) {
|
||||
G4VisAttributes stepPointsAttribs(myContext.GetStepPtsColour());
|
||||
stepPointsAttribs.SetVisibility(myContext.GetStepPtsVisible());
|
||||
|
||||
for (size_t i = 0; i < stepPoints.size(); ++i ) {
|
||||
G4Polymarker point;
|
||||
point.push_back(stepPoints[i]);
|
||||
point.SetMarkerType(myContext.GetStepPtsType());
|
||||
point.SetScreenSize(myContext.GetStepPtsSize());
|
||||
point.SetFillStyle(myContext.GetStepPtsFillStyle());
|
||||
stepPointsAttribs.SetStartTime(stepPointTimes[i]);
|
||||
stepPointsAttribs.SetEndTime(stepPointTimes[i]);
|
||||
point.SetVisAttributes(&stepPointsAttribs);
|
||||
pVVisManager->Draw(point);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawLineAndPoints(const G4VTrajectory& traj, const G4VisTrajContext& context, const G4int& i_mode)
|
||||
{
|
||||
// Extra copy while i_mode is still around
|
||||
G4VisTrajContext myContext(context);
|
||||
|
||||
@@ -150,36 +372,36 @@ namespace G4TrajectoryDrawerUtils {
|
||||
|
||||
GetPoints(traj, trajectoryLine, auxiliaryPoints, stepPoints);
|
||||
|
||||
if (myContext.GetDrawLine()) {
|
||||
G4VisAttributes trajectoryLineAttribs(myContext.GetLineColour());
|
||||
trajectoryLineAttribs.SetVisibility(myContext.GetLineVisible());
|
||||
trajectoryLine.SetVisAttributes(&trajectoryLineAttribs);
|
||||
|
||||
pVVisManager->Draw(trajectoryLine);
|
||||
}
|
||||
|
||||
if (myContext.GetDrawAuxPts() && (auxiliaryPoints.size() > 0)) {
|
||||
auxiliaryPoints.SetMarkerType(myContext.GetAuxPtsType());
|
||||
auxiliaryPoints.SetScreenSize(myContext.GetAuxPtsSize());
|
||||
auxiliaryPoints.SetFillStyle(myContext.GetAuxPtsFillStyle());
|
||||
|
||||
G4VisAttributes auxiliaryPointsAttribs(myContext.GetAuxPtsColour());
|
||||
auxiliaryPointsAttribs.SetVisibility(myContext.GetAuxPtsVisible());
|
||||
auxiliaryPoints.SetVisAttributes(&auxiliaryPointsAttribs);
|
||||
|
||||
pVVisManager->Draw(auxiliaryPoints);
|
||||
}
|
||||
|
||||
if (myContext.GetDrawStepPts() && (stepPoints.size() > 0)) {
|
||||
stepPoints.SetMarkerType(myContext.GetStepPtsType());
|
||||
stepPoints.SetScreenSize(myContext.GetStepPtsSize());
|
||||
stepPoints.SetFillStyle(myContext.GetStepPtsFillStyle());
|
||||
|
||||
G4VisAttributes stepPointsAttribs(myContext.GetStepPtsColour());
|
||||
stepPointsAttribs.SetVisibility(myContext.GetStepPtsVisible());
|
||||
stepPoints.SetVisAttributes(&stepPointsAttribs);
|
||||
|
||||
pVVisManager->Draw(stepPoints);
|
||||
if (myContext.GetTimeSliceInterval()) {
|
||||
|
||||
// Get corresponding track time information, if any
|
||||
std::vector<G4double> trajectoryLineTimes;
|
||||
std::vector<G4double> stepPointTimes;
|
||||
std::vector<G4double> auxiliaryPointTimes;
|
||||
|
||||
GetTimes(traj, trajectoryLineTimes, auxiliaryPointTimes, stepPointTimes);
|
||||
|
||||
// Check validity
|
||||
if (trajectoryLineTimes.size() != trajectoryLine.size() ||
|
||||
stepPointTimes.size() != stepPoints.size() ||
|
||||
auxiliaryPointTimes.size() != auxiliaryPoints.size()) {
|
||||
|
||||
// Revert to drawing without time information...
|
||||
DrawWithoutTime(myContext, trajectoryLine, auxiliaryPoints, stepPoints);
|
||||
} else {
|
||||
|
||||
SliceLine(myContext.GetTimeSliceInterval(),
|
||||
trajectoryLine, trajectoryLineTimes);
|
||||
|
||||
DrawWithTime(myContext,
|
||||
trajectoryLine, auxiliaryPoints, stepPoints,
|
||||
trajectoryLineTimes, auxiliaryPointTimes, stepPointTimes);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
DrawWithoutTime(myContext, trajectoryLine, auxiliaryPoints, stepPoints);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user