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)
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);
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);
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);
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");
}