LIGO-E1300128-v1
aLIGO Interferometer Optics Positions and Orientations for Initial Alignment

Revision History

Version -v1

2/7/2013, D. Coyne: initial release to support update to the L1 PRC and BS alignment solutions

Version -v2

2/12/2013, D. Coyne
1) Fixed error in calculation to insure that the PR2, PR3, SR2, SR3 optics are oriented vertically with respect to the local gravity vector (i.e. in local coordinates). Previous calculation had a small pitch error (due to yaw rotation in the global coordinate frame instead of local frame).
2) completed calculations of the locations and orientations of all of the H1 PRC and SRC optics (was partial for -v1)
3) Made nicely formatted tables for the summary tables

Notes and Notation

Both Zemax and Optica (a TM package for optical design in Mathematica) can be used to ray trace through an existing placement of optics, but it is cumbersome to use for determining the aligned positions of a number of wedged optics (as is the case with the recycling cavity). This notebook determines the positions and orientations of the optics given the following information/assumptions:

1) the X- and Y-arms are assumed to exactly 90 degrees apart. (T960176-C indicates that the deviation from 90 degrees is 1.2 microradian).

2) the x and y axes are aligned parrallel to the Fabry-Perot arm cavity axes, with the origin defined at the intersection of the recycling cavity beams and the splitting surface of the BS
(Note that this is later converted to the LIGO global coordinate system; The LIGO coordinate system has its origin at the projected intersection of the BT cavity axes.)

3) the notation is as follows:
    ui =ray unit vector for the beam incident upon surface i
    vi = ray unit vector for the beam reflected from surface i
    wi = ray unit vector for the beam refracted through surface i
    ni = unit normal vector for surface i
    
    i	surface
    0	BS (AR surface)
    1	ITMy (HR surface)
    2	ITMy (AR surface)
    3	CPy (surface adjacent to ITM)
    4	CPy (other surface)
    5	BS (50/50 surface)
    6	PR3 (HR surface)
    7	BS (AR surface, y-transmitted ray)
    8	SR3 (HR surface)
    9	ITMx (HR surface)
    10	ITMx (AR surface)
    11	CPx (surface adjacent to ITM)
    12	CPx (other surface)
    13	BS (AR surface, x-transmitted ray)
    14    PR2 (HR surface)
    15    PRM (HR surface)
    16	SR2 (HR surface)
    17	SRM (HR surface)

ar = anti-reflectance surface
hr = high reflectance surface
bs = beamsplitting surface

d12 = ITMy thickness at center, mm
d23 = ITMy to CPy gap distance, mm
d34 = CPy thickness at center, mm
d45 = CPy to BS(hr) distance, mm
d56 = BS(hr) to PR3 distance, mm
dBS = BS thickness at center, mm
d57 = BS(hr) to BS(ar) for y-beam, mm
d78 = BS(ar), at y-beam intercept, to SR3, mm
d513 = BS(hr) to BS(ar) for x-beam, mm
d910 = ITMx thickness at center, mm
d1011 = ITMx to CPx gap distance, mm
d1112 = CPx thickness at center, mm
d1213 = CPx to BS(ar) distance, mm
d614 = PR3 to PR2 distance, mm
d1415 = PR2 to PRM distance, mm

The “given” parameters (from Zemax layout, etc.) are as follows:
 - ITM (hr) center positions from Zemax
 - ITM thickness
 - ITM to CP gaps
 - CP thickness
 - BS thickness
 
     ITMx = vertical, thick side down
    ITMy = vertical, thick side down
    CPx = horizontal, thick side - Y
    CPy = horizontal, thick side - X
    BS = horizontal, thick side + X/+Y

Intialization

Off[General::"spell"]
Off[General::"spell1"]

Needs["VectorAnalysis`"]

Needs["Geometry`Rotations`"]

Needs[“Geometry`Rotations`”]
should no longer be needed. Use built - in RotationTransform and RotationMatrix
RotationMatrix uses yaw-pitch-roll angles rather than the Euler angles used by RotationMatrix3D
HOWEVER, didn’t Minimize function for determination of the BS orientation to work with RotateMatrix3D, so reverted to Rotate3D

RotationMatrix3D[phi_,theta_,psi_]:=RotationMatrix[Pi - psi, {0, 0, 1}].RotationMatrix[
  theta, {1, 0, 0}].RotationMatrix[Pi - phi, {0, 0, 1}]

RotationMatrix3D[phi,theta,psi]

Note: Per J. Wertz, "Spacecraft Attitude Determination and Control", D. Reidel Pub., 1985, pp.763-764, This is a Type 2 Euler Angle representation with a z-x-z rotation sequence.

Needs["Graphics`Shapes`"]
The functionality of RotateShape, TranslateShape, and AffineShape is provided by the newly added kernel functions Rotate, Translate, Scale and GeometricTransformation

pi=N[π,10];

Clear[Reflect];
Reflect[u_,n_]:=Block[{temp,i,j},temp=CrossProduct[u,n];i=(temp/(Sqrt[temp.temp]));j=CrossProduct[n,i];Return[u.j j-u.n n]];

Clear[Refract,ni,nt];
Refract[u_,n_,ni_,nt_]:=Block[{temp,i,j},temp=CrossProduct[u,n];i=(temp/(Sqrt[temp.temp]));j=CrossProduct[n,i];temp=((ni u.j)/nt);Return[temp j-(Sqrt[1-(temp^2)]) n]];

Needs["Optica`Optica`"]
SetOptions[DrawSystem, QuickTrace -> False];

DMS[rad_]:={IntegerPart[rad 180/Pi],IntegerPart[FractionalPart[rad 180/Pi] 60+Sign[rad]10^-18],Round[FractionalPart[(rad 180/Pi) 60] 60]};

RAD[deg_,min_,sec_]:=(deg+min/60+sec/3600) Pi/180;

formatedTablePositions:=Grid[Flatten[{{
{"Optic","Global Coordinates\n(mm)",SpanFromLeft,SpanFromLeft,"Local Coordinates\n(mm)",SpanFromLeft,SpanFromLeft},{SpanFromAbove,"Xg","Yg","Zg","Xl","Yl","Zl"}},Table[{opticLabel[[i]],NumberForm[opticPositionG[[i,1]],{10,1}],NumberForm[opticPositionG[[i,2]],{10,1}],NumberForm[opticPositionG[[i,3]],{10,1}],\
NumberForm[opticPositionL[[i,1]],{10,1}],NumberForm[opticPositionL[[i,2]],{10,1}],NumberForm[opticPositionL[[i,3]],{10,1}]},
{i,1,nOptics}]},1],Frame->All];

formatedTableNormals:=Grid[Flatten[{{
{"Optic","Normal Unit Vector (global)\n(mm)",SpanFromLeft,SpanFromLeft,"Normal Unit Vector (local)\n(mm)",SpanFromLeft,SpanFromLeft},{SpanFromAbove,"Ug","Vg","Wg","Ul","Vl","Wl"}},Table[{opticLabel[[i]],NumberForm[opticNormalG[[i,1]],{10,6}],NumberForm[opticNormalG[[i,2]],{10,6}],NumberForm[opticNormalG[[i,3]],{10,6}],\
NumberForm[opticNormalL[[i,1]],{10,6},ExponentFunction->(If[-30<#<30,Null,#]&)],NumberForm[opticNormalL[[i,2]],{10,6},ExponentFunction->(If[-30<#<30,Null,#]&)],NumberForm[opticNormalL[[i,3]],{10,6},ExponentFunction->(If[-30<#<30,Null,#]&)]},
{i,1,nOptics}]},1],Frame->All];

formatedTableAngles:=Grid[Flatten[{{
{"Optic","Yaw","Yaw",SpanFromLeft,SpanFromLeft},{SpanFromAbove,"rad","deg","min","sec"}},Table[{opticLabel[[i]],NumberForm[opticYaw[[i]],{10,6},ExponentFunction->(If[-10<#<10,Null,#]&)],NumberForm[DMS[opticYaw[[i]]][[1]],{10,0}],NumberForm[DMS[opticYaw[[i]]][[2]],{10,0}],NumberForm[DMS[opticYaw[[i]]][[3]],{10,0}]},
{i,1,nOptics}]},1],Frame->All];

formatedTableComparePositions:=Grid[Flatten[{{
{"Optic","Global Coordinate\n Difference (mm)",SpanFromLeft,SpanFromLeft},{SpanFromAbove,"DXg","DYg","DZg"}},Table[{compareOpticLabel[[i]],NumberForm[comparePositionG[[i,1]],{10,1},ExponentFunction->(If[-30<#<30,Null,#]&)],NumberForm[comparePositionG[[i,2]],{10,1},ExponentFunction->(If[-30<#<30,Null,#]&)],NumberForm[comparePositionG[[i,3]],{10,1},ExponentFunction->(If[-30<#<30,Null,#]&)]},
{i,1,nCompareOptics}]},1],Frame->All];

formatedTableParameters:=Grid[Flatten[{{
{"Optic","wedge",SpanFromLeft,"Thickness","Diameter"},{SpanFromAbove,"rad","deg","mm","mm"}},Table[{opticLabel[[i]],NumberForm[opticWedge[[i]],{10,6}],NumberForm[If[opticWedge[[i]]!="NA",opticWedge[[i]]*180/pi,"NA"],{10,6}],NumberForm[opticThick[[i]],{10,6}],NumberForm[opticDiameter[[i]],{10,6}]},
{i,1,nOptics}]},1],Frame->All];

Global to Local Coordinate Transformation Matrices

See Tables 10-14 and Tables 25-27 of T980044-v1(aka -10), "Determination of Local and Global Coordinate Axes for the LIGO Sites".

Rhc	-> Hanford Corner station

xangle=619.49 10^-6;
yangle=12.4832 10^-6;

Rhc = RotationMatrix3D[0,yangle,0].RotationMatrix3D[pi/2,xangle,-pi/2]; 
MatrixForm[Rhc]

MatrixForm[Rhc-IdentityMatrix[3]]

Rhcinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rhc.Rhcinv]

MatrixForm[Rhcinv]

Rhxm	-> Hanford x-mid station

xangle=305.827 10^-6;
yangle=12.0075 10^-6;

Rhxm = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rhxm]

MatrixForm[Rhxm-IdentityMatrix[3]]

Rhxminv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rhxm.Rhxminv]

Rhxe	-> Hanford x-end station

xangle=-7.8389 10^-6;
yangle=11.5318 10^-6;

Rhxe = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rhxe]

MatrixForm[Rhxe-IdentityMatrix[3]]

Rhxeinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rhxe.Rhxeinv]

Rhym	-> Hanford y-mid station

xangle=619.97 10^-6;
yangle=325.84 10^-6;

Rhym = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rhym]

MatrixForm[Rhym-IdentityMatrix[3]]

Rhyminv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rhym.Rhyminv]

Rhye	-> Hanford y-end station

xangle=620.45 10^-6;
yangle=639.20 10^-6;

Rhye = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rhxe]

MatrixForm[Rhye-IdentityMatrix[3]]

Rhyeinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rhye.Rhyeinv]

(180/Pi) 619 10^-6 //N

Rlc	-> Livingston Corner station

xangle=312.0 10^-6;
yangle=-611.0 10^-6;

Rlc = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rlc]

MatrixForm[Rlc-IdentityMatrix[3]]

Rlcinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rlc.Rlcinv]

Rlxe	-> Livingston x-end station

xangle=-315.0 10^-6;
yangle=-610.0 10^-6;

Rlxe = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rlxe]

MatrixForm[Rlxe-IdentityMatrix[3]]

Rlxeinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rlxe.Rlxeinv]

MatrixForm[Rlxeinv-Transpose[Rlxe]]

Rlye	-> Livingston y-end station

xangle=311.0 10^-6;
yangle=18.8 10^-6;

Rlye = RotationMatrix3D[0,yangle,0].RotationMatrix3D[Pi/2,xangle,-Pi/2];
MatrixForm[Rlye]

MatrixForm[Rlye-IdentityMatrix[3]]

Rlyeinv =RotationMatrix3D[Pi/2,-xangle,-Pi/2]. RotationMatrix3D[0,-yangle,0];
MatrixForm[Rlye.Rlyeinv]

Vector Analysis for Wedge Position & Orientation Determination

Parameters

wl = 1.064; 
nOptic = ModelRefractiveIndex[FusedSilica][WaveLength -> wl]
nAir = ModelRefractiveIndex[Air][WaveLength -> wl]
nVacuum = ModelRefractiveIndex[Vacuum][WaveLength -> wl]

nOptic=1.44963;
nAir=1.0;
nVacuum=1.0;

Note : D0901920-v12 &-v13 pdf file reports nOptic = 1.44963. In fact Zemax uses Suprasil-Ext index for 20C, zero pressure at 1064 nm which is 1.4500310
According to 
- I. H. Malitson. Interspecimen Comparison of the Refractive Index of Fused Silica, J. Opt. Soc. Am. 55, 1205-1208 (1965) doi:10.1364/JOSA.55.001205
- Handbook of Optics, 3rd edition, Vol. 4. McGraw-Hill 2009
as calculated at this URL:
http://refractiveindex.info/wiki/Citing_RefractiveIndex.INFO
the index at 1064 nm is 1.44963

H1

Notes

1) The ITM optic assignments of specific serial numbered optics is given in T1200324-v2. The assignments of the CP and BS optics, and the parameters of each COC optic is given by serial number at https://nebula.ligo.caltech.edu/optics/, with the exception of CPy. GariLynn states that CP09 must be replaced (currently part of H2-ITMy destined to become H1-ITMy) and has chosen CP02 for its replacement.
	ITMx is ITM09
	ITMy is ITM06
	CPx is CP01
	CPy is CP02
	BS is BS06

2) The magnitude and orientation of the wedge angles are as follows::
    ITMx = 0.077 deg, vertical, thick side down
    ITMy = 0.078 deg, vertical, thick side down
    CPx = 0.069 deg, horizontal, thick side -Y
    CPy = 0.069 deg, horizontal, thick side -X
    BS = 0.076 deg, horizontal, thick side +X/+Y
The wedge angle values given in https://nebula.ligo.caltech.edu/optics/ are the "final" values reported by the polishing contractor. However there is some round-off/approx. in this data. GariLynn Billingsley suggests using the values reported in C1107164-v1.

H1 Unique Parameters

wedgeITMx = 0.077*pi/180;
wedgeITMy = 0.078*pi/180;
wedgeCPx = 0.069*pi/180;
wedgeCPy = 0.069*pi/180;
wedgeBS = 0.076*pi/180;

ITMxThick=200.22;
ITMxDiameter=340.13;
ITMyThick=199.64;
ITMyDiameter=340.06;
CPxThick=99.82;
CPxDiameter=340.13;
CPyThick=99.91;
CPyDiameter=340.22;
BSThick=60.41;
BSDiameter=369.85;

p1={-200,4983.1,-80};
p9={5013,-200,-80};
d12=ITMyThick-(ITMyDiameter/2) Tan[wedgeITMy];
d910=ITMxThick-(ITMxDiameter/3) Tan[wedgeITMx];
d23=20;
d1011=20;
d34=CPyThick-(CPyDiameter/2) Tan[wedgeCPy];
d1112=CPxThick-(CPxDiameter/2) Tan[wedgeCPx];
dBS=BSThick-(BSDiameter/2) Tan[wedgeBS];

Note that the distances d513 and d57 are approximate -- they do not take into account the wedge angle of the BS

optic surface orientation determination

normal vectors for ITMs and CPs

n1 = {0, 1, 0}; 
n2=RotationMatrix3D[0,wedgeITMy,0].n1

n3=n2;
n4=RotationMatrix3D[0,0,-wedgeCPy].n3

n9 = {1, 0, 0}; 
n10 = RotationMatrix3D[pi/2, -wedgeITMx, -(pi/2)].n9

n11=n10;
n12=RotationMatrix3D[0,0,wedgeCPx].n11

ITMy path to BS

u1=-n1;
w1=u1;
u2=w1;
w2=Refract[u2,n2,nOptic,nVacuum]

u3=w2;
w3=Refract[u3,n3,nVacuum,nOptic]

u4=w3;
w4=Refract[u4,n4,nOptic,nVacuum]

u5y=w4;

ITMx path to BS

u9=-n9;
w9=u9;
u10=w9;
w10=Refract[u10,n10,nOptic,nVacuum]

u11=w10;
w11=Refract[u11,n11,nVacuum,nOptic]

u12=w11;
w12=Refract[u12,n12,nOptic,nVacuum]

u13=w12;

Tried to convert from Rotate3D to RotationMatrix3D and didn’t get this to work, so reverting to old function Rotate3D in package “Geometry`Rotations`”
soln = Minimize[Abs[Reflect[u5y, RotationMatrix3D[-yaw, 0, 0].{0, 1, 0}].Refract[Refract[u13, RotatationMatrix3D[wedgeBS, 0, 0].-RotationMatrix3D[yaw, 0, 0].{0, 1, 0}, nVacuum, nOptic], -RotationMatrix3D[yaw, 0, 0].{0, 1, 0}, nOptic, nVacuum]], yaw]
Note also that I have assumed a zero pitch angle. This is approximately correct because the BS has no vertical wedge component. However the reflected and refracted rays have a pitch angle difference of ~8 microrad (very small).

Clear[yaw];
soln=Maximize[Reflect[u5y,Rotate3D[{0,1,0},-yaw,0,0]].Refract[Refract[u13,Rotate3D[-Rotate3D[{0,1,0},-yaw,0,0],wedgeBS,0,0],nVacuum,nOptic],-Rotate3D[{0,1,0},-yaw,0,0],nOptic,nVacuum],yaw]

BSyaw=-yaw/.soln[[2]];
BSyawDeg=BSyaw 180/pi

n5y=RotationMatrix3D[BSyaw,0,0].{0,1,0}
n5x=-n5y;

v5=Reflect[u5y,n5y]

w5y=Refract[u5y,n5y,nVacuum,nOptic]

n13=RotationMatrix3D[wedgeBS,0,0].n5x;
n7=-n13

u7=w5y;
w7=Refract[u7,n7,nOptic,nVacuum]

w13=Refract[u13,n13,nVacuum,nOptic];
u5x=w13;
w5x=Refract[u5x,n5x,nOptic,nVacuum]

BS position determination

d513=dBS/(-w13.n5x)

d57=dBS/(w5y.n5x)

p2=p1+d12 w1

p3=p2+d23 w2

p4=p3+d34 w3

p10=p9+d910 w9

p11=p10+d1011 w10

p12=p11+d1112 w11

Clear[dBSy,dBSx]
soln=Minimize[EuclideanDistance[p4+dBSy w4,p12+dBSx w12+d513 w13],{dBSy,dBSx}]

d45=dBSy/.soln[[2]];
d1213=dBSx/.soln[[2]];

p5=p4+d45 w4
p13=p12+d1213 w12
p13+d513 w13

p7=p5+d57 u7

PR3 position determination

Take as a given the global x - coordinate of the PR3 from the IO layout (E1100494-v3)

pPR3={-19740,-177.4,-94.6};

xPR3=pPR3[[1]];

d56=(xPR3-p5[[1]])/v5[[1]]

p6=p5+d56 v5

PR2 position determination

PR3 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PR2 from the IO layout (because the IO layout position is used in the SolidWorks layouts used to physcially place the suspensions
pPR2 from  IO layout (E1100495-v4) should equal p14

pPR2io={-3581.3,-530.4,-84.3};

u6=v5;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p6+s Reflect[u6,Rhc.Rotate3D[{1,0,0},-yaw,0,0]],pPR2io],{s,yaw}]

PR3yaw=yaw/.soln[[2]];
d614=s/.soln[[2]];
n6=Rhc.Rotate3D[{1,0,0},-PR3yaw,0,0]
v6=Reflect[u6,n6];
p14=p6+d614 v6

PRM position determination

PR2 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PRM from the IO layout (because the IO layout position is used in the SolidWorks layouts used to physcially place the suspensions
pPRM from IO layout (E1100494-v3) should equal p15

pPRMio={-20189.6,-628.0,-94.2};

u14=v6;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p14+s Reflect[u14,Rhc.Rotate3D[{-1,0,0},-yaw,0,0]],pPRMio],{s,yaw}]

PR2yaw=yaw/.soln[[2]];
d1415=s/.soln[[2]];
n14=Rhc.Rotate3D[{-1,0,0},-PR2yaw,0,0]
v14=Reflect[u14,n14];
p15=p14+d1415 v14

u15=v14;
n15=-v14;
Clear[yaw]
soln=Maximize[n15.Rotate3D[{1,0,0},-yaw,0,0],{yaw}];
PRMyaw=yaw/.soln[[2]]

SR3 position determination

Take as a given the global y - coordinate of the SR3 from Zemax layout (D0901920-v13).
pSR3 from Zemax should equal p8

pSR3={-174.2,-19615.9,-94.5};
ySR3=pSR3[[2]];

d78=(ySR3-p7[[2]])/w7[[2]]

p8=p7+d78 w7

n15=-v14;

SR2 position determination

SR3 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the SR2 from the Zemax layout (because the Zemax layout positions for the SRC are used in the SolidWorks layouts used to physcially place the suspensions
pSR2 from Zemax (D0902216-v8) should equal p16

pSR2zemax={-594.1,-4178.1,-104.4};

u8=w7;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p8+s Reflect[u8,Rhc.Rotate3D[{0,1,0},-yaw,0,0]],pSR2zemax],{s,yaw}]

SR3yaw=yaw/.soln[[2]];
d816=s/.soln[[2]];
n8=Rhc.Rotate3D[{0,1,0},-SR3yaw,0,0]
v8=Reflect[u8,n8];
p16=p8+d816 v8

SRM position determination

SR2 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PRM from the Zemax layout (because the Zemax SRC layout positions are used in the SolidWorks layouts used to physcially place the suspensions
pSRM from Zemax (D0901920-v13) should equal p17

pSRMzemax={305.4,-19908.6,-113.2};

u16=v8;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p16+s Reflect[u16,Rhc.Rotate3D[{0,-1,0},-yaw,0,0]],pSRMzemax],{s,yaw}]

SR2yaw=yaw/.soln[[2]];
d1617=s/.soln[[2]];
n16=Rhc.Rotate3D[{0,-1,0},-SR2yaw,0,0]
v16=Reflect[u16,n16];
p17=p16+d1617 v16

u17=v16;
n17=-v16;
Clear[yaw]
soln=Maximize[n17.Rotate3D[{0,1,0},-yaw,0,0],{yaw}];
SRMyaw=yaw/.soln[[2]]

PRC, SRC & Schnupp Assymmetry Lengths

According to T0900043-v11, the recycling cavity lengths are supposed to be:
PRC length = 57656.0 mm
SRC length = 56008.0 mm
The Schnupp Assymmetry is supposed to be 80 mm, according to RODA M1200276-v1

dPRC=d1415+d614+d56+((nOptic d12+d23+nOptic d34+d45)+(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513))/2

dSRC=d1617+d816+d78+nOptic d57+((nOptic d12+d23+nOptic d34+d45)+(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513))/2

schnuppAssy=Abs[(nOptic d12+d23+nOptic d34+d45)-(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513)]

Summary

Optic Parameters

opticLabel={"PRM HR","PR2 HR","PR3 HR","BS HR","BS ARs","SRM HR","SR2 HR","SR3 HR","CPx","ITMx","CPy","ITMy"};
nOptics=Length[opticLabel];
opticWedge={"NA","NA","NA",wedgeBS,"NA","NA","NA","NA",wedgeCPx,wedgeITMx,wedgeCPy,wedgeITMy};
opticThick={"NA","NA","NA",BSThick,"NA","NA","NA","NA",CPxThick,ITMxThick,CPyThick,ITMyThick};
opticDiameter={"NA","NA","NA",BSDiameter,"NA","NA","NA","NA",CPxDiameter,ITMxDiameter,CPyDiameter,ITMyDiameter};

formatedTableParameters

Results

opticPositionG={p15,p14,p6,p5,p7,p17,p16,p8,p11,p9,p3,p1};
opticPositionL=opticPositionG.Rhc;
opticNormalG={n15,n14,n6,n5y,n13,n17,n16,n8,n11,n9,n3,n1};
opticNormalL=opticNormalG.Rhc;
opticYaw={PRMyaw,PR2yaw,PR3yaw,BSyaw,0,SRMyaw,SR2yaw,SR3yaw,0,0,0,0};

formatedTablePositions

formatedTableNormals

formatedTableAngles

Zemax results

Zemax results are from D0901920-v13
The wedge angle magnitudes (but not oreintations/signs) reported in the Zemax optical layout, D0901920-v13 differ, as follows:
   ITMx = ITM10? = 0.077 deg (same value but serial number designation is wrong)
   ITMy = ITM11? = 0.076 deg (value and serial number incorrect)
   CPx = CP01 = 0.070 deg (serial number correct, used “final” wedge angle instead of C1107164-v1 value)
   CPy = CP02 = 0.069 deg (serial number is incorrect)
   BS = BS06 = 0.076 deg (same)

opticLabelZemax={"PRM HR","PR2 HR","PR3 HR","BS HR","BS ARs","SRM HR","SR2 HR","SR3 HR","ITMx","ITMy","ETMx","ETMy"};
nOpticsZemax=Length[opticLabelZemax];
opticPosGZemax={{-20194.3,-628.0,-95.8},{-3581.7,-530.4,-84.5},{-19740.5,-174.0,-94.8},{-202.6,-183.9,-82.9},{-184.0,-249.8,-82.9},{305.4,-19908.6,-113.2},{-594.1,-4178.1,-104.4},{-174.2,-19615.9,-94.5},{5013.0,-200.0,-80.0},{-200.0 ,4983.1,-80.0},{3999498.0,-200.0,-80.0},{-200.0, 3999468.1,-80.0}};

compareOpticLabel=opticLabelZemax[[1;;10]];
nCompareOptics=10;
comparePositionG=Drop[opticPositionG,{9,11,2}]-opticPosGZemax[[1;;10]];

formatedTableComparePositions

IO results

IO Layout results for PRM, PR2 and PR3 are from E1100494-v3, E1100495-v4

opticLabelIO={"PRM HR","PR2 HR","PR3 HR"};
nOpticsIO=Length[opticLabelIO];
opticPosGIO={{-20189.6,-628,-94.2},{-3581.3,-530.4,-84.3},{-19740,-177.4,-94.6}};

compareOpticLabel=opticLabelIO[[1;;3]];
nCompareOptics=Length[compareOpticLabel];
comparePositionG=opticPositionG[[1;;3]]-opticPosGIO;

formatedTableComparePositions

L1

Notes

1) The ITM optic assignments of specific serial numbered optics is given in T1200324-v2. The assignments of the CP and BS optics, and the parameters of each COC optic is given by serial number at https://nebula.ligo.caltech.edu/optics/, with the exception of CPy. GariLynn states that CP09 must be replaced (currently part of H2-ITMy destined to become H1-ITMy) and has chosen CP02 for its replacement.
	ITMx is ITM04
	ITMy is ITM08
	CPx is CP06
	CPy is CP08
	BS is BS02

2) The magnitude and orientation of the wedge angles are as follows::
    ITMx = 0.0725 deg, vertical, thick side down
    ITMy = 0.074 deg, vertical, thick side down
    CPx = 0.073 deg, horizontal, thick side -Y
    CPy = 0.066 deg, horizontal, thick side -X
    BS = 0.070 deg, horizontal, thick side +X/+Y
The wedge angle values given in https://nebula.ligo.caltech.edu/optics/ are the "final" values reported by the polishing contractor. However there is some round-off/approx. in this data. GariLynn Billingsley suggests using the values reported in C1107164-v1.

L1 Unique Parameters

optic thicknesses are the as-built values reported in C1107164-v1 for the assigned optics

wedgeITMx = 0.0725*pi/180;
wedgeITMy = 0.074*pi/180;
wedgeCPx = 0.073*pi/180;
wedgeCPy = 0.066*pi/180;
wedgeBS = 0.070*pi/180;

ITMxThick=200.27;
ITMxDiameter=340.0;
ITMyThick=199.61;
ITMyDiameter=339.92;
CPxThick=100.31;
CPxDiameter=339.94;
CPyThick=100.32;
CPyDiameter=340.11;
BSThick=59.88;
BSDiameter=369.98;

p1={-200,4983.1,-80};
p9={5013,-200,-80};
d12=ITMyThick-(ITMyDiameter/2) Tan[wedgeITMy];
d910=ITMxThick-(ITMxDiameter/3) Tan[wedgeITMx];
d23=20;
d1011=20;
d34=CPyThick-(CPyDiameter/2) Tan[wedgeCPy];
d1112=CPxThick-(CPxDiameter/2) Tan[wedgeCPx];
dBS=BSThick-(BSDiameter/2) Tan[wedgeBS];

Note that the distances d513 and d57 are approximate -- they do not take into account the wedge angle of the BS

optic surface orientation determination

normal vectors for ITMs and CPs

n1 = {0, 1, 0}; 
n2=RotationMatrix3D[0,wedgeITMy,0].n1

n3=n2;
n4=RotationMatrix3D[0,0,-wedgeCPy].n3

n9 = {1, 0, 0}; 
n10 = RotationMatrix3D[pi/2, -wedgeITMx, -(pi/2)].n9

n11=n10;
n12=RotationMatrix3D[0,0,wedgeCPx].n11

ITMy path to BS

u1=-n1;
w1=u1;
u2=w1;
w2=Refract[u2,n2,nOptic,nVacuum]

u3=w2;
w3=Refract[u3,n3,nVacuum,nOptic]

u4=w3;
w4=Refract[u4,n4,nOptic,nVacuum]

u5y=w4;

ITMx path to BS

u9=-n9;
w9=u9;
u10=w9;
w10=Refract[u10,n10,nOptic,nVacuum]

u11=w10;
w11=Refract[u11,n11,nVacuum,nOptic]

u12=w11;
w12=Refract[u12,n12,nOptic,nVacuum]

u13=w12;

Tried to convert from Rotate3D to RotationMatrix3D and didn’t get this to work, so reverting to old function Rotate3D in package “Geometry`Rotations`”
soln = Minimize[Abs[Reflect[u5y, RotationMatrix3D[-yaw, 0, 0].{0, 1, 0}].Refract[Refract[u13, RotatationMatrix3D[wedgeBS, 0, 0].-RotationMatrix3D[yaw, 0, 0].{0, 1, 0}, nVacuum, nOptic], -RotationMatrix3D[yaw, 0, 0].{0, 1, 0}, nOptic, nVacuum]], yaw]
Note also that I have assumed a zero pitch angle. This is approximately correct because the BS has no vertical wedge component. However the reflected and refracted rays have a pitch angle difference of ~8 microrad (very small).

Clear[yaw];
soln=Maximize[Reflect[u5y,Rotate3D[{0,1,0},-yaw,0,0]].Refract[Refract[u13,Rotate3D[-Rotate3D[{0,1,0},-yaw,0,0],wedgeBS,0,0],nVacuum,nOptic],-Rotate3D[{0,1,0},-yaw,0,0],nOptic,nVacuum],yaw]

BSyaw=-yaw/.soln[[2]];
BSyawDeg=BSyaw 180/pi

n5y=RotationMatrix3D[BSyaw,0,0].{0,1,0}
n5x=-n5y;

v5=Reflect[u5y,n5y]

w5y=Refract[u5y,n5y,nVacuum,nOptic]

n13=RotationMatrix3D[wedgeBS,0,0].n5x;
n7=-n13

u7=w5y;
w7=Refract[u7,n7,nOptic,nVacuum]

w13=Refract[u13,n13,nVacuum,nOptic];
u5x=w13;
w5x=Refract[u5x,n5x,nOptic,nVacuum]

BS position determination

d513=dBS/(-w13.n5x)

d57=dBS/(w5y.n5x)

p2=p1+d12 w1

p3=p2+d23 w2

p4=p3+d34 w3

p10=p9+d910 w9

p11=p10+d1011 w10

p12=p11+d1112 w11

Clear[dBSy,dBSx]
soln=Minimize[EuclideanDistance[p4+dBSy w4,p12+dBSx w12+d513 w13],{dBSy,dBSx}]

d45=dBSy/.soln[[2]];
d1213=dBSx/.soln[[2]];

p5=p4+d45 w4
p13=p12+d1213 w12
p13+d513 w13

p7=p5+d57 u7

PR3 position determination

Take as a given the global x - coordinate of the PR3 from the IO layout (because the IO layout position is used in the SolidWorks layouts used to physcially place the suspensions
pPR3 from the IO layout (E1100492-v11, E1100493-v9) should equal p6

pPR3io={-19740.0,-177.4,-94.5};
xPR3=pPR3io[[1]];

d56=(xPR3-p5[[1]])/v5[[1]]

p6=p5+d56 v5

PR2 position determination

PR3 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PR2 from the IO layout (because the IO layout position is used in the SolidWorks layouts used to physcially place the suspensions
pPR2 from the IO layout (E1100492-v11, E1100493-v9) should equal p14

pPR2io={-3579.2,-530.4,-94.1};

u6=v5;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p6+s Reflect[u6,Rlc.Rotate3D[{1,0,0},-yaw,0,0]],pPR2io],{s,yaw}]

PR3yaw=yaw/.soln[[2]];
d614=s/.soln[[2]];
n6=Rlc.Rotate3D[{1,0,0},-PR3yaw,0,0]
v6=Reflect[u6,n6];
p14=p6+d614 v6

PRM position determination

PR2 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PRM from the IO layout (because the IO layout position is used in the SolidWorks layouts used to physcially place the suspensions
pPRM from the IO layout (E1100492-v11, E1100493-v9) should equal p15

pPRMio={-20189.6,-628.0,-104.1};

u14=v6;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p14+s Reflect[u14,Rlc.Rotate3D[{-1,0,0},-yaw,0,0]],pPRMio],{s,yaw}]

PR2yaw=yaw/.soln[[2]];
d1415=s/.soln[[2]];
n14=Rlc.Rotate3D[{-1,0,0},-PR2yaw,0,0]
v14=Reflect[u14,n14];
p15=p14+d1415 v14

u15=v14;
n15=-v14;
Clear[yaw]
soln=Maximize[n15.Rotate3D[{1,0,0},-yaw,0,0],{yaw}];
PRMyaw=yaw/.soln[[2]]

SR3 position determination

Take as a given the global y - coordinate of the SR3 from Zemax.
pSR3 from Zemax should equal p8

pSR3={-175.2,-19615.9,-94.1};
ySR3=pSR3[[2]];

d78=(ySR3-p7[[2]])/w7[[2]]

p8=p7+d78 w7

n15=-v14;

SR2 position determination

SR3 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the SR2 from the Zemax layout (because the Zemax layout positions for the SRC are used in the SolidWorks layouts used to physcially place the suspensions
pSR2 from Zemax (D0902216-v8) should equal p16

pSR2zemax={-594.1,-4178.1,-84.4};

u8=w7;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p8+s Reflect[u8,Rlc.Rotate3D[{0,1,0},-yaw,0,0]],pSR2zemax],{s,yaw}]

SR3yaw=yaw/.soln[[2]];
d816=s/.soln[[2]];
n8=Rlc.Rotate3D[{0,1,0},-SR3yaw,0,0]
v8=Reflect[u8,n8];
p16=p8+d816 v8

SRM position determination

SR2 is constrained to be vertical (zero pitch angle) in local coordinates (to minimize vertical bounce mode-to-length coupling). Consequently the normal vector for this optic must be pitched in global coordinates.
Take as a given the global x and y coordinates of the PRM from the Zemax layout (because the Zemax SRC layout positions are used in the SolidWorks layouts used to physcially place the suspensions
pSRM from Zemax (D0902216-v8) should equal p17

pSRMzemax={305.0,-19908.6,-93.2};

u16=v8;

Clear[s,yaw]
soln=Minimize[EuclideanDistance[p16+s Reflect[u16,Rlc.Rotate3D[{0,-1,0},-yaw,0,0]],pSRMzemax],{s,yaw}]

SR2yaw=yaw/.soln[[2]];
d1617=s/.soln[[2]];
n16=Rlc.Rotate3D[{0,-1,0},-SR2yaw,0,0]
v16=Reflect[u16,n16];
p17=p16+d1617 v16

u17=v16;
n17=-v16;
Clear[yaw]
soln=Maximize[n17.Rotate3D[{0,1,0},-yaw,0,0],{yaw}];
SRMyaw=yaw/.soln[[2]]

PRC, SRC & Schnupp Assymmetry Lengths

According to T0900043-v11, the recycling cavity lengths are supposed to be:
PRC length = 57656.0 mm
SRC length = 56008.0 mm
The Schnupp Assymmetry is supposed to be 80 mm, according to RODA M1200276-v1

dPRC=d1415+d614+d56+((nOptic d12+d23+nOptic d34+d45)+(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513))/2

dSRC=d1617+d816+d78+nOptic d57+((nOptic d12+d23+nOptic d34+d45)+(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513))/2

schnuppAssy=Abs[(nOptic d12+d23+nOptic d34+d45)-(nOptic d910+d1011+nOptic d1112+d1213+nOptic d513)]

Summary

Optic Parameters

opticLabel={"PRM HR","PR2 HR","PR3 HR","BS HR","BS ARs","SRM HR","SR2 HR","SR3 HR","CPx","ITMx","CPy","ITMy"};
nOptics=Length[opticLabel];
opticWedge={"NA","NA","NA",wedgeBS,"NA","NA","NA","NA",wedgeCPx,wedgeITMx,wedgeCPy,wedgeITMy};
opticThick={"NA","NA","NA",BSThick,"NA","NA","NA","NA",CPxThick,ITMxThick,CPyThick,ITMyThick};
opticDiameter={"NA","NA","NA",BSDiameter,"NA","NA","NA","NA",CPxDiameter,ITMxDiameter,CPyDiameter,ITMyDiameter};

formatedTableParameters

Results

opticLabel={"PRM HR","PR2 HR","PR3 HR","BS HR","BS ARs","SRM HR","SR2 HR","SR3 HR","CPx","ITMx","CPy","ITMy"};
nOptics=Length[opticLabel];
opticPositionG={p15,p14,p6,p5,p7,p17,p16,p8,p11,p9,p3,p1};
opticPositionL=opticPositionG.Rlc;
opticNormalG={n15,n14,n6,n5y,n13,n17,n16,n8,n11,n9,n3,n1};
opticNormalL=opticNormalG.Rlc;
opticYaw={PRMyaw,PR2yaw,PR3yaw,BSyaw,0,SRMyaw,SR2yaw,SR3yaw,0,0,0,0};

formatedTablePositions

formatedTableNormals

formatedTableAngles

Zemax results

Zemax results are from D0902216 - v8
The wedge angle magnitudes (but not oreintations/signs) reported in the Zemax optical layout, D0902216-v8 match the serial numbers and wedge angle values given above.

opticLabelZemax={"PRM HR","PR2 HR","PR3 HR","BS HR","BS ARs","SRM HR","SR2 HR","SR3 HR","ITMx","ITMy","ETMx","ETMy"};
nOpticsZemax=Length[opticLabelZemax];
opticPosGZemax={{-20190.0,-628.0,-102.8},{-3579.6,-530.4,-93.3},{-19740.5,-176.3,-93.9},{-202.5,-184.0,-82.8},{-183.9,-250.0,-82.9},{305.0,-19908.6,-93.2},{-594.1,-4178.1,-84.4},{-175.2,-19615.9,-94.1},{5013.0,-200.0,-80.0},{-200.0, 4983.1,-80.0},{3999498.0,-200.0,-80.0},{-200.0 ,3999468.1,-80.0}};

compareOpticLabel=opticLabelZemax[[1;;10]];
nCompareOptics=10;
comparePositionG=Drop[opticPositionG,{9,11,2}]-opticPosGZemax[[1;;10]];

formatedTableComparePositions

IO results

IO Layout results for PRM, PR2 and PR3 are from E1100492-v11, E1100493-v9

opticLabelIO={"PRM HR","PR2 HR","PR3 HR"};
nOpticsIO=Length[opticLabelIO];
opticPosGIO={{-20189.6,-628,-104.1},{-3579.2,-530.4,-94.1},{-19740,-177.4,-94.5}};

compareOpticLabel=opticLabelIO[[1;;3]];
nCompareOptics=Length[compareOpticLabel];
comparePositionG=opticPositionG[[1;;3]]-opticPosGIO;

formatedTableComparePositions