SOOT::Examples::Geometry - SOOT Examples for Geometry
This is a listing of all SOOT examples for Geometry.
use strict; use SOOT ':all'; use Math::Trig; #--- Definition of a simple geometry $gSystem->Load("libGeom"); $gSystem->Load("libGeomBuilder"); $gSystem->Load("libGeomPainter"); SOOT->UpdateClasses(); my $geom = TGeoManager->new("Assemblies", "Geometry using assemblies"); #--- define some materials my $matVacuum = TGeoMaterial->new("Vacuum", 0,0,0); my $matAl = TGeoMaterial->new("Al", 26.98,13,2.7); #--- define some media my $Vacuum = TGeoMedium->new("Vacuum", 1, $matVacuum); my $Al = TGeoMedium->new("Aluminium", 2, $matAl); #--- make the top container volume my $top = $geom->MakeBox("TOP", $Vacuum, 1000., 1000., 100.); $geom->SetTopVolume($top); # Make the elementary assembly of the whole structure my $tplate = TGeoVolumeAssembly->new("TOOTHPLATE"); # FIXME This segfaults!? my $ntooth = 5; my $xplate = 25.0; my $yplate = 50.0; my $xtooth = 10.0; my $ytooth = 0.5*$yplate/$ntooth; my $dshift = 2.*$xplate + $xtooth; my $plate = $geom->MakeBox("PLATE", $Al, $xplate, $yplate, 1); $plate->SetLineColor(kBlue); my $tooth = $geom->MakeBox("TOOTH", $Al, $xtooth, $ytooth, 1); $tooth->SetLineColor(kBlue); $tplate->AddNode($plate, 1); my ($xt, $yt); for my $i (0..$ntooth) { $xt = $xplate + $xtooth; $yt = -$yplate + (4*$i+1)*$ytooth; $tplate->AddNode($tooth, $i+1, TGeoTranslation->new($xt,$yt,0)->keep); $xt = -$xplate-$xtooth; $yt = -$yplate + (4*$i+3)*$ytooth; $tplate->AddNode($tooth, $ntooth+$i+1, TGeoTranslation->new($xt,$yt,0)->keep); } my $rot1 = TGeoRotation->new(); $rot1->RotateX(90); my $rot; my $trans; # Make a hexagone cell out of 6 toothplates. These can zip togeather # without generating overlaps (they are self-contained) my $cell = TGeoVolumeAssembly->new("CELL"); for my $i (0..6) { my $phi = 60.*$i; my $phirad = deg2rad($phi); my $xp = $dshift*sin($phirad); my $yp = -$dshift*cos($phirad); $rot = TGeoRotation->new($rot1); $rot->RotateZ($phi); $trans = TGeoCombiTrans->new($xp,$yp,0,$rot); $cell->AddNode($tplate, $i+1, $trans); # FIXME SEGV here } # Make a row as an assembly of cells, then combine rows in a honeycomb # structure. This again works without any need to define rows as "overlapping" my $row = TGeoVolumeAssembly->new("ROW"); my $ncells = 5; for my $i (0..$ncells-1) { my $ycell = (2*$i+1)*($dshift+10); $row->AddNode($cell, $ncells+$i+1, TGeoTranslation->new(0,$ycell,0)->keep); $row->AddNode($cell, $ncells-$i, TGeoTranslation->new(0,-$ycell,0)->keep); } my $dxrow = 3.*($dshift+10.)*tan(deg2rad(30.0)); my $dyrow = $dshift+10.; my $nrows = 5; for my $i (0..$nrows) { my $xrow = 0.5*(2*$i+1)*$dxrow; my $yrow = 0.5*$dyrow; if (($i%2)==0) { $yrow = -$yrow; } $top->AddNode($row, $nrows+$i+1, TGeoTranslation->new($xrow,$yrow,0)->keep); $top->AddNode($row, $nrows-$i, TGeoTranslation->new(-$xrow,-$yrow,0)->keep); } #--- close the geometry $geom->CloseGeometry(); $geom->SetVisLevel(4); $geom->SetVisOption(0); $top->Draw(); $gApplication->Run;
use strict; use warnings; use SOOT ':all'; use Math::Trig; $gSystem->Load("libGeom"); $gSystem->Load("libGeomBuilder"); $gSystem->Load("libGeomPainter"); SOOT->UpdateClasses(); # use TGeo classes to draw a model of a nucleus # # Author: Otto Schaile my $nProtons = shift || 40; my $nNeutrons = shift || 60; my $NeutronRadius = 60; my $ProtonRadius = 60; my $NucleusRadius; my $distance = 60; my $vol = $nProtons + $nNeutrons; $vol = 3 * $vol / (4 * pi); $NucleusRadius = $distance * $vol**(1./3.); my $geom = TGeoManager->new("nucleus", "Model of a nucleus"); $geom->SetNsegments(40); my $matEmptySpace = TGeoMaterial->new("EmptySpace", 0, 0, 0); my $matProton = TGeoMaterial->new("Proton" , .938, 1., 10000.); my $matNeutron = TGeoMaterial->new("Neutron" , .935, 0., 10000.); my $EmptySpace = TGeoMedium->new("Empty", 1, $matEmptySpace); my $Proton = TGeoMedium->new("Proton", 1, $matProton); my $Neutron = TGeoMedium->new("Neutron",1, $matNeutron); # the space where the nucleus lives (top container volume) my $worldx = 200.; my $worldy = 200.; my $worldz = 200.; my $top = $geom->MakeBox("WORLD", $EmptySpace, $worldx, $worldy, $worldz); $geom->SetTopVolume($top); my $proton = $geom->MakeSphere("proton", $Proton, 0., $ProtonRadius); my $neutron = $geom->MakeSphere("neutron", $Neutron, 0., $NeutronRadius); $proton->SetLineColor(kRed); $neutron->SetLineColor(kBlue); my ($x, $y, $z); my $i = 0; while ($i < $nProtons) { $x = $gRandom->Gaus(0.0, 1.0); $y = $gRandom->Gaus(0.0, 1.0); $z = $gRandom->Gaus(0.0, 1.0); printf "%f %f %f\n", $x, $y, $z; if (sqrt($x**2 + $y**2 + $z**2) < 1) { $x = (2 * $x - 1) * $NucleusRadius; $y = (2 * $y - 1) * $NucleusRadius; $z = (2 * $z - 1) * $NucleusRadius; my $trans = TGeoTranslation->new($x*1.0, $y*1.0, $z*1.0)->keep; $top->AddNode($proton, $i, $trans); $i++; } } $i = 0; while ($i < $nNeutrons) { $x = $gRandom->Gaus(0.0, 1.0); $y = $gRandom->Gaus(0.0, 1.0); $z = $gRandom->Gaus(0.0, 1.0); if (sqrt($x**2 + $y**2 + $z**2) < 1) { $x = (2 * $x - 1) * $NucleusRadius; $y = (2 * $y - 1) * $NucleusRadius; $z = (2 * $z - 1) * $NucleusRadius; my $trans = TGeoTranslation->new($x*1.0, $y*1.0, $z*1.0)->keep; $top->AddNode($neutron, $i + $nProtons, $trans); $i++; } } $geom->CloseGeometry(); $geom->SetVisLevel(4); $top->Draw("ogl"); $gApplication->Run;
use strict; use warnings; use SOOT ':all'; $gSystem->Load("libGeom"); $gSystem->Load("libGeomBuilder"); $gSystem->Load("libGeomPainter"); SOOT->UpdateClasses(); $gROOT->Reset(); my $c1 = TCanvas->new('c1', 'Geometry Shapes', 200, 10, 700, 500); # Define some volumes my $brik = TBRIK->new('BRIK', 'BRIK', 'void', 200, 150, 150); my $trd1 = TTRD1->new('TRD1', 'TRD1', 'void', 200, 50, 100, 100); my $trd2 = TTRD2->new('TRD2', 'TRD2', 'void', 200, 50, 200, 50, 100); my $trap = TTRAP->new('TRAP', 'TRAP', 'void', 190, 0, 0, 60, 40, 90, 15, 120, 80, 180, 15); my $para = TPARA->new('PARA', 'PARA', 'void', 100, 200, 200, 15, 30, 30); my $gtra = TGTRA->new('GTRA', 'GTRA', 'void', 390, 0, 0, 20, 60, 40, 90, 15, 120, 80, 180, 15); my $tube = TTUBE->new('TUBE', 'TUBE', 'void', 150, 200, 400); my $tubs = TTUBS->new('TUBS', 'TUBS', 'void', 80, 100, 100, 90, 235); my $cone = TCONE->new('CONE', 'CONE', 'void', 100, 50, 70, 120, 150); my $cons = TCONS->new('CONS', 'CONS', 'void', 50, 100, 100, 200, 300, 90, 270); my $sphe = TSPHE->new('SPHE', 'SPHE', 'void', 25, 340, 45, 135, 0, 270); my $sphe1 = TSPHE->new('SPHE1', 'SPHE1', 'void', 0, 140, 0, 180, 0, 360); my $sphe2 = TSPHE->new('SPHE2', 'SPHE2', 'void', 0, 200, 10, 120, 45, 145); my $pcon = TPCON->new('PCON', 'PCON', 'void', 180, 270, 4); $pcon->DefineSection(0, -200, 50, 100); $pcon->DefineSection(1, -50, 50, 80); $pcon->DefineSection(2, 50, 50, 80); $pcon->DefineSection(3, 200, 50, 100); my $pgon = TPGON->new('PGON', 'PGON', 'void', 180, 270, 8, 4); $pgon->DefineSection(0, -200, 50, 100); $pgon->DefineSection(1, -50, 50, 80); $pgon->DefineSection(2, 50, 50, 80); $pgon->DefineSection(3, 200, 50, 100); # Set shapes attributes $brik->SetLineColor(1); $trd1->SetLineColor(2); $trd2->SetLineColor(3); $trap->SetLineColor(4); $para->SetLineColor(5); $gtra->SetLineColor(7); $tube->SetLineColor(6); $tubs->SetLineColor(7); $cone->SetLineColor(2); $cons->SetLineColor(3); $pcon->SetLineColor(6); $pgon->SetLineColor(2); $sphe->SetLineColor(1); $sphe1->SetLineColor(2); $sphe2->SetLineColor(4); # Build the geometry hierarchy my $node1 = TNode->new('NODE1', 'NODE1', 'BRIK'); $node1->cd(); my $node2 = TNode->new( 'NODE2', 'NODE2', 'TRD1', 0, 0, -1000); my $node3 = TNode->new( 'NODE3', 'NODE3', 'TRD2', 0, 0, 1000); my $node4 = TNode->new( 'NODE4', 'NODE4', 'TRAP', 0, -1000, 0); my $node5 = TNode->new( 'NODE5', 'NODE5', 'PARA', 0, 1000, 0); my $node6 = TNode->new( 'NODE6', 'NODE6', 'TUBE', -1000, 0, 0); my $node7 = TNode->new( 'NODE7', 'NODE7', 'TUBS', 1000, 0, 0); my $node8 = TNode->new( 'NODE8', 'NODE8', 'CONE', -300, -300, 0); my $node9 = TNode->new( 'NODE9', 'NODE9', 'CONS', 300, 300, 0); my $node10 = TNode->new('NODE10', 'NODE10', 'PCON', 0, -1000, -1000); my $node11 = TNode->new('NODE11', 'NODE11', 'PGON', 0, 1000, 1000); my $node12 = TNode->new('NODE12', 'NODE12', 'GTRA', 0, -400, 700); my $node13 = TNode->new('NODE13', 'NODE13', 'SPHE', 10, -400, 500); my $node14 = TNode->new('NODE14', 'NODE14', 'SPHE1', 10, 250, 300); my $node15 = TNode->new('NODE15', 'NODE15', 'SPHE2', 10, -100, -200); # Draw this geometry in the current canvas $node1->cd(); $node1->Draw(); $c1->Update(); $c1->GetViewer3D; $gApplication->Run;
SOOT
Steffen Mueller, <smueller@cpan.org>
Copyright (C) 2010 by Steffen Mueller
SOOT, the Perl-ROOT wrapper, is free software; you can redistribute it and/or modify it under the same terms as ROOT itself, that is, the GNU Lesser General Public License. A copy of the full license text is available from the distribution as the LICENSE file.
To install SOOT, copy and paste the appropriate command in to your terminal.
cpanm
cpanm SOOT
CPAN shell
perl -MCPAN -e shell install SOOT
For more information on module installation, please visit the detailed CPAN module installation guide.