/** create root-geo-file for disk DIRC **/ { gROOT->LoadMacro("$VMCWORKDIR/gconfig/basiclibs.C"); basiclibs(); gSystem->Load("libGeoBase"); gSystem->Load("libParBase"); gSystem->Load("libBase"); gSystem->Load("libPassive"); FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader"); FairGeoInterface* geoFace = geoLoad->getGeoInterface(); geoFace->setMediaFile("../../geometry/media_pnd.geo"); geoFace->readMedia(); geoFace->print(); FairGeoMedia* geoMedia = geoFace->getMedia(); FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder(); // Parameters TString fGeoFile= "../../geometry/dsk.root"; // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> // Units Double_t const cm = 1.; Double_t const mm = cm/10.; Int_t const colBlack = 1; Int_t const colYellow = 5; Int_t const colRed = 2; Int_t const colBlue = 4; Int_t const colGreen = 3; Int_t const colGray = 15; // number of edges of the disk Int_t const fEdges = 8; // how many mirror types do we use? Int_t const fDetectorTypes = 2; Int_t const fDetectorColor[fDetectorTypes] = {colRed,colBlue}; Int_t const fMirrorColor[fDetectorTypes] = {colRed,colBlue}; Int_t const fDetectorsPerEdge = 120; // center angle in each equal-sided triangle in the octagon Double_t const fAlpha = 360. /fEdges; // [degree] Double_t const fAlphaRad = fAlpha * TMath::DegToRad(); // opening angle: disk is horizontal on top) Double_t const fPhi = fAlpha /2.; // [degree] //coating (air surrounding for reflections) Double_t const fCoatThickness = 1. *cm; // disk Double_t const fDiskThickness = 2. *cm; Double_t const fDiskRMin = 3. *cm; // could be something like the radius of beampipe Double_t const fDiskDistanceZ = 196. *cm; Double_t const fDiskRMax = fDiskDistanceZ * TMath::Tan(22.*TMath::DegToRad()); // ~79.19 cm // window Double_t const fWindowHeightHalf = fDiskDistanceZ * TMath::Tan( 5.*TMath::DegToRad()); // ~17.15 cm Double_t const fWindowWidthHalf = fDiskDistanceZ * TMath::Tan(10.*TMath::DegToRad()); // ~34.56 cm Bool_t const fWindowIsBox = kTRUE; // absorber in the window Double_t const fAbsorberThickness = 10 *mm; // arbitary number Bool_t const fAbsorberUse = kTRUE; // mirror Double_t const fMirrorHeight = 0.5 *mm; // arbitary value // mcp Double_t const fMcpHeight = 1. *cm; // arbitary value // edge Double_t const fEdgeWidthHalf = fDiskRMax * TMath::Tan(fPhi * TMath::DegToRad()); Double_t const fEdgeWidth = 2. * fEdgeWidthHalf; // detector Double_t const fDetectorWidth = fEdgeWidth/fDetectorsPerEdge; Double_t const fDetectorHeight = fMirrorHeight + fMcpHeight; // will help positioning TVector3 edgeStartPos; TVector3 corner; TGeoRotation nullRotation; TGeoRotation rotation; TString name; TString medium; FairGeoMedium* FairMediumAir = geoMedia->getMedium("air"); FairGeoMedium* FairMediumVacuum = geoMedia->getMedium("vacuum"); FairGeoMedium* FairMediumFusedSil = geoMedia->getMedium("FusedSil"); FairGeoMedium* FairMediumDIRCAir = geoMedia->getMedium("DIRCair"); FairGeoMedium* FairMediumMirror = geoMedia->getMedium("Mirror"); geoBuild->createMedium(FairMediumAir); geoBuild->createMedium(FairMediumVacuum); geoBuild->createMedium(FairMediumFusedSil); geoBuild->createMedium(FairMediumDIRCAir); geoBuild->createMedium(FairMediumMirror); TGeoManager* gGeoManager = (TGeoManager*)gROOT->FindObject("FAIRGeom"); cout<<"-I- overall top"<GetMedium("air")); gGeoManager->SetTopVolume(vTop); cout<<"-I- calculating local mother"<DefineSection(0, -fCoatThickness, fWindowHeightHalf - fAbsorberThickness - fCoatThickness, fDiskRMax + fMirrorHeight + fMcpHeight); lLocalMother->DefineSection(1, fDiskThickness + fCoatThickness, fWindowHeightHalf - fAbsorberThickness - fCoatThickness, fDiskRMax + fMirrorHeight + fMcpHeight); vLocalMother = new TGeoVolume("mother", lLocalMother, gGeoManager->GetMedium("DIRCair")); vTop->AddNode(vLocalMother, 0, new TGeoCombiTrans(0, 0, fDiskDistanceZ, new TGeoRotation(0))); cout<<"-I- calculating radiator disk"<DefineSection(0, 0.,fDiskRMin,fDiskRMax); lDiskGlass->DefineSection(1,fDiskThickness,fDiskRMin,fDiskRMax); // i know, that the thickness is too high, but that doesnt matter, cause // we will cmoposite the shape, but now we are sure it wont overlapp! if (fWindowIsBox) { TGeoBBox* lDiskWindow = new TGeoBBox("DW",fWindowWidthHalf,fWindowHeightHalf,fDiskThickness); } else { TGeoEltu* lDiskWindow = new TGeoEltu("DW",fWindowWidthHalf,fWindowHeightHalf,fDiskThickness); } // we need to shift the box along z-axis, cause center should be fDiskThickness/2 further in z TGeoTranslation* trDW = new TGeoTranslation("trDW",0., 0., fDiskThickness/2.); trDW->RegisterYourself(); // and to register it for TGeoCompositeShape TGeoCompositeShape* lDisk = new TGeoCompositeShape("DG - DW:trDW"); TGeoVolume* vDisk = new TGeoVolume("radiator", lDisk, gGeoManager->GetMedium("FusedSil")); vDisk->SetLineColor(colYellow); // AddNode(*daughter, copynumber, TGeoMatrix) vLocalMother->AddNode(vDisk,0,new TGeoCombiTrans(0., 0., 0., new TGeoRotation(0))); if (fAbsorberUse) { cout<<"-I- calculating absorber"<GetMedium("vacuum")); vAbsorber->SetLineColor(colBlack); // again we need to shift them by the half fDiskThickness so place the center where it belongs vLocalMother->AddNode(vAbsorber,0,new TGeoCombiTrans(0., 0.,fDiskThickness/2., new TGeoRotation(0))); } cout<<"-I- calculating detectors (mother for mirror/mcp)"<GetMedium("DIRCair")); vDetector[i]->SetLineColor(fDetectorColor[i]); } cout<<"-I- calculating mirrors"<GetMedium(medium.Data())); vMirror[i]->SetLineColor(fMirrorColor[i]); vDetector[i]->AddNode(vMirror[i],0, new TGeoCombiTrans(0.,-fDetectorHeight/2.+fMirrorHeight/2.,0., new TGeoRotation(0))); } cout<<"-I- calculating mcps"<GetMedium("FusedSil")); vMcp[i]->SetLineColor(colGray); vDetector[i]->AddNode(vMcp[i],0, new TGeoCombiTrans(0.,-fDetectorHeight/2.+fMirrorHeight+fMcpHeight/2.,0., new TGeoRotation(0))); } cout<<"-I- placing detectors"<AddNode(vDetector[(fDetectorsPerEdge*iEdge+iDet)%fDetectorTypes], fDetectorsPerEdge*iEdge + iDet, new TGeoCombiTrans(corner.X(),corner.Y(),corner.Z(), new TGeoRotation(rotation))); } } // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // End of detector construction code // close geometry gGeoManager->CloseGeometry(); // save to file TFile* fi = new TFile(fGeoFile,"RECREATE"); // writing the mother is sufficient, as it asks her daugthers to do the same. vTop->Write(); fi->Close(); cout << "Done." << endl; // lets see what we produced vTop->Raytrace(); }