diff --git a/compact/definitions.xml b/compact/definitions.xml index 9e7b6610f0f442e5373920f00185f1aadd42cdad..791ad094c15f4b3790d6d470ee74afc1572aa8e5 100644 --- a/compact/definitions.xml +++ b/compact/definitions.xml @@ -359,14 +359,14 @@ Examples: <constant name="TrackerBarrel_zmax" value="TrackerBarrel_length/2.0"/> <constant name="TrackerBarrelInside_length" value="VertexTrackingRegion_length"/> <constant name="TrackerBarrelInside_zmax" value="TrackerBarrelInside_length/2.0"/> - <constant name="TrackerEndcapP_length" value="925.0*mm"/> + <constant name="TrackerEndcapP_length" value="1025.0*mm"/> <constant name="TrackerEndcapN_length" value="495.0*mm"/> <documentation level="0"> ### PID Detector Region Parameters </documentation> - <constant name="ForwardPID_length" value="145.0*cm"/> + <constant name="ForwardPID_length" value="140.0*cm"/> <constant name="ForwardPID_rmin1" value="Beampipe_rmax + 90*mm"/> <constant name="ForwardPID_rmin2" value="18.0*cm"/> diff --git a/compact/drich.xml b/compact/drich.xml index dde6a2890ab106838ffeda97402b7720c8b8c128..59a14b35648b0c01b3a38dbbcb02711312e1be76 100644 --- a/compact/drich.xml +++ b/compact/drich.xml @@ -10,9 +10,9 @@ <constant name="DRICH_wall_thickness" value="0.5*cm"/> <!-- thickness of radial walls --> <constant name="DRICH_window_thickness" value="0.1*cm"/> <!-- thickness of entrance and exit walls --> <!-- tank geometry: cylinder, holding the majority of detector components --> -<constant name="DRICH_rmax2" value="200*cm"/> <!-- cylinder radius; 20 cm gap between dRICh and HCalBarrel --> +<constant name="DRICH_rmax2" value="220*cm"/> <!-- cylinder radius, near maximal to fit HCal barrel inner polygon --> <!-- snout geometry: cone with front radius rmax0 and back radius of rmax1 --> -<constant name="DRICH_SnoutLength" value="25.0*cm"/> +<constant name="DRICH_SnoutLength" value="4.0*cm"/> <constant name="DRICH_SnoutSlope" value="DRICH_rmax2 / (DRICH_zmin + DRICH_Length)"/> <constant name="DRICH_rmax0" value="DRICH_SnoutSlope * DRICH_zmin"/> <constant name="DRICH_rmax1" value="DRICH_SnoutSlope * ( DRICH_zmin + DRICH_SnoutLength)"/> @@ -101,7 +101,7 @@ </documentation> <radiator rmin="DRICH_rmin0 + DRICH_wall_thickness + 2.0*cm" - rmax="DRICH_rmax0 - DRICH_wall_thickness - 2.0*cm" + rmax="DRICH_rmax0 - DRICH_wall_thickness - 0.2*cm" phiw="60*degree" frontplane="DRICH_window_thickness + 0.5*DRICH_aerogel_thickness" pitch="0*degree" @@ -131,13 +131,10 @@ - `phiw`: azimuthal width of one sector - `thickness` is the radial thickness of the mirror; note that `backplane` is given for the reflective mirror surface, the inner radius of the sphere - - `focus_tune*` are tuning parameters for the focal plane: - - linearly retune focal point, using a real number; reference numbers are: - - 0.0: disabled, ideal focus at sensor sphere center - - 1.0: ideal focus re-tuned to be on sensor sphere - - `focus_tune_long` moves toward centroid sensor, while `focus_tune_perp` moves transverse - to this direction; movements are in the xz-plane only - - due to aberrations, ideal focus may not coincide with apparent focal region + - `focus_tune*` are tuning parameters for the focal region: + - `focus_tune_z` and `focus_tune_x` will move the focal region, with respect + to the sensor sphere center (i.e., set both to zero for focus at the sensor sphere center + (ignoring spherical aberrations effects)) - other settings: - `debug`: set to 1 so draw reference sphere instead, view with y-clipping </documentation> @@ -150,8 +147,8 @@ rmax="DRICH_rmax2 - DRICH_wall_thickness - 5.0*cm" phiw="59.5*degree" thickness="0.2*cm" - focus_tune_long="0.5" - focus_tune_perp="0.2" + focus_tune_x="40.0*cm" + focus_tune_z="-30.0*cm" debug="DRICH_debug_mirror" /> @@ -208,14 +205,14 @@ - `zmin`: z-plane cut </documentation> <sphere - centerz="-112.0 * cm" + centerz="-80.0 * cm" centerx="DRICH_rmax2 - 35.0*cm" - radius="160.0 * cm" + radius="100.0 * cm" debug="DRICH_debug_sensors" /> <sphericalpatch phiw="18*degree" - rmin="DRICH_rmax1 + 10.0*cm" + rmin="DRICH_rmax1 + 0.0*cm" rmax="DRICH_rmax2 - 5.0*cm" zmin="DRICH_SnoutLength + 5.0*cm" /> diff --git a/src/DRich_geo.cpp b/src/DRich_geo.cpp index e6225d7b950e5ebfdfce96496504c1d5ad615b21..388feae695e0375bc1c991861f17e2b073a1c718 100644 --- a/src/DRich_geo.cpp +++ b/src/DRich_geo.cpp @@ -77,8 +77,8 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec double mirrorRmin = mirrorElem.attr<double>(_Unicode(rmin)); double mirrorRmax = mirrorElem.attr<double>(_Unicode(rmax)); double mirrorPhiw = mirrorElem.attr<double>(_Unicode(phiw)); - double focusTuneLong = mirrorElem.attr<double>(_Unicode(focus_tune_long)); - double focusTunePerp = mirrorElem.attr<double>(_Unicode(focus_tune_perp)); + double focusTuneZ = mirrorElem.attr<double>(_Unicode(focus_tune_z)); + double focusTuneX = mirrorElem.attr<double>(_Unicode(focus_tune_x)); // - sensor module auto sensorElem = detElem.child(_Unicode(sensors)).child(_Unicode(module)); auto sensorMat = desc.material(sensorElem.attr<std::string>(_Unicode(material))); @@ -395,16 +395,12 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // BUILD MIRRORS ==================================================================== - // attributes, re-defined w.r.t. IP, needed for mirror positioning - double zS = sensorSphCenterZ + vesselZmin; // sensor sphere attributes - double xS = sensorSphCenterX; - double rS = sensorSphRadius; - double B = vesselZmax - mirrorBackplane; // distance between IP and mirror back plane - // derive spherical mirror parameters `(zM,xM,rM)`, for given image point // coordinates `(zI,xI)` and `dO`, defined as the z-distance between the - // object and the mirror surface; all coordinates are specified w.r.t. the - // object point coordinates + // object and the mirror surface + // - all coordinates are specified w.r.t. the object point coordinates + // - this is point-to-point focusing, but it can be used to effectively steer + // parallel-to-point focusing double zM,xM,rM; auto FocusMirror = [&zM,&xM,&rM](double zI, double xI, double dO) { zM = dO*zI / (2*dO-zI); @@ -412,6 +408,12 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec rM = dO - zM; }; + // attributes, re-defined w.r.t. IP, needed for mirror positioning + double zS = sensorSphCenterZ + vesselZmin; // sensor sphere attributes + double xS = sensorSphCenterX; + double rS = sensorSphRadius; + double B = vesselZmax - mirrorBackplane; // distance between IP and mirror back plane + // focus 1: set mirror to focus IP on center of sensor sphere `(zS,xS)` /*double zF = zS; double xF = xS; @@ -423,6 +425,7 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec // - `focusTuneLong` is the distance to move, given as a fraction of `sensorSphRadius` // - `focusTuneLong==0` means `(zF,xF)==(zS,xS)` // - `focusTuneLong==1` means `(zF,xF)` will be on the sensor sphere, near the centroid + /* double zC = sensorCentroidZ + vesselZmin; double xC = sensorCentroidX; double slopeF = (xC-xS) / (zC-zS); @@ -436,12 +439,19 @@ static Ref_t createDetector(Detector& desc, xml::Handle_t handle, SensitiveDetec zF += focusTunePerp * sensorSphRadius * std::cos(M_PI/2-thetaF); xF += focusTunePerp * sensorSphRadius * std::sin(M_PI/2-thetaF); FocusMirror(zF,xF,B); + */ + + // focus 4: use (z,x) coordinates for tune parameters + double zF = zS + focusTuneZ; + double xF = xS + focusTuneX; + FocusMirror(zF,xF,B); /* - printf("(zC,xC) = ( %.2f, %.2f )\n",zC,xC); - printf("zS = %f\n",zS); - printf("xS = %f\n",xS); - printf("B = %f\n",B); + // print some calculated parameters, viz. mirror attributes + //printf("(zC,xC) = ( %.2f, %.2f )\n",zC,xC); + //printf("zS = %f\n",zS); + //printf("xS = %f\n",xS); + //printf("B = %f\n",B); printf("zM = %f\n",zM); printf("xM = %f\n",xM); printf("rM = %f\n",rM);