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