61 std::vector<G4double>& trajectoryLineTimes,
62 std::vector<G4double>& auxiliaryPointTimes,
63 std::vector<G4double>& stepPointTimes)
75 std::vector<G4ThreeVector> positions;
82 if (positions.size() == 0 || trajectoryPointPosition != positions[positions.size() - 1]) {
84 G4double trajectoryPointPreTime = -std::numeric_limits<double>::max();
85 G4double trajectoryPointPostTime = std::numeric_limits<double>::max();
90 if (richTrajectoryPoint) {
91 trajectoryPointPreTime = richTrajectoryPoint->GetPreStepPointGlobalTime();
92 trajectoryPointPostTime = richTrajectoryPoint->GetPostStepPointGlobalTime();
94 static G4bool warnedTimeExceeded =
false;
95 if (!warnedTimeExceeded) {
97 "Trajectory point times exceed limit (>1000000 time slice)."
98 "\nNormal trajectory will be drawn.");
99 warnedTimeExceeded =
true;
104 static G4bool warnedNoAttValues =
false;
105 if (!warnedNoAttValues) {
107 "Trajectory point times not found. Use G4RichTrajectory:"
108 "\n /vis/scene/add/trajectories rich");
109 warnedNoAttValues =
true;
115 const std::vector<G4ThreeVector>* auxiliaries = aTrajectoryPoint->
GetAuxiliaryPoints();
116 if (0 != auxiliaries) {
117 for (
size_t iAux = 0; iAux < auxiliaries->size(); ++iAux) {
118 const G4ThreeVector& auxPointPosition = (*auxiliaries)[iAux];
119 if (positions.size() == 0 || auxPointPosition != positions[positions.size() - 1]) {
121 positions.push_back(trajectoryPointPosition);
122 trajectoryLine.push_back(auxPointPosition);
123 auxiliaryPoints.push_back(auxPointPosition);
126 G4double s1 = (auxPointPosition - lastTrajectoryPointPosition).mag();
127 G4double s2 = (trajectoryPointPosition - auxPointPosition).mag();
129 + (trajectoryPointPostTime - trajectoryPointPreTime) * (s1 / (s1 + s2));
130 trajectoryLineTimes.push_back(t);
131 auxiliaryPointTimes.push_back(t);
137 positions.push_back(trajectoryPointPosition);
138 trajectoryLine.push_back(trajectoryPointPosition);
139 stepPoints.push_back(trajectoryPointPosition);
141 trajectoryLineTimes.push_back(trajectoryPointPostTime);
142 stepPointTimes.push_back(trajectoryPointPostTime);
144 lastTrajectoryPointPosition = trajectoryPointPosition;
151 std::vector<G4double>& trajectoryLineTimes)
156 std::vector<G4double> newTrajectoryLineTimes;
158 newTrajectoryLine.push_back(trajectoryLine[0]);
159 newTrajectoryLineTimes.push_back(trajectoryLineTimes[0]);
160 size_t lineSize = trajectoryLine.size();
162 for (
size_t i = 1; i < trajectoryLine.size(); ++i) {
163 G4double deltaT = trajectoryLineTimes[i] - trajectoryLineTimes[i - 1];
165 G4double practicalTimeIncrement = std::max(timeIncrement, deltaT / 100.);
166 for (
G4double t = (
int(trajectoryLineTimes[i - 1] / practicalTimeIncrement) + 1)
167 * practicalTimeIncrement;
168 t <= trajectoryLineTimes[i]; t += practicalTimeIncrement)
171 + (trajectoryLine[i] - trajectoryLine[i - 1])
172 * ((t - trajectoryLineTimes[i - 1]) / deltaT);
173 newTrajectoryLine.push_back(pos);
174 newTrajectoryLineTimes.push_back(t);
177 newTrajectoryLine.push_back(trajectoryLine[i]);
178 newTrajectoryLineTimes.push_back(trajectoryLineTimes[i]);
182 trajectoryLine = std::move(newTrajectoryLine);
183 trajectoryLineTimes = std::move(newTrajectoryLineTimes);
186static void DrawWithoutTime(
const G4VisTrajContext& myContext, G4Polyline& trajectoryLine,
187 G4Polymarker& auxiliaryPoints, G4Polymarker& stepPoints)
192 if (0 == pVVisManager)
return;
195 G4VisAttributes trajectoryLineAttribs(myContext.
GetLineColour());
196 trajectoryLineAttribs.SetLineWidth(myContext.
GetLineWidth());
199 pVVisManager->
Draw(trajectoryLine);
210 pVVisManager->
Draw(auxiliaryPoints);
221 pVVisManager->
Draw(stepPoints);
225static void DrawWithTime(
const G4VisTrajContext& myContext, G4Polyline& trajectoryLine,
226 G4Polymarker& auxiliaryPoints, G4Polymarker& stepPoints,
227 std::vector<G4double>& trajectoryLineTimes,
228 std::vector<G4double>& auxiliaryPointTimes,
229 std::vector<G4double>& stepPointTimes)
234 if (0 == pVVisManager)
return;
237 const auto& viewerStartTime = timeParameters.
fStartTime;
238 const auto& viewerEndTime = timeParameters.fEndTime;
239 const auto& viewerFadeFactor = timeParameters.fFadeFactor;
242 G4VisAttributes trajectoryLineAttribs(myContext.
GetLineColour());
243 trajectoryLineAttribs.SetLineWidth(myContext.
GetLineWidth());
245 for (
size_t i = 1; i < trajectoryLine.size(); ++i) {
246 const auto& sliceStartTime = trajectoryLineTimes[i - 1];
247 const auto& sliceEndTime = trajectoryLineTimes[i];
248 if (sliceStartTime >= viewerStartTime && sliceEndTime <= viewerEndTime) {
250 slice.push_back(trajectoryLine[i - 1]);
251 slice.push_back(trajectoryLine[i]);
252 trajectoryLineAttribs.SetStartTime(trajectoryLineTimes[i - 1]);
253 trajectoryLineAttribs.SetEndTime(trajectoryLineTimes[i]);
254 if (viewerStartTime >= 0.) {
255 auto opacityMultiplier = 1. - viewerFadeFactor
256 * (viewerEndTime - trajectoryLineTimes[i]) / (viewerEndTime - viewerStartTime);
258 colour.
SetAlpha(opacityMultiplier * colour.GetAlpha());
259 trajectoryLineAttribs.SetColour(colour);
262 pVVisManager->
Draw(slice);
270 for (
size_t i = 0; i < auxiliaryPoints.size(); ++i) {
271 const auto& auxStartTime = auxiliaryPointTimes[i];
272 const auto& auxEndTime = auxiliaryPointTimes[i];
273 if (auxStartTime >= viewerStartTime && auxEndTime <= viewerEndTime) {
275 point.push_back(auxiliaryPoints[i]);
279 auxiliaryPointsAttribs.SetStartTime(auxiliaryPointTimes[i]);
280 auxiliaryPointsAttribs.SetEndTime(auxiliaryPointTimes[i]);
281 if (viewerStartTime >= 0.) {
282 auto opacityMultiplier = 1. - viewerFadeFactor
283 * (viewerEndTime - auxiliaryPointTimes[i] ) / (viewerEndTime - viewerStartTime);
285 colour.
SetAlpha(opacityMultiplier * colour.GetAlpha());
286 auxiliaryPointsAttribs.SetColour(colour);
289 pVVisManager->
Draw(point);
297 for (
size_t i = 0; i < stepPoints.size(); ++i) {
298 const auto& pointStartTime = stepPointTimes[i];
299 const auto& pointEndTime = stepPointTimes[i];
300 if (pointStartTime >= viewerStartTime && pointEndTime <= viewerEndTime) {
302 point.push_back(stepPoints[i]);
306 stepPointsAttribs.SetStartTime(stepPointTimes[i]);
307 stepPointsAttribs.SetEndTime(stepPointTimes[i]);
308 if (viewerStartTime >= 0.) {
309 auto opacityMultiplier = 1. - viewerFadeFactor
310 * (viewerEndTime - stepPointTimes[i]) / (viewerEndTime - viewerStartTime);
312 colour.
SetAlpha(opacityMultiplier * colour.GetAlpha());
313 stepPointsAttribs.SetColour(colour);
316 pVVisManager->
Draw(point);
332 std::vector<G4double> trajectoryLineTimes;
333 std::vector<G4double> stepPointTimes;
334 std::vector<G4double> auxiliaryPointTimes;
338 trajectoryLineTimes, auxiliaryPointTimes, stepPointTimes);
343 DrawWithTime(context, trajectoryLine, auxiliaryPoints, stepPoints, trajectoryLineTimes,
344 auxiliaryPointTimes, stepPointTimes);
347 DrawWithoutTime(context, trajectoryLine, auxiliaryPoints, stepPoints);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
CLHEP::Hep3Vector G4ThreeVector
const TimeParameters & GetTimeParameters() const
void SetMarkerType(MarkerType)
void SetSize(SizeType, G4double)
void SetFillStyle(FillStyle)
static const G4ModelingParameters * GetCurrentModelingParameters()
virtual const std::vector< G4ThreeVector > * GetAuxiliaryPoints() const
virtual const G4ThreeVector GetPosition() const =0
virtual G4VTrajectoryPoint * GetPoint(G4int i) const =0
virtual G4int GetPointEntries() const =0
static G4VVisManager * GetConcreteInstance()
virtual void Draw(const G4Circle &, const G4Transform3D &objectTransformation=G4Transform3D())=0
G4bool GetDrawAuxPts() const
G4Colour GetStepPtsColour() const
G4double GetLineWidth() const
G4double GetStepPtsSize() const
G4bool GetLineVisible() const
G4double GetTimeSliceInterval() const
G4bool GetDrawLine() const
G4VMarker::SizeType GetStepPtsSizeType() const
G4Polymarker::MarkerType GetAuxPtsType() const
G4double GetAuxPtsSize() const
G4VMarker::SizeType GetAuxPtsSizeType() const
G4Colour GetAuxPtsColour() const
G4VMarker::FillStyle GetStepPtsFillStyle() const
G4VMarker::FillStyle GetAuxPtsFillStyle() const
G4bool GetAuxPtsVisible() const
G4bool GetStepPtsVisible() const
G4Colour GetLineColour() const
G4Polymarker::MarkerType GetStepPtsType() const
G4bool GetDrawStepPts() const
void SetVisAttributes(const G4VisAttributes *)
TimesValidity GetPointsAndTimes(const G4VTrajectory &traj, const G4VisTrajContext &context, G4Polyline &trajectoryLine, G4Polymarker &auxiliaryPoints, G4Polymarker &stepPoints, std::vector< G4double > &trajectoryLineTimes, std::vector< G4double > &auxiliaryPointTimes, std::vector< G4double > &stepPointTimes)
void DrawLineAndPoints(const G4VTrajectory &traj, const G4VisTrajContext &)