9 Bool_t raytracing = kTRUE;
 
   15    gSystem->Load(
"libGeom");
 
   16    TControlBar* bar = 
new TControlBar(
"vertical", 
"TGeo composite shapes",20,20);
 
   17    bar->AddButton(
"How to run  ",
"help()",
"Instructions ");
 
   18    bar->AddButton(
"Union ", 
"s_union()", 
"A + B ");
 
   19    bar->AddButton(
"Intersection ", 
"s_intersection()",
"A * B ");
 
   20    bar->AddButton(
"Difference ", 
"s_difference()",
"A - B ");
 
   22    bar->AddButton(
"Complex composite", 
"complex_1()",
"(A * B) + (C - D)");
 
   31    gGeoManager->GetGeomPainter()->SetRaytracing(kFALSE);
 
   39    gROOT->GetListOfCanvases()->Delete();
 
   40    TCanvas *c = 
new TCanvas(
"composite shape", 
"Union boolean operation", 700, 1000);
 
   44    gPad->SetPad(0,0,1,0.4);
 
   46    gPad->SetPad(0,0.4,1,1);
 
   48    if (gGeoManager) 
delete gGeoManager;
 
   50    new TGeoManager(
"xtru", 
"poza12");
 
   51    TGeoMaterial *mat = 
new TGeoMaterial(
"Al", 26.98,13,2.7);
 
   52    TGeoMedium *med = 
new TGeoMedium(
"MED",1,mat);
 
   53    TGeoVolume *top = gGeoManager->MakeBox(
"TOP",med,100,100,100);
 
   54    gGeoManager->SetTopVolume(top);
 
   57    TGeoPgon *pgon = 
new TGeoPgon(
"pg",0.,360.,6,2);
 
   58    pgon->DefineSection(0,0,0,20);
 
   59    pgon->DefineSection(1, 30,0,20);
 
   61    TGeoSphere *sph = 
new TGeoSphere(
"sph", 40., 45., 5., 175., 0., 340.);
 
   63    TGeoTranslation *tr = 
new TGeoTranslation(0., 0., 45.);
 
   66    tr->RegisterYourself();
 
   68    TGeoCompositeShape *cs = 
new TGeoCompositeShape(
"mir", 
"sph:tr + pg");
 
   70    TGeoVolume *vol = 
new TGeoVolume(
"COMP1",cs);
 
   72    gGeoManager->CloseGeometry();
 
   73    gGeoManager->SetNsegments(100);
 
   78    TPaveText *pt = 
new TPaveText(0.01,0.01,0.99,0.99);
 
   80    TText *text = pt->AddText(
"TGeoCompositeShape - composite shape class");
 
   81    text->SetTextColor(2);
 
   82    pt->AddText(
"----- It's an example of boolean union operation : A + B");
 
   83    pt->AddText(
"----- A == part of sphere (5-175, 0-340), B == pgon");
 
   85    pt->SetAllWith(
"-----",
"color",4);
 
   86    pt->SetAllWith(
"-----",
"font",72);
 
   87    pt->SetAllWith(
"-----",
"size",0.04);
 
   89    pt->SetTextSize(.044);
 
   96    gROOT->GetListOfCanvases()->Delete();
 
   97    TCanvas *c = 
new TCanvas(
"composite shape", 
"Intersection boolean operation", 700, 1000);
 
  101    gPad->SetPad(0,0,1,0.4);
 
  103    gPad->SetPad(0,0.4,1,1);
 
  105    if (gGeoManager) 
delete gGeoManager;
 
  107    new TGeoManager(
"xtru", 
"poza12");
 
  108    TGeoMaterial *mat = 
new TGeoMaterial(
"Al", 26.98,13,2.7);
 
  109    TGeoMedium *med = 
new TGeoMedium(
"MED",1,mat);
 
  110    TGeoVolume *top = gGeoManager->MakeBox(
"TOP",med,100,100,100);
 
  111    gGeoManager->SetTopVolume(top);
 
  114    TGeoBBox *box = 
new TGeoBBox(
"bx", 40., 40., 40.);
 
  115    TGeoSphere *sph = 
new TGeoSphere(
"sph", 40., 45.);
 
  117    TGeoTranslation *tr = 
new TGeoTranslation(0., 0., 45.);
 
  120    tr->RegisterYourself();
 
  122    TGeoCompositeShape *cs = 
new TGeoCompositeShape(
"mir", 
"sph:tr * bx");
 
  124    TGeoVolume *vol = 
new TGeoVolume(
"COMP2",cs);
 
  126    gGeoManager->CloseGeometry();
 
  127    gGeoManager->SetNsegments(100);
 
  133    TPaveText *pt = 
new TPaveText(0.01,0.01,0.99,0.99);
 
  137    TText *text = pt->AddText(
"TGeoCompositeShape - composite shape class");
 
  139    text->SetTextColor(2);
 
  140    pt->AddText(
"----- Here is an example of boolean intersection operation : A * B");
 
  141    pt->AddText(
"----- A == sphere (with inner radius non-zero), B == box");
 
  143    pt->SetAllWith(
"-----",
"color",4);
 
  144    pt->SetAllWith(
"-----",
"font",72);
 
  145    pt->SetAllWith(
"-----",
"size",0.04);
 
  146    pt->SetTextAlign(12);
 
  147    pt->SetTextSize(0.044);
 
  154    gROOT->GetListOfCanvases()->Delete();
 
  155    TCanvas *c = 
new TCanvas(
"composite shape", 
"Difference boolean operation", 700, 1000);
 
  159    gPad->SetPad(0,0,1,0.4);
 
  161    gPad->SetPad(0,0.4,1,1);
 
  163    if (gGeoManager) 
delete gGeoManager;
 
  165    new TGeoManager(
"xtru", 
"poza12");
 
  166    TGeoMaterial *mat = 
new TGeoMaterial(
"Al", 26.98,13,2.7);
 
  167    TGeoMedium *med = 
new TGeoMedium(
"MED",1,mat);
 
  168    TGeoVolume *top = gGeoManager->MakeBox(
"TOP",med,100,100,100);
 
  169    gGeoManager->SetTopVolume(top);
 
  172    TGeoTorus *tor = 
new TGeoTorus(
"tor", 45., 15., 20., 45., 145.);
 
  173    TGeoSphere *sph = 
new TGeoSphere(
"sph", 20., 45., 0., 180., 0., 270.);
 
  175    TGeoCompositeShape *cs = 
new TGeoCompositeShape(
"mir", 
"sph - tor");
 
  177    TGeoVolume *vol = 
new TGeoVolume(
"COMP3",cs);
 
  179    gGeoManager->CloseGeometry();
 
  180    gGeoManager->SetNsegments(60);
 
  186    TPaveText *pt = 
new TPaveText(.01, .01, .99, .99);
 
  190    TText *text = pt->AddText(
"TGeoCompositeShape - composite shape class");
 
  192    text->SetTextColor(2);
 
  194    pt->AddText(
"----- It's an example of boolean difference: A - B");
 
  195    pt->AddText(
"----- A == part of sphere (0-180, 0-270), B == partial torus (45-145)");
 
  197    pt->SetAllWith(
"-----",
"color",4);
 
  198    pt->SetAllWith(
"-----",
"font",72);
 
  199    pt->SetAllWith(
"-----",
"size",0.04);
 
  200    pt->SetTextAlign(12);
 
  201    pt->SetTextSize(0.044);
 
  208    gROOT->GetListOfCanvases()->Delete();
 
  209    TCanvas *c = 
new TCanvas(
"composite shape", 
"A * B - C", 700, 1000);
 
  213    gPad->SetPad(0,0,1,0.4);
 
  215    gPad->SetPad(0,0.4,1,1);
 
  217    if (gGeoManager) 
delete gGeoManager;
 
  219    new TGeoManager(
"xtru", 
"poza12");
 
  220    TGeoMaterial *mat = 
new TGeoMaterial(
"Al", 26.98,13,2.7);
 
  221    TGeoMedium *med = 
new TGeoMedium(
"MED",1,mat);
 
  222    TGeoVolume *top = gGeoManager->MakeBox(
"TOP",med,100,100,100);
 
  223    gGeoManager->SetTopVolume(top);
 
  226    TGeoBBox *box = 
new TGeoBBox(
"box", 20., 20., 20.);
 
  227    TGeoBBox *box1 = 
new TGeoBBox(
"box1", 5., 5., 5.);
 
  228    TGeoSphere *sph = 
new TGeoSphere(
"sph", 5., 25.);
 
  229    TGeoSphere *sph1 = 
new TGeoSphere(
"sph1", 1., 15.);
 
  231    TGeoTranslation *tr = 
new TGeoTranslation(0., 30., 0.);
 
  232    TGeoTranslation *tr1 = 
new TGeoTranslation(0., 40., 0.);
 
  233    TGeoTranslation *tr2 = 
new TGeoTranslation(0., 30., 0.);
 
  234    TGeoTranslation *tr3 = 
new TGeoTranslation(0., 30., 0.);
 
  240    tr->RegisterYourself();
 
  241    tr1->RegisterYourself();
 
  242    tr2->RegisterYourself();
 
  243    tr3->RegisterYourself();
 
  245    TGeoCompositeShape *cs = 
new TGeoCompositeShape(
"mir", 
"(sph * box) + (sph1:tr - box1:tr1)");
 
  247    TGeoVolume *vol = 
new TGeoVolume(
"COMP4",cs);
 
  250    gGeoManager->CloseGeometry();
 
  251    gGeoManager->SetNsegments(80);
 
  256    TPaveText *pt = 
new TPaveText(0.01,0.01,0.99,0.99);
 
  258    TText *text = pt->AddText(
"TGeoCompositeShape - composite shape class");
 
  259    text->SetTextColor(2);
 
  260    pt->AddText(
"----- (sphere * box) + (sphere - box) ");
 
  263    pt->SetAllWith(
"-----",
"color",4);
 
  264    pt->SetAllWith(
"-----",
"font",72);
 
  265    pt->SetAllWith(
"-----",
"size",0.04);
 
  266    pt->SetTextAlign(12);
 
  267    pt->SetTextSize(0.044);
 
  274 void AddText(TPaveText *pave, 
const char *datamember, Double_t value, 
const char *comment)
 
  277    for (Int_t i=0; i<128; i++) line[i] = 
' ';
 
  278    memcpy(&line[0], datamember, strlen(datamember));
 
  281    sprintf(number, 
"%5.2f", value);
 
  282    memcpy(&line[12], number, strlen(number));
 
  285    sprintf(&line[30], 
"%s",comment);
 
  286    TText *text = pave->AddText(line);
 
  287    text->SetTextAlign(12);
 
  291 void AddText(TPaveText *pave, 
const char *datamember, Int_t value, 
const char *comment)
 
  294    for (Int_t i=0; i<128; i++) line[i] = 
' ';
 
  295    memcpy(&line[0], datamember, strlen(datamember));
 
  298    sprintf(number, 
"%5i", value);
 
  299    memcpy(&line[12], number, strlen(number));
 
  302    sprintf(&line[30], 
"%s",comment);
 
  303    TText *text = pave->AddText(line);
 
  304    text->SetTextAlign(12);
 
  308 void AddText(TPaveText *pave, TObject *pf, Int_t iaxis)
 
  311    TGeoPatternFinder *finder = (TGeoPatternFinder*)pf;
 
  312    if (!pave || !pf) 
return;
 
  313    for (Int_t i=0; i<128; i++) line[i] = 
' ';
 
  314    TGeoVolume *volume = finder->GetVolume();
 
  315    TGeoShape *sh = volume->GetShape();
 
  316    sprintf(line, 
"Division of %s on axis %d (%s)", volume->GetName(), iaxis,sh->GetAxisName(iaxis));
 
  317    TText *text = pave->AddText(line);
 
  318    text->SetTextColor(3);
 
  319    text->SetTextAlign(12);
 
  320    AddText(pave, 
"fNdiv",finder->GetNdiv(),
"number of divisions");
 
  321    AddText(pave, 
"fStart",finder->GetStart(),
"start divisioning position");
 
  322    AddText(pave, 
"fStep",finder->GetStep(),
"division step");
 
  327    if (!gGeoManager) 
return;
 
  329    TVirtualGeoPainter *painter = gGeoManager->GetGeomPainter();
 
  331    if (!painter) 
return;
 
  333    painter->SetRaytracing(raytracing);
 
  345    new TCanvas(
"chelp",
"Help to run demos",200,10,700,600);
 
  347    TPaveText* welcome = 
new TPaveText(.1,.8,.9,.97);
 
  348    welcome->AddText(
"Welcome to the new geometry package");
 
  349    welcome->SetTextFont(32);
 
  350    welcome->SetTextColor(4);
 
  351    welcome->SetFillColor(24);
 
  354    TPaveText* hdemo = 
new TPaveText(.05,.05,.95,.7);
 
  355    hdemo->SetTextAlign(12);
 
  356    hdemo->SetTextFont(52);
 
  357    hdemo->AddText(
"- Demo for building TGeo composite shapes");
 
  359    hdemo->SetAllWith(
"....",
"color",2);
 
  360    hdemo->SetAllWith(
"....",
"font",72);
 
  361    hdemo->SetAllWith(
"....",
"size",0.03);