//void ConstructGeometry1(TGeoMedium *lead, TGeoMedium *pMed2) void ConstructGeometry1(TGeoMedium *lead) { cout << endl; cout << "create_target_geo.C-I- R3BTarget:: ConstructGeometry() "<< endl; cout << "-I- R3BTarget Target type: Lead target (199mg/cm2) "<< endl; cout << endl; Double_t dx, dy, dz; Double_t thx, thy, thz; Double_t phx, phy, phz; // Combi transformation: dx = 0.000000; dy = 0.000000; dz = 0.000000; //-(0.15+half thickness) // Rotation: thx = 90.000000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = 0.000000; phz = 0.000000; TGeoRotation *pRot = new TGeoRotation("",thx,phx,thy,phy,thz,phz); TGeoCombiTrans* pMatrix = new TGeoCombiTrans("", dx,dy,dz,pRot); /* // Shape: TargetEnveloppe type: TGeoBBox // TargetEnveloppe Tube 1 dx = 1.6000; dy = 1.6000; dz = 0.009000; TGeoShape *pTargetEnveloppe = new TGeoBBox("TargetEnveloppe",dx,dy,dz); TGeoVolume *pTargetEnveloppe_log = new TGeoVolume("TargetEnveloppe",pTargetEnveloppe, pMed2); pTargetEnveloppe_log->SetVisLeaves(kTRUE); TGeoCombiTrans* pGlobal = GetGlobalPosition(pMatrix); gTop->AddNode(pTargetEnveloppe_log, 0, pGlobal); */ // Shape: LeadTarget type: TGeoBBox dx = 1.500000; //s318 dy = 1.500000; //s318 dz = 0.008766520; //s318: 199mg/cm2 = 0.17533040mm TGeoShape *pLeadTarget = new TGeoBBox("LeadTarget", dx,dy,dz); TGeoVolume* pleadTarget_log = new TGeoVolume("leadTarget_log",pLeadTarget, lead); pleadTarget_log->SetVisLeaves(kTRUE); TGeoVolumeAssembly *keep = new TGeoVolumeAssembly("Target"); keep->AddNode(pleadTarget_log, 0, pMatrix); //pTargetEnveloppe_log->AddNode(pleadTarget_log, 0, pGlobal); TGeoCombiTrans* pGlobal = GetGlobalPosition(pMatrix); gTop->AddNode(keep, 0, pGlobal); }
void ConstructGeometry6(TGeoMedium *pMed16) { cout << endl; cout << "-I- R3BTarget::ConstructGeometry() "<< endl; cout << "-I- R3BTarget Target type: CH2 target (2.31 mm) "<< endl; cout << endl; Double_t dx, dy, dz; Double_t thx, thy, thz; Double_t phx, phy, phz; // Combi transformation: dx = 0.000000; dy = 0.000000; dz = 0.000000; //-(0.15cm+half thickness) // Rotation: thx = 90.000000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = 0.000000; phz = 0.000000; TGeoRotation *pRot = new TGeoRotation("",thx,phx,thy,phy,thz,phz); TGeoCombiTrans *pMatrix = new TGeoCombiTrans("", dx,dy,dz,pRot); dx = 1.500000; //s318 dy = 1.500000; //s318 dz = 0.1155; //s318 TGeoShape *pCH2Target = new TGeoBBox("CH2Target", dx,dy,dz); TGeoVolume *pCH2Target_log = new TGeoVolume("CH2Target_log",pCH2Target, pMed16); pCH2Target_log->SetVisLeaves(kTRUE); TGeoVolumeAssembly *keep = new TGeoVolumeAssembly("Target"); keep->AddNode(pCH2Target_log, 0, pMatrix); TGeoCombiTrans* pGlobal = GetGlobalPosition(pMatrix); gTop->AddNode(keep, 0, pGlobal); }
/* * CreateLambdaGeometry.C * * Created on: Mar 21, 2013 * Author: stockman */ startdetector1() { //----------------------------- Double_t positionOfDisk1inZ = 40.0; //in cm //Double_t positionOfDisk2inZ = 53.0; //in cm //-------------------------------------------------------------------- gROOT->Macro("$VMCWORKDIR/gconfig/rootlogon.C"); // Load this libraries gSystem->Load("libGeoBase"); gSystem->Load("libParBase"); gSystem->Load("libBase"); gSystem->Load("libPndData"); gSystem->Load("libPassive"); TString outfile= "../../geometry/startdetector.root"; TFile* fi = new TFile(outfile,"RECREATE"); FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader"); FairGeoInterface *geoFace = geoLoad->getGeoInterface(); geoFace->setMediaFile("../../geometry/media_pnd.geo"); geoFace->readMedia(); geoFace->print(); FairGeoMedia *Media = geoFace->getMedia(); FairGeoBuilder *geobuild=geoLoad->getGeoBuilder(); FairGeoMedium *CbmMediumHYPdiamond = Media->getMedium("HYPdiamond"); FairGeoMedium *CbmMediumCarbon = Media->getMedium("carbon"); FairGeoMedium *CbmMediumCarbonFoam = Media->getMedium("carbonfoam"); FairGeoMedium *CbmMediumAluminium = Media->getMedium("aluminium"); Int_t nmed=geobuild->createMedium(CbmMediumHYPdiamond); nmed=geobuild->createMedium(CbmMediumCarbon); nmed=geobuild->createMedium(CbmMediumCarbonFoam); nmed=geobuild->createMedium(CbmMediumAluminium); TGeoManager* gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom"); TGeoVolume *top = new TGeoVolumeAssembly("top"); gGeoMan->SetTopVolume(top); TGeoVolume *combinedLambdaDisks = new TGeoVolumeAssembly("CombinedLambdaDisks"); TGeoVolumeAssembly* lambdaDisk = new TGeoVolumeAssembly("LambdaDisk"); TGeoVolumeAssembly* largeRing = new TGeoVolumeAssembly("LargeRing"); TGeoVolumeAssembly* smallRing = new TGeoVolumeAssembly("SmallRing"); // lambdaDisk->AddNode(largeSensorVolume,0,trc1); // TGeoShape* largeSensorShape = new TGeoTrd1("StripSensorActiveLargeShape", 3.4593/2, 1.9936/2,0.03/2, 5.5665/2); Double_t points [16]; points[0] = -1.7297; points[1] = 2.7833; points[2] = 1.7297; points[3] = 2.7833; points[4] = 0.9968; points[5] = -2.7833; points[6] = -0.9968; points[7] = -2.7833; points[8] = -1.7297; points[9] = 2.7833; points[10] = 1.7297; points[11] = 2.7833; points[12] = 0.9968; points[13] = -2.7833; points[14] = -0.9968; points[15] = -2.7833; TGeoShape* largeSensorShape = new TGeoArb8("StripSensorActiveLargeShape", 0.03/2, points); TGeoVolume* largeSensorVolume = new TGeoVolume("StripSensorActiveLargeTrap",largeSensorShape,gGeoMan->GetMedium("HYPdiamond")); // TGeoRotation rotSensor("rotSensor",0,90,0); TGeoRotation rotSensor("rotSensor",0,0,0); TGeoTranslation transLargeSensor(0,(14.8669 + 5.5665)/2,0); TGeoCombiTrans combined1(transLargeSensor, rotSensor); for (int i = 0; i < 12; i++){ TString rotName("rotLargeSens"); rotName.Append(i+1); TGeoRotation rotSens(rotName.Data(), 0,0, i*2 * 360/24); TGeoHMatrix sens = rotSens * combined1; largeRing->AddNode(largeSensorVolume, i, new TGeoHMatrix(sens)); } Double_t pointsSmall [16]; pointsSmall[0] = -1.9579/2; pointsSmall[1] = 5.3358/2; pointsSmall[2] = 1.9579/2; pointsSmall[3] = 5.3358/2; pointsSmall[4] = 0.5529/2; pointsSmall[5] = -5.3358/2; pointsSmall[6] = -0.5529/2; pointsSmall[7] = -5.3358/2; pointsSmall[8] = -1.9579/2; pointsSmall[9] = 5.3358/2; pointsSmall[10] = 1.9579/2; pointsSmall[11] = 5.3358/2; pointsSmall[12] = 0.5529/2; pointsSmall[13] = -5.3358/2; pointsSmall[14] = -0.5529/2; pointsSmall[15] = -5.3358/2; // TGeoShape* smallSensorShape = new TGeoTrd1("StripSensorActiveSmallShape", 1.9579/2, 0.5529/2, 0.03/2, 5.3358/2); TGeoShape* smallSensorShape = new TGeoArb8("StripSensorActiveSmallShape", 0.03/2, pointsSmall); TGeoVolume* smallSensorVolume = new TGeoVolume("StripSensorActiveSmallTrap", smallSensorShape, gGeoMan->GetMedium("HYPdiamond")); TGeoTranslation transSmallSensor(0,5.3358/2+2.1,0); TGeoCombiTrans combined2(transSmallSensor, rotSensor); for (int i = 0; i < 12; i++){ TString rotName("rotSmallSens"); rotName.Append(i+1); TGeoRotation rotSens(rotName.Data(), 0,0, i*2 * 360/24); TGeoHMatrix sens = rotSens * combined2; smallRing->AddNode(smallSensorVolume, i+12, new TGeoHMatrix(sens)); } lambdaDisk->AddNode(largeRing, 0, new TGeoTranslation(0,0,-0.5)); lambdaDisk->AddNode(largeRing, 1, new TGeoRotation("largeRingRot",0,0,360/24)); TGeoCombiTrans combiSmallRing2(TGeoTranslation(0,0,-1.5), TGeoRotation("smallRingRot",0,0,360/24)); lambdaDisk->AddNode(smallRing, 0, new TGeoTranslation(0,0,-1.0)); lambdaDisk->AddNode(smallRing, 1, new TGeoHMatrix(combiSmallRing2)); TGeoVolumeAssembly* supportDisk = new TGeoVolumeAssembly("SupportDisk"); TGeoVolumeAssembly* supportLarge = new TGeoVolumeAssembly("SupportLarge"); TGeoShape* carbonFoamShape = new TGeoBBox(3.4/2, 0.2/2, 3.5/2); TGeoVolume* carbonFoam = new TGeoVolume("CarbonFoam", carbonFoamShape, gGeoMan->GetMedium("carbonfoam")); TGeoShape* carbonFiberShape = new TGeoBBox(3.4/2, 0.02/2, 3.5/2); TGeoVolume* carbonFiber = new TGeoVolume("CarbonFiber", carbonFiberShape, gGeoMan->GetMedium("carbon")); TGeoShape* HYPdiamondReadoutShape = new TGeoBBox(3.4/2, 0.02/2, 3.5/2); TGeoVolume* HYPdiamondReadout = new TGeoVolume("HYPdiamondReadout", HYPdiamondReadoutShape, gGeoMan->GetMedium("HYPdiamond")); TGeoShape* aluCablesShape = new TGeoBBox(3.4/2, 0.4/2, 3.5/2); TGeoVolume* aluCables = new TGeoVolume("AluCables", aluCablesShape, gGeoMan->GetMedium("aluminium")); supportLarge->AddNode(carbonFoam, 1); supportLarge->AddNode(carbonFiber, 1, new TGeoTranslation(0,(0.2 + 0.02)/2, 0)); supportLarge->AddNode(carbonFiber, 2, new TGeoTranslation(0,-(0.2 + 0.02)/2, 0)); supportLarge->AddNode(HYPdiamondReadout, 1, new TGeoTranslation(0,(0.2 + 0.02 + 0.02)/2, 0)); supportLarge->AddNode(HYPdiamondReadout, 2, new TGeoTranslation(0,-(0.2 + 0.02 + 0.02)/2, 0)); supportLarge->AddNode(aluCables, 1, new TGeoTranslation(0,(0.2 + 0.02 + 0.02 + 0.4)/2, 0)); supportLarge->AddNode(aluCables, 2, new TGeoTranslation(0,-(0.2 + 0.02 + 0.02 + 0.4)/2, 0)); TGeoTranslation transSupportLarge(0,(14.8669)/2 + 5.5665 + 1,0); for (int i = 0; i < 24; i++){ TString rotName("rotSupportLarge"); rotName.Append(i+1); TGeoRotation rotSens(rotName.Data(), 0,0, i * 360/24); TGeoHMatrix sens = rotSens * transSupportLarge; supportDisk->AddNode(supportLarge, i+1, new TGeoHMatrix(sens)); } TGeoVolumeAssembly* supportSmall = new TGeoVolumeAssembly("SupportSmall"); TGeoShape* carbonFoamShapeSmall = new TGeoBBox(1.8/2, 0.2/2, 3.5/2); TGeoVolume* carbonFoamSmall = new TGeoVolume("CarbonFoamSmall", carbonFoamShapeSmall, gGeoMan->GetMedium("carbonfoam")); TGeoShape* carbonFiberShapeSmall = new TGeoBBox(1.8/2, 0.02/2, 3.5/2); TGeoVolume* carbonFiberSmall = new TGeoVolume("CarbonFiberSmall", carbonFiberShapeSmall, gGeoMan->GetMedium("carbon")); TGeoShape* HYPdiamondReadoutShapeSmall = new TGeoBBox(1.8/2, 0.02/2, 3.5/2); TGeoVolume* HYPdiamondReadoutSmall = new TGeoVolume("HYPdiamondReadoutSmall", HYPdiamondReadoutShapeSmall, gGeoMan->GetMedium("HYPdiamond")); TGeoShape* aluCablesShapeSmall = new TGeoBBox(1.8/2, 0.4/2, 3.5/2); TGeoVolume* aluCablesSmall = new TGeoVolume("AluCablesSmall", aluCablesShapeSmall, gGeoMan->GetMedium("aluminium")); supportSmall->AddNode(carbonFoamSmall, 1); supportSmall->AddNode(carbonFiberSmall, 1, new TGeoTranslation(0,(0.2 + 0.02)/2, 0)); supportSmall->AddNode(carbonFiberSmall, 2, new TGeoTranslation(0,-(0.2 + 0.02)/2, 0)); supportSmall->AddNode(HYPdiamondReadoutSmall, 1, new TGeoTranslation(0,(0.2 + 0.02 + 0.02)/2, 0)); supportSmall->AddNode(HYPdiamondReadoutSmall, 2, new TGeoTranslation(0,-(0.2 + 0.02 + 0.02)/2, 0)); supportSmall->AddNode(aluCablesSmall, 1, new TGeoTranslation(0,(0.2 + 0.02 + 0.02 + 0.4)/2, 0)); supportSmall->AddNode(aluCablesSmall, 2, new TGeoTranslation(0,-(0.2 + 0.02 + 0.02 + 0.4)/2, 0)); TGeoTranslation transSupportSmall(0,2.1 + 5.3358 + 0.5,0); for (int i = 0; i < 24; i++){ TString rotName("rotSupportSmall"); rotName.Append(i+1); TGeoRotation rotSens(rotName.Data(), 0,0, i * 360/24); TGeoHMatrix sens = rotSens * transSupportSmall; supportDisk->AddNode(supportSmall, i+1, new TGeoHMatrix(sens)); } combinedLambdaDisks->AddNode(lambdaDisk,1,new TGeoTranslation(0,0,positionOfDisk1inZ)); //combinedLambdaDisks->AddNode(lambdaDisk,2,new TGeoTranslation(0,0,positionOfDisk2inZ)); //combinedLambdaDisks->AddNode(supportDisk,1, new TGeoTranslation(0,0,(positionOfDisk1inZ + positionOfDisk2inZ)/2)); top->AddNode(combinedLambdaDisks,0); gGeoMan->CloseGeometry(); top->Write(); fi->Close(); // gGeoManager->Export(outfile); gGeoManager->SetVisLevel(30); top->Draw("ogl"); }
void create_mtof_geo(const char* geoTag) { // ------- Load media from media file ----------------------------------- FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader"); FairGeoInterface* geoFace = geoLoad->getGeoInterface(); TString geoPath = gSystem->Getenv("VMCWORKDIR"); TString medFile = geoPath + "/geometry/media_r3b.geo"; geoFace->setMediaFile(medFile); geoFace->readMedia(); gGeoMan = gGeoManager; // -------------------------------------------------------------------------- // ------- Geometry file name (output) ---------------------------------- TString geoFileName = geoPath + "/geometry/mtof_"; geoFileName = geoFileName + geoTag + ".geo.root"; // -------------------------------------------------------------------------- // ----------------- Get and create the required media ----------------- FairGeoMedia* geoMedia = geoFace->getMedia(); FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder(); FairGeoMedium* mAir = geoMedia->getMedium("Air"); if ( ! mAir ) Fatal("Main", "FairMedium Air not found"); geoBuild->createMedium(mAir); TGeoMedium* pMed2 = gGeoMan->GetMedium("Air"); if ( ! pMed2 ) Fatal("Main", "Medium Air not found"); FairGeoMedium* mTof = geoMedia->getMedium("plasticFormTOF"); if ( ! mTof ) Fatal("Main", "FairMedium plasticFormTOF not found"); geoBuild->createMedium(mTof); TGeoMedium* pMed34 = gGeoMan->GetMedium("plasticFormTOF"); if ( ! pMed34 ) Fatal("Main", "Medium plasticFormTOF not found"); // -------------------------------------------------------------------------- // -------------- Create geometry and top volume ------------------------- gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom"); gGeoMan->SetName("mTOFgeom"); TGeoVolume* top = new TGeoVolumeAssembly("TOP"); gGeoMan->SetTopVolume(top); // -------------------------------------------------------------------------- // out-of-file geometry definition Double_t dx,dy,dz; Double_t a; Double_t thx, phx, thy, phy, thz, phz; Double_t z, density, w; Int_t nel, numed; // TRANSFORMATION MATRICES // Combi transformation: //NTF position //dx = -154.815998;//Justyna //dy = 0.000000; //Justyna //dz = 761.755160;//Justyna //dx = -157.536214;//Justyna new //dy = -0.010000; //Justyna new ////dz = 760.939056;//Justyna new //dz = 760.139056;//Justyna //dx = -155.709;//dE tracker //dy = 0.524; ////dz = 761.487; //dz = 760.687; //try -0.8 like Justyna //LABPOS(FTF,-155.824045,0.523976,761.870346) dx = -155.824045;//dE tracker, correction due to wrong angle dy = 0.523976; dz = 761.870346; // Rotation: thx = -106.700000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = -16.700000; phz = 0.000000; /* dx = -171.1; dy = 2.400000; dz = 548.95; // dz = 0.; // Rotation: thx = -121.000000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = -31.000000; phz = 0.000000;*/ TGeoRotation *pMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz); TGeoCombiTrans* pMatrix2 = new TGeoCombiTrans("", dx,dy,dz,pMatrix3); /* // TRANSFORMATION MATRICES // Combi transformation: dx = 151.000000; dy = 0.000000; dz = 758.000000; // Rotation: thx = 106.700000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = 16.700000; phz = 0.000000; TGeoRotation *pMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz); TGeoCombiTrans* pMatrix2 = new TGeoCombiTrans("", dx,dy,dz,pMatrix3); */ // Shape: World type: TGeoBBox TGeoVolume* pWorld = gGeoManager->GetTopVolume(); pWorld->SetVisLeaves(kTRUE); // Create a global Mother Volume /* dx = 200.000000; dy = 200.000000; dz = 200.000000; TGeoShape *pBoxWorld = new TGeoBBox("mTofBoxWorld", dx,dy,dz); TGeoVolume* pWorld = new TGeoVolume("mTofBoxLogWorld",pBoxWorld, pMed2); pWorld->SetVisLeaves(kTRUE); TGeoCombiTrans *pGlobalc = GetGlobalPosition(); // add the sphere as Mother Volume pAWorld->AddNode(pWorld, 0, pGlobalc); */ // SHAPES, VOLUMES AND GEOMETRICAL HIERARCHY // Shape: mTOFBox type: TGeoBBox dx = 24.000000; dy = 24.000000; //dz = 0.250000; //wrong: should be 0.5->1cm total dz = 0.500000; /* dx = 94.450000; //TFW size dy = 73.450000; dz = 0.500000;*/ TGeoShape *pmTOFBox = new TGeoBBox("mTOFBox", dx,dy,dz); // Volume: mTOFLog TGeoVolume * pmTOFLog = new TGeoVolume("mTOFLog",pmTOFBox, pMed34); pmTOFLog->SetVisLeaves(kTRUE); TGeoVolumeAssembly *pmTof = new TGeoVolumeAssembly("mTOF"); TGeoCombiTrans *t0 = new TGeoCombiTrans("t0"); pmTof->AddNode(pmTOFLog, 0, t0); TGeoCombiTrans *pGlobal = GetGlobalPosition(pMatrix2); if (pGlobal){ pWorld->AddNode(pmTof, 0, pGlobal); }else{ pWorld->AddNode(pmTof, 0, pMatrix2); } // AddSensitiveVolume(pmTOFLog); // fNbOfSensitiveVol+=1; // --------------- Finish ----------------------------------------------- gGeoMan->CloseGeometry(); gGeoMan->CheckOverlaps(0.001); gGeoMan->PrintOverlaps(); gGeoMan->Test(); TFile* geoFile = new TFile(geoFileName, "RECREATE"); top->Write(); geoFile->Close(); // -------------------------------------------------------------------------- }
void create_tof_geo(const char* geoTag) { fGlobalTrans->SetTranslation(0.0,0.0,0.0); // ------- Load media from media file ----------------------------------- FairGeoLoader* geoLoad = new FairGeoLoader("TGeo","FairGeoLoader"); FairGeoInterface* geoFace = geoLoad->getGeoInterface(); TString geoPath = gSystem->Getenv("VMCWORKDIR"); TString medFile = geoPath + "/geometry/media_r3b.geo"; geoFace->setMediaFile(medFile); geoFace->readMedia(); gGeoMan = gGeoManager; // -------------------------------------------------------------------------- // ------- Geometry file name (output) ---------------------------------- TString geoFileName = geoPath + "/geometry/tof_"; geoFileName = geoFileName + geoTag + ".geo.root"; // -------------------------------------------------------------------------- // ----------------- Get and create the required media ----------------- FairGeoMedia* geoMedia = geoFace->getMedia(); FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder(); FairGeoMedium* mAir = geoMedia->getMedium("Air"); if ( ! mAir ) Fatal("Main", "FairMedium Air not found"); geoBuild->createMedium(mAir); TGeoMedium* pMed2 = gGeoMan->GetMedium("Air"); if ( ! pMed2 ) Fatal("Main", "Medium Air not found"); FairGeoMedium* mTof = geoMedia->getMedium("plasticForTOF"); if ( ! mTof ) Fatal("Main", "FairMedium plasticForTOF not found"); geoBuild->createMedium(mTof); TGeoMedium* pMed34 = gGeoMan->GetMedium("plasticForTOF"); if ( ! pMed34 ) Fatal("Main", "Medium plasticForTOF not found"); // -------------------------------------------------------------------------- // -------------- Create geometry and top volume ------------------------- gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom"); gGeoMan->SetName("TOFgeom"); TGeoVolume* top = new TGeoVolumeAssembly("TOP"); gGeoMan->SetTopVolume(top); // -------------------------------------------------------------------------- // out-of-file geometry definition Double_t dx,dy,dz; Double_t a; // Double_t thx, phx, thy, phy, thz, phz; Double_t z, density, w; Int_t nel, numed; // TRANSFORMATION MATRICES // Combi transformation: dx = -417.359574; //Justyna dy = 2.400000; //Justyna dz = 960.777114; //Justyna // dx = -421.33683; //Christoph // dy = 2.12; //Christoph // dz = 958.387337; //Christoph /* dx = -171.1; //position directrly (15cm) after DCH2 dy = 2.400000; dz = 548.95;*/ // dz = 0.; /* // Rotation: thx = -121.000000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = -31.000000; phz = 0.000000;*/ //this // TGeoRotation *pMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz); //this TGeoRotation *gRot = new TGeoRotation(); gRot->RotateX(0.); gRot->RotateY(-31.000000); gRot->RotateZ(0.); TGeoCombiTrans* // pMatrix2 = new TGeoCombiTrans("", dx,dy,dz,pMatrix3); //this pMatrix2 = new TGeoCombiTrans("", dx,dy,dz,gRot); //this /* PREVIOUS!!! // TRANSFORMATION MATRICES // Combi transformation: dx = 419.700000; dy = 0.000000; dz = 952.400000; // dz = 0.; // Rotation: thx = 121.000000; phx = 0.000000; thy = 90.000000; phy = 90.000000; thz = 31.000000; phz = 0.000000; TGeoRotation *pMatrix3 = new TGeoRotation("",thx,phx,thy,phy,thz,phz); TGeoCombiTrans* pMatrix2 = new TGeoCombiTrans("", dx,dy,dz,pMatrix3); */ //Top Volume TGeoVolume* pWorld = gGeoManager->GetTopVolume(); pWorld->SetVisLeaves(kTRUE); TGeoVolumeAssembly *ptof = new TGeoVolumeAssembly("TOF"); // SHAPES, VOLUMES AND GEOMETRICAL HIERARCHY // Shape: TOFBox type: TGeoBBox dx = 94.450000; dy = 73.450000; dz = 0.500000; TGeoShape *pTOFBox = new TGeoBBox("TOFBox", dx,dy,dz); // Volume: TOFLog TGeoVolume* pTOFLog = new TGeoVolume("TOFLog",pTOFBox, pMed34); pTOFLog->SetVisLeaves(kTRUE); TGeoCombiTrans *t0 = new TGeoCombiTrans("t0"); ptof->AddNode(pTOFLog, 0, t0); TGeoCombiTrans *pGlobal = GetGlobalPosition(pMatrix2); if (pGlobal) { pWorld->AddNode(ptof, 0, pGlobal); } else { pWorld->AddNode(ptof, 0, pMatrix2); } // AddSensitiveVolume(pTOFLog); // fNbOfSensitiveVol+=1; // --------------- Finish ----------------------------------------------- gGeoMan->CloseGeometry(); gGeoMan->CheckOverlaps(0.001); gGeoMan->PrintOverlaps(); gGeoMan->Test(); TFile* geoFile = new TFile(geoFileName, "RECREATE"); top->Write(); geoFile->Close(); // -------------------------------------------------------------------------- }
KVFAZIABlock::KVFAZIABlock() : TGeoVolumeAssembly("STRUCT_BLOCK") { // Default constructor SetMedium(gGeoManager->GetMedium("Vacuum"));//to avoid warnings about STRUCT_BLOCK has dummy medium KVMaterial mat_si("Si"); TGeoMedium *Silicon = mat_si.GetGeoMedium(); KVMaterial mat_csi("CsI"); TGeoMedium *CesiumIodide = mat_csi.GetGeoMedium(); KVMaterial mat_plomb("Lead"); TGeoMedium *Plomb = mat_plomb.GetGeoMedium(); TGeoVolumeAssembly* quartet = gGeoManager->MakeVolumeAssembly("STRUCT_QUARTET"); quartet->SetMedium(gGeoManager->GetMedium("Vacuum"));//to avoid warnings about STRUCT_QUARTET has dummy medium TGeoVolume* si = 0; TGeoVolume* csi = 0; Double_t distance_si2_si1 = 0.220; Double_t distance_csi_si2 = 0.434; Double_t side_si = 2; Double_t side_csi_front = 2.050; Double_t side_csi_back = 2.272; Double_t inter_si = 0.24; Double_t thick_si1 = 300 * KVUnits::um; Double_t thick_si2 = 500 * KVUnits::um; Double_t thick_csi = 10; Double_t adjust_csi = 0.0165; Int_t ndet = 1;; TGeoTranslation* tr = 0; Double_t shift = side_si / 2 + inter_si / 2; //printf("%lf\n", shift); Double_t coefx[4] = { -1., -1., 1., 1.}; Double_t coefy[4] = {1., -1., -1., 1.}; for (Int_t nt = 1; nt <= 4; nt += 1) { shift = side_si / 2 + inter_si / 2; si = gGeoManager->MakeBox(Form("DET_SI1-T%d", nt), Silicon, side_si / 2, side_si / 2, thick_si1 / 2.); tr = new TGeoTranslation(coefx[nt - 1]*shift, coefy[nt - 1]*shift, thick_si1 / 2.); quartet->AddNode(si, ndet++, tr); ((TGeoNodeMatrix*)quartet->GetNodes()->Last())->SetName(Form("DET_SI1-T%d", nt)); si = gGeoManager->MakeBox(Form("DET_SI2-T%d", nt), Silicon, side_si / 2, side_si / 2, thick_si2 / 2.); tr = new TGeoTranslation(coefx[nt - 1]*shift, coefy[nt - 1]*shift, thick_si2 / 2. + distance_si2_si1); quartet->AddNode(si, ndet++, tr); ((TGeoNodeMatrix*)quartet->GetNodes()->Last())->SetName(Form("DET_SI2-T%d", nt)); shift = side_si / 2 + inter_si / 2 + adjust_csi; csi = gGeoManager->MakeTrd2(Form("DET_CSI-T%d", nt), CesiumIodide, side_csi_front / 2, side_csi_back / 2, side_csi_front / 2, side_csi_back / 2, thick_csi / 2.); tr = new TGeoTranslation(coefx[nt - 1]*shift, coefy[nt - 1]*shift, thick_csi / 2. + distance_csi_si2); quartet->AddNode(csi, ndet++, tr); ((TGeoNodeMatrix*)quartet->GetNodes()->Last())->SetName(Form("DET_CSI-T%d", nt)); } Int_t nbl = 1; TGeoVolume* blindage = 0; //Double_t thick_bld = thick_si1+distance_si2_si1+thick_si2; /* l'epaisseur du si1 est compris dans la distance_si2_si1 */ Double_t thick_bld = distance_si2_si1 + thick_si2; Double_t shift_bld = (side_si + inter_si) / 2.; ///Croix inter quartet // // Separation des 4 télescopes // // blindage = gGeoManager->MakeBox("DEADZONE_BLINDAGE_1", Plomb, inter_si / 2, (side_si + inter_si / 2), thick_bld / 2.); //printf("%s\n", blindage->GetMaterial()->GetTitle()); tr = new TGeoTranslation(0, 0, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); blindage = gGeoManager->MakeBox("DEADZONE_BLINDAGE_2", Plomb, (side_si / 2), inter_si / 2, thick_bld / 2.); tr = new TGeoTranslation(-1 * shift_bld, 0, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); tr = new TGeoTranslation(+1 * shift_bld, 0, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); ///Contour de l ensemble du quartet // //Délimiation des bords exterieurs // // shift_bld = (side_si + inter_si); blindage = gGeoManager->MakeBox("DEADZONE_BLINDAGE_3", Plomb, (side_si + inter_si / 2), inter_si / 2, thick_bld / 2.); tr = new TGeoTranslation(0, shift_bld, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); tr = new TGeoTranslation(0, -1 * shift_bld, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); /// blindage = gGeoManager->MakeBox("DEADZONE_BLINDAGE_4", Plomb, inter_si / 2, (side_si + inter_si * 1.5), thick_bld / 2.); tr = new TGeoTranslation(shift_bld, 0, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); tr = new TGeoTranslation(-1 * shift_bld, 0, thick_bld / 2.); quartet->AddNode(blindage, nbl++, tr); fTotSidWBlind = 4 * side_si + 5 * inter_si; //Coordonnées extraite des côtes données par Yvan M. //vecteur pointant le milieu d un quartet //X=-2.231625 //Y=-2.230525 //Z=99.950350 // Mag=100.000139 // Theta=1.808104 // Phi = -135.014124 TVector3* placement = new TVector3(-2.231625, -2.230525, 99.950350); TVector3* Centre = new TVector3(); TGeoRotation rot1, rot2; TGeoTranslation trans; TGeoTranslation invZtrans(0, 0, -100); TGeoHMatrix h; TGeoHMatrix* ph = 0; //Boucle sur les 4 quartets d un block Double_t tx[4] = {1, -1, -1, 1}; Double_t ty[4] = {1, 1, -1, -1}; Double_t theta = 0; Double_t phi = 0; Double_t trans_z = 0; for (Int_t nq = 1; nq <= 4; nq += 1) { Centre->SetXYZ(placement->X()*tx[nq - 1], placement->Y()*ty[nq - 1], placement->Z()); theta = Centre->Theta() * TMath::RadToDeg(); phi = Centre->Phi() * TMath::RadToDeg(); trans_z = Centre->Mag() + thick_si1 / 2.; rot2.SetAngles(phi + 90., theta, 0.); rot1.SetAngles(-1.*phi, 0., 0.); trans.SetDz(trans_z); h = invZtrans * rot2 * trans * rot1; ph = new TGeoHMatrix(h); AddNode(quartet, nq, ph); } }
int main(int argc, char * argv[]) { TApplication app("app", &argc, argv); plottingEngine.SetDefaultStyle(); const bool debug = true; // Load the field map. ComponentAnsys123* fm = new ComponentAnsys123(); const std::string efile = "ELIST.lis"; const std::string nfile = "NLIST.lis"; const std::string mfile = "MPLIST.lis"; const std::string sfile = "PRNSOL.lis"; fm->Initialise(efile, nfile, mfile, sfile, "mm"); fm->EnableMirrorPeriodicityX(); fm->EnableMirrorPeriodicityY(); fm->PrintRange(); // Dimensions of the GEM const double pitch = 0.014; const double kapton = 50.e-4; const double metal = 5.e-4; const double outdia = 70.e-4; const double middia = 50.e-4; const bool plotField = false; if (plotField) { ViewField* fieldView = new ViewField(); fieldView->SetComponent(fm); fieldView->SetPlane(0., -1., 0., 0., 0., 0.); fieldView->SetArea(-pitch / 2., -0.02, pitch / 2., 0.02); fieldView->SetVoltageRange(-160., 160.); TCanvas* cF = new TCanvas(); fieldView->SetCanvas(cF); fieldView->PlotContour(); } // Setup the gas. MediumMagboltz* gas = new MediumMagboltz(); gas->SetComposition("ar", 70., "co2", 30.); gas->SetTemperature(293.15); gas->SetPressure(760.); gas->EnableDebugging(); gas->Initialise(); gas->DisableDebugging(); // Set the Penning transfer efficiency. const double rPenning = 0.57; const double lambdaPenning = 0.; gas->EnablePenningTransfer(rPenning, lambdaPenning, "ar"); // Load the ion mobilities. gas->LoadIonMobility("IonMobility_Ar+_Ar.txt"); // Associate the gas with the corresponding field map material. const int nMaterials = fm->GetNumberOfMaterials(); for (int i = 0; i < nMaterials; ++i) { const double eps = fm->GetPermittivity(i); if (fabs(eps - 1.) < 1.e-3) fm->SetMedium(i, gas); } fm->PrintMaterials(); // Create the sensor. Sensor* sensor = new Sensor(); sensor->AddComponent(fm); sensor->SetArea(-5 * pitch, -5 * pitch, -0.03, 5 * pitch, 5 * pitch, 0.03); AvalancheMicroscopic* aval = new AvalancheMicroscopic(); aval->SetSensor(sensor); AvalancheMC* drift = new AvalancheMC(); drift->SetSensor(sensor); drift->SetDistanceSteps(2.e-4); const bool plotDrift = true; ViewDrift* driftView = new ViewDrift(); if (plotDrift) { driftView->SetArea(-2 * pitch, -2 * pitch, -0.02, 2 * pitch, 2 * pitch, 0.02); // Plot every 10 collisions (in microscopic tracking). aval->SetCollisionSteps(10); aval->EnablePlotting(driftView); drift->EnablePlotting(driftView); } // Histograms int nBinsGain = 100; double gmin = 0.; double gmax = 100.; TH1F* hElectrons = new TH1F("hElectrons", "Number of electrons", nBinsGain, gmin, gmax); TH1F* hIons = new TH1F("hIons", "Number of ions", nBinsGain, gmin, gmax); int nBinsChrg = 100; TH1F* hChrgE = new TH1F("hChrgE", "Electrons on plastic", nBinsChrg, -0.5e4 * kapton, 0.5e4 * kapton); TH1F* hChrgI = new TH1F("hChrgI", "Ions on plastic", nBinsChrg, -0.5e4 * kapton, 0.5e4 * kapton); double sumIonsTotal = 0.; double sumIonsDrift = 0.; double sumIonsPlastic = 0.; double sumElectronsTotal = 0.; double sumElectronsPlastic = 0.; double sumElectronsUpperMetal = 0.; double sumElectronsLowerMetal = 0.; double sumElectronsTransfer = 0.; double sumElectronsOther = 0.; const int nEvents = 10; for (int i = nEvents; i--;) { if (debug || i % 10 == 0) std::cout << i << "/" << nEvents << "\n"; // Randomize the initial position. const double smear = pitch / 2.; double x0 = -smear + RndmUniform() * smear; double y0 = -smear + RndmUniform() * smear; double z0 = 0.025; double t0 = 0.; double e0 = 0.1; aval->AvalancheElectron(x0, y0, z0, t0, e0, 0., 0., 0.); int ne = 0, ni = 0; aval->GetAvalancheSize(ne, ni); hElectrons->Fill(ne); hIons->Fill(ni); const int np = aval->GetNumberOfElectronEndpoints(); double xe1, ye1, ze1, te1, e1; double xe2, ye2, ze2, te2, e2; double xi1, yi1, zi1, ti1; double xi2, yi2, zi2, ti2; int status; for (int j = np; j--;) { aval->GetElectronEndpoint(j, xe1, ye1, ze1, te1, e1, xe2, ye2, ze2, te2, e2, status); sumElectronsTotal += 1.; if (ze2 > -kapton / 2. && ze2 < kapton / 2.) { hChrgE->Fill(ze2 * 1.e4); sumElectronsPlastic += 1.; } else if (ze2 >= kapton / 2. && ze2 <= kapton / 2. + metal) { sumElectronsUpperMetal += 1.; } else if (ze2 <= -kapton / 2. && ze2 >= -kapton / 2. - metal) { sumElectronsLowerMetal += 1.; } else if (ze2 < -kapton / 2. - metal) { sumElectronsTransfer += 1.; } else { sumElectronsOther += 1.; } drift->DriftIon(xe1, ye1, ze1, te1); drift->GetIonEndpoint(0, xi1, yi1, zi1, ti1, xi2, yi2, zi2, ti2, status); if (zi1 < 0.01) { sumIonsTotal += 1.; if (zi2 > 0.01) sumIonsDrift += 1.; } if (zi2 > -kapton / 2. && zi2 < kapton / 2.) { hChrgI->Fill(zi2 * 1.e4); sumIonsPlastic += 1.; } } } double fFeedback = 0.; if (sumIonsTotal > 0.) fFeedback = sumIonsDrift / sumIonsTotal; std::cout << "Fraction of ions drifting back: " << fFeedback << "\n"; const double neMean = hElectrons->GetMean(); std::cout << "Mean number of electrons: " << neMean << "\n"; const double niMean = hIons->GetMean(); std::cout << "Mean number of ions: " << niMean << "\n"; std::cout << "Mean number of electrons on plastic: " << sumElectronsPlastic / nEvents << "\n"; std::cout << "Mean number of ions on plastic: " << sumIonsPlastic / nEvents << "\n"; std::cout << "Electron endpoints:\n"; const double fUpperMetal = sumElectronsUpperMetal / sumElectronsTotal; const double fPlastic = sumElectronsPlastic / sumElectronsTotal; const double fLowerMetal = sumElectronsLowerMetal / sumElectronsTotal; const double fTransfer = sumElectronsTransfer / sumElectronsTotal; const double fOther = sumElectronsOther / sumElectronsTotal; std::cout << " upper metal: " << fUpperMetal * 100. << "%\n"; std::cout << " plastic: " << fPlastic * 100. << "%\n"; std::cout << " lower metal: " << fLowerMetal * 100. << "%\n"; std::cout << " transfer: " << fTransfer * 100. << "%\n"; std::cout << " other: " << fOther * 100. << "%\n"; TCanvas* cD = new TCanvas(); const bool plotGeo = true; if (plotGeo && plotDrift) { // Build the geometry in Root. TGeoManager* geoman = new TGeoManager("world", "geometry"); TGeoMaterial* matVacuum = new TGeoMaterial("Vacuum", 0, 0, 0); TGeoMedium* medVacuum = new TGeoMedium("Vacuum", 1, matVacuum); TGeoMaterial* matKapton = new TGeoMaterial("Kapton", 12, 6, 1.42); TGeoMedium* medKapton = new TGeoMedium("Kapton", 2, matKapton); TGeoMaterial* matCopper = new TGeoMaterial("Copper", 63, 29, 8.94); TGeoMedium* medCopper = new TGeoMedium("Copper", 3, matCopper); TGeoVolume* volTop = geoman->MakeBox("TOP", medVacuum, pitch, pitch, 0.02); volTop->SetVisibility(0); TGeoBBox* shpKapton = new TGeoBBox("K", pitch / 2., pitch / 2., kapton / 2.); TGeoPcon* shpHole = new TGeoPcon("H", 0., 360., 3); shpHole->DefineSection(0, -kapton / 2., 0., outdia / 2.); shpHole->DefineSection(1, 0., 0., middia / 2.); shpHole->DefineSection(2, kapton / 2., 0., outdia / 2.); TGeoCompositeShape* shpGem = new TGeoCompositeShape("G", "K - H"); TGeoVolume* volKapton = new TGeoVolume("Kapton", shpGem, medKapton); volKapton->SetLineColor(kGreen); volKapton->SetTransparency(50); TGeoBBox* shpMetal = new TGeoBBox("M", pitch / 2., pitch / 2., metal / 2.); TGeoTube* shpTube = new TGeoTube("T", 0., outdia / 2., metal / 2.); TGeoCompositeShape* shpElectrode = new TGeoCompositeShape("E", "M - T"); TGeoVolume* volElectrode = new TGeoVolume("Electrode", shpElectrode, medCopper); volElectrode->SetLineColor(kBlue); volElectrode->SetTransparency(50); TGeoVolumeAssembly* volGem = new TGeoVolumeAssembly("Gem"); const double shift = 0.5 * (metal + kapton); volGem->AddNode(volKapton, 1); volGem->AddNode(volElectrode, 2, new TGeoTranslation(0., 0., shift)); volGem->AddNode(volElectrode, 3, new TGeoTranslation(0., 0., -shift)); volTop->AddNode(volGem, 1); volTop->AddNode(volGem, 2, new TGeoTranslation(-pitch, 0., 0.)); volTop->AddNode(volGem, 3, new TGeoTranslation(+pitch, 0., 0.)); volTop->AddNode(volGem, 4, new TGeoTranslation(-pitch / 2., sqrt(3) * pitch / 2., 0.)); volTop->AddNode(volGem, 5, new TGeoTranslation(+pitch / 2., sqrt(3) * pitch / 2., 0.)); volTop->AddNode(volGem, 6, new TGeoTranslation(-pitch / 2., -sqrt(3) * pitch / 2., 0.)); volTop->AddNode(volGem, 7, new TGeoTranslation(+pitch / 2., -sqrt(3) * pitch / 2., 0.)); geoman->SetVerboseLevel(0); geoman->SetTopVolume(volTop); geoman->CloseGeometry(); geoman->CheckOverlaps(0.1e-4); geoman->SetNmeshPoints(100000); cD->cd(); geoman->GetTopVolume()->Draw("ogl"); } if (plotDrift) { driftView->SetCanvas(cD); driftView->Plot(); } const bool plotHistogram = true; if (plotHistogram) { TCanvas* cH = new TCanvas("cH", "Histograms", 800, 700); cH->Divide(2, 2); cH->cd(1); hElectrons->Draw(); cH->cd(2); hIons->Draw(); cH->cd(3); hChrgE->Draw(); cH->cd(4); hChrgI->Draw(); } app.Run(kTRUE); }