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: G4HepRepFileSceneHandler.cc,v 1.56 2006/06/29 21:17:24 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-01 $
|
||||
// $Id: G4HepRepFileSceneHandler.cc,v 1.64 2006/11/16 21:06:11 perl Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
//
|
||||
//
|
||||
// Joseph Perl 27th January 2002
|
||||
@@ -98,7 +98,6 @@ G4VSceneHandler(system, fSceneIdCount++, name)
|
||||
haveVisible = false;
|
||||
drawingTraj = false;
|
||||
doneInitTraj = false;
|
||||
drawTrajPts = false;
|
||||
drawingHit = false;
|
||||
doneInitHit = false;
|
||||
}
|
||||
@@ -170,6 +169,12 @@ void G4HepRepFileSceneHandler::AddSolid(const G4Box& box) {
|
||||
PrintThings();
|
||||
#endif
|
||||
|
||||
if (drawingTraj)
|
||||
return;
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
|
||||
haveVisible = false;
|
||||
AddHepRepInstance("Prism", NULL);
|
||||
|
||||
@@ -226,6 +231,13 @@ void G4HepRepFileSceneHandler::AddSolid(const G4Cons& cons) {
|
||||
if (cons.GetDeltaPhiAngle() < twopi) {
|
||||
G4VSceneHandler::AddSolid(cons); // Invoke default action.
|
||||
} else {
|
||||
|
||||
if (drawingTraj)
|
||||
return;
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
|
||||
haveVisible = false;
|
||||
AddHepRepInstance("Cylinder", NULL);
|
||||
|
||||
@@ -270,6 +282,13 @@ void G4HepRepFileSceneHandler::AddSolid(const G4Tubs& tubs) {
|
||||
if (tubs.GetDeltaPhiAngle() < twopi) {
|
||||
G4VSceneHandler::AddSolid(tubs); // Invoke default action.
|
||||
} else {
|
||||
|
||||
if (drawingTraj)
|
||||
return;
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
|
||||
haveVisible = false;
|
||||
AddHepRepInstance("Cylinder", NULL);
|
||||
|
||||
@@ -310,6 +329,12 @@ void G4HepRepFileSceneHandler::AddSolid(const G4Trd& trd) {
|
||||
PrintThings();
|
||||
#endif
|
||||
|
||||
if (drawingTraj)
|
||||
return;
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
|
||||
haveVisible = false;
|
||||
AddHepRepInstance("Prism", NULL);
|
||||
|
||||
@@ -558,8 +583,18 @@ void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) {
|
||||
strcmp(category,"Association")!=0 &&
|
||||
strcmp(category,"PickAction")!=0)
|
||||
category = "Physics";
|
||||
hepRepXMLWriter->addAttDef(iAttVal->GetName(), iAttDef->second.GetDesc(),
|
||||
category, iAttDef->second.GetExtra());
|
||||
// Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule
|
||||
// that each object can have only one instance of a given AttValue.
|
||||
// Both of these attributes are redundant to actual position information of the point.
|
||||
// New Wired can just tell the user the point position itself.
|
||||
if (strcmp(iAttVal->GetName(),"Aux-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Z")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Z")!=0)
|
||||
hepRepXMLWriter->addAttDef(iAttVal->GetName(), iAttDef->second.GetDesc(),
|
||||
category, iAttDef->second.GetExtra());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -584,11 +619,11 @@ void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) {
|
||||
// factors including i_mode, trajContext and filtering).
|
||||
drawingTraj = true;
|
||||
doneInitTraj = false;
|
||||
drawTrajPts = false;
|
||||
G4VSceneHandler::AddCompound(traj);
|
||||
drawingTraj = false;
|
||||
|
||||
if (drawTrajPts) {
|
||||
// Draw step points.
|
||||
if (drawingMode!=0 || trajContext->GetDrawStepPts()) {
|
||||
if (!doneInitTraj)
|
||||
InitTrajectory();
|
||||
// Create Trajectory Points as a subType of Trajectories.
|
||||
@@ -596,21 +631,49 @@ void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) {
|
||||
// This allows the user to tell that points don't exist (admittedly odd) rather
|
||||
// than that they were omitted by the drawing mode.
|
||||
previousName = hepRepXMLWriter->prevTypeName[2];
|
||||
hepRepXMLWriter->addType("Trajectory Points",2);
|
||||
hepRepXMLWriter->addType("Trajectory Step Points",2);
|
||||
|
||||
float redness;
|
||||
float greenness;
|
||||
float blueness;
|
||||
G4int markSize;
|
||||
G4bool visible;
|
||||
G4bool square;
|
||||
if (drawingMode==0) {
|
||||
G4Colour colour = trajContext->GetStepPtsColour();
|
||||
redness = colour.GetRed();
|
||||
greenness = colour.GetGreen();
|
||||
blueness = colour.GetBlue();
|
||||
markSize = (G4int) trajContext->GetStepPtsSize();
|
||||
visible = (G4int) trajContext->GetStepPtsVisible();
|
||||
square = (trajContext->GetStepPtsType()==G4Polymarker::squares);
|
||||
} else {
|
||||
redness = 1.;
|
||||
greenness = 1.;
|
||||
blueness = 1.;
|
||||
markSize = std::abs(drawingMode/1000);
|
||||
visible = true;
|
||||
square = false;
|
||||
}
|
||||
|
||||
// Avoiding drawing anything black on black.
|
||||
if (redness==0. && greenness==0. && blueness==0.) {
|
||||
redness = 1.;
|
||||
greenness = 1.;
|
||||
blueness = 1.;
|
||||
}
|
||||
|
||||
// Specify attributes common to all trajectory points.
|
||||
if (strcmp("Trajectory Points",previousName)!=0) {
|
||||
if (strcmp("Trajectory Step Points",previousName)!=0) {
|
||||
hepRepXMLWriter->addAttValue("DrawAs","Point");
|
||||
|
||||
G4int markSize;
|
||||
if (drawingMode==0)
|
||||
markSize = (G4int) trajContext->GetStepPtsSize();
|
||||
else
|
||||
markSize = std::abs(drawingMode/1000);
|
||||
hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness);
|
||||
hepRepXMLWriter->addAttValue("MarkSize",markSize);
|
||||
|
||||
hepRepXMLWriter->addAttValue("Layer",110);
|
||||
hepRepXMLWriter->addAttValue("Visibility","True");
|
||||
hepRepXMLWriter->addAttValue("Visibility",visible);
|
||||
if (square)
|
||||
hepRepXMLWriter->addAttValue("MarkName","square");
|
||||
else
|
||||
hepRepXMLWriter->addAttValue("MarkName","dot");
|
||||
}
|
||||
|
||||
// Loop over all points on this trajectory.
|
||||
@@ -642,7 +705,17 @@ void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) {
|
||||
std::vector<G4AttValue>::iterator iAttVal;
|
||||
for (iAttVal = pointAttValues->begin();
|
||||
iAttVal != pointAttValues->end(); ++iAttVal)
|
||||
hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue());
|
||||
// Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule
|
||||
// that each object can have only one instance of a given AttValue.
|
||||
// Both of these attributes are redundant to actual position information of the point.
|
||||
// New Wired can just tell the user the point position itself.
|
||||
if (strcmp(iAttVal->GetName(),"Aux-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Z")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Z")!=0)
|
||||
hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue());
|
||||
delete pointAttValues;
|
||||
}
|
||||
delete rawPointAttValues;
|
||||
@@ -658,6 +731,124 @@ void G4HepRepFileSceneHandler::AddCompound (const G4VTrajectory& traj) {
|
||||
hepRepXMLWriter->addPoint(vertex.x(), vertex.y(), vertex.z());
|
||||
}
|
||||
}
|
||||
|
||||
// Draw Auxiliary Points
|
||||
if (drawingMode!=0 || trajContext->GetDrawAuxPts()) {
|
||||
if (!doneInitTraj)
|
||||
InitTrajectory();
|
||||
// Create Trajectory Points as a subType of Trajectories.
|
||||
// Note that we should create this heprep type even if there are no actual points.
|
||||
// This allows the user to tell that points don't exist (admittedly odd) rather
|
||||
// than that they were omitted by the drawing mode.
|
||||
previousName = hepRepXMLWriter->prevTypeName[2];
|
||||
hepRepXMLWriter->addType("Trajectory Auxiliary Points",2);
|
||||
|
||||
float redness;
|
||||
float greenness;
|
||||
float blueness;
|
||||
G4int markSize;
|
||||
G4bool visible;
|
||||
G4bool square;
|
||||
if (drawingMode==0) {
|
||||
G4Colour colour = trajContext->GetAuxPtsColour();
|
||||
redness = colour.GetRed();
|
||||
greenness = colour.GetGreen();
|
||||
blueness = colour.GetBlue();
|
||||
markSize = (G4int) trajContext->GetAuxPtsSize();
|
||||
visible = (G4int) trajContext->GetAuxPtsVisible();
|
||||
square = (trajContext->GetAuxPtsType()==G4Polymarker::squares);
|
||||
} else {
|
||||
redness = 1.;
|
||||
greenness = 1.;
|
||||
blueness = 1.;
|
||||
markSize = std::abs(drawingMode/1000);
|
||||
visible = true;
|
||||
square = false;
|
||||
}
|
||||
|
||||
// Avoiding drawing anything black on black.
|
||||
if (redness==0. && greenness==0. && blueness==0.) {
|
||||
redness = 1.;
|
||||
greenness = 1.;
|
||||
blueness = 1.;
|
||||
}
|
||||
|
||||
// Specify attributes common to all trajectory points.
|
||||
if (strcmp("Trajectory Auxiliary Points",previousName)!=0) {
|
||||
hepRepXMLWriter->addAttValue("DrawAs","Point");
|
||||
hepRepXMLWriter->addAttValue("MarkColor", redness, greenness, blueness);
|
||||
hepRepXMLWriter->addAttValue("MarkSize",markSize);
|
||||
hepRepXMLWriter->addAttValue("Layer",110);
|
||||
hepRepXMLWriter->addAttValue("Visibility",visible);
|
||||
if (square)
|
||||
hepRepXMLWriter->addAttValue("MarkName","Square");
|
||||
else
|
||||
hepRepXMLWriter->addAttValue("MarkName","Dot");
|
||||
}
|
||||
|
||||
// Loop over all points on this trajectory.
|
||||
for (i = 0; i < traj.GetPointEntries(); i++) {
|
||||
G4VTrajectoryPoint* aTrajectoryPoint = traj.GetPoint(i);
|
||||
|
||||
// Each point is a separate instance of the type Trajectory Points.
|
||||
hepRepXMLWriter->addInstance();
|
||||
|
||||
// Pointers to hold trajectory point attribute values and definitions.
|
||||
std::vector<G4AttValue>* rawPointAttValues = aTrajectoryPoint->CreateAttValues();
|
||||
std::vector<G4AttValue>* pointAttValues =
|
||||
new std::vector<G4AttValue>;
|
||||
std::map<G4String,G4AttDef>* pointAttDefs =
|
||||
new std::map<G4String,G4AttDef>;
|
||||
|
||||
// Get trajectory point attributes and definitions in standard HepRep style
|
||||
// (uniform units, 3Vectors decomposed).
|
||||
if (rawPointAttValues) {
|
||||
G4bool error = G4AttCheck(rawPointAttValues,
|
||||
aTrajectoryPoint->GetAttDefs()).Standard(pointAttValues,pointAttDefs);
|
||||
if (error) {
|
||||
G4cout << "G4HepRepFileSceneHandler::AddCompound(traj):"
|
||||
"\nERROR found during conversion to standard point attributes." << G4endl;
|
||||
}
|
||||
|
||||
// Write out point attribute values.
|
||||
if (pointAttValues) {
|
||||
std::vector<G4AttValue>::iterator iAttVal;
|
||||
for (iAttVal = pointAttValues->begin();
|
||||
iAttVal != pointAttValues->end(); ++iAttVal)
|
||||
// Do not write out the Aux or Pos attribute. Aux does not conform to the HepRep rule
|
||||
// that each object can have only one instance of a given AttValue.
|
||||
// Both of these attributes are redundant to actual position information of the point.
|
||||
// New Wired can just tell the user the point position itself.
|
||||
if (strcmp(iAttVal->GetName(),"Aux-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Aux-Z")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-X")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Y")!=0 &&
|
||||
strcmp(iAttVal->GetName(),"Pos-Z")!=0)
|
||||
hepRepXMLWriter->addAttValue(iAttVal->GetName(), iAttVal->GetValue());
|
||||
delete pointAttValues;
|
||||
}
|
||||
delete rawPointAttValues;
|
||||
}
|
||||
|
||||
// Clean up point attributes.
|
||||
if (pointAttDefs)
|
||||
delete pointAttDefs;
|
||||
|
||||
// Each trajectory point is made of a single primitive, a point.
|
||||
G4Point3D vertex = aTrajectoryPoint->GetPosition();
|
||||
|
||||
// Loop over auxiliary points associated with this Trajectory Point.
|
||||
const std::vector<G4ThreeVector>* auxiliaries = aTrajectoryPoint->GetAuxiliaryPoints();
|
||||
if (0 != auxiliaries) {
|
||||
for (size_t iAux=0; iAux<auxiliaries->size(); ++iAux) {
|
||||
const G4ThreeVector auxPos((*auxiliaries)[iAux]);
|
||||
hepRepXMLWriter->addPrimitive();
|
||||
hepRepXMLWriter->addPoint(auxPos.x(), auxPos.y(), auxPos.z());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -827,6 +1018,7 @@ void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyline& polyline) {
|
||||
|
||||
if (drawingTraj)
|
||||
InitTrajectory();
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
|
||||
@@ -867,10 +1059,8 @@ void G4HepRepFileSceneHandler::AddPrimitive (const G4Polymarker& line) {
|
||||
if (sizeType==world)
|
||||
size = 4.;
|
||||
|
||||
if (drawingTraj) {
|
||||
drawTrajPts = true;
|
||||
if (drawingTraj)
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
@@ -971,10 +1161,8 @@ void G4HepRepFileSceneHandler::AddPrimitive(const G4Circle& circle) {
|
||||
if (sizeType==world)
|
||||
size = 4.;
|
||||
|
||||
if (drawingTraj) {
|
||||
drawTrajPts = true;
|
||||
if (drawingTraj)
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
@@ -1017,10 +1205,8 @@ void G4HepRepFileSceneHandler::AddPrimitive(const G4Square& square) {
|
||||
if (sizeType==world)
|
||||
size = 4.;
|
||||
|
||||
if (drawingTraj) {
|
||||
drawTrajPts = true;
|
||||
if (drawingTraj)
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
@@ -1051,10 +1237,8 @@ void G4HepRepFileSceneHandler::AddPrimitive(const G4Polyhedron& polyhedron) {
|
||||
|
||||
if(polyhedron.GetNoFacets()==0)return;
|
||||
|
||||
if (drawingTraj) {
|
||||
drawTrajPts = true;
|
||||
if (drawingTraj)
|
||||
return;
|
||||
}
|
||||
|
||||
if (drawingHit)
|
||||
InitHit();
|
||||
@@ -1111,8 +1295,7 @@ void G4HepRepFileSceneHandler::AddHepRepInstance(const char* primName,
|
||||
G4VPhysicalVolume* pCurrentPV = 0;
|
||||
G4LogicalVolume* pCurrentLV = 0;
|
||||
G4int currentDepth = 0;
|
||||
G4PhysicalVolumeModel* pPVModel =
|
||||
dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
|
||||
G4PhysicalVolumeModel* pPVModel = dynamic_cast<G4PhysicalVolumeModel*>(fpModel);
|
||||
if (pPVModel) {
|
||||
pCurrentPV = pPVModel->GetCurrentPV();
|
||||
pCurrentLV = pPVModel->GetCurrentLV();
|
||||
@@ -1224,20 +1407,7 @@ void G4HepRepFileSceneHandler::AddHepRepInstance(const char* primName,
|
||||
G4int drawnMotherDepth = 0;
|
||||
if (ri != drawnPVPath.rend()) {
|
||||
// This volume has a mother.
|
||||
G4VPhysicalVolume* drawnMotherPV = ri->GetPhysicalVolume();
|
||||
// Find this mother's depth by examining prevTypeNames.
|
||||
if (currentDepth>1) {
|
||||
drawnMotherDepth = currentDepth-1;
|
||||
while (strcmp(hepRepXMLWriter->prevTypeName[drawnMotherDepth],drawnMotherPV->GetName())!=0) {
|
||||
//G4cout << "Didn't find mother at depth:" << drawnMotherDepth << ", that depth had:" <<
|
||||
//hepRepXMLWriter->prevTypeName[drawnMotherDepth] << G4endl;
|
||||
drawnMotherDepth--;
|
||||
if (drawnMotherDepth==0) {
|
||||
//G4cout << "Got to drawnMotherDepth of zero. Giving up." << G4endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
drawnMotherDepth = ri->GetNonCulledDepth();
|
||||
} else {
|
||||
// This volume has no mother. Must be a top level volume.
|
||||
//G4cout << "Mother must be very top" << G4endl;
|
||||
@@ -1264,14 +1434,21 @@ void G4HepRepFileSceneHandler::AddHepRepInstance(const char* primName,
|
||||
// Additional attributes.
|
||||
hepRepXMLWriter->addAttValue("Layer",hepRepXMLWriter->typeDepth);
|
||||
hepRepXMLWriter->addAttValue("LVol", pCurrentLV->GetName());
|
||||
hepRepXMLWriter->addAttValue("Region", pCurrentLV->GetRegion()->GetName());
|
||||
G4Region* region = pCurrentLV->GetRegion();
|
||||
G4String regionName = region? region->GetName(): G4String("No region");
|
||||
hepRepXMLWriter->addAttValue("Region", regionName);
|
||||
hepRepXMLWriter->addAttValue("RootRegion", pCurrentLV->IsRootRegion());
|
||||
hepRepXMLWriter->addAttValue("Solid", pCurrentLV->GetSolid()->GetName());
|
||||
hepRepXMLWriter->addAttValue("EType", pCurrentLV->GetSolid()->GetEntityType());
|
||||
hepRepXMLWriter->addAttValue("Material", pCurrentLV->GetMaterial()->GetName());
|
||||
hepRepXMLWriter->addAttValue("Density", pCurrentLV->GetMaterial()->GetDensity()*m3/kg);
|
||||
hepRepXMLWriter->addAttValue("State", pCurrentLV->GetMaterial()->GetState());
|
||||
hepRepXMLWriter->addAttValue("Radlen", pCurrentLV->GetMaterial()->GetRadlen()/m);
|
||||
G4Material * material = pPVModel->GetCurrentMaterial();
|
||||
G4String matName = material? material->GetName(): G4String("No material");
|
||||
hepRepXMLWriter->addAttValue("Material", matName);
|
||||
G4double matDensity = material? material->GetDensity(): 0.;
|
||||
hepRepXMLWriter->addAttValue("Density", matDensity*m3/kg);
|
||||
G4State matState = material? material->GetState(): kStateUndefined;
|
||||
hepRepXMLWriter->addAttValue("State", matState);
|
||||
G4double matRadlen = material? material->GetRadlen(): 0.;
|
||||
hepRepXMLWriter->addAttValue("Radlen", matRadlen/m);
|
||||
}
|
||||
|
||||
hepRepXMLWriter->addAttValue("DrawAs",primName);
|
||||
|
||||
Reference in New Issue
Block a user