From 68983c9e931282c533b012922891b2313adc7b9d Mon Sep 17 00:00:00 2001 From: Philipp Klaus Date: Fri, 4 Aug 2017 17:49:42 +0200 Subject: [PATCH] v0.7 --- mvd.C | 147 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 116 insertions(+), 31 deletions(-) diff --git a/mvd.C b/mvd.C index c3e6ac3..4ecbe25 100644 --- a/mvd.C +++ b/mvd.C @@ -1,7 +1,13 @@ static const int numStations = 4; -Float_t quadrantBeamOffset[4] = {-0.54, -0.54, -0.82, -1.04}; -Float_t carrierDimensions[4][3] = {{5.0, 5.15, 0.015}, {8.0, 8.0, 0.015}, {11.0, 9.9, 0.0375}, {14.0, 12.75, 0.0375}}; +Float_t quadrantBeamOffset[4] = {0.54, 0.54, 0.82, 1.04}; +Float_t carrierDimensions[4][3] = {{5.0, 5.15, 0.015}, {8.0, 8.0, 0.015}, {11.0, 9.9, 0.0300}, {14.0, 12.75, 0.0300}}; Float_t stationPosition[4] = {5.0, 10.0, 15.0, 20.0}; +Float_t carrierClampOverlap = 1.0; +Float_t heatsinkWidth[4] = {23.1, 31.1, 34.34, 37.7}; +Float_t heatsinkHeight = 37.7; +Float_t heatsinkThickness = 1.; +Float_t fpcThickness = 0.0009; +Float_t glueThickness = 0.0008; int sensorRows[4] = {3, 5, 7, 10}; int sensorCols[4] = {1, 2, 3, 4}; // 3xFSBB : 30 x 13 mm2 (of which the lower 3mm inactive) @@ -17,18 +23,25 @@ TGeoVolume *stations[numStations]; void mvd() { + TCanvas *c3D = new TCanvas("c3D","MVD Layout",1600,1200); + TGeoManager *manager = new TGeoManager("Chamber Layout", "Chamber Layout"); TGeoMaterial *mat = new TGeoMaterial("Vacuum", 0.,0.,0.); - TGeoMaterial *tmat = new TGeoMaterial("TubeMat", 26.98,13.,2.700); - tmat->SetTransparency(0); - TGeoMaterial *wmat = new TGeoMaterial("WireMat", 63.546,29.,8.920); TGeoMaterial *matAl = new TGeoMaterial("Al", 26.98,13,2.7); - matAl->SetTransparency(0); - TGeoMedium *med = new TGeoMedium("Vacuum", 0, mat); - TGeoMedium *tmed = new TGeoMedium("TubeMed", 0, tmat); - TGeoMedium *wmed = new TGeoMedium("WireMed", 0, wmat); + //matAl->SetTransparency(0); + TGeoMaterial *matSilicon = new TGeoMaterial("silicon", 0, 0, 0); + TGeoMaterial *matGlue = new TGeoMaterial("glue", 0, 0, 0); + TGeoMaterial *matDiamond = new TGeoMaterial("diamond", 0, 0, 0); + TGeoMaterial *matTPG = new TGeoMaterial("TPG", 0, 0, 0); + TGeoMaterial *matFPC = new TGeoMaterial("FPC", 0, 0, 0); + TGeoMedium *vac = new TGeoMedium("Vacuum", 0, mat); TGeoMedium *Al = new TGeoMedium("AlMed", 2, matAl); - top = manager->MakeBox("Top",med,300.,300.,300.); + TGeoMedium *silicon = new TGeoMedium("siliconMed", 2, matSilicon); + TGeoMedium *glue = new TGeoMedium("glueMed", 2, matGlue); + TGeoMedium *diamond = new TGeoMedium("diamondMed", 2, matDiamond); + TGeoMedium *TPG = new TGeoMedium("TPGMed", 2, matTPG); + TGeoMedium *FPC = new TGeoMedium("FPCMed", 2, matFPC); + top = manager->MakeBox("Top", vac, 300., 300., 300.); manager->SetTopVolume(top); @@ -42,17 +55,45 @@ void mvd() TGeoTranslation T; TGeoRotation R; TGeoCombiTrans *M; - char station_name[30], quadrant_name[30], carrier_name[30]; + char station_name[30], quadrant_name[30], carrier_name[30], heatsink_name[30], heatsinkpart_name[30]; + int heatsinkpartno = 0; + + // --- Sensor Assembly + TGeoVolume *sensor_front = new TGeoVolumeAssembly("sensor_front"); + TGeoVolume *sensor_back = new TGeoVolumeAssembly("sensor_back"); + // Active + R.SetAngles(0.,0.,0.); + Float_t x_offset = -sensorDimensionsActive[0]/2; + Float_t y_offset = -sensorDimensionsActive[1]/2; + Float_t z_offset = sensorDimensionsActive[2]/2 + glueThickness; + T.SetTranslation(x_offset, y_offset, -z_offset); + M = new TGeoCombiTrans(T,R); + sensor_front->AddNode(sensorActive, 1, M); + T.SetTranslation(x_offset, y_offset, z_offset); + M = new TGeoCombiTrans(T,R); + sensor_back->AddNode(sensorActive, 1, M); + // Passive + y_offset = -sensorDimensionsPassive[1]/2 - sensorDimensionsActive[1]; + T.SetTranslation(x_offset, y_offset, -z_offset); + M = new TGeoCombiTrans(T,R); + sensor_front->AddNode(sensorPassive, 1, M); + T.SetTranslation(x_offset, y_offset, z_offset); + M = new TGeoCombiTrans(T,R); + sensor_back->AddNode(sensorPassive, 1, M); for (int i=0; iMakeBox(carrier_name, Al, cd[0]/2, cd[1]/2, cd[2]/2); @@ -62,33 +103,73 @@ void mvd() R.SetAngles(0.,0.,0.); M = new TGeoCombiTrans(T,R); quadrant->AddNode(carrier, 1, M); + // --- Heatsink + R.SetAngles(0.,0.,0.); + // first part on carrier + sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++); + Float_t height_1 = heatsinkWidth[i]/2 - cd[1] + carrierClampOverlap - quadrantBeamOffset[i]; + Float_t width_1 = heatsinkWidth[i]/2 + quadrantBeamOffset[i]; + Float_t thickness = (heatsinkThickness-cd[2])/2.; + TGeoVolume* hs_part1 = manager->MakeBox(heatsinkpart_name, Al, width_1/2., height_1/2., thickness/2.); + T.SetTranslation(-width_1/2, -height_1/2-cd[1]+carrierClampOverlap, +(thickness+cd[2])/2*(1.0+explosion/0.2)); + M = new TGeoCombiTrans(T,R); + quadrant->AddNode(hs_part1, 1, M); + T.SetTranslation(-width_1/2, -height_1/2-cd[1]+carrierClampOverlap, -(thickness+cd[2])/2); + M = new TGeoCombiTrans(T,R); + quadrant->AddNode(hs_part1, 2, M); + // second part on carrier + sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++); + Float_t height_2 = heatsinkWidth[i] - height_1 - width_1; + Float_t width_2 = heatsinkWidth[i]/2 - cd[0] + carrierClampOverlap + quadrantBeamOffset[i]; + TGeoVolume* hs_part2 = manager->MakeBox(heatsinkpart_name, Al, width_2/2, height_2/2, thickness/2); + T.SetTranslation(-width_2/2-cd[0]+carrierClampOverlap, -height_2/2, +(thickness+cd[2])/2); + M = new TGeoCombiTrans(T,R); + quadrant->AddNode(hs_part2, 1, M); + T.SetTranslation(-width_2/2-cd[0]+carrierClampOverlap, -height_2/2, -(thickness+cd[2])/2); + M = new TGeoCombiTrans(T,R); + quadrant->AddNode(hs_part2, 2, M); + // element to fill top and bottom if needed + sprintf(heatsinkpart_name, "heatsinkpart_%i", heatsinkpartno++); + Float_t height = (heatsinkHeight-heatsinkWidth[i])/2; + if (height > 0.1) { + TGeoVolume* hs_part3 = manager->MakeBox(heatsinkpart_name, Al, heatsinkWidth[i]/2, height/2, heatsinkThickness/2); + T.SetTranslation(0, height/2+heatsinkWidth[i]/2, 0); + M = new TGeoCombiTrans(T,R); + heatsink->AddNode(hs_part3, 1, M); + T.SetTranslation(0, -(height/2+heatsinkWidth[i]/2), 0); + M = new TGeoCombiTrans(T,R); + heatsink->AddNode(hs_part3, 2, M); + T.SetTranslation(0, 0, 0); + M = new TGeoCombiTrans(T,R); + station->AddNode(heatsink, 1, M); + } + // --- Sensors cout << " # of sensors per quadrant: " << sensorCols[i]*sensorRows[i] << endl; - // Sensors + int sensor_front_count = 0; + int sensor_back_count = 0; for (int k=0; kAddNode(sensorActive, 1, M); - // Passive - y_offset = -sensorDimensionsPassive[1]/2 - sensorDimensionsActive[1] - sensorPitch*l; - T.SetTranslation(x_offset, y_offset, z_offset); - R.SetAngles(0.,0.,0.); - M = new TGeoCombiTrans(T,R); - quadrant->AddNode(sensorPassive, 1, M); + if (l%2 == 0) // front side + quadrant->AddNode(sensor_front, sensor_front_count++, M); + else // back side + quadrant->AddNode(sensor_back, sensor_back_count++, M); } } for (int j=0; j<4; j++) { cout << " Quadrant " << j << endl; - Float_t x_sign = (j == 0 || j == 3) ? -1. : 1.; - Float_t y_sign = (j == 0 || j == 1) ? 1. : -1.; + Float_t x_sign = (j == 0 || j == 3) ? 1. : -1.; + Float_t y_sign = (j == 0 || j == 1) ? -1. : 1.; T.SetTranslation(x_sign*quadrantBeamOffset[i], y_sign*quadrantBeamOffset[i], (explosion/10.)*(j-1.5)); R.SetAngles(0.,0.,-90.*j); M = new TGeoCombiTrans(T,R); @@ -98,18 +179,22 @@ void mvd() R.SetAngles(0.,0.,0.); M = new TGeoCombiTrans(T,R); top->AddNode(station, 1, M); + station->Draw(""); + gPad->GetView()->RotateView(90, 180); + char filename[30]; + sprintf(filename, "mvd.root.S%i.pdf", i); + c3D->SaveAs(filename); stations[i] = station; } + //manager->CheckGeometryFull(); manager->CloseGeometry(); - TCanvas *c3D = new TCanvas("c3D","MVD Layout",1600,1200); + top->Export("mvd.root"); top->Draw("ogl"); //station->Draw("ogl"); - //station->Draw(""); //quadrant->Draw("ogl"); //quadrant->Draw(""); //quadrant->Raytrace(); //top->Draw(""); - gPad->GetView()->ShowAxis(); + //gPad->GetView()->ShowAxis(); //top->Raytrace(); - top->Export("mvd.root"); } -- 2.43.0