Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
parallel_world.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_geom
3 /// Misaligning geometry generate in many cases overlaps, due to the idealization
4 /// of the design and the fact that in real life movements of the geometry volumes
5 /// have constraints and are correlated.
6 ///
7 /// This typically generates inconsistent
8 /// response of the navigation methods, leading to inefficiencies during tracking,
9 /// errors in the material budget calculations, and so on. Among those, there are
10 /// dangerous cases when the hidden volumes are sensitive.
11 /// This macro demonstrates how to use the "parallel world" feature to assign
12 /// highest navigation priority to some physical paths in geometry.
13 ///
14 /// \macro_image
15 /// \macro_code
16 ///
17 /// \author Andrei Gheata
18 
19 void align();
20 
21 //______________________________________________________________________________
22 void parallel_world(Bool_t usepw=kTRUE, Bool_t useovlp=kTRUE)
23 {
24  TGeoManager *geom = new TGeoManager("parallel_world", "Showcase for prioritized physical paths");
25  TGeoMaterial *matV = new TGeoMaterial("Vac", 0,0,0);
26  TGeoMedium *medV = new TGeoMedium("MEDVAC",1,matV);
27  TGeoMaterial *matAl = new TGeoMaterial("Al", 26.98,13,2.7);
28  TGeoMedium *medAl = new TGeoMedium("MEDAL",2,matAl);
29  TGeoMaterial *matSi = new TGeoMaterial("Si", 28.085,14,2.329);
30  TGeoMedium *medSi = new TGeoMedium("MEDSI",3,matSi);
31  TGeoVolume *top = gGeoManager->MakeBox("TOP",medV,100,400,1000);
32  gGeoManager->SetTopVolume(top);
33 
34  // Shape for the support block
35  TGeoBBox *sblock = new TGeoBBox("sblock", 20,10,2);
36  // The volume for the support
37  TGeoVolume *support = new TGeoVolume("block",sblock, medAl);
38  support->SetLineColor(kGreen);
39 
40  // Shape for the sensor to be prioritized in case of overlap
41  TGeoBBox *ssensor = new TGeoBBox("sensor", 19,9,0.2);
42  // The volume for the sensor
43  TGeoVolume *sensor = new TGeoVolume("sensor",ssensor, medSi);
44  sensor->SetLineColor(kRed);
45 
46  // Chip assembly of support+sensor
47  TGeoVolumeAssembly *chip = new TGeoVolumeAssembly("chip");
48  chip->AddNode(support, 1);
49  chip->AddNode(sensor,1, new TGeoTranslation(0,0,-2.1));
50 
51  // A ladder that normally sags
52  TGeoBBox *sladder = new TGeoBBox("sladder", 20,300,5);
53  // The volume for the ladder
54  TGeoVolume *ladder = new TGeoVolume("ladder",sladder, medAl);
55  ladder->SetLineColor(kBlue);
56 
57  // Add nodes
58  top->AddNode(ladder,1);
59  for (Int_t i=0; i<10; i++)
60  top->AddNode(chip, i+1, new TGeoTranslation(0, -225.+50.*i, 10));
61 
62  gGeoManager->CloseGeometry();
63  TGeoParallelWorld *pw = 0;
64  if (usepw) pw = gGeoManager->CreateParallelWorld("priority_sensors");
65 // Align chips
66  align();
67  if (usepw) {
68  if (useovlp) pw->AddOverlap(ladder);
69  pw->CloseGeometry();
70  gGeoManager->SetUseParallelWorldNav(kTRUE);
71  }
72  TString cname;
73  cname = usepw ? "cpw" : "cnopw";
74  TCanvas *c = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(cname);
75  if (c) c->cd();
76  else c = new TCanvas(cname, "",800,600);
77  top->Draw();
78 // top->RandomRays(0,0,0,0,sensor->GetName());
79  // Track random "particles" coming from the block side and draw only the tracklets
80  // actually crossing one of the sensors. Note that some of the tracks coming
81  // from the outer side may see the full sensor, while the others only part of it.
82  TStopwatch timer;
83  timer.Start();
84  top->RandomRays(100000,0,0,-30,sensor->GetName());
85  timer.Stop();
86  timer.Print();
87  TView3D *view = (TView3D*)gPad->GetView();
88  view->SetParallel();
89  view->Side();
90  if (usepw) pw->PrintDetectedOverlaps();
91 }
92 
93 //______________________________________________________________________________
94 void align()
95 {
96 // Aligning 2 sensors so they will overlap with the support. One sensor is positioned
97 // normally while the other using the shared matrix
98  TGeoPhysicalNode *node;
99  TGeoParallelWorld *pw = gGeoManager->GetParallelWorld();
100  Double_t sag;
101  for (Int_t i=0; i<10; i++) {
102  node = gGeoManager->MakePhysicalNode(TString::Format("/TOP_1/chip_%d",i+1));
103  sag = 8.-0.494*(i-4.5)*(i-4.5);
104  TGeoTranslation *tr = new TGeoTranslation(0., -225.+50.*i, 10-sag);
105  node->Align(tr);
106  if (pw) pw->AddNode(TString::Format("/TOP_1/chip_%d",i+1));
107  }
108 }