E1200797-v2
IAS Alignment Solutions

This is an evolving notebook used for calculating/providing the positions and orientations of the IAS theodolite-total-station/autocolimator for initial alignment and positioning of the primary optics. It also calculates the pitch angles of the COC relative to the local horizontal. The alignment solutions (angles, positions/distances) calculated in this notebook are inserted into each of the IAS alignment procedures.

This notebook is released each time a particular set of alignment solutions are available. Each alignment solution, and associated notes, are given a separate DCC number. However all of the solutions to date are kept in this evolving notebook. The notebook will be posted to the parent DCC number (E1200797) as well as the subsidiary DCC number for the specific alignment solution which was the reason for the version release.

Version History

E1200556-v1  D. Coyne  8/29/2011, 5/30/2012

1) Started with iLIGO version of this notebook
1) Calculation of the monument locations required for alignment of H2-FMy on LHO Mechanical Test Stand #2. (The output was releasd in an alignment procedure, this notebook was not released to the DCC.)
2) Incorporated the coordinates and orientations for all optics of H1 and L1. H2 is no longer to be deployed (H2 will become LIGO-India, I1).
3) Calculated the optic pitch and yaw values to be checked against values used in SolidWorks.

E1200556-v2  D. Coyne  6/7/2012

1) Released to show L1 PR3 alignment solutions (yaw, pitch, x, y, z)

E1200556-v3  D. Coyne  6/7/2012

1) Released to show L1 PRM angular alignment solution (yaw, pitch)

E1200556-v4  D. Coyne  6/12/2012

1) Updated all L1 optic positions and orientations per D0902216-x010 Zemax model. Need to update H1 as well.
2) Released to show LBSC2 cartridge alignment solutions -- HOWEVER THE BS ORIENTATION IS APPARENTLY OPPOSITE TO WHAT I HAVE ASSUMED -- MUST BE RE-CALCULATED

E1200556-v5  D. Coyne  6/14/2012

1) Corrected LBSC2 cartridge alignment solutions (with an orientation of the BS which reflects the actual orientation chosen at LLO)
2) Revised the BS AR normal vector to be consistent with BS SN002 wedge angle of 0.070 deg (rather than the avergae value of 0.073 deg used in Zemax D0902216-x010)
3) Released to show 4 BS alignment solutions for the cartridge on the test stand

E1200556-v6  D. Coyne  6/18/2012

1) LBSC2 BS AR yaw & pitch alignment: Based on measurements by Joe Hanson 6/14/2012 on the position of the LLO Test Stand #1 monuments relative to the LVEA wall (which correct D1200869-v4 and E1100374-v4), the location of the proposed monument TS1-17 in v5 of this document is in the LVEA wall. As a consequence the location of the proposed monuments to support angular alignment of the BS vai the AR surface for LBSC2 are revised in this v6 version.
One can (just barely) get sufficient range to separate the AR surface reflection from the HR surface reflection, when aligned normal to the HR surface. However, one cannot get sufficient range to separate the returns when aligned normal to the AR surface (in transmission through the HR surface). However, since it is possible that one can still get sufficient return signal intensity by blocking the HR reflection through the use of an iris to close down the aperture for the exiting laser autocollimator beam and, simultaneously, the return aperture, a solution is provided for alignment of the pitch & yaw of the AR surface (in transmission through the HR surface).
2) LBSC2 BS HR yaw & pitch alignment: I calculated that 8995 mm of distance was required between the Total Station and the BS optic in order to separate the HR and AR returns, The alignment solution for pitch & yaw alignment of the BS HR face had only 8717 mm of distance in v5. I revised the solution so that the minimum distance is achieved.

E1200556-v7  D. Coyne  6/26/2012

1) Corrected the LLO Test Stand #1 monument locations per Doug Cook’s and Jason Oberling’s survey and re-calculated the LBSC2 TS1 solutions.

E1200798-v1  D. Coyne  9/4/2012

1) Formulated BS cartridge alignment on LHO Test Stand #2. Included “BS AR” coordinates and normal vector for H1.

E1200797-v2  D. Coyne  9/5/2012

1) Formulated alignment solutions for the L1 power recycling cavity (PRC) optics: PRM, PR2 and PR3.

2) Calculated positional (x, y, z) alignment solution for LBSC2 BS in the chamber.

.. Intialization

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

Needs["VectorAnalysis`"]

Needs[“Geometry`Rotations`”]
is no longer needed. Use built - in RotationTransform and RotationMatrix
RotationMatrix uses yaw-pitch-roll angles rather than the Euler angles used by RotationMatrix3D

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

The function "Reflect[u,n]" takes the unit ray vector, u, and reflects it from the surface with an outward surface normal vector, n, and returns the reflected unit ray vector, v.

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

The function "Refract[u,n,ni,nt]" takes the unit ray vector, u, and refracts it through the surface with an outward surface normal vector, n, and returns the refracted unit ray vector, v. The incident ray travels through a media with an index of refraction, ni, and refracts into a media with an index of refraction, nt.

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

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;

The functions LTHR reflects the light back parallel to the input beam but translated; Lateral Transfer Hollow Retroreflector (LTHR) function. (The physical unit used in the IAS system is called a PLX retroreflector, made by the PLX Inc.)

The function LTHRangle takes the input vector, u, and returns the retroreflected ray, v.

The function LTHRpos takes an entrance aperture center point, a, translates it along the axis vector, axis, a distance, d, and returns the exit aperture center point, b, where the retroreflected and translated ray, v, eminates.

Clear[LTHRangle];
LTHRangle[u_]:=-u;

Clear[LTHRpos];
LTHRpos[a_,axis_,d_]:=a+d axis;

Clear[LTHPangle];
LTHRangle[u_]:=u;

Clear[LTHPpos];
LTHRpos[a_,axis_,d_]:=a+d axis;

LTHPlength=15.75 25.4;
LTHRlength = LTHPlength

.. 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]

.. Optic surface positions & orientations and Monument Positions

-Global coordinates taken from:
	H1: D0901920-v10 ( was E1101147-v2, “H1_recycling cavity length .076wedge”)
	L1: Zemax model “D090xxxx L1 Zemax layout.zar”, PDMW vault version x010
	H2: D0902345-v8 (was E1101148-v2, “H2_recycling-cavity-length-0.076wedge”)
Normal vectors in global coordinates taken with Zemax from:
	Zemax model “D0901920 H1 Zemax layout.zar”, PDMW vault version x009 (and x010 for BS HR & AR normal vectors, with BS wedge set to 0.076 for SN06)
	Zemax model “D090xxxx L1 Zemax layout.zar”, PDMW vault version x010
	Zemax model “D090xxxx H2 Zemax layout.zar”, PDMW vault version x009
by running a ray trace and exporting the normal vector components (Nx, Ny, Nz) at the location of intersection of the ray. Of course if the system is not aligned well for curved optics the normal vector will change. These values were exported 5/29-31/2012, with sign corrections as needed so that all are outward facing normal vectors; Here the outward surface normal is used in *all cases*.

Note that H2 will not be deployed (H2 components will become LIGO-India, I1). However the alignment solutions for ITMy (WBSC8) and ETMy (WBSC6) are given in this notebook (these two ITMs are used for the One Arm Test)

... Global Coordinates

H1

Optics

nOpticsH1=11;
opticLabelH1={"PRM HR","PR2 HR","PR3 HR","BS HR","BS AR","SRM HR","SR2 HR","SR3 HR","ITMx HR","ITMy HR","ETMx HR","ETMy HR"};

opticPosH1G={{-20208.0,-628.0,-94.1},
	{-3589.1,-530.4,-84.2},
	{-19741.0,-175.3,-94.6},
	{-202.63,-183.9,-82.9},
  {-160.32,-226.23,-82.9},
	{305.2,-19875.6,-113.5},
	{-594.3,-4160.4,-104.1},
  {-175.5,-19615.9,-94.5},
  {4998.0,-200.0,-80.0},
  {-200.0, 4998.1,-80.0},
  {3999498.0,-200.0,-80.0},
{-200.0 ,3999498.1,-80.0}};

opticOrientH1G = {{9.999826  10^ - 01, 5.872318  10^ - 03, 5.969026 10^ - 04},
  {-9.999674 10^ - 01, 8.054606 10^ - 03, -6.194173 10^ - 04},
  {9.999368 10^ - 01, -1.123096 10^ - 02, 6.194173 10^ - 04},
  {-.7067506313, .7074627280, 0.000000},
{0.7058116198 ,-0.7083995938, 0.0000000000},
  {-5.714130 10^ - 02, 9.983659 10^ - 01, 5.963790 10^ - 04},
  {4.211194 10^ - 02, -9.991129 10^ - 01, 1.250005 10^ - 05},
  {-1.379639 10^ - 02, 9.999048 10^ - 01, -1.250005 10^ - 05},
  {1.000000 10^ + 00, 0.000000 10^ + 00, 0.000000 10^ + 00},
  {0.000000 10^ + 00, 1.000000 10^ + 00, 0.000000 10^ + 00},
  {-1.000000 10^ + 00, 0.000000 10^ + 00, 0.000000 10^ + 00},
  {0.000000 10^ + 00, -1.000000 10^ + 00, 0.000000 10^ + 00}};

ensure that the normal vectors have unit length

Do[
	temp=opticOrientH1G[[j]];
	i=Flatten[Position[Abs[temp],Max[Abs[temp]]]][[1]];
	If[i==1,
		opticOrientH1G[[j]]={Sign[temp[[1]]] Sqrt[1-temp[[2]]^2-temp[[3]]^2],temp[[2]],temp[[3]]};,
		If[i==2,
			opticOrientH1G[[j]]={temp[[1]],Sign[temp[[2]]] Sqrt[1-temp[[1]]^2-temp[[3]]^2],temp[[3]]};,
			If[i==3,opticOrientH1G[[j]]={temp[[1]],temp[[2]],Sign[temp[[3]]] Sqrt[1-temp[[1]]^2-temp[[2]]^2]};,
							opticOrientH1G[[j]]={0,0,0};]]],
		{j,nOpticsH1}];

Do[
	If[Abs[opticOrientH1G[[i]].opticOrientH1G[[i]]-1]> 10^-7, Print["error"],],
	{i,nOpticsH1}];

tableHead={"Xg","Yg","Zg","Ug","Vg","Wg"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosH1G,opticOrientH1G}]],6],TableHeadings->{opticLabelH1,tableHead}]]

Tables

nTablesH1=11;
tableLabelH1={"WHAM1","WHAM2","WHAM3","WHAM4","WHAM5","WHAM6","WBSC1","WBSC2","WBSC3","WBSC9","WBSC10"};

tablePosH1G={{-22692,0,0},
{-20122,0,0},
	{-3831,0,0},
	{0,-3831,0},
	{0,-20122,0},
	{0,-22692,0},
	{0,4580,0},
{0,0,0},
{4580,0,0},
{4000000,0,0},
{0,4000000,0}};

tableHead={"x_global","y_global","z_global"};
Print[TableForm[tablePosH1G,TableHeadings->{tableLabelH1,tableHead}]]

H2

positions relative to the mechanical test stand in global coordinates

opticLabelH2={"H2 FMy HR","H2 ITMy HR"};
nOpticsH2=Dimensions[opticLabelH2][[1]];

opticPosH2G={{200.689, 9004.403, -80.354},
		{200.000,9897.700,-80.000}} //N;
posWBSC8G = {0,9369.000,0};

Do[opticPosH2G[[j]]=opticPosH2G[[j]] - posWBSC8G,{j,nOpticsH2}];

FMyOrientG={.702932,.711257,-.000393};
ITMyOrientG={0,1,0};

opticOrientH2G = {FMyOrientG,ITMyOrientG} //N;

Do[
	temp=opticOrientH2G[[j]];
	i=Flatten[Position[Abs[temp],Max[Abs[temp]]]][[1]];
	If[i==1,
		opticOrientH2G[[j]]={Sign[temp[[1]]] Sqrt[1-temp[[2]]^2-temp[[3]]^2],temp[[2]],temp[[3]]};,
		If[i==2,
			opticOrientH2G[[j]]={temp[[1]],Sign[temp[[2]]] Sqrt[1-temp[[1]]^2-temp[[3]]^2],temp[[3]]};,
			If[i==3,opticOrientH2G[[j]]={temp[[1]],temp[[2]],Sign[temp[[3]]] Sqrt[1-temp[[1]]^2-temp[[2]]^2]};,
							opticOrientH2G[[j]]={0,0,0};]]],
		{j,nOpticsH2}];

Do[
	If[Abs[opticOrientH2G[[i]].opticOrientH2G[[i]]-1]> 10^-15, Print["error"],],
	{i,nOpticsH2}];

tableHead={"Xg","Yg","Zg","Ug","Vg","Wg"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosH2G,opticOrientH2G}]],6],TableHeadings->{opticLabelH2,tableHead}]]

L1

Optics

nOpticsL1=12;
opticLabelL1={"PRM HR","PR2 HR","PR3 HR","BS HR","BS AR","SRM HR","SR2 HR","SR3 HR","ITMx HR","ITMy HR","ETMx HR","ETMy HR"};

opticPosL1G={{-20207.70,-627.50,-104.07},{-3589.10,-530.38,-94.14},{-19741.00,-174.77,-94.59},{-202.63,-183.89,-82.91},{-160.32,-226.23,-82.91},{305.29,-19908.49,-94.26},{-594.19,-4178.10,-84.85},{-175.02,-19615.90,-94.49},{5013.00,-200.00,-80.00},{-200.00 ,4983.10,-80.00},{3999498.0,-200.0,-80.0},{-200.0 ,3999468.1,-80.0}};

opticOrientL1G = {{0.9999827147,0.0058461204,0.0005970073},{-0.9999672771 ,0.0080845049,-0.0003125248},{0.9999367595,-0.0112397745 ,0.0003122433},{-0.7067506313 ,0.7074627280, 0.0000000000},{0.7058486938 ,-0.7083626390, 0.0000000000},{-0.0570848398,0.9983691573,0.0006032904},{0.0421197750, -0.9991123676, -0.0006108652},{-0.0138039552 ,0.9999045134, 0.0006106988},{1.0000000000, 0.0000000000 ,0.0000000000},{0.0000000000 ,1.0000000000, 0.0000000000},{-1.0000000000, 0.0000000000, 0.0000000000},{0.0000000000,-1.0000000000 ,0.0000000000}};

ensure that the normal vectors have unit length

Do[
	temp=opticOrientL1G[[j]];
	i=Flatten[Position[Abs[temp],Max[Abs[temp]]]][[1]];
	If[i==1,
		opticOrientL1G[[j]]={Sign[temp[[1]]] Sqrt[1-temp[[2]]^2-temp[[3]]^2],temp[[2]],temp[[3]]};,
		If[i==2,
			opticOrientL1G[[j]]={temp[[1]],Sign[temp[[2]]] Sqrt[1-temp[[1]]^2-temp[[3]]^2],temp[[3]]};,
			If[i==3,opticOrientL1G[[j]]={temp[[1]],temp[[2]],Sign[temp[[3]]] Sqrt[1-temp[[1]]^2-temp[[2]]^2]};,
							opticOrientL1G[[j]]={0,0,0};]]],
		{j,nOpticsL1}];

Do[
	If[Abs[opticOrientL1G[[i]].opticOrientL1G[[i]]-1]> 10^-7, Print["error"],],
	{i,nOpticsL1}];

BS wedge angle (deg) used in Zemax D0902216-x010 -- an average value for all BS optics:

VectorAngle[opticOrientL1G[[4]],-opticOrientL1G[[5]]] 180/Pi

Correct for the actual SN002 wedge angle of 0.070 deg:

opticOrientL1G[[5]]=-RotationMatrix3D[.070 Pi/180,0,0].opticOrientL1G[[4]]

tableHead={"Xg","Yg","Zg","Ug","Vg","Wg"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosL1G,opticOrientL1G}]],6],TableHeadings->{opticLabelL1,tableHead}]]

Tables

nTablesL1=11;
tableLabelL1={"LHAM1","LHAM2","LHAM3","LHAM4","LHAM5","LHAM6","LBSC1","LBSC2","LBSC3","LBSC4","LBSC5"};

tablePosL1G={{-22692,0,0},
{-20122,0,0},
	{-3831,0,0},
	{0,-3831,0},
	{0,-20122,0},
	{0,-22692,0},
	{0,4580,0},
{0,0,0},
{4580,0,0},
{4000000,0,0},
{0,4000000,0}};

tableHead={"x_global","y_global","z_global"};
Print[TableForm[tablePosL1G,TableHeadings->{tableLabelL1,tableHead}]]

Chambers

Chamber center positions, in global coordinates, are listed in D0902216-v6

chambersL1={{"LBSC1", 0.0, 4580.0, 0.0},
{"LBSC2", 0.0 ,0.0, 0.0},
{"LBSC3", 4580.0 ,0.0 ,0.0},
{"LBSC4", 4000000.0, 0.0 ,0.0},
{"LBSC5", 0.0 ,4000000.0 ,0.0},
{"LHAM1",-22692.0 ,0.0 ,0.0},
{"LHAM2",-20122.0 ,0.0 ,0.0},
{"LHAM3",-3831.0 ,0.0 ,0.0},
{"LHAM4", 0.0,-3831.0 ,0.0},
{"LHAM5", 0.0,-20122.0, 0.0},
{"LHAM6", 0.0,-22692.0 ,0.0}};
nChambersL1=Length[chambersL1];
nBSCchambersL1=5;
nHAMchambersL1=6;

tableHead={"x_global","y_global","z_global"};
Print[TableForm[chambersL1[[All,2;;4]],TableHeadings->{chambersL1[[All,1]],tableHead}]]

H1 and L1 Differences

tableHead={"Xg","Yg","Zg","Ug","Vg","Wg"};
Print[TableForm[Partition[Flatten[Transpose[{(opticPosL1G-opticPosH1G),(opticOrientL1G-opticOrientH1G)}]],6],TableHeadings->{opticLabelL1,tableHead}]]

Just a check; In global coordinates we expect that H1 is quite similar to L1. However since PR2, PR3, SR2 and SR3 are vertical in the local (gravity) frame, the vertical component of their surface normal vectors (Wg) should be different. Moreover the differences should be the same for PR2 & SR3, as well as for SR2 & SR3. This is the case above.
As a consequence Wg will be different for PRM and SRM as well. 
The vertical positions of PRM, PR2, SRM and SR2 are also different, as a consequence of the pitch angle difference. 
Yaw angles should all be very similar ... and they are. The largest difference is 11 microrad.

... Local Coordinates

IAM @ LHO

coordinates of the Initial Alignment Monuments (IAM) for aLIGO are given in D1100291-v4

IAMLabellho={"BTVE-1","BTVE-5","IAM-1","IAM-2","IAM-3","IAM-4","IAM-5","IAM-6","IAM-7","IAM-8","IAM-9","IAM-10","IAM-11","IAM-12","PSI-1","PSI-2","PSI-3","PSI-4","PSI-5","PSI-6","PSI-7","PSI-8","PSI-9","PSI-10","PSI-11","PSI-12","LV1","LV2","LV3","LV4","LV5","LV6","LV7","LV8","LV9","LV10","LV11","LV12","LV13","LV14","LV15","LV16","LV17","LV18","LV19","LV20","LV21","LV22","LV23","LV24","LV25","LV26"};

IAMPosLlho={{0.0,46000.0},{46000.0,0.0},{2362.3,-3251.2},{11543.0,-3251.2},{213360.0,-3251.2},{2362.3,212.9},{11543.1,-200.0},{-3251.2 ,2362.2},{-200.0 ,2362.2},{11543.0,9060.0},{-3251.2 ,11428.0},{200.0,11428.0},{9163.1,11428.0},{-3251.2, 213360.0},{2362.3,44643.1},{9219.6,31601.7},{-2362.2 ,9219.6},{-22382.7 ,2362.2},{-22382.7 ,0.0},{2362.2,2362.2},{0.0,-22382.7},{2362.1,-22382.7},{2362.2,-2362.2},{9219.6,-2362.2},{31601.1,9219.6},{44642.6,2362.2},{-2132.9 ,11428.0},{-2133.6, 2362.2},{-2131.6, 38158.1},{NaN,NaN},{-2133.6,-1930.7},{11543.0,-1930.7},{38155.0,-1930.7},{NaN,NaN},{11543.0,11428.0},{27340.1,11428.0},{11543.0,27306.3},{-2132.2, 25171.9},{-2131.9 ,31415.1},{1375.2,-1930.7},{31426.7,-1930.7},{33967.1,-1930.7},{200.0,38158.1},{0.0,38158.1},{-200.0 ,38158.1},{-2133.6,-3830.7},{-2133.6,-20122.0},{-2133.6,-22692.0},{-3831.0,-3050.7},{-20122.0,-3050.7},{-22692.0,-3050.7},{-2133.6,-3050.7}};

tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLlho,TableHeadings->{IAMLabellho,tableHead}]]

data=Transpose[Partition[Join[IAMLabellho,IAMPosLlho[[All,1]],IAMPosLlho[[All,2]]],Length[IAMLabellho]]];
labels=Text[#[[1]],1.5 #[[{2,3}]]]&/@data;

dataPlot=ListPlot[IAMPosLlho,PlotStyle->PointSize->Large];
Show[dataPlot,Graphics[{Red,labels}],PlotRange->{{-30000,60000},{-30000,60000}},AspectRatio->1]
Show[dataPlot,Graphics[{Red,labels}],PlotRange->{{-30000,5000},{-30000,5000}},AspectRatio->1]

TS1 @ LHO

TS#1 monuments are in local coordinates, i.e. center of TS1 is (0,0)

IAMlhoTS1={{"TS1-1",-200.0, 5133.0},
{"TS1-2", 0.0, 5133.0},
{"TS1-3", 200.0, 5133.0},
{"TS1-4",-200.0,-7570.0},
{"TS1-5", 0.0,-7570.0},
{"TS1-6", 200.0,-7570.0},
{"TS1-10", 0.0 ,0.0},
{"TS1-11",-7289.0 ,200.0},
{"TS1-12",-7289.0, 0.0},
{"TS1-13",-7289.0,-200.0},
{"TS1-15", 2872.0, 200.0},
{"TS1-16", 2872.0, 0.0},
{"TS1-17", 2872.0,-200.0}};

IAMLabellhoTS1=Transpose[IAMlhoTS1][[1]];
IAMPosLlhoTS1=IAMlhoTS1[[All,2;;3]];

tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLlhoTS1,TableHeadings->{IAMLabellhoTS1,tableHead}]]

TS2 @ LHO

TS#2 monuments are in local coordinates, i.e. center of TS2 is (0,0)

IAMlhoTS2={{"TS2-1",-200.0, 5133.0},
{"TS2-2", 0.0, 5133.0},
{"TS2-3", 200.0, 5133.0},
{"TS2-4",-200.0,-7570.0},
{"TS2-5", 0.0,-7570.0},
{"TS2-6", 200.0,-7570.0},
{"TS2-7",-200.0, 2800.0},
{"TS2-8", 3327.3, 2800.0},
{"TS2-9", 3327.3,-326.1},
{"TS2-10", 0.0 ,0.0},
{"TS2-11",-2872.0 ,200.0},
{"TS2-12",-2872.0, 0.0},
{"TS2-13",-2872.0,-200.0},
{"TS2-14", 200.0 ,7570.0},
{"TS2-15", 7285.0, 200.0},
{"TS2-16", 7285.0 ,0.0},
{"TS2-17", 7285.0,-200.0}};

IAMLabellhoTS2=Transpose[IAMlhoTS2][[1]];
IAMPosLlhoTS2=IAMlhoTS2[[All,2;;3]];

tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLlhoTS2,TableHeadings->{IAMLabellhoTS2,tableHead}]]

H1

Optics

opticPosH1L=Table[0,{nOpticsH1}];
opticOrientH1L=opticPosH1L;

Do[
	opticPosH1L[[i]]=opticPosH1G[[i]].Rhc //N;
	opticOrientH1L[[i]] = opticOrientH1G[[i]].Rhc //N;
	If[Abs[opticOrientH1L[[i]].opticOrientH1L[[i]]-1]> 10^-15, Print["error"],],
	{i,nOpticsH1-2}];

opticPosH1L[[nOpticsH1-1]]=opticPosH1G[[nOpticsH1-1]].Rhxe //N;
opticOrientH1L[[nOpticsH1-1]] = opticOrientH1G[[nOpticsH1-1]].Rhxe //N;
If[Abs[opticOrientH1L[[nOpticsH1-1]].opticOrientH1L[[nOpticsH1-1]]-1]> 10^-15, Print["error"],];

opticPosH1L[[nOpticsH1]]=opticPosH1G[[nOpticsH1]].Rhye //N;
opticOrientH1L[[nOpticsH1]] = opticOrientH1G[[nOpticsH1]].Rhye //N;
If[Abs[opticOrientH1L[[nOpticsH1]].opticOrientH1L[[nOpticsH1]]-1]> 10^-15, Print["error"],];

tableHead={"Xl","Yl","Zl","Ul","Vl","Wl"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosH1L,opticOrientH1L}]],6],TableHeadings->{opticLabelH1,tableHead}]]

Tables

Convert the global coordinates of the optics tables into the local coordinate system:

tablePosH1L=Table[0,{nTablesL1}];
Do[
	tablePosH1L[[i]]=tablePosH1G[[i]].Rhc //N,
	{i,nTables}];
tableHead={"x_local","y_local","z_local"};
Print[TableForm[tablePosH1L,TableHeadings->{tableLabelH1,tableHead}]]

H2

opticPosH2L=Table[0,{nOpticsH2}];
opticOrientH2L=opticPosH2L;

Do[
	opticPosH2L[[i]]=opticPosH2G[[i]].Rhc //N;
	opticOrientH2L[[i]] = opticOrientH2G[[i]].Rhc //N;
	If[Abs[opticOrientH2L[[i]].opticOrientH2L[[i]]-1]> 10^-15, Print["error"],],
	{i,nOpticsH2}];

tableHead={"Xl","Yl","Zl","Ul","Vl","Wl"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosH2L,opticOrientH2L}]],6],TableHeadings->{opticLabelH2,tableHead}]]

ArcTan[opticOrientH2L[[1,1]],opticOrientH2L[[1,2]]]

ArcTan[opticOrientH2L[[1,1]],opticOrientH2L[[1,2]]]*180/Pi

(45.3397-45.3373)*Pi/180*10^6

(180-179.9775)*Pi/180*10^6

DMS[ArcTan[opticOrientH2L[[1,1]],opticOrientH2L[[1,2]]]]

ArcTan[opticOrientH2L[[2,2]],opticOrientH2L[[2,3]]] 180/Pi

DMS[ArcTan[opticOrientH2L[[2,2]],opticOrientH2L[[2,3]]]]

IAM @ LLO

coordinates of the Initial Alignment Monuments (IAM) for aLIGO are given in D980499-C and E1100374-v4

IAMllo={{"IAM-L1",-22382.3,-1854.2},{"IAM-L2",-1854.2,-1854.2},{"IAM-L3",-1854.2,-22089.6},{"IAM-L4", 2362.2,-1854.2},{"IAM-L5", 38154.0,-1854.2},{"IAM-L6", 220000.0,-1854.2},{"IAM-L7",-1854.2 ,2362.2},{"IAM-L8",-1854.2 ,38154.0},{"IAM-L9",-1854.2 ,220000.0},{"L1 IAM 380", 0.0 ,NaN},{"L1 IAM 379",-1858.0,-26231.2},{"L1 IAM 378",-1858.0,-2245.5},{"L1 IAM 377",-1858.0,-1845.1},{"L1 IAM 381", 11591.0,-1845.1},{"_87", 45990.8,-1845.1},{"L1 IAM 382",-22283.5,-2245.5},{"L1 IAM 376",-1858.0 ,12604.4},{"IAM 92",-1858.0 ,45962.2},{"AM 405",-1858.0,-22503.2},{"AM 404",-1858.0,-19941.0},{"AM 403",-1858.0,-3650.0},{"AM 400",-3831.1,-2245.5},{"AM 401",-20122.1,-2245.5},{"AM 402",-22692.0,-2245.5},{"IAM 333", 6526.5,2037.4},{"IAM 398", 6726.5,2037.4},{"IAM 332", 6926.5,2037.4},{"IAM 329", 14019.5,6968.4},{"IAM 393", 14019.5,7168.4},{"IAM 337", 14019.5,7368.4},{"IAM 334", 6926.5,14739.4},{"IAM 391", 6726.5,14739.4},{"IAM 349", 6526.5,14739.4},{"IAM 389", 3859.5,7368.4},{"IAM 397", 3859.5,7168.4},{"IAM 400", 3859.5,6968.4},{"IAM 394", 6726.5,7168.4},{"IAM 342", 9433.0,-1429.1},{"IAM 396", 9633.0,-1429.1},{"IAM 350", 9833.0,-1429.1},{"IAM 346", 17203.0,3503.9},{"IAM 392", 17203.0,3703.9},{"IAM 338", 17203.0,3903.9},{"IAM 327", 9833.0,10992.9},{"IAM 395", 9633.0,10992.9},{"IAM 385", 9433.0,10992.9},{"IAM 330", 6761.0,3903.9},{"IAM 390", 6761.0,3703.9},{"IAM 326", 6761.0,3503.9},{"IAM 399", 9633.0,3703.9}};

IAMLabelllo=Transpose[IAMllo][[1]];
IAMPosLllo=IAMllo[[All,2;;3]];
tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLllo,TableHeadings->{IAMLabelllo,tableHead}]]

labels=Text[#[[1]],1.1 #[[{2,3}]]]&/@Drop[IAMllo,{10}];
dataPlot=ListPlot[IAMPosLllo,PlotStyle->PointSize->Large];
Show[dataPlot,Graphics[{Red,labels}],PlotRange->{{-30000,60000},{-30000,60000}},AspectRatio->1]

labelsTS1=Text[#[[1]],1.08 #[[{2,3}]]]&/@IAMllo[[25;;37]];
labelsTS2=Text[#[[1]],1.08 #[[{2,3}]]]&/@IAMllo[[38;;50]];
dataPlot=ListPlot[IAMPosLllo,PlotStyle->PointSize->Large];
Show[dataPlot,Graphics[{Red,labelsTS1}],Graphics[{Green,labelsTS2}],PlotRange->{{0,20000},{-5000,20000}},AspectRatio->1]

Subtract center coordinates from all Test Stand #1 monuments, so that all calculations are done in TS#1 local coordinates

IAMlloTS1=Table["",{13},{3}];
Do[IAMlloTS1[[i-24,1]]=IAMllo[[i,1]];IAMlloTS1[[i-24,2;;3]]=IAMllo[[i,2;;3]]-IAMllo[[37,2;;3]],{i,25,37}];
IAMLabellloTS1=Transpose[IAMlloTS1][[1]];
IAMPosLlloTS1=IAMlloTS1[[All,2;;3]];
tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLlloTS1,TableHeadings->{IAMLabellloTS1,tableHead}]]

Subtract center coordinates from all Test Stand #2 monuments, so that all calculations are done in TS#2 local coordinates

IAMlloTS2=Table["",{13},{3}];
Do[IAMlloTS2[[i-37,1]]=IAMllo[[i,1]];IAMlloTS2[[i-37,2;;3]]=IAMllo[[i,2;;3]]-IAMllo[[50,2;;3]],{i,38,50}];
IAMLabellloTS2=Transpose[IAMlloTS2][[1]];
IAMPosLlloTS2=IAMlloTS2[[All,2;;3]];
tableHead={"Xl","Yl"};
Print[TableForm[IAMPosLlloTS2,TableHeadings->{IAMLabellloTS2,tableHead}]]

L1

Optics

opticPosL1L=Table[0,{nOpticsL1}];
opticOrientL1L=opticPosL1L;

Do[
	opticPosL1L[[i]]=opticPosL1G[[i]].Rlc //N;
	opticOrientL1L[[i]] = opticOrientL1G[[i]].Rlc //N;
	If[Abs[opticOrientL1L[[i]].opticOrientL1L[[i]]-1]> 10^-15, Print["error"],],
	{i,nOpticsL1-2}];

opticPosL1L[[nOpticsL1-1]]=opticPosL1G[[nOpticsL1-1]].Rlxe //N;
opticOrientL1L[[nOpticsL1-1]] = opticOrientL1G[[nOpticsL1-1]].Rlxe //N;
If[Abs[opticOrientL1L[[nOpticsL1-1]].opticOrientL1L[[nOpticsL1-1]]-1]> 10^-15, Print["error"],];

opticPosL1L[[nOpticsL1]]=opticPosL1G[[nOpticsL1]].Rlye //N;
opticOrientL1L[[nOpticsL1]] = opticOrientL1G[[nOpticsL1]].Rlye //N;
If[Abs[opticOrientL1L[[nOpticsL1]].opticOrientL1L[[nOpticsL1]]-1]> 10^-15, Print["error"],];

tableHead={"Xl","Yl","Zl","Ul","Vl","Wl"};
Print[TableForm[Partition[Flatten[Transpose[{opticPosL1L,opticOrientL1L}]],6],TableHeadings->{opticLabelL1,tableHead}]]

Tables

Convert the global coordinates of the optics tables into the local coordinate system:

tablePosL1L=Table[0,{nTablesL1}];
Do[
	tablePosL1L[[i]]=tablePosL1G[[i]].Rlc //N,
	{i,nTablesL1}];
tableHead={"x_local","y_local","z_local"};
Print[TableForm[tablePosL1L,TableHeadings->{tableLabelL1,tableHead}]]

Chambers

.. Optic Pitch & Yaw Angles

... H1

The  pitch & yaw angles are determined for the optics

Uncorrected from Zemax

opticPitchRadianH1=Table[0,{nOpticsH1}];
opticPitchDegreeH1=opticPitchRadianH1;
opticPitchDMSH1=opticPitchRadianH1;
opticPitchDirectionH1=opticPitchRadianH1;
Do[
opticPitchRadianH1[[i]]=VectorAngle[opticOrientH1L[[i]],{opticOrientH1L[[i,1]],opticOrientH1L[[i,2]],0}];
If[opticOrientH1L[[i,3]]>0,opticPitchDirectionH1[[i]]="up",
If[opticOrientH1L[[i,3]]<0,opticPitchDirectionH1[[i]]="down",
opticPitchDirectionH1[[i]]=""]];
opticPitchDegreeH1[[i]]=opticPitchRadianH1[[i]] 180/Pi;
opticPitchDMSH1[[i]]=DMS[opticPitchRadianH1[[i]]],
{i,nOpticsH1}];

tableHead={"Ul","Vl","Wl","Pitch","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientH1L,opticPitchDirectionH1,opticPitchRadianH1,opticPitchDegreeH1,opticPitchDMSH1}],3]],9],TableHeadings->{opticLabelH1,tableHead}]]

N.B.: The local coordinate frame pitch angles of PR2 HR, PR3 HR, SR2 HR and SR3 HR should all be zero. The non-zero, local coordinate frame, pitch values for SR2 and SR3 HR reflect an error in the Zemax model; The pitch angle of these optics were set in the global coordinate system without taking into account the yaw component of the normal vector of these optics. This error is particularly accute for the SR2 optic which has the largest yaw component. When the yaw components of the SR2 and SR3 optics are set to zero, the residual error of the pitch in local coordinates is nearly zero, as shown below.

opticOrientH1G[[6]]

opticOrientH1G[[6]].Rhc

d={0,opticOrientH1G[[6,2]],opticOrientH1G[[6,3]]};
d.Rhc

Corrected from Zemax

calc

({{opticOrientH1L[[2,3]]=0;}, {opticOrientH1L[[3,3]]=0;
opticOrientH1L[[6,3]]=0;
opticOrientH1L[[7,3]]=0;}})

ensure that the normal vectors have unit length

Do[
	temp=opticOrientH1L[[j]];
	i=Flatten[Position[Abs[temp],Max[Abs[temp]]]][[1]];
	If[i==1,
		opticOrientH1L[[j]]={Sign[temp[[1]]] Sqrt[1-temp[[2]]^2-temp[[3]]^2],temp[[2]],temp[[3]]};,
		If[i==2,
			opticOrientH1L[[j]]={temp[[1]],Sign[temp[[2]]] Sqrt[1-temp[[1]]^2-temp[[3]]^2],temp[[3]]};,
			If[i==3,opticOrientH1L[[j]]={temp[[1]],temp[[2]],Sign[temp[[3]]] Sqrt[1-temp[[1]]^2-temp[[2]]^2]};,
							opticOrientH1L[[j]]={0,0,0};]]],
		{j,nOpticsH1}];
Do[
	If[Abs[opticOrientH1L[[i]].opticOrientH1L[[i]]-1]> 10^-7, Print["error"],],
	{i,nOpticsH1}];

opticPitchRadianH1=Table[0,{nOpticsH1}];
opticPitchDegreeH1=opticPitchRadianH1;
opticPitchDMSH1=opticPitchRadianH1;
opticPitchDirectionH1=opticPitchRadianH1;
Do[
opticPitchRadianH1[[i]]=VectorAngle[opticOrientH1L[[i]],{opticOrientH1L[[i,1]],opticOrientH1L[[i,2]],0}];
If[opticOrientH1L[[i,3]]>0,opticPitchDirectionH1[[i]]="up",
If[opticOrientH1L[[i,3]]<0,opticPitchDirectionH1[[i]]="down",
opticPitchDirectionH1[[i]]=""]];
opticPitchDegreeH1[[i]]=opticPitchRadianH1[[i]] 180/Pi;
opticPitchDMSH1[[i]]=DMS[opticPitchRadianH1[[i]]],
{i,nOpticsH1}];

opticYawRadianH1=Table[0,{nOpticsH1}];
opticYawDegreeH1=opticPitchRadianH1;
opticYawDMSH1=opticPitchRadianH1;
opticYawDirectionH1=opticPitchRadianH1;
Do[
opticYawRadianH1[[i]]=VectorAngle[opticOrientH1L[[i]],{opticOrientH1L[[i,1]],0,opticOrientH1L[[i,3]]}];
If[opticOrientH1L[[i,2]]>0,opticYawDirectionH1[[i]]="left",
If[opticOrientH1L[[i,2]]<0,opticYawDirectionH1[[i]]="right",
opticYawDirectionH1[[i]]=""]];
opticYawDegreeH1[[i]]=opticYawRadianH1[[i]] 180/Pi;
opticYawDMSH1[[i]]=DMS[opticYawRadianH1[[i]]],
{i,nOpticsH1}];

pitch table

tableHead={"Ul","Vl","Wl","Pitch","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientH1L,opticPitchDirectionH1,opticPitchRadianH1,opticPitchDegreeH1,opticPitchDMSH1}],3]],9],TableHeadings->{opticLabelH1,tableHead}]]

yaw table

tableHead={"Ul","Vl","Wl","Yaw","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientH1L,opticYawDirectionH1,opticYawRadianH1,opticYawDegreeH1,opticYawDMSH1}],3]],9],TableHeadings->{opticLabelH1,tableHead}]]

... H2

The Euler pitch angle is determined for hanging the optics on the bench
up = indicates that the outward surface normal vector of the HR face of the optic has a component in the positive, local vertical direction

Clear[Pitch,Yaw,s];
opticPrH2=Table[0,{nOpticsH2}];
opticPH2=opticPrH2;
opticPdH2=opticPrH2;
Do[
	s=FindMinimum[Abs[Sqrt[Rotate3D[{0,0,1},0,Pitch,Yaw].opticOrientH2L[[i]]]-1],{Yaw,1.5708},{Pitch,1.5708}];
	If[opticOrientH2L[[i,3]]>0,opticPdH2[[i]]="up",
		If[opticOrientH2L[[i,3]]<0,opticPdH2[[i]]="down",
				opticPdH2[[i]]=""]];
  opticPrH2[[i]]=(Pitch-pi/2)/.s[[2]];
  opticPH2[[i]]=DMS[(Pitch-pi/2)/.s[[2]]],
	{i,nOpticsH2}];

tableHead={"Ul","Vl","Wl","Pitch","(rad)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientH2L,opticPdH2,opticPrH2,opticPH2}],3]],8],TableHeadings->{opticLabelH2,tableHead}]]

... L1

The  pitch angle is determined for hanging the optics on the bench:

Uncorrected from Zemax

opticPitchRadianL1=Table[0,{nOpticsL1}];
opticPitchDegreeL1=opticPitchRadianL1;
opticPitchDMSL1=opticPitchRadianL1;
opticPitchDirectionL1=opticPitchRadianL1;
Do[
opticPitchRadianL1[[i]]=VectorAngle[opticOrientL1L[[i]],{opticOrientL1L[[i,1]],opticOrientL1L[[i,2]],0}];
If[opticOrientL1L[[i,3]]>0,opticPitchDirectionL1[[i]]="up",
If[opticOrientL1L[[i,3]]<0,opticPitchDirectionL1[[i]]="down",
opticPitchDirectionL1[[i]]=""]];
opticPitchDegreeL1[[i]]=opticPitchRadianL1[[i]] 180/Pi;
opticPitchDMSL1[[i]]=DMS[opticPitchRadianL1[[i]]],
{i,nOpticsL1}];

tableHead={"Ul","Vl","Wl","Pitch","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientL1L,opticPitchDirectionL1,opticPitchRadianL1,opticPitchDegreeL1,opticPitchDMSL1}],3]],9],TableHeadings->{opticLabelL1,tableHead}]]

N.B.: The local coordinate frame pitch angles of PR2 HR, PR3 HR, SR2 HR and SR3 HR should all be zero. The non-zero, local coordinate frame, pitch values for these optics reflect a slight error in the Zemax model; The pitch angle of these optics were set in the global coordinate system without taking into account the yaw component of the normal vector of these optics. So, we’ll set the pitch angle for these optics to zero here -- which is an approximate correction:

Corrected from Zemax

calc

({{opticOrientL1L[[2,3]]=0;}, {opticOrientL1L[[3,3]]=0;
opticOrientL1L[[6,3]]=0;
opticOrientL1L[[7,3]]=0;}})

ensure that the normal vectors have unit length

Do[
	temp=opticOrientL1L[[j]];
	i=Flatten[Position[Abs[temp],Max[Abs[temp]]]][[1]];
	If[i==1,
		opticOrientL1L[[j]]={Sign[temp[[1]]] Sqrt[1-temp[[2]]^2-temp[[3]]^2],temp[[2]],temp[[3]]};,
		If[i==2,
			opticOrientL1L[[j]]={temp[[1]],Sign[temp[[2]]] Sqrt[1-temp[[1]]^2-temp[[3]]^2],temp[[3]]};,
			If[i==3,opticOrientL1L[[j]]={temp[[1]],temp[[2]],Sign[temp[[3]]] Sqrt[1-temp[[1]]^2-temp[[2]]^2]};,
							opticOrientL1L[[j]]={0,0,0};]]],
		{j,nOpticsL1}];
Do[
	If[Abs[opticOrientL1L[[i]].opticOrientL1L[[i]]-1]> 10^-7, Print["error"],],
	{i,nOpticsL1}];

opticPitchRadianL1=Table[0,{nOpticsL1}];
opticPitchDegreeL1=opticPitchRadianL1;
opticPitchDMSL1=opticPitchRadianL1;
opticPitchDirectionL1=opticPitchRadianL1;
Do[
opticPitchRadianL1[[i]]=VectorAngle[opticOrientL1L[[i]],{opticOrientL1L[[i,1]],opticOrientL1L[[i,2]],0}];
If[opticOrientL1L[[i,3]]>0,opticPitchDirectionL1[[i]]="up",
If[opticOrientL1L[[i,3]]<0,opticPitchDirectionL1[[i]]="down",
opticPitchDirectionL1[[i]]=""]];
opticPitchDegreeL1[[i]]=opticPitchRadianL1[[i]] 180/Pi;
opticPitchDMSL1[[i]]=DMS[opticPitchRadianL1[[i]]],
{i,nOpticsL1}];

opticYawRadianL1=Table[0,{nOpticsL1}];
opticYawDegreeL1=opticPitchRadianL1;
opticYawDMSL1=opticPitchRadianL1;
opticYawDirectionL1=opticPitchRadianL1;
Do[
opticYawRadianL1[[i]]=VectorAngle[opticOrientL1L[[i]],{opticOrientL1L[[i,1]],0,opticOrientL1L[[i,3]]}];
If[opticOrientL1L[[i,2]]>0,opticYawDirectionL1[[i]]="left",
If[opticOrientL1L[[i,2]]<0,opticYawDirectionL1[[i]]="right",
opticYawDirectionL1[[i]]=""]];
opticYawDegreeL1[[i]]=opticYawRadianL1[[i]] 180/Pi;
opticYawDMSL1[[i]]=DMS[opticYawRadianL1[[i]]],
{i,nOpticsL1}];

pitch table

tableHead={"Ul","Vl","Wl","Pitch","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientL1L,opticPitchDirectionL1,opticPitchRadianL1,opticPitchDegreeL1,opticPitchDMSL1}],3]],9],TableHeadings->{opticLabelL1,tableHead}]]

yaw table

tableHead={"Ul","Vl","Wl","Yaw","(rad)","(deg)","(deg)","(min)","(sec)"};
Print[TableForm[Partition[Flatten[N[Transpose[{opticOrientL1L,opticYawDirectionL1,opticYawRadianL1,opticYawDegreeL1,opticYawDMSL1}],3]],9],TableHeadings->{opticLabelL1,tableHead}]]

.. Intialization

L1

nAlignOpticsL1=2*nOpticsL1;
theoYawL1=Table[0,{nAlignOpticsL1}];
theoPitchL1=theoYawL1;
theoDistanceL1=theoYawL1;
theoOrientL1=Table[0,{nAlignOpticsL1},{3}];
theoPosL1=theoOrientL1;
iIAMOptSqL1=Table[1,{nAlignOpticsL1}];
iIAMOptSqRefL1=iIAMOptSqL1;
iIAMtheoL1=iIAMOptSqL1;
iIAMtheoRefL1=iIAMOptSqL1;
LTHRL1=Table["",{nAlignOpticsL1}];
LTHPL1=LTHRL1;

formatAlignTable[il_,ih_]:=Grid[Flatten[{{{"Alignment",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Transit Square",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"Total Station",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"PLX",SpanFromLeft},\
{"Name","Local Coordinates\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Distance\n(mm)","Yaw",SpanFromLeft,SpanFromLeft,"Pitch",SpanFromLeft,SpanFromLeft,"LTHR","LTHP"},{SpanFromAbove,"Xl","Yl","Zl","Name","Xl","Yl","Name","Xl","Yl","Name","Xl","Yl","Zl","Name","Xl","Yl",SpanFromAbove,"deg","min","sec","deg","min","sec",SpanFromAbove,SpanFromAbove}},\
Table[{alignLabelL1[[i]],NumberForm[alignOpticPosL1L[[i,1]],{10,1}],NumberForm[alignOpticPosL1L[[i,2]],{10,1}],NumberForm[alignOpticPosL1L[[i,3]],{10,1}],\
If[iIAMOptSqL1[[i]]!="NA",IAMlloTS1[[iIAMOptSqL1[[i]],1]],"NA"],If[iIAMOptSqL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMOptSqL1[[i]],2]],{10,1}],""],If[iIAMOptSqL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMOptSqL1[[i]],3]],{10,1}],""],\
If[iIAMOptSqRefL1[[i]]!="NA",IAMlloTS1[[iIAMOptSqRefL1[[i]],1]],"NA"],If[iIAMOptSqRefL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMOptSqRefL1[[i]],2]],{10,1}],""],If[iIAMOptSqRefL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMOptSqRefL1[[i]],3]],{10,1}],""],\
IAMlloTS1[[iIAMtheoL1[[i]],1]],NumberForm[IAMlloTS1[[iIAMtheoL1[[i]],2]],{10,1}],NumberForm[IAMlloTS1[[iIAMtheoL1[[i]],3]],{10,1}],NumberForm[theoPosL1[[i,3]],{10,1}],\
If[iIAMtheoRefL1[[i]]!="NA",IAMlloTS1[[iIAMtheoRefL1[[i]],1]],"NA"],If[iIAMtheoRefL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMtheoRefL1[[i]],2]],{10,1}],""],If[iIAMtheoRefL1[[i]]!="NA",NumberForm[IAMlloTS1[[iIAMtheoRefL1[[i]],3]],{10,1}],""],\
NumberForm[theoDistanceL1[[i]],{10,1}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[3]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[3]],{10,0}],\
LTHRL1[[i]],LTHPL1[[i]]},{i,il,ih}]},1],Frame->All];

formatIAMAlignTable[il_,ih_]:=Grid[Flatten[{{{"Alignment",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Transit Square",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"Total Station",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"PLX",SpanFromLeft},\
{"Name","Local Coordinates\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Distance\n(mm)","Yaw",SpanFromLeft,SpanFromLeft,"Pitch",SpanFromLeft,SpanFromLeft,"LTHR","LTHP"},{SpanFromAbove,"Xl","Yl","Zl","Name","Xl","Yl","Name","Xl","Yl","Name","Xl","Yl","Zl","Name","Xl","Yl",SpanFromAbove,"deg","min","sec","deg","min","sec",SpanFromAbove,SpanFromAbove}},\
Table[{alignLabelL1[[i]],NumberForm[alignOpticPosL1L[[i,1]],{10,1}],NumberForm[alignOpticPosL1L[[i,2]],{10,1}],NumberForm[alignOpticPosL1L[[i,3]],{10,1}],\
If[iIAMOptSqL1[[i]]!="NA",IAMllo[[iIAMOptSqL1[[i]],1]],"NA"],If[iIAMOptSqL1[[i]]!="NA",NumberForm[IAMllo[[iIAMOptSqL1[[i]],2]],{10,1}],""],If[iIAMOptSqL1[[i]]!="NA",NumberForm[IAMllo[[iIAMOptSqL1[[i]],3]],{10,1}],""],\
If[iIAMOptSqRefL1[[i]]!="NA",IAMllo[[iIAMOptSqRefL1[[i]],1]],"NA"],If[iIAMOptSqRefL1[[i]]!="NA",NumberForm[IAMllo[[iIAMOptSqRefL1[[i]],2]],{10,1}],""],If[iIAMOptSqRefL1[[i]]!="NA",NumberForm[IAMllo[[iIAMOptSqRefL1[[i]],3]],{10,1}],""],\
IAMllo[[iIAMtheoL1[[i]],1]],NumberForm[IAMllo[[iIAMtheoL1[[i]],2]],{10,1}],NumberForm[IAMllo[[iIAMtheoL1[[i]],3]],{10,1}],NumberForm[theoPosL1[[i,3]],{10,1}],\
If[iIAMtheoRefL1[[i]]!="NA",IAMllo[[iIAMtheoRefL1[[i]],1]],"NA"],If[iIAMtheoRefL1[[i]]!="NA",NumberForm[IAMllo[[iIAMtheoRefL1[[i]],2]],{10,1}],""],If[iIAMtheoRefL1[[i]]!="NA",NumberForm[IAMllo[[iIAMtheoRefL1[[i]],3]],{10,1}],""],\
NumberForm[theoDistanceL1[[i]],{10,1}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoYawL1[[i]] Pi/180][[3]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoPitchL1[[i]] Pi/180][[3]],{10,0}],\
LTHRL1[[i]],LTHPL1[[i]]},{i,il,ih}]},1],Frame->All];

H1

nAlignOpticsH1=2*nOpticsH1;
theoYawH1=Table[0,{nAlignOpticsH1}];
theoPitchH1=theoYawH1;
theoDistanceH1=theoYawH1;
theoOrientH1=Table[0,{nAlignOpticsH1},{3}];
theoPosH1=theoOrientH1;
iIAMOptSqH1=Table[1,{nAlignOpticsH1}];
iIAMOptSqRefH1=iIAMOptSqH1;
iIAMtheoH1=iIAMOptSqH1;
iIAMtheoRefH1=iIAMOptSqH1;
LTHRH1=Table["",{nAlignOpticsH1}];
LTHPH1=LTHRH1;

formatLHOAlignTable[il_,ih_]:=Grid[Flatten[{{{"Alignment",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Transit Square",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"Total Station",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"PLX",SpanFromLeft},\
{"Name","Local Coordinates\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Distance\n(mm)","Yaw",SpanFromLeft,SpanFromLeft,"Pitch",SpanFromLeft,SpanFromLeft,"LTHR","LTHP"},{SpanFromAbove,"Xl","Yl","Zl","Name","Xl","Yl","Name","Xl","Yl","Name","Xl","Yl","Zl","Name","Xl","Yl",SpanFromAbove,"deg","min","sec","deg","min","sec",SpanFromAbove,SpanFromAbove}},\
Table[{alignLabelH1[[i]],NumberForm[alignOpticPosH1L[[i,1]],{10,1}],NumberForm[alignOpticPosH1L[[i,2]],{10,1}],NumberForm[alignOpticPosH1L[[i,3]],{10,1}],\
If[iIAMOptSqH1[[i]]!="NA",IAMlhoTS2[[iIAMOptSqH1[[i]],1]],"NA"],If[iIAMOptSqH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMOptSqH1[[i]],2]],{10,1}],""],If[iIAMOptSqH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMOptSqH1[[i]],3]],{10,1}],""],\
If[iIAMOptSqRefH1[[i]]!="NA",IAMlhoTS2[[iIAMOptSqRefH1[[i]],1]],"NA"],If[iIAMOptSqRefH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMOptSqRefH1[[i]],2]],{10,1}],""],If[iIAMOptSqRefH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMOptSqRefH1[[i]],3]],{10,1}],""],\
IAMlhoTS2[[iIAMtheoH1[[i]],1]],NumberForm[IAMlhoTS2[[iIAMtheoH1[[i]],2]],{10,1}],NumberForm[IAMlhoTS2[[iIAMtheoH1[[i]],3]],{10,1}],NumberForm[theoPosH1[[i,3]],{10,1}],\
If[iIAMtheoRefH1[[i]]!="NA",IAMlhoTS2[[iIAMtheoRefH1[[i]],1]],"NA"],If[iIAMtheoRefH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMtheoRefH1[[i]],2]],{10,1}],""],If[iIAMtheoRefH1[[i]]!="NA",NumberForm[IAMlhoTS2[[iIAMtheoRefH1[[i]],3]],{10,1}],""],\
NumberForm[theoDistanceH1[[i]],{10,1}],NumberForm[DMS[theoYawH1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoYawH1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoYawH1[[i]] Pi/180][[3]],{10,0}],NumberForm[DMS[theoPitchH1[[i]] Pi/180][[1]],{10,0}],NumberForm[DMS[theoPitchH1[[i]] Pi/180][[2]],{10,0}],NumberForm[DMS[theoPitchH1[[i]] Pi/180][[3]],{10,0}],\
LTHRH1[[i]],LTHPH1[[i]]},{i,il,ih}]},1],Frame->All];

.. H1

... Alignment Solution List

Each alignment solution is given as a single row in a table associated with an optic. Some optics require more than one alignment solution. For example, one solution for angular alignment and one for positional alignment. In order to accomplish this the optics list is augmented with additional entries. Not an elegant approach, but workable. Start by alternately listing {x,y,z} and {q,y} solutions, then tweak as needed.

alignLabelH1=Table[0,{2*nOpticsH1}];
alignOpticPosH1L=Table[0,{2*nOpticsH1},{3}];
alignOpticOrientH1L=alignOpticPosH1L;
Do[
j=Floor[(i+1)/2];
alignLabelH1[[i]]=StringJoin[opticLabelH1[[j]],If[EvenQ[i]," q,y"," x,y,z"]];
alignOpticPosH1L[[i]]=opticPosH1L[[j]];
alignOpticOrientH1L[[i]]=opticOrientH1L[[j]];
,{i,1,2*nOpticsH1}]

The BS has 4 cartridge alignment solutions and 2 chamber alignment solutions. Only one of the “BS HR q,y” or “BS AR q,y” solutions is needed; Both are listed just in case one return is weak.

alignLabelH1[[7]]="TS BS&ARellpBaf x,y,z";
alignLabelH1[[8]]="TS BS HR q,y";
alignLabelH1[[9]]="TS BS AR q,y";
alignLabelH1[[10]]="TS BS HRellpBaf x,y,z";
alignOpticPosH1L[[7]]=opticPosH1L[[5]];
alignOpticPosH1L[[8]]=opticPosH1L[[4]];
alignOpticPosH1L[[9]]=opticPosH1L[[5]];
alignOpticPosH1L[[10]]=opticPosH1L[[4]];
alignOpticOrientH1L[[7]]=opticOrientH1L[[5]];
alignOpticOrientH1L[[8]]=opticOrientH1L[[4]];
alignOpticOrientH1L[[9]]=opticOrientH1L[[5]];
alignOpticOrientH1L[[10]]=opticOrientH1L[[4]];

Rotate the BS optic coordinates 90 deg to reflect the fact that TS#1 is rotated relative to LBSC2

Do[alignOpticPosH1L[[i]]=RotationMatrix3D[Pi/2,0,0].alignOpticPosH1L[[i]];alignOpticOrientH1L[[i]]=RotationMatrix3D[Pi/2,0,0].alignOpticOrientH1L[[i]],{i,7,10}]

The BS has 3 chamber alignment solutions.

alignLabelH1=Insert[alignLabelH1,"BS HR&ITMellpBafs x,y,z",11];
alignLabelH1=Insert[alignLabelH1,"BS HR q,y",12];
alignLabelH1=Insert[alignLabelH1,"BS AR q,y",13];
alignOpticPosH1L[[11]]=opticPosH1L[[4]];
alignOpticPosH1L[[12]]=opticPosH1L[[4]];
alignOpticPosH1L[[13]]=opticPosH1L[[5]];
alignOpticOrientH1L[[11]]=opticOrientH1L[[4]];
alignOpticOrientH1L[[12]]=opticOrientH1L[[4]];
alignOpticOrientH1L[[13]]=opticOrientH1L[[5]];

tableHead={"Xl","Yl","Zl","Ul","Vl","Wl"};
Print[TableForm[Partition[Flatten[Transpose[{alignOpticPosH1L,alignOpticOrientH1L}]],6],TableHeadings->{alignLabelH1,tableHead}]]

nAlignsH1=Length[alignLabelH1];

... BS Alignment

Cartridge

The BS is aligned on the cartridge while on Test Stand #2 at LHO.

The BS to be used for H1 is SN 06 which has a wedge angle of 0.076 deg

solution 1

ialign=7;
alignLabelH1[[ialign]]

Rotate the BS optic coordinates 90 deg to reflect the fact that TS#2 is rotated relative to WBSC2

BSARPos=alignOpticPosH1L[[ialign]]

BS wedge angle (deg) used in Zemax. Actual wedge angle for H1 BS-06 is 0.076 deg:

wedge=VectorAngle[alignOpticOrientH1L[[ialign]],-alignOpticOrientH1L[[ialign+1]]] 180/Pi

BSHROrient=alignOpticOrientH1L[[ialign+1]]

BSAROrient=alignOpticOrientH1L[[ialign]]

iIAMOptSqRefH1[[ialign]]=16;
IAMlhoTS2[[iIAMOptSqRefH1[[ialign]]]]

iIAMOptSqH1[[ialign]]=12;
IAMlhoTS2[[iIAMOptSqH1[[ialign]]]]

IAMlhoTS2[[iIAMOptSqH1[[ialign]],2]]

BSARPos[[1]]

Add a monument (TS2-18) along the TS2-11 to TS2-13 line and normal to the BS AR surface:

d=(IAMlhoTS2[[iIAMOptSqH1[[ialign]],2]]-BSARPos[[1]])/BSAROrient[[1]];
IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-18",BSARPos+d BSAROrient}]];
iIAMtheoH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoH1[[ialign]]]]

theoPosH1[[ialign]]=IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;4]]

theoOrientH1[[ialign]]=-BSAROrient

Separation from LAC to BS AR surface (mm):

theoDistanceH1[[ialign]]=Sqrt[(theoPosH1[[ialign]]-BSARPos).(theoPosH1[[ialign]]-BSARPos)]

iIAMtheoRefH1[[ialign]]="NA";

IAMlhoTS2[[iIAMOptSqH1[[ialign]],2;;3]]
IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;3]]

zeroYawReference=IAMlhoTS2[[iIAMOptSqH1[[ialign]],2;;3]]-IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;3]];
theoYawH1[[ialign]]=VectorAngle[theoOrientH1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchH1[[ialign]]=Sign[theoOrientH1[[ialign,3]]]VectorAngle[Join[theoOrientH1[[ialign,1;;2]],{0}],theoOrientH1[[ialign]]] 180/Pi

formatLHOAlignTable[ialign,ialign]

solution 2

ialign=8;
alignLabelH1[[ialign]]

Required beam separation from HR and AR surfaces so as not to get an erroneous laser autocollimator (LAC) reading is 32 mm. The beam divergence of the Newport LDS-vector LAC is 100 urad. Given a wedge angle of 0.070 deg (minimum wedge angle for any BS) and an index of refraction at 670 nm of ~1.456, the separation from the LAC to the BS AR surface must be at least ~9 m :

31/(1.456 (.070 Pi/180) 2-100 10^-6)

31.9/(1.456 (.070 Pi/180) 2)

So place a new TS2-19 monument along the X = 0 line (formed by TS2-10, at the center, and TS2-2):

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-19",0,9250/Sqrt[2]//N}]];
iIAMOptSqH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMOptSqH1[[ialign]]]]

iIAMOptSqRefH1[[ialign]]=10;
IAMlhoTS2[[iIAMOptSqRefH1[[ialign]]]]

alignOpticOrientH1L[[ialign]]

Add a monument (TS2-20) at the intersection of a line from TS2-19 which is normal to the line through TS2-19 and TS2-10 and a line normal to the BS HR surface, but displaced laterally by the LTHP:

LTHPH1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].alignOpticOrientH1L[[ialign,1;;2]],0];
LTHPPosInX=200;
s=(LTHPPosInX-alignOpticPosH1L[[ialign,1]])/alignOpticOrientH1L[[ialign,1]];
LTHPPosIn=alignOpticPosH1L[[ialign]]+s alignOpticOrientH1L[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMlhoTS2[[iIAMOptSqH1[[ialign]],3]]-alignOpticPosH1L[[ialign,2]]-LTHPorient[[2]])/alignOpticOrientH1L[[ialign,2]];
theoPosH1[[ialign]]=alignOpticPosH1L[[ialign]]+d alignOpticOrientH1L[[ialign]]+LTHPorient;
d1=alignOpticPosH1L[[ialign]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosH1[[ialign]];
theoDistanceH1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3]

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-20",theoPosH1[[ialign]]}]];
iIAMtheoH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoH1[[ialign]]]]

theoPosH1[[ialign]]=IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;4]]

theoOrientH1[[ialign]]=-BSHROrient

Calculate the angular separation between the beam reflected by the AR surface (after trasmission through the HR surface) and the beam reflected from the HR surface:

separationAngle=VectorAngle[Refract[Reflect[Refract[(1+10^-13)theoOrientH1[[ialign]],BSHROrient,1,1.456],BSAROrient],-BSHROrient,1.456,1],BSHROrient]

approximate calculation of this angle:

2 1.456 (wedge Pi/180)

Calculate the separation of the beam reflected from the BS AR surface, at the location of the Total Station:

BSthickness=59.88;
theoDistanceH1[[ialign]] separationAngle + BSthickness 2 wedge Pi/180

iIAMtheoRefH1[[ialign]]=Length[IAMlhoTS2]-1;

zeroYawReference=IAMlhoTS2[[iIAMOptSqH1[[ialign]],2;;3]]-IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;3]];
theoYawH1[[ialign]]=VectorAngle[theoOrientH1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchH1[[ialign]]=Sign[theoOrientH1[[ialign,3]]]VectorAngle[Join[theoOrientH1[[ialign,1;;2]],{0}],theoOrientH1[[ialign]]] 180/Pi

formatLHOAlignTable[ialign,ialign]

solution 3

In case the return beam intensity from the HR surface is too faint, add a monument (TS2-21) (near to monument (TS2-20)) at the intersection of a line at 90 deg from the line between TS2-19 and TS2-20 and a line along the retro-reflection from the BS AR surface through the BS HR surface, but displaced laterally by the LTHP:

ialign=9;
alignLabelH1[[ialign]]

iIAMOptSqRefH1[[ialign]]=10;
IAMlhoTS2[[iIAMOptSqRefH1[[ialign]]]]

Reverse the orientation of the AR surface since we are reflecting off the AR surface after trasmission through the BS:

theoOrientH1[[ialign]]=-Refract[-alignOpticOrientH1L[[ialign]],-BSHROrient,1.456,1]

Use the optic position for the previous alignment (align-1), i.e. the HR surface:

LTHPH1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].theoOrientH1[[ialign,1;;2]],0];
LTHPPosInX=200;
s=(LTHPPosInX-alignOpticPosH1L[[ialign-1,1]])/theoOrientH1[[ialign,1]];
LTHPPosIn=alignOpticPosH1L[[ialign-1]]+s theoOrientH1[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMlhoTS2[[Length[IAMlhoTS2],2]]-alignOpticPosH1L[[ialign-1,1]]-LTHPorient[[1]])/theoOrientH1[[ialign,1]];
theoPosH1[[ialign]]=alignOpticPosH1L[[ialign-1]]+d theoOrientH1[[ialign]]+LTHPorient;
d1=alignOpticPosH1L[[ialign-1]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosH1[[ialign]];
theoDistanceH1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3]

theoDistanceH1[[ialign]] separationAngle + BSthickness 2 wedge Pi/180

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-21",theoPosH1[[ialign]]}]];
iIAMtheoH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoH1[[ialign]]]]

theoPosH1[[ialign]]=IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;4]]

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-22",0,theoPosH1[[ialign,2]]}]];
iIAMtheoRefH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoRefH1[[ialign]]]]

iIAMOptSqH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMOptSqH1[[ialign]]]]

zeroYawReference=IAMlhoTS2[[iIAMOptSqH1[[ialign]],2;;3]]-IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;3]];
theoYawH1[[ialign]]=VectorAngle[theoOrientH1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchH1[[ialign]]=Sign[theoOrientH1[[ialign,3]]]VectorAngle[Join[theoOrientH1[[ialign,1;;2]],{0}],theoOrientH1[[ialign]]] 180/Pi

formatLHOAlignTable[ialign,ialign]

solution 4

ialign=10;
alignLabelH1[[ialign]]

iIAMOptSqRefH1[[ialign]]="NA";
iIAMOptSqH1[[ialign]]="NA";

Add a monument, TS2-23, at the Y-coordinate of TS2-14, and the X-coordinate of the BS HR face:

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-23",alignOpticPosH1L[[ialign,1]],IAMlhoTS2[[14,3]]}]];
iIAMtheoH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoH1[[ialign]]]]

theoPosH1[[ialign]]=Append[IAMlhoTS2[[iIAMtheoH1[[ialign]],2;;3]],alignOpticPosH1L[[ialign,3]]]

Add a monument, TS2-24, at the Y-coordinate of TS2-10, and the X-coordinate of the BS HR face:

IAMlhoTS2=Append[IAMlhoTS2,Flatten[{"TS2-24",alignOpticPosH1L[[ialign,1]],IAMlhoTS2[[10,3]]}]];
iIAMtheoRefH1[[ialign]]=Length[IAMlhoTS2];
IAMlhoTS2[[iIAMtheoRefH1[[ialign]]]]

theoOrientH1[[ialign]]={0,-1,0}

theoDistanceH1[[ialign]]=Sqrt[(theoPosH1[[ialign]]-alignOpticPosH1L[[ialign]]).(theoPosH1[[ialign]]-alignOpticPosH1L[[ialign]])]

theoYawH1[[ialign]]=0;
theoPitchH1[[ialign]]=0;

formatLHOAlignTable[ialign,ialign]

summary of BS cartridge solutions

formatLHOAlignTable[7,10]

Chamber

TBD

TableForm[IAMlhoTS2]

.. H2

... FMy cartridge alignment

d = convenient y - distance from test stand center to a monument for aligning directly to the FMy optic

d=2800;
dy=d-opticPosH2L[[1,2]]
s=dy/opticOrientH2L[[1,2]]

opticPosH2L[[1,2]]

dx=s opticOrientH2L[[1,1]]

opticOrientH2L[[1]]

opticOrientH2G[[1]]

opticPosH2L[[1]]

opticPosH2L[[1]]+s opticOrientH2L[[1]]

opticOrientH2L[[1]]

theo=-Reflect[opticOrientL[[5]],opticOrientL[[6]]]

Monument for retroreflecting beam transmitted through ITMy back on FMy

u1G={-5.419633 10^-4,-9.99999702 10^-1,-5.96945 10^-4};
v1G=Reflect[u1G,opticOrientH2G[[1]]]

v1L=v1G.Rhc

Pi -ArcTan[v1L[[2]],v1L[[1]]]
(180/Pi) (Pi -ArcTan[v1L[[2]],v1L[[1]]])
DMS[Pi -ArcTan[v1L[[2]],v1L[[1]]]]

Sts2p9=dx/v1L[[1]]

pos = Sts2p9 v1L

opticPosH2L[[1,2]]+pos[[2]]

.. L1

... Alignment Solution List

Each alignment solution is given as a single row in a table associated with an optic. Some optics require more than one alignment solution. For example, one solution for angular alignment and one for positional alignment. In order to accomplish this the optics list is augmented with additional entries. Not an elegant approach, but workable. Start by alternately listing {x,y,z} and {q,y} solutions, then tweak as needed.

alignLabelL1=Table[0,{2*nOpticsL1}];
alignOpticPosL1L=Table[0,{2*nOpticsL1},{3}];
alignOpticOrientL1L=alignOpticPosL1L;
Do[
j=Floor[(i+1)/2];
alignLabelL1[[i]]=StringJoin[opticLabelL1[[j]],If[EvenQ[i]," q,y"," x,y,z"]];
alignOpticPosL1L[[i]]=opticPosL1L[[j]];
alignOpticOrientL1L[[i]]=opticOrientL1L[[j]];
,{i,1,2*nOpticsL1}]

The BS has 4 cartridge alignment solutions and 2 chamber alignment solutions. Only one of the “BS HR q,y” or “BS AR q,y” solutions is needed; Both are listed just in case one return is weak.

alignLabelL1[[7]]="TS BS&ARellpBaf x,y,z";
alignLabelL1[[8]]="TS BS HR q,y";
alignLabelL1[[9]]="TS BS AR q,y";
alignLabelL1[[10]]="TS BS HRellpBaf x,y,z";
alignOpticPosL1L[[7]]=opticPosL1L[[5]];
alignOpticPosL1L[[8]]=opticPosL1L[[4]];
alignOpticPosL1L[[9]]=opticPosL1L[[5]];
alignOpticPosL1L[[10]]=opticPosL1L[[4]];
alignOpticOrientL1L[[7]]=opticOrientL1L[[5]];
alignOpticOrientL1L[[8]]=opticOrientL1L[[4]];
alignOpticOrientL1L[[9]]=opticOrientL1L[[5]];
alignOpticOrientL1L[[10]]=opticOrientL1L[[4]];

Rotate the BS optic coordinates 90 deg to reflect the fact that TS#1 is rotated relative to LBSC2

Do[alignOpticPosL1L[[i]]=RotationMatrix3D[Pi/2,0,0].alignOpticPosL1L[[i]];alignOpticOrientL1L[[i]]=RotationMatrix3D[Pi/2,0,0].alignOpticOrientL1L[[i]],{i,7,10}]

The BS has 3 chamber alignment solutions.

alignLabelL1=Insert[alignLabelL1,"BS HR&ITMellpBafs x,y,z",11];
alignLabelL1=Insert[alignLabelL1,"BS HR q,y",12];
alignLabelL1=Insert[alignLabelL1,"BS AR q,y",13];
alignOpticPosL1L[[11]]=opticPosL1L[[4]];
alignOpticPosL1L[[12]]=opticPosL1L[[4]];
alignOpticPosL1L[[13]]=opticPosL1L[[5]];
alignOpticOrientL1L[[11]]=opticOrientL1L[[4]];
alignOpticOrientL1L[[12]]=opticOrientL1L[[4]];
alignOpticOrientL1L[[13]]=opticOrientL1L[[5]];

tableHead={"Xl","Yl","Zl","Ul","Vl","Wl"};
Print[TableForm[Partition[Flatten[Transpose[{alignOpticPosL1L,alignOpticOrientL1L}]],6],TableHeadings->{alignLabelL1,tableHead}]]

nAlignsL1=Length[alignLabelL1];

... PRM Alignment

Angular Alignment (q, y)

A direct view perpendicular to the center of PRM is not possible from the region of the spool between HAM3 and BSC2, due to the PR2 suspension blocking the view. Consequently a periscope (PLX LTHP) is used

Derive yaw reference from sight line from "L1 IAM 378" to "L1 IAM 382" (parrallel to X-axis) with Bruson Optical Square
Place Theodolite/Total Station over new monument "am 503" which is placed at same X location as "L1 IAM 378" but along normal vector to PRM, translated by the PLX LTHP
The PLX LTHP is placed in the spool to the -X side of HAM3

calculations

ialign=2;
alignLabelL1[[ialign]]

theoOrientL1[[ialign]]=-alignOpticOrientL1L[[ialign]];

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

Approximate position of the LTHP (in the spool to the -X side of the HAM3 chamber, but before the MC Baffle):

LTHPL1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].alignOpticOrientL1L[[ialign,1;;2]],0];
LTHPPosInX=-5550;
s=(LTHPPosInX-alignOpticPosL1L[[ialign,1]])/alignOpticOrientL1L[[ialign,1]];
LTHPPosIn=alignOpticPosL1L[[ialign]]+s alignOpticOrientL1L[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMPosLllo[[iIAMOptSqL1[[ialign]],1]]-alignOpticPosL1L[[ialign,1]]-LTHPorient[[1]])/alignOpticOrientL1L[[ialign,1]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign]]+d alignOpticOrientL1L[[ialign]]+LTHPorient;
d1=alignOpticPosL1L[[ialign]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3];

IAMllo=Append[IAMllo,Flatten[{"am 500",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 500",theoPosL1[[ialign,1;;2]]}]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]],LTHPPosIn[[1;;2]],LTHPPosOut[[1;;2]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref","LTHP In","LTHP Out"};
PointLabels=Table[Text[labels[[i]],data[[i]]+{500,1000}],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,2000},All}]

formatIAMAlignTable[ialign,ialign]

Position Alignment (x,y,z)

Set the Total Station/Theodolite at y = 0 for a clear sight to PRM HR center

calculations

ialign=1;
alignLabelL1[[ialign]]

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

theoPosL1[[ialign]]={IAMllo[[iIAMOptSqL1[[ialign]],2]],0,alignOpticPosL1L[[ialign,3]]};
IAMllo=Append[IAMllo,Flatten[{"am 501",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 501",theoPosL1[[ialign,1;;2]]}]

d=alignOpticPosL1L[[ialign]]-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d.d];
theoOrientL1[[ialign]]=d/theoDistanceL1[[ialign]]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large,PlotRange->All];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref"};
PointLabels=Table[Text[labels[[i]],data[[i]]],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},{-30000,2000}}]

formatIAMAlignTable[ialign,ialign]

... PR2 Alignment

Angular Alignment (q, y)

A direct view perpendicular to the center of PR2, from the region of the spool between HAM3 and BSC2, is possible with the use of an extended retro-reflector (PLX LTHR)

Derive yaw reference from sight line from "L1 IAM 378" to "L1 IAM 382" (parrallel to X-axis) with Bruson Optical Square
Place Theodolite/Total Station over new monument "am 500" which is placed at same X location as "L1 IAM 378" but along normal vector to PR2, translated by the PLX LTHR
The PLX LTHR is placed in the spool to the -X side of HAM3

calculations

ialign=4;
alignLabelL1[[ialign]]

theoOrientL1[[ialign]]=alignOpticOrientL1L[[ialign]];

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

Approximate position of the LTHR (in the spool to the -X side of the HAM3 chamber, but before the MC Baffle):

LTHRL1[[ialign]]="Y";
LTHRorient=Append[LTHRlength RotationMatrix[-Pi/2].alignOpticOrientL1L[[ialign,1;;2]],0]
LTHRPosInX=-5550;
s=(LTHRPosInX-alignOpticPosL1L[[ialign,1]])/alignOpticOrientL1L[[ialign,1]];
LTHRPosIn=alignOpticPosL1L[[ialign]]+s alignOpticOrientL1L[[ialign]]
LTHRPosOut=LTHRPosIn+LTHRorient

d=(IAMPosLllo[[iIAMOptSqL1[[ialign]],1]]-alignOpticPosL1L[[ialign,1]]-LTHRorient[[1]])/alignOpticOrientL1L[[ialign,1]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign]]+d alignOpticOrientL1L[[ialign]]+LTHRorient;
d1=alignOpticPosL1L[[ialign]]-LTHRPosIn;
d2=LTHRorient;
d3=LTHRPosIn+LTHRorient-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3];

IAMllo=Append[IAMllo,Flatten[{"am 502",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 502",theoPosL1[[ialign,1;;2]]}]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]],LTHPPosIn[[1;;2]],LTHPPosOut[[1;;2]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref","LTHP In","LTHP Out"};
PointLabels=Table[Text[labels[[i]],data[[i]]+{200,500}],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},{-25000,5000}}]

formatIAMAlignTable[ialign,ialign]

Position Alignment (x,y,z)

Set the Total Station/Theodolite at the intersection of the PR2 HR normal vector (projected backwards) and the monument reference line x = -1858.0 mm

calculations

ialign=3;
alignLabelL1[[ialign]]

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

s=(IAMllo[[iIAMOptSqL1[[ialign]],2]]-alignOpticPosL1L[[ialign,1]])/alignOpticOrientL1L[[ialign,1]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign]]+s alignOpticOrientL1L[[ialign]]

IAMllo=Append[IAMllo,Flatten[{"am 503",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 503",theoPosL1[[ialign,1;;2]]}]

d=alignOpticPosL1L[[ialign]]-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d.d];
theoOrientL1[[ialign]]=d/theoDistanceL1[[ialign]];

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large,PlotRange->All];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref"};
PointLabels=Table[Text[labels[[i]],data[[i]]],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},{-25000,5000}}]

formatIAMAlignTable[ialign,ialign]

... PR3 Alignment

Angular Alignment (q, y)

A direct view perpendicular to the center of PR3 is not possible from the region of the spool between HAM3 and BSC2, due to the PR2 suspension blocking the view. Consequently a periscope (PLX LTHP) is used

Derive yaw reference from sight line from "L1 IAM 378" to "L1 IAM 382" (parrallel to X-axis) with Bruson Optical Square
Place Theodolite/Total Station over new monument "am 500" which is placed at same X location as "L1 IAM 378" but along normal vector to PR3, translated by the PLX LTHP
The PLX LTHP is placed in the spool to the -X side of HAM3

calculations

ialign=6;
alignLabelL1[[ialign]]

theoOrientL1[[ialign]]=-alignOpticOrientL1L[[ialign]];

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

Approximate position of the LTHP (in the spool to the -X side of the HAM3 chamber, but before the MC Baffle):

LTHPL1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].alignOpticOrientL1L[[ialign,1;;2]],0];
LTHPPosInX=-5550;
s=(LTHPPosInX-alignOpticPosL1L[[ialign,1]])/alignOpticOrientL1L[[ialign,1]];
LTHPPosIn=alignOpticPosL1L[[ialign]]+s alignOpticOrientL1L[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMPosLllo[[iIAMOptSqL1[[ialign]],1]]-alignOpticPosL1L[[ialign,1]]-LTHPorient[[1]])/alignOpticOrientL1L[[ialign,1]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign]]+d alignOpticOrientL1L[[ialign]]+LTHPorient;
d1=alignOpticPosL1L[[ialign]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3];

IAMllo=Append[IAMllo,Flatten[{"am 504",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 504",theoPosL1[[ialign,1;;2]]}]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]],LTHPPosIn[[1;;2]],LTHPPosOut[[1;;2]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref","LTHP In","LTHP Out"};
PointLabels=Table[Text[labels[[i]],data[[i]]+{500,1000}],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},All}]

formatIAMAlignTable[ialign,ialign]

Position Alignment (x,y,z)

Set the Total Station/Theodolite at y = 0 for a clear sight to PR3 HR center

calculations

ialign=5;
alignLabelL1[[ialign]]

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

theoPosL1[[ialign]]={IAMllo[[iIAMOptSqL1[[ialign]],2]],0,alignOpticPosL1L[[ialign,3]]};
IAMllo=Append[IAMllo,Flatten[{"am 505",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 505",theoPosL1[[ialign,1;;2]]}]

d=alignOpticPosL1L[[ialign]]-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d.d]
theoOrientL1[[ialign]]=d/theoDistanceL1[[ialign]]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large,PlotRange->All];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref"};
PointLabels=Table[Text[labels[[i]],data[[i]]],{i,1,Length[labels]}];

results

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},{-30000,2000}}]

formatIAMAlignTable[ialign,ialign]

... PRC Alignment Summary

Table summarizing the alignment solutions for the Power Recycling Cavity (PRC) optics: PRM, PR2 and PR3

formatIAMAlignTable[1,6]

TableForm[IAMllo]

... BS Alignment

Cartridge

solution 1

ialign=7;
alignLabelL1[[ialign]]

Rotate the BS optic coordinates 90 deg to reflect the fact that TS#1 is rotated relative to LBSC2

BSARPos=alignOpticPosL1L[[ialign]]

BS wedge angle (deg):

wedge=VectorAngle[alignOpticOrientL1L[[ialign]],-alignOpticOrientL1L[[ialign+1]]] 180/Pi

BSHROrient=alignOpticOrientL1L[[ialign+1]]

BSAROrient=alignOpticOrientL1L[[ialign]]

iIAMOptSqRefL1[[ialign]]=5;
IAMlloTS1[[iIAMOptSqRefL1[[ialign]]]]

iIAMOptSqL1[[ialign]]=11;
IAMlloTS1[[iIAMOptSqL1[[ialign]]]]

Add a monument (TS1-14) along the IAM-389 to IAM IAM-400 line and normal to the BS AR surface:

d=(IAMlloTS1[[iIAMOptSqL1[[ialign]],2]]-BSARPos[[1]])/BSAROrient[[1]];
IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-14",BSARPos+d BSAROrient}]];
iIAMtheoL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoL1[[ialign]]]]

theoPosL1[[ialign]]=IAMlloTS1[[iIAMtheoL1[[ialign]],2;;4]]

theoOrientL1[[ialign]]=-BSAROrient

Separation from LAC to BS AR surface (mm):

theoDistanceL1[[ialign]]=Sqrt[(theoPosL1[[ialign]]-BSARPos).(theoPosL1[[ialign]]-BSARPos)]

iIAMtheoRefL1[[ialign]]="NA";

zeroYawReference=IAMlloTS1[[iIAMOptSqL1[[ialign]],2;;3]]-IAMlloTS1[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=Sign[theoOrientL1[[ialign,3]]]VectorAngle[Join[theoOrientL1[[ialign,1;;2]],{0}],theoOrientL1[[ialign]]] 180/Pi

formatAlignTable[ialign,ialign]

solution 2

ialign=8;
alignLabelL1[[ialign]]

Required beam separation from HR and AR surfaces so as not to get an erroneous laser autocollimator (LAC) reading is 32 mm. The beam divergence of the Newport LDS-vector LAC is 100 urad. Given a wedge angle of 0.070 deg (for BS SN002 to be used for L1) and an index of refraction at 670 nm of ~1.456, the separation from the LAC to the BS AR surface must be at least ~9 m :

31/(1.456 (.070 Pi/180) 2-100 10^-6)

31.9/(1.456 (.070 Pi/180) 2)

So place a new TS1-15 monument along the X = 0 line between IAM394 and IAM391:

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-15",0,9250/Sqrt[2]//N}]];
iIAMOptSqL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=13;
IAMlloTS1[[iIAMOptSqRefL1[[ialign]]]]

alignOpticOrientL1L[[ialign]]

Add a monument (TS1-16) at the intersection of a line from TS1-15 which is normal to the line through IAM-349 and IAM-391 and a line normal to the BS HR surface, but displaced laterally by the LTHP:

LTHPL1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].alignOpticOrientL1L[[ialign,1;;2]],0];
LTHPPosInX=200;
s=(LTHPPosInX-alignOpticPosL1L[[ialign,1]])/alignOpticOrientL1L[[ialign,1]];
LTHPPosIn=alignOpticPosL1L[[ialign]]+s alignOpticOrientL1L[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMlloTS1[[iIAMOptSqL1[[ialign]],3]]-alignOpticPosL1L[[ialign,2]]-LTHPorient[[2]])/alignOpticOrientL1L[[ialign,2]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign]]+d alignOpticOrientL1L[[ialign]]+LTHPorient;
d1=alignOpticPosL1L[[ialign]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3]

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-16",theoPosL1[[ialign]]}]];
iIAMtheoL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoL1[[ialign]]]]

theoPosL1[[ialign]]=IAMlloTS1[[iIAMtheoL1[[ialign]],2;;4]]

theoOrientL1[[ialign]]=-BSHROrient

Calculate the angular separation between the beam reflected by the AR surface (after trasmission through the HR surface) and the beam reflected from the HR surface:

separationAngle=VectorAngle[Refract[Reflect[Refract[(1+10^-13)theoOrientL1[[ialign]],BSHROrient,1,1.456],BSAROrient],-BSHROrient,1.456,1],BSHROrient]

approximate calculation of this angle:

2 1.456 (wedge Pi/180)

Calculate the separation of the beam reflected from the BS AR surface, at the location of the Total Station:

BSthickness=59.88;
theoDistanceL1[[ialign]] separationAngle + BSthickness 2 wedge Pi/180

iIAMtheoRefL1[[ialign]]=Length[IAMlloTS1]-1;

zeroYawReference=IAMlloTS1[[iIAMOptSqL1[[ialign]],2;;3]]-IAMlloTS1[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=Sign[theoOrientL1[[ialign,3]]]VectorAngle[Join[theoOrientL1[[ialign,1;;2]],{0}],theoOrientL1[[ialign]]] 180/Pi

formatAlignTable[ialign,ialign]

solution 3

In case the return beam intensity from the HR surface is too faint, add a monument (TS1-17) (near to monument (TS1-16)) at the intersection of a line at 90 deg from the line between TS1-15 and TS1-16 and a line along the retro-reflection from the BS AR surface through the BS HR surface, but displaced laterally by the LTHP:

ialign=9;
alignLabelL1[[ialign]]

iIAMOptSqRefL1[[ialign]]=13;
IAMlloTS1[[iIAMOptSqRefL1[[ialign]]]]

Reverse the orientation of the AR surface since we are reflecting off the AR surface after trasmission through the BS:

theoOrientL1[[ialign]]=-Refract[-alignOpticOrientL1L[[ialign]],-BSHROrient,1.456,1]

Use the optic position for the previous alignment (align-1), i.e. the HR surface:

LTHPL1[[ialign]]="Y";
LTHPorient=Append[LTHPlength RotationMatrix[Pi/2].theoOrientL1[[ialign,1;;2]],0];
LTHPPosInX=200;
s=(LTHPPosInX-alignOpticPosL1L[[ialign-1,1]])/theoOrientL1[[ialign,1]];
LTHPPosIn=alignOpticPosL1L[[ialign-1]]+s theoOrientL1[[ialign]];
LTHPPosOut=LTHPPosIn+LTHPorient;

d=(IAMlloTS1[[16,2]]-alignOpticPosL1L[[ialign-1,1]]-LTHPorient[[1]])/theoOrientL1[[ialign,1]];
theoPosL1[[ialign]]=alignOpticPosL1L[[ialign-1]]+d theoOrientL1[[ialign]]+LTHPorient;
d1=alignOpticPosL1L[[ialign-1]]-LTHPPosIn;
d2=LTHPorient;
d3=LTHPPosIn+LTHPorient-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d1.d1]+Sqrt[d2.d2]+Sqrt[d3.d3]

theoDistanceL1[[ialign]] separationAngle + BSthickness 2 wedge Pi/180

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-17",theoPosL1[[ialign]]}]];
iIAMtheoL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoL1[[ialign]]]]

theoPosL1[[ialign]]=IAMlloTS1[[iIAMtheoL1[[ialign]],2;;4]]

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-18",0,theoPosL1[[ialign,2]]}]];
iIAMtheoRefL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoRefL1[[ialign]]]]

iIAMOptSqL1[[ialign]]=18;
IAMlloTS1[[iIAMOptSqL1[[ialign]]]]

zeroYawReference=IAMlloTS1[[iIAMOptSqL1[[ialign]],2;;3]]-IAMlloTS1[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=Sign[theoOrientL1[[ialign,3]]]VectorAngle[Join[theoOrientL1[[ialign,1;;2]],{0}],theoOrientL1[[ialign]]] 180/Pi

formatAlignTable[ialign,ialign]

solution 4

ialign=10;
alignLabelL1[[ialign]]

alignOpticPosL1L[[10,1]]

iIAMOptSqRefL1[[ialign]]="NA";
iIAMOptSqL1[[ialign]]="NA";

Add a monument, TS1-19, at the Y-coordinate of IAM349, and the X-coordinate of the BS HR face:

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-19",alignOpticPosL1L[[ialign,1]],IAMlloTS1[[9,3]]}]];
iIAMtheoL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoL1[[ialign]]]]

theoPosL1[[ialign]]=Append[IAMlloTS1[[iIAMtheoL1[[ialign]],2;;3]],alignOpticPosL1L[[ialign,3]]]

Add a monument, TS1-20, at the Y-coordinate of IAM394, and the X-coordinate of the BS HR face:

IAMlloTS1=Append[IAMlloTS1,Flatten[{"TS1-20",alignOpticPosL1L[[ialign,1]],IAMlloTS1[[13,3]]}]];
iIAMtheoRefL1[[ialign]]=Length[IAMlloTS1];
IAMlloTS1[[iIAMtheoRefL1[[ialign]]]]

theoOrientL1[[ialign]]={0,-1,0}

theoDistanceL1[[ialign]]=Sqrt[(theoPosL1[[ialign]]-alignOpticPosL1L[[ialign]]).(theoPosL1[[ialign]]-alignOpticPosL1L[[ialign]])]

theoYawL1[[ialign]]=0;
theoPitchL1[[ialign]]=0;

formatAlignTable[ialign,ialign]

summary of BS cartridge solutions

formatAlignTable[7,10]

Chamber

solution 1

Set the Total Station on the beam line path from the center of the BS to the center of PR3, looking at the center of the BS, in order to align the position (x, y, z) of the LBSC2 cartridge, using the HR Elliptical Baffle target (x, z) and the retro-reflector (y)

ialign=11;
alignLabelL1[[ialign]]

iIAMOptSqL1[[ialign]]=12;
IAMllo[[iIAMOptSqL1[[ialign]]]]

iIAMOptSqRefL1[[ialign]]=16;
IAMllo[[iIAMOptSqRefL1[[ialign]]]]

IAMllo[[iIAMOptSqL1[[ialign]],2]]

s=(IAMllo[[iIAMOptSqL1[[ialign]],2]]-alignOpticPosL1L[[5,1]])/(alignOpticPosL1L[[ialign,1]]-alignOpticPosL1L[[5,1]]);
theoPosL1[[ialign]]=s (alignOpticPosL1L[[ialign]]-alignOpticPosL1L[[5]])+alignOpticPosL1L[[5]];
IAMllo=Append[IAMllo,Flatten[{"am 506",theoPosL1[[ialign,1;;2]]}]];
iIAMtheoL1[[ialign]]=Length[IAMllo];
Flatten[{"am 506",theoPosL1[[ialign,1;;2]]}]

alignOpticPosL1L[[ialign]]

theoPosL1[[ialign]]

d=alignOpticPosL1L[[ialign]]-theoPosL1[[ialign]];
theoDistanceL1[[ialign]]=Sqrt[d.d]
theoOrientL1[[ialign]]=d/theoDistanceL1[[ialign]]

iIAMtheoRefL1[[ialign]]=11;
IAMllo[[iIAMtheoRefL1[[ialign]]]]

zeroYawReference=IAMllo[[iIAMOptSqL1[[ialign]],2;;3]]-IAMllo[[iIAMtheoL1[[ialign]],2;;3]];
theoYawL1[[ialign]]=VectorAngle[theoOrientL1[[ialign,1;;2]],zeroYawReference] 180/Pi

theoPitchL1[[ialign]]=ArcTan[theoOrientL1[[ialign,3]]/theoOrientL1[[ialign,1]]] 180/Pi

data={alignOpticPosL1L[[ialign,1;;2]],IAMllo[[iIAMOptSqL1[[ialign]],2;;3]],IAMllo[[iIAMOptSqRefL1[[ialign]],2;;3]],IAMllo[[iIAMtheoL1[[ialign]],2;;3]],IAMllo[[iIAMtheoRefL1[[ialign]],2;;3]]};
dataPlot=ListPlot[data,PlotStyle->PointSize->Large,PlotRange->All];
labels={alignLabelL1[[ialign]],"OptSq","OptSq Ref","TS","TS Ref"};
PointLabels=Table[Text[labels[[i]],data[[i]]],{i,1,Length[labels]}];

Show[dataPlot,Graphics[{Red,PointLabels}],AspectRatio->1,PlotRange->{{-25000,5000},{-30000,2000}}]

formatIAMAlignTable[11,11]

TableForm[IAMllo[[51;;Length[IAMllo]]]]

solution 2

ialign=12;
alignLabelL1[[ialign]]

SOLUTION TBD -- BUT DOES NOT REQUIRE A MONUMENT ON THE PIPE BRIDGE

solution 3

ialign=13;
alignLabelL1[[ialign]]

SOLUTION TBD -- BUT DOES NOT REQUIRE A MONUMENT ON THE PIPE BRIDGE

... SRM Alignment

... SR2 Alignment

... SR3 Alignment

... ITMx Alignment

Cartridge

Chamber

... ITMy Alignment

Cartridge

Chamber

... ETMx Alignment

Cartridge

Chamber

... ETMy Alignment

Cartridge

Chamber

... Summary of Alignment Solutions

calculations

table=Grid[Flatten[{{{"Optic",SpanFromLeft,SpanFromLeft,SpanFromLeft,"Transit Square",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,"Total Station",SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft,SpanFromLeft},\
{"Name","Local Coordinates\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Over Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Sights Monument\n(mm)",SpanFromLeft,SpanFromLeft,"Distance\n(mm)","Yaw\n(deg)","Pitch\n(deg)"},{SpanFromAbove,"Xl","Yl","Zl","Name","Xl","Yl","Name","Xl","Yl","Name","Xl","Yl","Name","Xl","Yl",SpanFromAbove,SpanFromAbove,SpanFromAbove}},\
Table[{opticLabelL1[[i]],NumberForm[opticPosL1L[[i,1]],{10,1}],NumberForm[opticPosL1L[[i,2]],{10,1}],NumberForm[opticPosL1L[[i,3]],{10,1}],\
IAMllo[[iIAMOptSqL1[[i]],1]],NumberForm[IAMllo[[iIAMOptSqL1[[i]],2]],{10,1}],NumberForm[IAMllo[[iIAMOptSqL1[[i]],3]],{10,1}],\
IAMllo[[iIAMOptSqRefL1[[i]],1]],NumberForm[IAMllo[[iIAMOptSqRefL1[[i]],2]],{10,1}],NumberForm[IAMllo[[iIAMOptSqRefL1[[i]],3]],{10,1}],\
IAMllo[[iIAMtheoL1[[i]],1]],NumberForm[IAMllo[[iIAMtheoL1[[i]],2]],{10,1}],NumberForm[IAMllo[[iIAMtheoL1[[i]],3]],{10,1}],\
IAMllo[[iIAMtheoRefL1[[i]],1]],NumberForm[IAMllo[[iIAMtheoRefL1[[i]],2]],{10,1}],NumberForm[IAMllo[[iIAMtheoRefL1[[i]],3]],{10,1}],\
NumberForm[theoDistanceL1[[i]],{10,1}],NumberForm[theoYawL1[[i]],{10,5}],NumberForm[theoPitchL1[[i]],{10,5}]},{i,1,nOpticsL1}]},1],Frame->All];

results

table