Skip to content
Snippets Groups Projects
Commit bb9e63e0 authored by Alexander Kiselev's avatar Alexander Kiselev
Browse files

SiPM sensor geometry for dRICH implemented

parent 094eee76
Branches irt-init-v01
No related tags found
No related merge requests found
......@@ -18,9 +18,11 @@
<constant name="DRICH_rmax1" value="DRICH_SnoutSlope * ( DRICH_zmin + DRICH_SnoutLength)"/>
<!-- additional parameters -->
<constant name="DRICH_aerogel_thickness" value="4.0*cm"/> <!-- aerogel thickness -->
<constant name="DRICH_sensor_size" value="48.0*mm"/> <!-- sensor side length -->
<constant name="DRICH_sensor_thickness" value="35.0*mm"/> <!-- sensor thickness -->
<constant name="DRICH_num_px" value="16"/> <!-- number of pixels along one side of the sensor -->
<constant name="DRICH_sensor_size" value="25.8*mm"/> <!-- sensor side length -->
<constant name="DRICH_sensor_thickness" value="0.5*mm"/> <!-- sensor thickness -->
<constant name="DRICH_num_px" value="8"/> <!-- number of pixels along one side of the sensor -->
<constant name="DRICH_sensor_pixel_pitch" value="3.2*mm"/> <!-- center-to-center distance between SiPMs in a 8x8 panel -->
<constant name="DRICH_sensor_pixel_size" value="3.0*mm"/> <!-- a single SiPM pixel size -->
<!-- debugging switches -->
<comment>
- `DRICH_debug_optics`: 1 = all components become vacuum, except for mirrors; test opticalphotons from IP
......@@ -183,7 +185,7 @@
vis="DRICH_sensor_vis"
side="DRICH_sensor_size"
thickness="DRICH_sensor_thickness"
gap="0.5*(52-48)*mm + 2*mm"
gap="0.2*mm"
/>
......@@ -244,10 +246,10 @@
<readout name="DRICHHits">
<segmentation
type="CartesianGridXY"
grid_size_x="DRICH_sensor_size/(DRICH_num_px-1)"
grid_size_y="DRICH_sensor_size/(DRICH_num_px-1)"
offset_x="-DRICH_sensor_size/2.0"
offset_y="-DRICH_sensor_size/2.0"
grid_size_x="DRICH_sensor_pixel_pitch"
grid_size_y="DRICH_sensor_pixel_pitch"
offset_x="-DRICH_sensor_pixel_pitch*DRICH_num_px/2.0"
offset_y="-DRICH_sensor_pixel_pitch*DRICH_num_px/2.0"
/>
<id>system:8,sector:3,module:12,x:23:16,y:16</id>
</readout>
......
......@@ -13,11 +13,13 @@
<constant name="ERICH_window_thickness" value="0.1*cm"/> <!-- thickness of entrance and exit walls -->
<!-- additional parameters -->
<constant name="ERICH_aerogel_thickness" value="3.0*cm"/> <!-- aerogel thickness -->
<constant name="ERICH_sensor_active_size" value="24.0*mm"/> <!-- sensor side length (effective area) -->
<constant name="ERICH_sensor_full_size" value="25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
<constant name="ERICH_sensor_thickness" value="1.5*mm"/> <!-- sensor thickness -->
<!--constant name="ERICH_sensor_active_size" value="24.0*mm"/--> <!-- sensor side length (effective area) -->
<constant name="ERICH_sensor_size" value="25.8*mm"/> <!-- sensor side length (full size, with enclosure) -->
<constant name="ERICH_sensor_thickness" value="0.5*mm"/> <!-- sensor thickness -->
<constant name="ERICH_sensor_dist" value="40*cm"/> <!-- distance between aerogel exit plane and sensor entrance plane -->
<constant name="ERICH_num_px" value="8"/> <!-- number of pixels along one side of the sensor -->
<constant name="ERICH_sensor_pixel_pitch" value="3.2*mm"/> <!-- center-to-center distance between SiPMs in a 8x8 panel -->
<constant name="ERICH_sensor_pixel_size" value="3.0*mm"/> <!-- a single SiPM pixel size -->
<!-- debugging switches -->
<comment>
- `ERICH_debug_optics`: 1 = all components become vacuum; test opticalphotons from IP
......@@ -117,8 +119,7 @@
<documentation level="10">
##### Sensor module
- based on Hamamatsu S13361-3050AE-08
- effective area: 24.0 x 24.0 mm
- enclosure size: 25.8 x 25.8 mm
- sensor assembly size: 25.8 x 25.8 mm
- pixel size: 3x3 mm (8x8 matrix)
- thickness: 1.5 mm
- dimensions:
......@@ -132,9 +133,9 @@
material="AirOptical"
surface="SensorSurface_ERICH"
vis="ERICH_sensor_vis"
side="ERICH_sensor_active_size"
side="ERICH_sensor_size"
thickness="ERICH_sensor_thickness"
gap="0.5*(ERICH_sensor_full_size-ERICH_sensor_active_size) + 0.1*mm"
gap="0.2*mm"
/>
......@@ -184,15 +185,17 @@
| x pixel | 20 | 16 |
| y pixel | 36 | 16 |
- offset assignment needs to be validated; presently IRTAlgorithm Juggler plugin
does digitization on its own
</documentation>
<readouts>
<readout name="ERICHHits">
<segmentation
type="CartesianGridXY"
grid_size_x="ERICH_sensor_active_size/(ERICH_num_px-1)"
grid_size_y="ERICH_sensor_active_size/(ERICH_num_px-1)"
offset_x="-ERICH_sensor_active_size/2.0"
offset_y="-ERICH_sensor_active_size/2.0"
grid_size_x="ERICH_sensor_pixel_pitch"
grid_size_y="ERICH_sensor_pixel_pitch"
offset_x="-ERICH_sensor_pixel_pitch*ERICH_num_px/2.0"
offset_y="-ERICH_sensor_pixel_pitch*ERICH_num_px/2.0"
/>
<id>system:8,module:12,x:20:16,y:16</id>
</readout>
......
......@@ -285,7 +285,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
Volume motherVol = desc.pickMotherVolume(det);
// FIXME: usage of this translation assumes gasvolume2vessel translation is (0,0,0);
auto gasvolume2master = Position(0, 0, vesselZmin) - originFront;
printf("@@@ %7.1f %7.1f %7.1f\n", gasvolume2master.x()/mm, gasvolume2master.y()/mm, gasvolume2master.z()/mm);
//printf("@@@ %7.1f %7.1f %7.1f\n", gasvolume2master.x()/mm, gasvolume2master.y()/mm, gasvolume2master.z()/mm);
PlacedVolume vesselPV = motherVol.placeVolume(vesselVol, gasvolume2master);
vesselPV.addPhysVolID("system", detID);
det.setPlacement(vesselPV);
......@@ -325,7 +325,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
// aerogel placement and surface properties
// TODO [low-priority]: define skin properties for aerogel and filter
auto radiatorPos = Position(0., 0., radiatorFrontplane) + originFront;
printf("@@@ %f\n", (1/mm)*radiatorPos.z());
//printf("@@@ %f\n", (1/mm)*radiatorPos.z());
auto aerogelPV = gasvolVol.placeVolume(aerogelVol,
Translation3D(radiatorPos.x(), radiatorPos.y(), radiatorPos.z()) // re-center to originFront
* RotationY(radiatorPitch) // change polar angle to specified pitch // FIXME: probably broken (not yet in use anyway)
......@@ -335,7 +335,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
//SkinSurface aerogelSkin(desc, aerogelDE, "mirror_optical_surface", aerogelSurf, aerogelVol);
//aerogelSkin.isValid();
{
printf("@@@ %f\n", (1/mm)*(gasvolume2master.z() + aerogelPV.position().z()));//+aerogelThickness/2));
//printf("@@@ %f\n", (1/mm)*(gasvolume2master.z() + aerogelPV.position().z()));//+aerogelThickness/2));
//auto surface = new FlatSurface((1/mm)*TVector3(0,0,vesselOffset+aerogelPV.position().z()+aerogelThickness/2), nx, ny);
auto surface = new FlatSurface((1/mm)*TVector3(0,0,gasvolume2master.z() + aerogelPV.position().z()), nx, ny);
//printf("@M@ aerogel %7.2f\n", (vesselOffset+aerogelPV.position().z()+aerogelThickness/2)/mm);
......@@ -364,7 +364,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
{
// FIXME: create a small air gap in the geometry as well;
printf("@@@ %f\n", (1/mm)*(gasvolume2master.z() + filterPV.position().z()));
//printf("@@@ %f\n", (1/mm)*(gasvolume2master.z() + filterPV.position().z()));
auto surface = new FlatSurface((1/mm)*TVector3(0,0,gasvolume2master.z() + filterPV.position().z()), nx, ny);
for(int isec=0; isec<nmax/*nSectors*/; isec++) {
auto radiator = geometry->AddFlatRadiator(detector, "Filter", isec,
......@@ -504,7 +504,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
//localToGlobal.LocalToMaster(l, g);
double xx, yy, zz;
translation.GetComponents(xx, yy, zz);
printf("@@@ %10.5f %10.5f %10.5f\n", xx/mm, yy/mm, zz/mm);
//printf("@@@ %10.5f %10.5f %10.5f\n", xx/mm, yy/mm, zz/mm);
auto surface = new SphericalSurface((1/mm)*TVector3(
xx+gasvolume2master.x(),
......
......@@ -331,7 +331,17 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec
));
// Assume that photosensors can have different 3D surface parameterizations;
auto surface = new FlatSurface((1/mm)*TVector3(0.0, 0, vesselOffset+sensorPV.position().z()), nx, ny);
//+auto surface = new FlatSurface((1/mm)*TVector3(0.0, 0, vesselOffset+sensorPV.position().z()), nx, ny);
// FIXME: unify with dRICH;
double xxl[3] = {0.0, 0.0, 0.0}, bff[3], xxg[3], nxl[3] = {1.0, 0.0, 0.0}, nyl[3] = {0.0, 1.0, 0.0}, nxg[3], nyg[3];
sensorPV.ptr()->LocalToMaster(xxl, bff);
vesselPV.ptr()->LocalToMaster(bff, xxg);
//printf("@G@ %10.5f %10.5f %10.5f\n", xxg[0]/mm, xxg[1]/mm, xxg[2]/mm);
// Assume vessel transformation is a pure translation;
sensorPV.ptr()->LocalToMasterVect(nxl, nxg);
sensorPV.ptr()->LocalToMasterVect(nyl, nyg);
auto surface = new FlatSurface((1/mm)*TVector3(xxg), TVector3(nxg), TVector3(nyg));
uint64_t imodsec = (uint64_t(imod) << moffset) & msmask;
detector->CreatePhotonDetectorInstance(0, pd, imodsec, surface);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment