T1100455-v2 - Analysis of position/voltage data on BOSEMs #011, #063, #005

Version history

-v1 (8/23/11): data on #011 taken 8/22

-v2 (8/26/11): Reworked analysis to make all quantities a function of serial number, e.g., rawdata[63]. Made plots show raw data as well as interpolated curves. Added data on #063, taken 8/23 and #005, taken 8/26. Add photo of setup.

Measurement details

The flag was a new-style one, D1100573-v5.

The satellite amp serial number was S000296, operated in photoconductive mode (10 V bias on the PD). It had been modded for lower gain with 121K gain resistors. Reported voltages are the differential output of channel A of the satellite amp (two-sided), giving 4.13 µA/V. Output was measured by a multimeter and recorded manually. Time was allowed after each micrometer change to allow the whitening filter in the satellite amp to settle.

The BOSEM was on a 1D translation stage moving it in/out relative to the flag, with the LED-PD axis horizontal and the flexi-circuit up. (Looking from the back of the BOSEM toward the flag, this puts the PD on the right and the LED on the left.) Hereafter this direction is called x. More positive numbers on the x micrometer correspond to the flag entering the BOSEM.

The flag was put on a 2D translation stage allowing movement in both transverse directions, hereafter y (transverse horizontal, or along the beam line) and z (vertical). The flag was horizontal and the edge of the wedge was vertical. Larger numbers on the y micrometer mean the flag was moving closer to the LED. When the flag was centered tranversely as near as possible by eye, the y micrometer read 14.2 mm.

In a preliminary measurement on BOSEM #011, it was established that the voltage was almost perfectly independent of the vertical (z) position of the flag for the full usable vertical range of the flag. In fact the voltage only started to change when the flag started to foul on the BOSEM body and be pushed out of alignment.

The following data and analysis concerns the output as a function of longitudinal (x) and transverse parallel to the beam (y). See at end for summary/conclusions.

BOSEM SN011

Data taken 8/22/11 by Vern Sandberg and Mark Barton

Data

The raw data imported from Excel, as a rectangular array with each row a longitudinal (x) position, each column a transverse (y) position, and the empty string for missing values.

rawdata[11] = {{{14.565`,14.547`,14.525`,14.5`,14.488`,14.467`,14.445`,14.428`,14.407`,14.393`,14.373`},{"","","","","","",14.295`,"","","",""},{14.107`,14.072`,14.004`,13.945`,13.854`,13.776`,13.667`,13.571`,13.44`,13.307`,13.129`},{"","","","","","",12.465`,"","","",""},{11.764`,11.677`,11.527`,11.384`,11.183`,11.003`,10.781`,10.59`,10.389`,10.218`,10.034`},{"","","","","","",8.931`,"","","",""},{7.503`,7.472`,7.347`,7.3`,7.22`,7.164`,7.084`,7.046`,6.988`,6.968`,6.8950000000000005`},{"","","","","","",5.284`,"","","",""},{3.184`,3.245`,3.259`,3.345`,3.38`,3.489`,3.555`,3.669`,3.735`,3.843`,3.917`},{"","","","","","",2.016`,"","","",""},{0.781`,0.805`,0.8240000000000001`,0.847`,0.864`,0.908`,0.934`,1.001`,1.059`,1.138`,1.203`},{"","","","","","","","","","",""},{0.113`,0.115`,0.116`,0.117`,0.115`,0.11800000000000001`,0.117`,0.116`,0.115`,0.111`,0.106`},{"","","","","","","","","","",""},{0.069`,0.07100000000000001`,0.07100000000000001`,0.07200000000000001`,0.073`,0.073`,0.07200000000000001`,0.07`,0.066`,0.061`,0.053`}}}[[1]];

The longitudinal positions

x[11] ={17.8, 17.9, 18, 18.1, 18.2, 18.3, 18.4, 18.5, 18.6, 18.7, 18.8, 18.9, 19, 19.1, 19.2};

The transverse positions

y[11] = {13,13.2,13.4,13.6,13.8,14,14.2,14.4,14.6,14.8 ,15};

The index for the central transverse position

jcent[11] = 8;

The most central transverse position (by eye)

y[11][[jcent[11]]]

Analysis

The data in a form convenient for ListPlot3D, as {x,y,value} triples, with missing values suppressed

data[11] = Flatten[Table[{x[11][[i]],y[11][[j]],rawdata[11][[i,j]]},{i,Length[x[11]]},{j,Length[y[11]]}],1]/.{_,_,""}:>Sequence[];

ListPlot3D[data[11]]

The data in a convenient format for other calculations, with unequal length rows, each a list of {x, value} pairs for a value of y, using the same indexing as y.

databycol[11] = Table[Table[{x[11][[i]],rawdata[11][[i,j]]},{i,Length[x[11]]}],{j,Length[y[11]]}]/.{_,""}:>Sequence[];

A table of interpolated functions, one for each y.

curves[11] = Table[
Interpolation[databycol[11][[j]]],
{j,Length[y[11]]}
];

A plot of all the interpolation functions in spectrum order with the smallest y purple and the largest red. Note that there is an optimum where the voltage is independent of transverse position

Show@@Join[
Table[ListPlot[databycol[11][[j]],PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[11]]]],{j,Length[y[11]]}],
Table[Plot[curves[11][[j]][x],{x,Min[x[11]],Max[x[11]]},PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[11]]]],{j,Length[y[11]]}],
{PlotLabel-> "Response of BOSEM #011 at different tranverse positions (red nearest LED)"}
]

The open light voltage, calculated as the maximum of the central y curve

openlight[11] = Max[Part[rawdata[11],All,jcent[11]]/.""->Sequence[]]

The optimum longitudinal position, calculated as the point where the maximum and minimum values among the various curves are closest

optpos[11] =x/. FindMinimum[Max[Table[curves[11][[j]][x],{j,Length[y[11]]}]]-Min[Table[curves[11][[j]][x],{j,Length[y[11]]}]],{x,18.5,18,19}][[2]]

The fraction of the maximum voltage at the optimum

optfrac[11] = curves[11][[jcent[11]]][optpos[11]]/openlight[11]

The slope at the optimum x and central y, in V/mm

optslope[11] =- Dt[curves[11][[jcent[11]]][x],x]/.x->optpos[11]

The slope at the optimum x and central y normalized to the open light voltage, in 1/mm

relslope[11] = optslope[11]/openlight[11]

The maximum normalized slope among the curves at optimum x (turns out to be at minumum y)

maxrelslope[11] = - (Dt[curves[11][[1]][x],x]/.x->optpos[11])/openlight[11]

The minimum normalized slope among the curves at optimum x (turns out to be at maximum y)

minrelslope[11] = - (Dt[curves[11][[-1]][x],x]/.x->optpos[11])/openlight[11]

The upper anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos1[11] =x/. FindMaximum[Max[Table[curves[11][[j]][x],{j,Length[y[11]]}]]-Min[Table[curves[11][[j]][x],{j,Length[y[11]]}]],{x,18.5,18.5,19}][[2]]

The lower anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos2[11] =x/. FindMaximum[Max[Table[curves[11][[j]][x],{j,Length[y[11]]}]]-Min[Table[curves[11][[j]][x],{j,Length[y[11]]}]],{x,18.1,17.8,18.5}][[2]]

The fractions of the maximum voltage at the anti-optima

antioptfrac1[11] = curves[11][[jcent[11]]][antioptpos1[11]]/openlight[11]

antioptfrac2[11] = curves[11][[jcent[11]]][antioptpos2[11]]/openlight[11]

A perturbation in x position that gives an arbitary 10% extra light than at the sensing sweet spot

pertpos[11]=x/.FindRoot[curves[11][[jcent[11]]][x]-openlight[11]*(optfrac[11]+0.1),{x,18.5}][[1]]

The tranverse cross-coupling (y slope scaled by open light) at the optimum in 1/mm

crossopt[11] = -(Dt[Interpolation[Table[{y[11][[j]],curves[11][[j]][optpos[11]]},{j,Length[y[11]]}]][y],y]/.y->y[11][[jcent[11]]])/openlight[11]

The transverse cross-coupling (y slope scaled by open light) at the perturbed position in 1/mm

crosspert[11] = -(Dt[Interpolation[Table[{y[11][[j]],curves[11][[j]][pertpos[11]]},{j,Length[y[11]]}]][y],y]/.y->y[11][[jcent[11]]])/openlight[11]

The cross-coupling compared to the sensitivity at the optimum, in percent

100 crossopt[11]/relslope[11]

The cross-coupling compared to the sensitivity at the perturbed position, in percent

100crosspert[11]/relslope[11]

BOSEM SN063

Data taken 8/23/11 by Vern Sandberg and Mark Barton

Data

The raw data imported from Excel, as a rectangular array with each row a longitudinal (x) position, each column a transverse (y) position, and the empty string for missing values.

rawdata[63] = {{{17.42`,17.404`,17.389`,17.368`,17.354`,17.337`,17.324`,17.305`,17.293`,17.275`,17.265`,17.248`},{17.37`,17.356`,17.339`,17.306`,17.285`,17.253`,17.227`,17.185`,17.157`,17.099`,17.106`,16.995`},{16.46`,16.445`,16.367`,16.254`,16.149`,16.001`,15.868`,15.684`,15.488`,15.25`,14.969`,14.737`},{13.23`,13.216`,13.06`,12.865`,12.666`,12.412`,12.267`,12.042`,11.92`,11.736`,11.596`,11.409`},{7.8`,7.837`,7.851`,7.855`,7.878`,7.86`,7.896`,7.865`,7.916`,7.869`,7.873`,7.849`},{3.18`,3.227`,3.218`,3.259`,3.298`,3.342`,3.451`,3.534`,3.701`,3.808`,3.983`,4.075`},{0.618`,0.642`,0.642`,0.672`,0.697`,0.699`,0.725`,0.758`,0.812`,0.85`,0.899`,0.941`},{0.098`,0.097`,0.096`,0.094`,0.095`,0.095`,0.095`,0.095`,0.096`,0.094`,0.091`,0.087`}}}  [[1]];

The longitudinal positions

x[63] ={17.6,17.8, 18, 18.2, 18.4, 18.6,18.8, 19};

The transverse positions

y[63] = {13,13.2,13.4,13.6,13.8,14,14.2,14.4,14.6,14.8 ,15,15.2};

The index for the central transverse position

jcent[63] = 8;

The most central transverse position (by eye)

y[63][[jcent[63]]]

Analysis

The data in a form convenient for ListPlot3D, as {x,y,value} triples, with missing values suppressed

data[63] = Flatten[Table[{x[63][[i]],y[63][[j]],rawdata[63][[i,j]]},{i,Length[x[63]]},{j,Length[y[63]]}],1]/.{_,_,""}:>Sequence[];

ListPlot3D[data[63]]

The data in a convenient format for other calculations, with unequal length rows, each a list of {x, value} pairs for a value of y, using the same indexing as y.

databycol[63] = Table[Table[{x[63][[i]],rawdata[63][[i,j]]},{i,Length[x[63]]}],{j,Length[y[63]]}]/.{_,""}:>Sequence[];

A table of interpolated functions, one for each y.

curves[63] = Table[
Interpolation[databycol[63][[j]]],
{j,Length[y[63]]}
];

A plot of all the interpolation functions in spectrum order with the smallest y purple and the largest red. Note that there is an optimum where the voltage is independent of transverse position

Show@@Join[
Table[ListPlot[databycol[63][[j]],PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[63]]]],{j,Length[y[63]]}],
Table[Plot[curves[63][[j]][x],{x,Min[x[63]],Max[x[63]]},PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[63]]]],{j,Length[y[63]]}],
{PlotLabel-> "Response of BOSEM #063 at different tranverse positions (red nearest LED)"}
]

The open light voltage, calculated as the maximum of the central y curve

openlight[63] = Max[Part[rawdata[63],All,jcent[63]]/.""->Sequence[]]

The optimum longitudinal position, calculated as the point where the maximum and minimum values among the various curves are closest

optpos[63] =x/. FindMinimum[Max[Table[curves[63][[j]][x],{j,Length[y[63]]}]]-Min[Table[curves[63][[j]][x],{j,Length[y[63]]}]],{x,18.5,18,19}][[2]]

The fraction of the maximum voltage at the optimum

optfrac[63] = curves[63][[jcent[63]]][optpos[63]]/openlight[63]

The slope at the optimum x and central y, in V/mm

optslope[63] =- Dt[curves[63][[jcent[63]]][x],x]/.x->optpos[63]

The slope at the optimum x and central y normalized to the open light voltage, in 1/mm

relslope[63] = optslope[63]/openlight[63]

The maximum normalized slope among the curves at optimum x (turns out to be at minumum y)

maxrelslope[63] = - (Dt[curves[63][[1]][x],x]/.x->optpos[63])/openlight[63]

The minimum normalized slope among the curves at optimum x (turns out to be at maximum y)

minrelslope[63] = - (Dt[curves[63][[-1]][x],x]/.x->optpos[63])/openlight[63]

The upper anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos1[63] =x/. FindMaximum[Max[Table[curves[63][[j]][x],{j,Length[y[63]]}]]-Min[Table[curves[63][[j]][x],{j,Length[y[63]]}]],{x,18.5,18.5,19}][[2]]

The lower anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos2[63] =x/. FindMaximum[Max[Table[curves[63][[j]][x],{j,Length[y[63]]}]]-Min[Table[curves[63][[j]][x],{j,Length[y[63]]}]],{x,18.1,17.8,18.5}][[2]]

The fractions of the maximum voltage at the anti-optima

antioptfrac1[63] = curves[63][[jcent[63]]][antioptpos1[63]]/openlight[63]

antioptfrac2[63] = curves[63][[jcent[63]]][antioptpos2[63]]/openlight[63]

A perturbation in x position that gives an arbitary 10% extra light than at the sensing sweet spot

pertpos[63]=x/.FindRoot[curves[63][[jcent[63]]][x]-openlight[63]*(optfrac[63]+0.1),{x,18.5}][[1]]

The tranverse cross-coupling (y slope scaled by open light) at the optimum in 1/mm

crossopt[63] = -(Dt[Interpolation[Table[{y[63][[j]],curves[63][[j]][optpos[63]]},{j,Length[y[63]]}]][y],y]/.y->y[63][[jcent[63]]])/openlight[63]

The transverse cross-coupling (y slope scaled by open light) at the perturbed position in 1/mm

crosspert[63] = -(Dt[Interpolation[Table[{y[63][[j]],curves[63][[j]][pertpos[63]]},{j,Length[y[63]]}]][y],y]/.y->y[63][[jcent[63]]])/openlight[63]

The cross-coupling compared to the sensitivity at the optimum, in percent

100 crossopt[63]/relslope[63]

The cross-coupling compared to the sensitivity at the perturbed position, in percent

100crosspert[63]/relslope[63]

BOSEM SN005

Data taken 8/26/11 by Vern Sandberg and Mark Barton

Data

The raw data imported from Excel, as a rectangular array with each row a longitudinal (x) position, each column a transverse (y) position, and the empty string for missing values.

rawdata[5] ={{{16.72`,16.7`,16.682`,16.667`,16.647`,16.629`,16.614`,16.594`,16.566`,16.541`,16.507`},{"","","","","",16.331`,"","","","",""},{15.941`,15.877`,15.817`,15.733`,15.643`,15.536`,15.42`,15.304`,15.092`,14.932`,14.685`},{"","","","","",14.184`,"","","","",""},{13.116`,12.989`,12.874`,12.676`,12.545`,12.351`,12.181`,12.043`,11.832`,11.755`,11.563`},{"","","","","",10.41`,"","","","",""},{8.355`,8.336`,8.392`,8.336`,8.388`,8.378`,8.337`,8.349`,8.288`,8.312`,8.256`},{"","","","","",6.346`,"","","","",""},{3.715`,3.801`,3.901`,3.993`,4.101`,4.301`,4.404`,4.585`,4.668`,4.828`,4.889`},{"","","","","",2.511`,"","","","",""},{0.913`,0.956`,1.022`,1.051`,1.137`,1.208`,1.268`,1.386`,1.448`,1.606`,1.735`},{"","","","","",0.423`,"","","","",""},{0.114`,0.117`,0.118`,0.121`,0.123`,0.126`,0.128`,0.131`,0.136`,0.144`,0.149`},{"","","","","",0.091`,0.091`,"","","",""}}} [[1]];

The longitudinal positions

x[5] ={17.8,17.9, 18,18.1, 18.2,18.3, 18.4,18.5, 18.6,18.7,18.8,18.9, 19};

The transverse positions

y[5] = {13.3,13.5,13.7,13.9,14.1,14.3,14.5,14.7,14.9 ,15.1,15.3};

The index for the central transverse position

jcent[5] = 6;

The most central transverse position (by eye)

y[5][[jcent[5]]]

Analysis

The data in a form convenient for ListPlot3D, as {x,y,value} triples, with missing values suppressed

data[5] = Flatten[Table[{x[5][[i]],y[5][[j]],rawdata[5][[i,j]]},{i,Length[x[5]]},{j,Length[y[5]]}],1]/.{_,_,""}:>Sequence[];

ListPlot3D[data[5]]

The data in a convenient format for other calculations, with unequal length rows, each a list of {x, value} pairs for a value of y, using the same indexing as y.

databycol[5] = Table[Table[{x[5][[i]],rawdata[5][[i,j]]},{i,Length[x[5]]}],{j,Length[y[5]]}]/.{_,""}:>Sequence[];

A table of interpolated functions, one for each y.

curves[5] = Table[
Interpolation[databycol[5][[j]]],
{j,Length[y[5]]}
];

A plot of all the interpolation functions in spectrum order with the smallest y purple and the largest red. Note that there is an optimum where the voltage is independent of transverse position

Show@@Join[
Table[ListPlot[databycol[5][[j]],PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[5]]]],{j,Length[y[5]]}],
Table[Plot[curves[5][[j]][x],{x,Min[x[5]],Max[x[5]]},PlotStyle->ColorData["Rainbow"][(j-1)/Length[y[5]]]],{j,Length[y[5]]}],
{PlotLabel-> "Response of BOSEM #005 at different tranverse positions (red nearest LED)"}
]

The open light voltage, calculated as the maximum of the central y curve

openlight[5] = Max[Part[rawdata[5],All,jcent[5]]/.""->Sequence[]]

The optimum longitudinal position, calculated as the point where the maximum and minimum values among the various curves are closest

optpos[5] =x/. FindMinimum[Max[Table[curves[5][[j]][x],{j,Length[y[5]]}]]-Min[Table[curves[5][[j]][x],{j,Length[y[5]]}]],{x,18.5,18,19}][[2]]

The fraction of the maximum voltage at the optimum

optfrac[5] = curves[5][[jcent[5]]][optpos[5]]/openlight[5]

The slope at the optimum x and central y, in V/mm

optslope[5] =- Dt[curves[5][[jcent[5]]][x],x]/.x->optpos[5]

The slope at the optimum x and central y normalized to the open light voltage, in 1/mm

relslope[5] = optslope[5]/openlight[5]

The maximum normalized slope among the curves at optimum x (turns out to be at minumum y)

maxrelslope[5] = - (Dt[curves[5][[1]][x],x]/.x->optpos[5])/openlight[5]

The minimum normalized slope among the curves at optimum x (turns out to be at maximum y)

minrelslope[5] = - (Dt[curves[5][[-1]][x],x]/.x->optpos[5])/openlight[5]

The upper anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos1[5] =x/. FindMaximum[Max[Table[curves[5][[j]][x],{j,Length[y[5]]}]]-Min[Table[curves[5][[j]][x],{j,Length[y[5]]}]],{x,18.5,18.5,19}][[2]]

The lower anti-optimum longitudinal position, calculated as the point above the optimum where the maximum and minimum values among the various curves are most spread

antioptpos2[5] =x/. FindMaximum[Max[Table[curves[5][[j]][x],{j,Length[y[5]]}]]-Min[Table[curves[5][[j]][x],{j,Length[y[5]]}]],{x,18.1,17.8,18.5}][[2]]

The fractions of the maximum voltage at the anti-optima

antioptfrac1[5] = curves[5][[jcent[5]]][antioptpos1[5]]/openlight[5]

antioptfrac2[5] = curves[5][[jcent[5]]][antioptpos2[5]]/openlight[5]

A perturbation in x position that gives an arbitary 10% extra light than at the sensing sweet spot

pertpos[5]=x/.FindRoot[curves[5][[jcent[5]]][x]-openlight[5]*(optfrac[5]+0.1),{x,18.5}][[1]]

The tranverse cross-coupling (y slope scaled by open light) at the optimum in 1/mm

crossopt[5] = -(Dt[Interpolation[Table[{y[5][[j]],curves[5][[j]][optpos[5]]},{j,Length[y[5]]}]][y],y]/.y->y[5][[jcent[5]]])/openlight[5]

The transverse cross-coupling (y slope scaled by open light) at the perturbed position in 1/mm

crosspert[5] = -(Dt[Interpolation[Table[{y[5][[j]],curves[5][[j]][pertpos[5]]},{j,Length[y[5]]}]][y],y]/.y->y[5][[jcent[5]]])/openlight[5]

The cross-coupling compared to the sensitivity at the optimum, in percent

100 crossopt[5]/relslope[5]

The cross-coupling compared to the sensitivity at the perturbed position, in percent

100crosspert[5]/relslope[5]

Summary

With the new flag design, the output has very little sensitivity to transverse motion perpendicular to the beam direction.

For each BOSEM, there is a sensing sweet spot (cf. the actuation sweet spot), where the output is insensitive to transverse motion parallel to the beam direction - of order 0.3% of the sensitivity in the working direction.

At a longitudinal position giving 10% more light than at the sweet spot (chosen as an easy tolerance to meet), the cross-coupling to transverse was still a respectable 3% or so.

Worst case tranverse cross-coupling occurs at approximately 0.2 and 0.8 of open light where the cross-coupling is as much as 6%.

There is some variation in the position of the sweet spot as characterized by the fraction of open light voltage - in a convenience sample of 3 BOSEMs, the sweet spot ranged from 0.39 to 0.49 of open light. Thus if reducing cross-coupling is important, each BOSEM needs to be characterized separately to find the sweet spot.

Although the longitudinal DC response is independent of transverse position near the sweet spot, the sensitivity to longitudinal perturbations around that working point changes by a factor of about ±25% across the ±1 mm of possible transverse motion. Thus if gain consistency is important, accurate centering is required. Since vertical drift of the suspended components is more likely than horizontal, the flags should be placed with the edges vertically.