8 Double_t display= par[4]*( 20-copyNo);
9 Double_t position= par[0]+(copyNo)*par[2];
11 origin.SetXYZ(0, display,position);
28 Double_t halfLength = par[3] + copyNo * par[4];
29 Layer.SetXYZ(par[5],halfLength,par[1]);
44 b = rotma->GetRotationMatrix();
47 for (Int_t
i=0;
i<9;
i++) {
53 cout<<
" matrix "<<b[
i]<<endl;
55 v.SetX(b[0]*vec.X()+b[1]*vec.Y()+b[2]*vec.Z());
56 v.SetY(b[3]*vec.X()+b[4]*vec.Y()+b[5]*vec.Z());
57 v.SetZ(b[6]*vec.X()+b[7]*vec.Y()+b[8]*vec.Z());
71 gROOT->Macro(
"$VMCWORKDIR/gconfig/rootlogon.C");
74 gSystem->Load(
"libGeoBase");
75 gSystem->Load(
"libParBase");
76 gSystem->Load(
"libBase");
77 gSystem->Load(
"libPndData");
78 gSystem->Load(
"libPassive");
83 TFile*
fi =
new TFile(outfile,
"RECREATE");
85 FairGeoLoader*
geoLoad =
new FairGeoLoader(
"TGeo",
"FairGeoLoader");
86 FairGeoInterface *
geoFace = geoLoad->getGeoInterface();
87 geoFace->setMediaFile(
"../../geometry/media_pnd.geo");
91 FairGeoMedia *
Media = geoFace->getMedia();
92 FairGeoBuilder *
geobuild=geoLoad->getGeoBuilder();
94 FairGeoMedium *medab = Media->getMedium(
"HYPdiamond");
95 Int_t nmedGe=geobuild->createMedium(medab);
98 FairGeoMedium *medsci = Media->getMedium(
"HYPsilicon");
99 Int_t nmedsci=geobuild->createMedium(medsci);
101 FairGeoMedium *medcar = Media->getMedium(
"HYPcarbon");
102 Int_t nmedC=geobuild->createMedium(medcar);
106 TGeoManager*
gGeoMan = (TGeoManager*)gROOT->FindObject(
"FAIRGeom");
108 TGeoVolume *
top =
new TGeoVolumeAssembly(
"hypst");
110 gGeoMan->SetTopVolume(top);
112 TGeoVolume *complex =
new TGeoVolumeAssembly(
"complex");
117 const Int_t
max = 80;
151 Int_t NbOfLayers = 20;
153 Double_t lt = fAbsorberThickness + fGapThickness;
163 TGeoRotation*
rot =
new TGeoRotation();
164 TGeoRotation* rotO =
new TGeoRotation();
165 TGeoRotation*
rot2 =
new TGeoRotation();
169 TGeoVolume *BoxAsmb[4];
172 TGeoVolume *LayAsmb[80];
253 TGeoVolume *LaySi[80];
254 TGeoVolume *LayAb[80];
259 for(
int i=0;
i<4;
i++){
262 rot->SetAngles(0,0,0);
263 rot2->SetAngles(0,0,0);
265 rot->RotateZ((-1*
i)*90.0);
266 rot2->RotateZ(-1*
i*90.0);
269 v2 =
new TVector3(
rotate(TVector3((stsyz/2)-hole,stsyz/2,0.),rot2));
270 sprintf(tempname,
"stgQuad%d",
i+1);
271 sprintf(name4,
"transQuad%d",
i+1);
273 TGeoCombiTrans* trc5 =
new TGeoCombiTrans(v2->x(), v2->y(), v2->z(),
274 new TGeoRotation (*rot));
275 trc5->SetName(name4);
276 trc5->RegisterYourself();
278 BoxAsmb[
d]=
new TGeoVolumeAssembly(tempname);
279 complex->AddNode(BoxAsmb[d],0,trc5);
284 string tmaterial[4]={
"HYPdiamond",
"HYPdiamond",
"beryllium",
"aluminium"};
286 char tmplay[100],tmplayb[100],tmpAbs[100], tmpGap[100],tmpVAbs[100], tmpVGap[100];
289 Double_t firstPosition = -0.5*SecTargThick + 0.5*LayThick;
292 Double_t firstLength = 0.5*SecTargSizeYZ + lengthpar;
295 Double_t lastLength = SecTargSizeYZ;
299 TVector3 vecAbs,vecGap;
305 Double_t fStartPosition = firstPosition;
306 Double_t fHalfLayThick = 0.5*LayThick;
308 Double_t fHalfLengthFirst = 0.5 * firstLength;
309 Double_t fHalfLengthIncr = 0.5 *(lastLength-firstLength)/NbOfLayers;
310 Double_t fHalfLastLength = 0.5*lastLength;
312 Double_t param[6]={fStartPosition,fHalfLayThick,fSpacing,fHalfLengthFirst,
313 fHalfLengthIncr,fHalfLastLength};
320 for(Int_t
i=0;
i<20;
i++)
331 v_Pos.SetY(-v_Pos.y());
333 v_Pos.SetZ(-v_Pos.z());
347 zla[
i]= fAbsorberThickness/2;
352 vecAbs.SetZ(-fGapThickness/2.0);
362 zlg[
i]= fGapThickness/2.0;
367 vecGap.SetZ(fAbsorberThickness/2);
383 for(Int_t j=0; j<4;j++)
388 for(Int_t k=0; k<20; k++)
396 sprintf(tmplay,
"stgLay%d",k);
397 sprintf(tmpAbs,
"stgBlAb%d",k);
398 sprintf(tmpGap,
"stgBlSi%d",k);
399 sprintf(tmpVAbs,
"stglAb%d",k);
400 sprintf(tmpVGap,
"stglSi%d",k);
402 sprintf(name,
"transAb%d",k);
403 sprintf(name1,
"transSi%d",k);
404 sprintf(name2,
"transLay%d",k);
406 LayAsmb[
t]=
new TGeoVolumeAssembly(tmplay);
412 BoxAb[
t] =
new TGeoBBox(tmpAbs,da[k],ha[k],zla[k]);
413 LayAb[
t] =
new TGeoVolume(tmpVAbs,BoxAb[t],gGeoMan->GetMedium(
"HYPdiamond"));
414 BoxSi[
t] =
new TGeoBBox(tmpGap,dg[k],hg[k],zlg[k]);
415 LaySi[
t] =
new TGeoVolume(tmpVGap,BoxSi[t],gGeoMan->GetMedium(
"HYPsilicon"));
416 LaySi[
t]->SetLineColor(kPink);
417 LayAb[
t]->SetLineColor(kYellow);
420 TGeoCombiTrans*
trc1 =
new TGeoCombiTrans(xa[k],ya[k],za[k],
new TGeoRotation ());
422 trc1->RegisterYourself();
423 LayAsmb[
t]->AddNode(LayAb[t],k, trc1);
426 if(k<2||(k==5||k==10||k==15)){
427 TGeoCombiTrans*
trc2 =
new TGeoCombiTrans(xg[k],yg[k],zg[k],
new TGeoRotation ());
428 trc2->SetName(name1);
429 trc2->RegisterYourself();
430 LayAsmb[
t]->AddNode(LaySi[t],k, trc2);
431 TGeoCombiTrans*
trc3 =
new TGeoCombiTrans(xl[k],yl[k],zl[k],
new TGeoRotation ());
432 trc3->SetName(name2);
433 trc3->RegisterYourself();
434 BoxAsmb[j]->AddNode(LayAsmb[t],k,trc3);
443 for(Int_t k=20; k<36; k++)
451 sprintf(tmplay,
"stgLay%d",k);
452 sprintf(tmpAbs,
"stgBlAb%d",k);
453 sprintf(tmpGap,
"stgBlSi%d",k);
454 sprintf(tmpVAbs,
"stglAb%d",k);
455 sprintf(tmpVGap,
"stglSi%d",k);
457 sprintf(name,
"transAb%d",k);
458 sprintf(name1,
"transSi%d",k);
459 sprintf(name2,
"transLay%d",k);
461 LayAsmb[
t]=
new TGeoVolumeAssembly(tmplay);
467 BoxAb[
t] =
new TGeoBBox(tmpAbs,da[k-20],ha[k-20],zla[k-20]);
468 LayAb[
t] =
new TGeoVolume(tmpVAbs,BoxAb[k],gGeoMan->GetMedium(
"HYPdiamond"));
469 BoxSi[
t] =
new TGeoBBox(tmpGap,dg[k-20],hg[k-20],zlg[k-20]);
470 LaySi[
t] =
new TGeoVolume(tmpVGap,BoxSi[t],gGeoMan->GetMedium(
"HYPsilicon"));
471 LaySi[
t]->SetLineColor(kPink);
472 LayAb[
t]->SetLineColor(kYellow);
476 TGeoCombiTrans*
trc1 =
new TGeoCombiTrans(xa[k-20],ya[k-20],za[k-20],
new TGeoRotation ());
478 trc1->RegisterYourself();
479 LayAsmb[
t]->AddNode(LayAb[t],k, trc1);
482 if(k<22||(k==25||k==30||k==35)){
484 TGeoCombiTrans*
trc2 =
new TGeoCombiTrans(xg[k-20],yg[k-20],zg[k-20],
new TGeoRotation ());
485 trc2->SetName(name1);
486 trc2->RegisterYourself();
487 LayAsmb[
t]->AddNode(LaySi[t],k, trc2);
490 TGeoCombiTrans*
trc3 =
new TGeoCombiTrans(xl[k-20],yl[k-20],zl[k-20],
new TGeoRotation ());
491 trc3->SetName(name2);
492 trc3->RegisterYourself();
493 BoxAsmb[j]->AddNode(LayAsmb[t],k,trc3);
502 for(Int_t k=40; k<56; k++)
510 sprintf(tmplay,
"stgLay%d",k);
511 sprintf(tmpAbs,
"stgBlAb%d",k);
512 sprintf(tmpGap,
"stgBlSi%d",k);
513 sprintf(tmpVAbs,
"stglAb%d",k);
514 sprintf(tmpVGap,
"stglSi%d",k);
516 sprintf(name,
"transAb%d",k);
517 sprintf(name1,
"transSi%d",k);
518 sprintf(name2,
"transLay%d",k);
520 LayAsmb[
t]=
new TGeoVolumeAssembly(tmplay);
526 BoxAb[
t] =
new TGeoBBox(tmpAbs,da[k-40],ha[k-40],zla[k-40]);
527 LayAb[
t] =
new TGeoVolume(tmpVAbs,BoxAb[t],gGeoMan->GetMedium(
"HYPdiamond"));
528 BoxSi[
t] =
new TGeoBBox(tmpGap,dg[k-40],hg[k-40],zlg[k-40]);
529 LaySi[
t] =
new TGeoVolume(tmpVGap,BoxSi[t],gGeoMan->GetMedium(
"HYPsilicon"));
530 LaySi[
t]->SetLineColor(kPink);
531 LayAb[
t]->SetLineColor(kYellow);
537 TGeoCombiTrans*
trc1 =
new TGeoCombiTrans(xa[k-40],ya[k-40],za[k-40],
new TGeoRotation ());
539 trc1->RegisterYourself();
540 LayAsmb[
t]->AddNode(LayAb[t],k, trc1);
542 if(k<42||(k==45||k==50||k==55)){
544 TGeoCombiTrans*
trc2 =
new TGeoCombiTrans(xg[k-40],yg[k-40],zg[k-40],
new TGeoRotation ());
545 trc2->SetName(name1);
546 trc2->RegisterYourself();
547 LayAsmb[
t]->AddNode(LaySi[t],k, trc2);
550 TGeoCombiTrans*
trc3 =
new TGeoCombiTrans(xl[k-40],yl[k-40],zl[k-40],
new TGeoRotation ());
551 trc3->SetName(name2);
552 trc3->RegisterYourself();
553 BoxAsmb[j]->AddNode(LayAsmb[t],k,trc3);
562 for(Int_t k=60; k<76; k++)
570 sprintf(tmplay,
"stgLay%d",k);
571 sprintf(tmpAbs,
"stgBlAb%d",k);
572 sprintf(tmpGap,
"stgBlSi%d",k);
573 sprintf(tmpVAbs,
"stglAb%d",k);
574 sprintf(tmpVGap,
"stglSi%d",k);
576 sprintf(name,
"transAb%d",k);
577 sprintf(name1,
"transSi%d",k);
578 sprintf(name2,
"transLay%d",k);
580 LayAsmb[
t]=
new TGeoVolumeAssembly(tmplay);
586 BoxAb[
t] =
new TGeoBBox(tmpAbs,da[k-60],ha[k-60],zla[k-60]);
587 LayAb[
t] =
new TGeoVolume(tmpVAbs,BoxAb[t],gGeoMan->GetMedium(
"HYPdiamond"));
588 BoxSi[
t] =
new TGeoBBox(tmpGap,dg[k-60],hg[k-60],zlg[k-60]);
589 LaySi[
t] =
new TGeoVolume(tmpVGap,BoxSi[t],gGeoMan->GetMedium(
"HYPsilicon"));
590 LaySi[
t]->SetLineColor(kPink);
591 LayAb[
t]->SetLineColor(kYellow);
595 TGeoCombiTrans*
trc1 =
new TGeoCombiTrans(xa[k-60],ya[k-60],za[k-60],
new TGeoRotation ());
597 trc1->RegisterYourself();
598 LayAsmb[
t]->AddNode(LayAb[t],k, trc1);
601 if(k<62||(k==65||k==70||k==75)){
603 TGeoCombiTrans*
trc2 =
new TGeoCombiTrans(xg[k-60],yg[k-60],zg[k-60],
new TGeoRotation ());
604 trc2->SetName(name1);
605 trc2->RegisterYourself();
606 LayAsmb[
t]->AddNode(LaySi[t],k, trc2);
610 TGeoCombiTrans*
trc3 =
new TGeoCombiTrans(xl[k-60],yl[k-60],zl[k-60],
new TGeoRotation ());
611 trc3->SetName(name2);
612 trc3->RegisterYourself();
613 BoxAsmb[j]->AddNode(LayAsmb[t],k,trc3);
624 pipe =
new TGeoTube(
"stghypPipe",0.69,0.7,10.);
625 hyppipe =
new TGeoVolume(
"stglpipe",pipe,gGeoMan->GetMedium(
"HYPcarbon"));
627 TGeoCombiTrans* trc4 =
new TGeoCombiTrans(0., 0., 0.,
new TGeoRotation ());
629 trc4->SetName(
"transpipe");
630 trc4->RegisterYourself();
642 complex->AddNode(hyppipe, 0,trc4);
647 top->AddNode(complex,0,
new TGeoCombiTrans(0., 0., -55.5,
new TGeoRotation ()));
649 gGeoMan->CloseGeometry();
static T ASin(const T &x)
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
TVector3 ComputeTransformation(const int copyNo, Double_t *par)
int create_HypSTxy3Cmic_RootGeo5Lay()
Double_t const fAbsorberThickness
FairGeoBuilder * geobuild
TVector3 rotate(TVector3 vec, TGeoRotation *rotma)
FairGeoInterface * geoFace
TVector3 ComputeDimensions(const int copyNo, Double_t *par)