[Raytrace] Ross Null (Long Post)

John D. Upton jd-upton@texas.net
Mon, 28 Apr 2003 15:16:07 -0500


Robin,

At 08:35 PM 4/25/2003 -0700, you wrote:
>More confusion over Ross Null test. Using an f/4.2, D= 22.4 mirror, f= 450 
>mm, D = 145 mm, t = 15.5 mm lens.  I used the software program from Mel
   ... snip ...
>the source. I need it the same as the object plane for my slitless 
>tester.   The software from Mel's site gave a max OPD of 0.0692.  I tried 
>iterating the

     Your input seems to be missing a surface in your setup.  Here is a 
version of your prescription I entered from the data in your two posts.  It 
has been optimized to minimize the total spherical aberration while 
maintaining an image distance as close as possible to the source 
distance.  For this setup, the best I could do was get them within about 
0.6 mm.

     This is the same problem I wrestled with in OSLO-LT last month.  (See 
the thread on user defined optimization set up.)  In order to force the 
source and image to be (nearly) coincident, you need to define some user 
optimization commands.  At the bottom of this post, I have appended the 
final OSLO-LT lens file and the two CCL files used for the 
optimization.  If you copy the CCL files to the PRIVATE CCL directory and 
recompile the Private CCL commands, you can optimize both spherical 
aberration and source-image distance.  After playing with this, remember to 
rename the two private CCL file to some extension other than CCL and 
recompile back to normal operation again.  (Note that the file names differ 
slightly between different versions of OSLO-LT.  You will have to rename 
the copies in the Private CCL directory the same as their counterparts in 
the Public CCL directory.)

     Not having looked at the other information sources you cited, I cannot 
say if this is a good solution for your setup.

     In the notes for the design, you mention the beam clearing the lens at 
an off axis angle of 0.5 degree.  Were you by any chance trying to set up a 
Dall Null configuration where the return beam doesn't pass through the lens 
again?  The following data pertains to the Ross Null configuration only.


*LENS DATA
Ross Null, 22.4" f4.2, 450mm len
  SRF      RADIUS      THICKNESS   APERTURE RADIUS       GLASS  SPE  NOTE
  OBJ       --        289.581931 V    0.000290             AIR
  AST       --         15.500000     45.946951 AS          BK7 C
   2   -238.719031    4.2835e+03 V   47.566304 S           AIR
   3   -4.7803e+03   -4.2835e+03 P  284.480000 S    REFL_HATCH   *
   4    238.719031 P  -15.500000 P   11.566760 S           BK7 P
   5        --     P -289.581931 S   11.173023 S           AIR
  IMS       --         -0.579194      0.023537 S

*CONIC AND POLYNOMIAL ASPHERIC DATA
  SRF        CC          AD          AE          AF          AG
   3      -1.000000      --          --          --          --

     The trace results were not as good as you quoted for the software on 
Mel's site.  The OSLO-LT results were as follows:

*WAVEFRONT RS
  WAVELENGTH 1
    PKVAL OPD     RMS OPD  STREHL RATIO    RSY         RSX         RSZ
     0.120901    0.023270    0.978992      --          --          --

The Ross Null File:

===== Start of Ross_Null_Palmer.len ================================
// OSLO 6.04 63357 25680 35746
LEN NEW "Ross Null, 22.4\" f4.2, 450mm len" -216.34 6
NAO  0.1567062162182
ANG  0.0000572957795
DES  "tw"
UNI  1.0
SNO1 "This file uses a Melles Griot f=300mm, d=66mm, t=6.5mm lens for the 
nulling lens"
SNO2 "from their website, cost: $38.00. This lens should clear the return 
light"
SNO3 "from the mirror with a 0.5 degree angle off axis."
// SRF 0
AIR
TH   289.5819314985729
AP  0.0002895819314
NXT  // SRF 1
GLA BK7
TH   15.5
NXT  // SRF 2
AIR
RD   -238.7190313248665
TH   4283.4745926101468
NXT  // SRF 3
RFH
RD   -4780.3000000000002
PK THM  -1 0.0
CC   -1.0
DT   1
NXT  // SRF 4
PK  GLA  -3
PK CVM  -2 0.0
PK THM  -3 0.0
NXT  // SRF 5
AIR
PK CV   -4 0.0
PY   0.0
NXT  // SRF 6
AIR
TH   -0.5791943000625
WV 0.54607
WW 1.0
END  6
SDAD 100.0
OPDF 1.0e-08
OPOC "opcb_abs"
VAR NEW
V 1 0 0 TH 0.1 10000.0 1.0 0.0045946951357
V 2 2 0 TH 0.1 10000.0 1.0 0.0045946951357
END
OPE NEW
O 1 "OCM20" 1.0 "TOTAL_SPH"
O 2 "OCM23" 0.0 "TH0+TH5"
END
===== End of Ross_Null_Palmer.len ==================================



The optimization call-back functions file:
===== Start of op_callbaks.ccl =====================================
#include "..\..\public\ccl\inc\a_global.h"

cmd opcb_abs(void)
// hlp:  <P>Sample
// hlp:  <a href="optimization_conditions.htm">command</a> for computation 
of a
// hlp:  user-defined <a 
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp:  through <a 
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL 
operands</a>.</P>
// hlp:  <P>This command calculates system paraxial ray data (PY, PU, PYC, 
PUC, EFL),
// hlp:  as well as chromatic, 3rd and 5th order aberration coefficients.
// hlp:  It serves as an error function callback for the <a 
HREF="commands_opabs_template.htm">opabs_template</a> command.</P>
// hlp:  <P><I>Note: The <A HREF="optimization_conditions.htm">optimization 
condition for CCL operands</A> needs to be set to
// hlp:  &quot;opcb_abs&quot; for this command to work correctly.</I></P>
// kwd:  sample, operands, aberrations,
// cat:  optimization

/***************************************** WARNING 
********************************************
* Don't change this command. It is used as a callback for the 
opabs_template and may be used
* by several error function generators. Changing it may produce unexpected 
results for these
* commands. If you want to use a modified callback, make a copy, rename the 
copy to something
* else (e.g. my_opcb_abs) and modify the copy.
**********************************************************************************************/

{
         int ssb_row_sav;

         set_preference(outp, off);
         ssb_row_sav = sbrow;
         ssbuf_reset(ssb_row_sav, 6);
         paraxial_trace();
         Ocm[1] = ssb(1, 1); // py
         Ocm[2] = ssb(1, 2); // pu
         Ocm[3] = ssb(1, 4); // pyc
         Ocm[4] = ssb(1, 5); // puc
         chromatic_abers();
         Ocm[5] = ssb(2, 1); // pac
         Ocm[6] = ssb(2, 3); // plc
         Ocm[7] = ssb(2, 2); // sac
         Ocm[8] = ssb(2, 4); // slc
         seidel_abers();
         Ocm[9] = ssb(3, 1);  // sa3
         Ocm[10] = ssb(3, 2); // cma3
         Ocm[11] = ssb(3, 3); // ast3
         Ocm[12] = ssb(3, 4); // ptz3
         Ocm[13] = ssb(3, 5); // dis3
         fifth_order_abers();
         Ocm[14] = ssb(4, 1); // sa5
         Ocm[15] = ssb(4, 2); // cma5
         Ocm[16] = ssb(4, 3); // ast5
         Ocm[17] = ssb(4, 4); // ptz5
         Ocm[18] = ssb(4, 5); // dis5
         Ocm[19] = ssb(4, 6); // sa7
         Ocm[20] = Ocm[9] + Ocm[14] + Ocm[19]; // total sph
         paraxial_constants();
         Ocm[21] = ssb(5, 1); // focal length (ang. mag.)
         Ocm[22] = Ocm[1] + Ocm[9]; // PY + SA3 for singlet_erf
       Ocm[23] = th[0] + th[5]; // th[0]+th[5]
         ssbuf_reset(-ssb_row_sav, 6);
         set_preference(output_text, on);
}

cmd opcb_rays(void)
// hlp:  <P>Sample
// hlp:  <a href="optimization_conditions.htm">command</a> for computation 
of a
// hlp:  user-defined <a 
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp:  through <a 
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL 
operands</a>.</P>
// hlp:  <P>This command calculates system <a 
href="analysis_tools_raytracing_paraxial.htm">paraxial parameters</a>
// hlp:  (PY, PU, PYC, PUC, EFL), as well as exact ray trace data for on 
and off-axis rays. The ray parameters
// hlp:  describing the rays used are obtained from system note 6, as set 
up by the
// hlp:  <a HREF="commands_oprays_template.htm">oprays_template</a> 
command.</P>
// hlp:  <P><I>Note: The <A HREF="optimization_conditions.htm">optimization 
condition for CCL operands</A> needs
// hlp:  to be set to &quot;opcb_rays&quot; for this command to work 
correctly.</I></P>
// kwd:  sample, operands
// cat:  optimization

{
         int ic,ssb_row_sav,chkap;
         double w2d;
         char tmpstr[81];

         set_preference(outp, off);
         ssb_row_sav = sbrow;
         ssbuf_reset(ssb_row_sav, 12);
         chkap = apck;
         apck off;

/* Parse system note 6 to get static OCM's:
         OCM1 = "AXIS_FYMAX" On-axis fractional beam radius
         OCM2 = "OFAX_FOB"   Fractional height of off-axis object point
         OCM3 = "OFAX_FYMIN" Lower FY for off-axis object point
         OCM4 = "OFAX_FYMAX" Upper FY for off-axis object point
         OCM5 = "OFAX_FX"    FX for off-axis object point skew ray
*/
         get_system_note(6);
         strtoken(tmpstr,system_note, " ");
         if (!strcmp(tmpstr, "opcb_rays"))
         {
                 for (ic = 1; ic < 6; ic++)
                 {
                         strtoken(tmpstr, "", " ");
                         ocm[ic] = atof(tmpstr);
                 }
         }

         ssbuf_reset(1,2,1e20);
         // paraxial data
         paraxial_trace();
         Ocm[6] = ssb(1,1); // py
         Ocm[7] = ssb(1,2); // pu
         Ocm[8] = ssb(1,4); // pyc
         Ocm[9] = ssb(1,5); // puc
         paraxial_constants();
         Ocm[10] = ssb(2,1); // focal length (ang. mag.)
         ssbuf_reset(1,12,1e20);
         // on axis
         set_object_point(0);
         Ocm[11] = ssb(3,3); // axis focus shift
         trace_fan(y,all,2,.7*Ocm[1],Ocm[1],0);
         Ocm[12] = ssb(5,5); // axis FY zone dy
         Ocm[13] = ssb(5,8); // axis FY zone opd
         Ocm[14] = ssb(5,9); // axis FY zone dmd
         Ocm[15] = ssb(5,10); // axis FY zone osc
         Ocm[16] = ssb(4,5); // axis FY edge dy
         Ocm[17] = ssb(4,8); // axis FY edge opd
         Ocm[18] = ssb(4,9); // axis FY edge dmd
         Ocm[19] = ssb(4,10); // axis FY edge osc
         // off-axis
         set_object_point(Ocm[2]);
         Ocm[20] = ssb(8,1); // off-axis FY 0 yc
         Ocm[21] = ssb(8,3); // off-axis FY 0 yfs
         Ocm[22] = ssb(8,4); // off-axis FY 0 xfs
         trace_fan(y,all,2,Ocm[3],Ocm[4],0);
         Ocm[23] = ssb(9,5);  // off-axis upper FY dy
         Ocm[24] = ssb(9,8);  // off-axis upper FY opd
         Ocm[25] = ssb(9,9);  // off-axis upper FY dmd
         Ocm[26] = ssb(10,5); // off-axis lower FY dy
         Ocm[27] = ssb(10,8); // off-axis lower FY opd
         Ocm[28] = ssb(10,9); // off-axis lower FY dmd
         trace_fan(x,all,1,Ocm[5],Ocm[5],0);
         Ocm[29] = ssb(11,5); // off-axis skew dy
         Ocm[30] = ssb(11,6); // off-axis skew dx
         //
         // insert user defs here
         Ocm[31] = 0.5*(Ocm[23] + Ocm[26]); // tangential coma
         Ocm[32] = Ocm[20] - Ocm[8]; // distortion
         //
         if (opdw) // convert wavelengths to distance units
         {
                 w2d = wv[1]/(1000.0*uni);
                 Ocm[13] *= w2d;
                 Ocm[14] *= w2d;
                 Ocm[17] *= w2d;
                 Ocm[18] *= w2d;
                 Ocm[24] *= w2d;
                 Ocm[25] *= w2d;
                 Ocm[27] *= w2d;
                 Ocm[28] *= w2d;
         }
         if (chkap) apck on;
         ssbuf_reset(-ssb_row_sav, 12);
         set_preference(output_text, on);
}

cmd oprds_spot_size(void)
// hlp:  <P>Sample
// hlp:  <a href="optimization_conditions.htm">command</a> for computation 
of a
// hlp:  user-defined <a 
href="optimization_data_errorfunction_overview.htm">error function</a>
// hlp:  through <a 
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL 
operands</a>.</P>
// hlp:  <P>This command calculates RMS R
// hlp:  <a href="analysis_tools_imagequality_spotdiagram.htm">spot 
size</a> for wavelength 1 at three
// hlp:  <a href="optimization_data_fieldpoints.htm">field points</a>.</P>
// hlp:  <P><I>Note: The <A HREF="optimization_conditions.htm">optimization 
condition</A> <B>Command for CCL operands</B> needs to be set to
// hlp:  &quot;oprds_spot_size&quot; for  <a 
href="optimization_data_errorfunction_operands_components_CCL.htm">CCL 
operands</a>
// hlp:  to be computed accurately.</I></P>
// kwd:  sample, operands, RMS spot size, field points
// cat:  optimization
{
         int ssb_row_sav;

         set_preference(output_text, off);
         ssb_row_sav = sbrow();
         ssbuf_reset(ssb_row_sav, 100);
         trace_ref_ray(0.0);
         spot_diagram(mon, 10.0);
         Ocm[0] = c4;
         trace_ref_ray(0.7);
         ssbuf_reset(-ssb_row_sav, 100);
         ssb_row_sav = sbrow();
         ssbuf_reset(ssb_row_sav, 100);
         spot_diagram(mon, 10.0);
         Ocm[1] = c4;
         trace_ref_ray(1.0);
         ssbuf_reset(-ssb_row_sav, 100);
         ssb_row_sav = sbrow();
         ssbuf_reset(ssb_row_sav, 100);
         spot_diagram(mon, 10.0);
         Ocm[2] = c4;
         ssbuf_reset(-ssb_row_sav, 100);
         set_preference(output_text, on);
}

cmd
geniiops(void)
// geniierf_lt callback function
{
         int     ic, apchk, ssrow;
         double  pu, pyht, imht, w2d, fy;
         char    tmpstr[81];

         set_preference(output_text, off);
         apchk = apck;
         aperture_check(off);
         ssrow = sbrow();
         ssbuf_reset(ssrow, 0);

/* Parse system note 6 to get static OCM's */
         get_system_note(6);
         strtoken(tmpstr,system_note, " ");
         if (!strcmp(tmpstr, "geniierf_lt"))
         {
                 strtoken(tmpstr, "", " ");
                 ocm[0] = atof(tmpstr);
                 strtoken(tmpstr, "", " ");
                 ocm[1] = 1.0/(6.0*atof(tmpstr));
                 for (ic = 0; ic < 7; ic++)
                 {
                         strtoken(tmpstr, "", " ");
                         ocm[44 + ic] = atof(tmpstr);
                 }
                 strtoken(tmpstr, "", " ");
                 ocm[14] = atof(tmpstr);
                 strtoken(tmpstr, "", " ");
                 ocm[29] = atof(tmpstr);
         }

         Ocm[2] = 2.1*Ocm[1];
         Ocm[3] = 2.8*Ocm[1];
         Ocm[4] = 3.0*Ocm[1];
         Ocm[5] = 4.0*Ocm[1];
         Ocm[6] = Ocm[0]*Ocm[1]/3.0;
         Ocm[7] = 3.2*Ocm[0]*Ocm[1];
         if (opdw)
         {
                 Ocm[6] *= 1000.0*uni/wv[1];
                 Ocm[7] *= 1000.0*uni/wv[1];
         }
         Ocm[8] = 0.0001;

         /* paraxial axial ray slope */
         paraxial_trace();

         /* save u' */
         pu = ssb(1, 2);
         Ocm[9] = pu + Ocm[0];

/* on-axis reference ray */
         ssbuf_reset(1, 0);
         trace_ray_derivs(0.0, 0.0, 0.0, 0.0, 0.0);
         /* focus shift */
         Ocm[10] = ssb(4, 1);

/* paraxial image height */
         pyht = ssb(5, 1);

/* On axis DY, OPD, DMD */
         ssbuf_reset(1, 0);
         trace_fan(y, all, 1, Ocm[44], Ocm[44], 0.0);
         Ocm[11] = ssb(1, 5);
         Ocm[12] = ssb(1, 8);
         Ocm[13] = ssb(1, 9);

/* 0.7 field reference ray */
         ssbuf_reset(1, 0);
         trace_ray_derivs(0.7, 0.0, 0.0, 0.0, 0.0);

         /* distortion */
         if (fabs(pyht) < 1.0e-40)
                 Ocm[15] = 0.0;
         else
                 Ocm[15] = 100.0*(ssb(3, 1)/0.7 - pyht)/pyht;

         /* field curvature */
         Ocm[17] = ssb(4, 1);
         Ocm[18] = ssb(4, 4);
         fy = ssb(2, 3);

         /* coma */
         ssbuf_reset(1, 0);
         trace_fan(y, std, 3, fy - 1.0e-4, fy + 1.0e-4, 0.0);
         Ocm[19] = 0.3333333e+08*rn[ims - 1][1]*pu*(ssb(3, 5) - 2.0*ssb(2, 
5) + ssb(1, 5));
         if (opdw)
         {
                 w2d = 1000.0*uni/wv[1];
                 Ocm[19] *= w2d;
         }

         /* meridional rays */
         ssbuf_reset(1, 0);
         trace_fan(y, all, 2, Ocm[45], Ocm[46], 0.0);
         Ocm[20] = ssb(1, 5);
         Ocm[21] = ssb(1, 8);
         Ocm[22] = ssb(1, 9);
         Ocm[23] = ssb(2, 5);
         Ocm[24] = ssb(2, 8);
         Ocm[25] = ssb(2, 9);

         /* sagittal ray */
         trace_fan(x, all, 1, Ocm[47], Ocm[47], 0.0);
         Ocm[26] = ssb(3, 6);
         Ocm[27] = ssb(3, 5);
         Ocm[28] = ssb(3, 8);

/* 1.0 field reference ray */
         ssbuf_reset(1, 0);
         trace_ray_derivs(1.0, 0.0, 0.0, 0.0, 0.0);

         /* distortion */
         if (fabs(pyht) < 1.0e-40)
                 Ocm[30] = 0.0;
         else
                 Ocm[30] = 100.0*(ssb(3, 1) - pyht)/pyht;

         /* field curvature */
         Ocm[32] = ssb(4, 1);
         Ocm[33] = ssb(4, 4);
         fy = ssb(2, 3);

         /* coma */
         ssbuf_reset(1, 0);
         trace_fan(y, std, 3, fy - 1.0e-4, fy + 1.0e-4, 0.0);
         Ocm[34] = 0.3333333e+08*rn[ims - 1][1]*pu*(ssb(3, 5) - 2.0*ssb(2, 
5) + ssb(1, 5));
         if (opdw)
                 Ocm[34] *= w2d;

         /* meridional rays */
         ssbuf_reset(1, 0);
         trace_fan(y, all, 2, Ocm[48], Ocm[49], 0.0);
         Ocm[35] = ssb(1, 5);
         Ocm[36] = ssb(1, 8);
         Ocm[37] = ssb(1, 9);
         Ocm[38] = ssb(2, 5);
         Ocm[39] = ssb(2, 8);
         Ocm[40] = ssb(2, 9);

         /* sagittal ray */
         trace_fan(x, all, 1, Ocm[50], Ocm[50], 0.0);
         Ocm[41] = ssb(3, 6);
         Ocm[42] = ssb(3, 5);
         Ocm[43] = ssb(3, 8);

         ssbuf_reset(-ssrow, 0);
         set_preference(output_text, on);
         if (apchk) aperture_check(on);
}

cmd oprds(void)
// hlp:  <p>Provided for backward compatibility only. Use "opcb_abs" 
instead.</p>
// kwd:  operands, callbacks
// cat:  optimization
{
         int ssb_row_sav;

         set_preference(outp, off);
         ssb_row_sav = sbrow;
         ssbuf_reset(ssb_row_sav, 6);
         paraxial_trace();
         Ocm[1] = ssb(1, 1); // py
         Ocm[2] = ssb(1, 2); // pu
         Ocm[3] = ssb(1, 4); // pyc
         Ocm[4] = ssb(1, 5); // puc
         chromatic_abers();
         Ocm[6] = ssb(2, 1); // pac
         Ocm[7] = ssb(2, 3); // plc
         Ocm[8] = ssb(2, 2); // sac
         Ocm[9] = ssb(2, 4); // slc
         seidel_abers();
         Ocm[11] = ssb(3, 1); // sa3
         Ocm[12] = ssb(3, 2); // cma3
         Ocm[13] = ssb(3, 3); // ast3
         Ocm[14] = ssb(3, 4); // ptz3
         Ocm[15] = ssb(3, 5); // dis3
         fifth_order_abers();
         Ocm[21] = ssb(4, 1); // sa5
         Ocm[22] = ssb(4, 2); // cma5
         Ocm[23] = ssb(4, 3); // ast5
         Ocm[24] = ssb(4, 4); // ptz5
         Ocm[25] = ssb(4, 5); // dis5
         Ocm[31] = ssb(4, 6); // sa7
         Ocm[41] = Ocm[11] + Ocm[21] + Ocm[31]; // total sph
         paraxial_constants();
         Ocm[0] = ssb(5, 1); // focal length (ang. mag.)
         ssbuf_reset(-ssb_row_sav, 6);
         set_preference(output_text, on);
}
===== End of op_callbaks.ccl =======================================



The optimization OCM definition template file:
===== Start of op_erfs.ccl =========================================
#include "..\..\public\ccl\inc\a_global.h"

cmd opabs_template(void)
// hlp:  <P>Generates an error function containing all the 1st, 3rd, and 
5th-order aberrations. The resulting
// hlp:  error function can then be edited using the operands spreadsheet 
editor to remove unwanted terms.
// hlp:  Alternately, this command can be copied, renamed and edited to 
make a custom operands generator for
// hlp:  a specific type of system. Note that this command just sets up the 
error function. The error function
// hlp:  is evaluated by the <a href="commands_opcb_abs.htm">opcb_abs</a> 
command in op_callbacks.ccl. If you want to add additional terms to your
// hlp:  error function, you must also create a new callback command that 
will evaluate them.</P>
// hlp:  <P>NOTE: This is a <a 
href="optimization_data_errorfunction_generators_abtemplate.htm">template</a> 
to help you set up an error function, not a working error function. It
// hlp:  will not work unless you delete the operands that don't apply to 
your system!</P>
// kwd:  error function, OCM, optimization, error function generator
// cat:  optimization
{
         int  opnbr;

         set_preference(output_text, off);
         opt_oprdccl("opcb_abs");

         operands(new);
         opnbr = 0;
         opnbr++;o(opnbr, ins, "OCM1 ", 0.0, "PY");   /* Axial ray height */
         opnbr++;o(opnbr, ins, "OCM2 ", 0.0, "PU");   /* Axial ray slope */
         opnbr++;o(opnbr, ins, "OCM3 ", 0.0, "PYC");  /* Chief ray height */
         opnbr++;o(opnbr, ins, "OCM4 ", 0.0, "PUC");  /* Chief ray slope */
         opnbr++;o(opnbr, ins, "OCM5 ", 0.0, "PAC");  /* Primary axial color */
         opnbr++;o(opnbr, ins, "OCM6 ", 0.0, "PLC");  /* Primary lateral 
color */
         opnbr++;o(opnbr, ins, "OCM7 ", 0.0, "SAC");  /* Secondary axial 
color */
         opnbr++;o(opnbr, ins, "OCM8 ", 0.0, "SLC");  /* Secondary lateral 
color */
         opnbr++;o(opnbr, ins, "OCM9 ", 0.0, "SA3");  /* 3rd-order spherical */
         opnbr++;o(opnbr, ins, "OCM10", 0.0, "CMA3"); /* 3rd-order coma*/
         opnbr++;o(opnbr, ins, "OCM11", 0.0, "AST3"); /* 3rd-order 
astigmatism*/
         opnbr++;o(opnbr, ins, "OCM12", 0.0, "PTZ3"); /* 3rd-order Petzval 
blur */
         opnbr++;o(opnbr, ins, "OCM13", 0.0, "DIS3"); /* 3rd-order distortion*/
         opnbr++;o(opnbr, ins, "OCM14", 0.0, "SA5");  /* 5th-order 
spherical aberration*/
         opnbr++;o(opnbr, ins, "OCM15", 0.0, "CMA5"); /* 5th-order linear 
coma */
         opnbr++;o(opnbr, ins, "OCM16", 0.0, "AST5"); /* 5th-order 
astigmatism */
         opnbr++;o(opnbr, ins, "OCM17", 0.0, "PTZ5"); /* 5th-order Petzval 
blur */
         opnbr++;o(opnbr, ins, "OCM18", 0.0, "DIS5"); /* 5th-order 
distortion */
         opnbr++;o(opnbr, ins, "OCM19", 0.0, "SA7");  /* 7th-order 
spherical aberration */
         opnbr++;o(opnbr, ins, "OCM20", 1.0, "TOTAL_SPH"); /* Total 
(3rd+5th+7th) spherical*/
         opnbr++;o(opnbr, ins, "OCM21", 0.0, "EFL");  /* Effective focal 
length */
         opnbr++;o(opnbr, ins, "OCM23", 1.0, "TH0+TH5");  /* Thickness */
         end();
         set_preference(output_text, on);
}
===== End of op_erfs.ccl ===========================================

Best Regards,

John D. Upton
Georgetown, TX
<http://www.atm-workshop.com/>      "The ATM's Workshop Page"
<http://hometown.aol.com/RonWin20/>  "Ronchi For Windows Software Page"