Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
parallel_world.C File Reference

Detailed Description

Misaligning geometry generate in many cases overlaps, due to the idealization of the design and the fact that in real life movements of the geometry volumes have constraints and are correlated.

This typically generates inconsistent response of the navigation methods, leading to inefficiencies during tracking, errors in the material budget calculations, and so on. Among those, there are dangerous cases when the hidden volumes are sensitive. This macro demonstrates how to use the "parallel world" feature to assign highest navigation priority to some physical paths in geometry.

void align();
//______________________________________________________________________________
void parallel_world(Bool_t usepw = kTRUE, Bool_t useovlp = kTRUE)
{
// web geometry display does not support "parallel world" feature
gROOT->SetWebDisplay("off");
TGeoManager *geom = new TGeoManager("parallel_world", "Showcase for prioritized physical paths");
TGeoMaterial *matV = new TGeoMaterial("Vac", 0, 0, 0);
TGeoMedium *medV = new TGeoMedium("MEDVAC", 1, matV);
TGeoMaterial *matAl = new TGeoMaterial("Al", 26.98, 13, 2.7);
TGeoMedium *medAl = new TGeoMedium("MEDAL", 2, matAl);
TGeoMaterial *matSi = new TGeoMaterial("Si", 28.085, 14, 2.329);
TGeoMedium *medSi = new TGeoMedium("MEDSI", 3, matSi);
TGeoVolume *top = gGeoManager->MakeBox("TOP", medV, 100, 400, 1000);
gGeoManager->SetTopVolume(top);
// Shape for the support block
TGeoBBox *sblock = new TGeoBBox("sblock", 20, 10, 2);
// The volume for the support
TGeoVolume *support = new TGeoVolume("block", sblock, medAl);
support->SetLineColor(kGreen);
// Shape for the sensor to be prioritized in case of overlap
TGeoBBox *ssensor = new TGeoBBox("sensor", 19, 9, 0.2);
// The volume for the sensor
TGeoVolume *sensor = new TGeoVolume("sensor", ssensor, medSi);
sensor->SetLineColor(kRed);
// Chip assembly of support+sensor
chip->AddNode(support, 1);
chip->AddNode(sensor, 1, new TGeoTranslation(0, 0, -2.1));
// A ladder that normally sags
TGeoBBox *sladder = new TGeoBBox("sladder", 20, 300, 5);
// The volume for the ladder
TGeoVolume *ladder = new TGeoVolume("ladder", sladder, medAl);
ladder->SetLineColor(kBlue);
// Add nodes
top->AddNode(ladder, 1);
for (Int_t i = 0; i < 10; i++)
top->AddNode(chip, i + 1, new TGeoTranslation(0, -225. + 50. * i, 10));
gGeoManager->CloseGeometry();
TGeoParallelWorld *pw = nullptr;
if (usepw)
pw = gGeoManager->CreateParallelWorld("priority_sensors");
// Align chips
align();
if (usepw) {
if (useovlp)
pw->AddOverlap(ladder);
gGeoManager->SetUseParallelWorldNav(kTRUE);
}
TString cname;
cname = usepw ? "cpw" : "cnopw";
TCanvas *c = (TCanvas *)gROOT->GetListOfCanvases()->FindObject(cname);
if (c)
c->cd();
else
c = new TCanvas(cname, "", 800, 600);
top->Draw();
// top->RandomRays(0,0,0,0,sensor->GetName());
// Track random "particles" coming from the block side and draw only the tracklets
// actually crossing one of the sensors. Note that some of the tracks coming
// from the outer side may see the full sensor, while the others only part of it.
TStopwatch timer;
timer.Start();
top->RandomRays(100000, 0, 0, -30, sensor->GetName());
timer.Stop();
timer.Print();
TView3D *view = (TView3D *)gPad->GetView();
if (view) {
view->SetParallel();
view->Side();
}
if (usepw)
}
//______________________________________________________________________________
void align()
{
// Aligning 2 sensors so they will overlap with the support. One sensor is positioned
// normally while the other using the shared matrix
TGeoParallelWorld *pw = gGeoManager->GetParallelWorld();
Double_t sag;
for (Int_t i = 0; i < 10; i++) {
node = gGeoManager->MakePhysicalNode(TString::Format("/TOP_1/chip_%d", i + 1));
sag = 8. - 0.494 * (i - 4.5) * (i - 4.5);
TGeoTranslation *tr = new TGeoTranslation(0., -225. + 50. * i, 10 - sag);
node->Align(tr);
if (pw)
pw->AddNode(TString::Format("/TOP_1/chip_%d", i + 1));
}
}
#define c(i)
Definition RSha256.hxx:101
int Int_t
Signed integer 4 bytes (int).
Definition RtypesCore.h:59
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
double Double_t
Double 8 bytes.
Definition RtypesCore.h:73
constexpr Bool_t kTRUE
Definition RtypesCore.h:107
@ kRed
Definition Rtypes.h:67
@ kGreen
Definition Rtypes.h:67
@ kBlue
Definition Rtypes.h:67
externTGeoManager * gGeoManager
#define gROOT
Definition TROOT.h:417
#define gPad
The Canvas class.
Definition TCanvas.h:23
The manager class for any TGeo geometry.
Definition TGeoManager.h:46
Base class describing materials.
Media are used to store properties related to tracking and which are useful only when using geometry ...
Definition TGeoMedium.h:23
Base class for a flat parallel geometry.
Bool_t CloseGeometry()
The main geometry must be closed.
void AddNode(const char *path)
Add a node normally to this world. Overlapping nodes not allowed.
Int_t PrintDetectedOverlaps() const
Print the overlaps which were detected during real tracking.
void AddOverlap(TGeoVolume *vol, Bool_t activate=kTRUE)
To use this optimization, the user should declare the full list of volumes which may overlap with any...
Physical nodes are the actual 'touchable' objects in the geometry, representing a path of positioned ...
Bool_t Align(TGeoMatrix *newmat=nullptr, TGeoShape *newshape=nullptr, Bool_t check=kFALSE, Double_t ovlp=0.001)
Align a physical node with a new relative matrix/shape.
Class describing translations.
Definition TGeoMatrix.h:117
Volume assemblies.
Definition TGeoVolume.h:317
TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="") override
Add a component to the assembly.
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
Definition TGeoVolume.h:43
void RandomRays(Int_t nrays=10000, Double_t startx=0, Double_t starty=0, Double_t startz=0, const char *target_vol=nullptr, Bool_t check_norm=kFALSE)
Random raytracing method.
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
Add a TGeoNode to the list of nodes.
void Draw(Option_t *option="") override
draw top volume according to option
void SetLineColor(Color_t lcolor) override
Set the line color.
const char * GetName() const override
Returns name of object.
Definition TNamed.h:49
Stopwatch class.
Definition TStopwatch.h:28
void Start(Bool_t reset=kTRUE)
Start the stopwatch.
void Stop()
Stop the stopwatch.
void Print(Option_t *option="") const override
Print the real and cpu time passed between the start and stop events.
Basic string class.
Definition TString.h:138
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition TString.cxx:2385
void SetParallel() override
void Side() override
Author
Andrei Gheata

Definition in file parallel_world.C.