]> jspc29.x-matter.uni-frankfurt.de Git - mvd_geometry.git/commitdiff
v0.7
authorPhilipp Klaus <klaus@physik.uni-frankfurt.de>
Fri, 4 Aug 2017 15:49:42 +0000 (17:49 +0200)
committerPhilipp Klaus <klaus@physik.uni-frankfurt.de>
Fri, 4 Aug 2017 15:49:57 +0000 (17:49 +0200)
mvd.C

diff --git a/mvd.C b/mvd.C
index c3e6ac320d49cf4c2665ce861716ef50c022f751..4ecbe25ca43fc52c1aa8502dd40b04611a609a47 100644 (file)
--- 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; i<numStations; i++)
       {
+      // --- Station Assembly
       cout << "Station " << i << endl;
       sprintf(station_name, "station_S%i", i);
       TGeoVolume *station = new TGeoVolumeAssembly(station_name);
-      
+      // --- Quadrant Assembly
       sprintf(quadrant_name, "quadrant_S%i", i);
       TGeoVolume *quadrant = new TGeoVolumeAssembly(quadrant_name);
-
+      // --- Heatsink Assembly
+      sprintf(heatsink_name, "heatsink_S%i", i);
+      TGeoVolume *heatsink = new TGeoVolumeAssembly(heatsink_name);
+      // --- Carrier
       sprintf(carrier_name, "carrier_S%i", i);
       Float_t cd[3] = {carrierDimensions[i][0], carrierDimensions[i][1], carrierDimensions[i][2]};
       TGeoVolume* carrier = manager->MakeBox(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; k<sensorCols[i]; k++)
          {
          for (int l=0; l<sensorRows[i]; l++)
             {
-            // Active
-            Float_t x_offset = -sensorDimensionsActive[0]*(0.5 + k);
-            Float_t y_offset = -sensorDimensionsActive[1]/2 - sensorPitch*l;
-            Float_t z_offset = TMath::Power(-1, l+1) * (sensorDimensionsActive[2] + cd[2])*(1+explosion);
+            Float_t x_offset = -sensorDimensionsActive[0]*k;
+            Float_t y_offset = - sensorPitch*l;
+            Float_t z_offset = cd[2]/2;
+            if (l%2 == 0) // front side
+               z_offset = -z_offset;
             T.SetTranslation(x_offset, y_offset, z_offset);
             R.SetAngles(0.,0.,0.);
             M = new TGeoCombiTrans(T,R);
-            quadrant->AddNode(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");
    }