- LRCMP - COMPUTES HEIGHTS,ANGLES GIVEN LASER RANGING DISTANCES.
- LRCMPDIST3 - COMPUTE PLTAVGHGT FOR ENTRIES WITH MISSING DISTOMAT READINGS
- LRDIST3INP - INPUT THE COEF FOR THE 3 DISTOMAT FITS
- LRPCINP - INPUT PC LASER RANGING DATA.
- LRPCINPRANGE - INPUT A RANGE OF PC LASER RANGING DATA.
- LRPLOTDIAG - PLOT DIAGNOSTIC INFO
- LRPLOTDISTFAIL - PLOT DISTOMAT FAILURES BY AZ,ZA
- LRPLOTHGHT - PLOT THE PLATFORM HEIGHT VERSUS TIME
- LRPLOTTEMP - PLOT PLATFORM TEMP FOR THE DATA SET PASSED IN.

NAME: lrcmp - computes heights,angles given laser ranging distances. SYNTAX: istat=lrcmp(pcdat,retdat,ext=ext) ARGS: pcdat[]: {lrpcinp} data read in by lrpcinp(). KEYWORDS: ext : if set then return extended lr data structure: Included space for az,zagr,zach (but they are not yet filled in). RETURNS: retdat[]: {lrdat} data with computed offsets. istat: int always returns number of entries in pcdatnumber of entries computed DESCRIPTION: The routine computes the platform positions from the distomat distances. It is called by lrpcinp after reading in the raw data from the laser ranging PC. The coordinates and matrices are: lr6 \ / lr1 \ /d1 d2 \ T12 / \ / \./ / \ / \ | / \ | \lr5 d3 / \d9 / lr2 | y (+ north) \ / \ / | d4 \ / \ /d8 ---------X \ / \ / x (+ west) \ / \ / T8 ----------------- T4 Z (+toward the bowl) / d6 \ / \ /d5 \d7 / \ /lr4 \lr3 The d's are the 9 distances (6 measured , 3 known) that will determine the 9 coordinates of the corners of the triangle delta_d=[d1,d2,d3,d4,d5,d6,d7,d8,d9] The matrix equation is: A*dx = delta_d where dx = [dx1,dy1,dz1,dx2,dy2,dz3,dx3,dy3,dz3] 1=t12,2=t8,3=t4 is the motion of these corners. then dx=delta_d * ainverse If you compare this with any c code remember that idl has the first index varying most rapidly and C has the second (mainly for the init of ainv below). The direction cosines look to be (cornerpoint - point)/dist The platform corners seem to go in the opposite directions then mmd,jayaram memo: T12,T8,T4 rather than T12,T4,T8. Lets hope the ref distances were also switched. the distomat ordering looks like lrn on the plot (i think). NOTES: let [] be a vector. [Cm] is the position of one of the 3 corners. [Crm] is the reference position for the [Cm]. [DRn] be one of the 6 distomat reference vectors. It points from the laser ranger to the target when the 3 platform corners are at [Crm]. [Dn] be the instantaneous position from laser ranger to target. deltaDn : magnitude of ([Dn]- [DRn]) [dxm] be the displacement vector from corner m : [Cm]-[Crm] Any motion of [dxm] perpendicular to [Dn] will not change the distance The change in distance will be the projection of [dxm] onto the [Dn] direction. Since the relative motions are small compared to the length of [DRn], use the unit vector of [DRn] rather than [Dn] when computing the dot product. The unit vector for a [DRn] is just [DRn]/magnitude(DRn) [Drn] points from the distomat to the target. As an example, DR1 is at -x,+y1,+z CRm is at 0,+y1a,0 where y1a

(See /pkg/rsi/local/libao/phil/lr/lrcmp.pro)

## LRCMPDIST3 - COMPUTE PLTAVGHGT FOR ENTRIES WITH MISSING DISTOMAT READINGS

[Previous Routine] [Next Routine] [List of Routines]NAME: lrcmpdist3 - compute pltAvgHgt for entries with missing distomat readings SYNTAX: n=lrcmpdist3(fitI,dist6,cmpI) ARGS: fitI : {} struct holding fit coef. see lrdist3inp() dist6[6,m]: float distances to check for computation RETURNS: cmpI:[] holding the fit results DESCRIPTION: Search dist6[6,m] for the entries that don't have 6 lr measurements. For those that have valid 3 135 or 3 246 reading (but not 6 good ones) , compute the average height from the fit coef in fitI (see lrdist3inp()). Return the indices into dist6[0,I] in ii[] for these entries. cmpI will contain: IDL> help,cmpi,/st ** Structure <8c3d18>, 4 tags, length=6480, data length=6472, refs=1: N LONG 462 number we found to compute II LONG Array[462] index into dist6[0,*] for this AVGPLTH DOUBLE Array[462] avg hght in meters SETUSED INT Array[462] 1 dist135, 2 246

(See /pkg/rsi/local/libao/phil/lr/lrcmpdist3.pro)

## LRDIST3INP - INPUT THE COEF FOR THE 3 DISTOMAT FITS

[Previous Routine] [Next Routine] [List of Routines]NAME: lrdist3inp - input the coef for the 3 distomat fits SYNTAX: istat=lrdist3inp(fitI,yymmdd=yymmdd,fname=fname) KEYWORDS: yymmdd: long date for data. If not supplied use current date. The coefs can be updated occasionally. fname: string filename for the coef. If not supplied use the default name. RETURNS: istat:int 0 ok -1 error inputing file -2 no data for requested date fitI: {} holds fitinfo DESCRIPTION: Input the coef's used to fit the avg plat height to 3 distomat distances.

(See /pkg/rsi/local/libao/phil/lr/lrdist3inp.pro)

## LRPCINP - INPUT PC LASER RANGING DATA.

[Previous Routine] [Next Routine] [List of Routines]NAME: lrpcinp - input pc laser ranging data. SYNTAX: npnts=lrpcinp(yymmdd,b,daynum=daynum,year=year,ext=ext,use3=use3) ARGS: yymmdd: long year,mon,day to input. -1 --> today RETURNS: npnts : int number of entries found b[npts]: {lrdat} array holding the data keywords: daynum: long if supplied then use daynum for day of year year : long if daynum supplied, then year to use. If not supplied, use current year. ext: if set then return extended info.. az,gr,ch positions. This uses the tdsummary info. It is not available for the current month. use3 : if set, then also compute hght if only 3 dist good either 1,3,5, or 2,4,6 For those points using only 3 distomats, only the avg height is computed, the cornerheights, offsets and rotations are not computed DESCRIPTION: The routine inputs a days worth of laser ranging data. It returns the data from the laser ranging PC as well as the heigts converted to feet above sea level (the conversion factors were measured in 1990 and have probably changed!). The data available on disc goes back about 8 months from the present. New samples are taken once every two minutes. During periods of rain, the distomats have no readings and the distances are set to 0. The data structure for the returned data is: The coordinate systems used are: C1: x-west,ynorth,z-down cm no corrections to move to Sea level crdSys C2: x-west,ynorth,z-up feet above sea level name type coordSys value description. DATE DOUBLE 1.0057176 daynumber with fractional day TEMPB FLOAT 0.00000 bowl temp F (not recorded) TEMPPL FLOAT 70.1000 platform temp degF DIST FLOAT Array[6] distomat distances [meters]. DISTTM FLOAT Array[6] secs when reading completed. AVGH FLOAT C2 1256.33 Average hght Ft above sealevel. CORNERH FLOAT C2 array[3] Corner hght [12,4,8] DX FLOAT C1 -1.50626 Avg x-translation [cm] DY FLOAT C1 4.52196 Avg y-translation [cm] DZ FLOAT C1 -100.191 Avg z-translation [cm] XROT FLOAT C1 -0.00127837 rotation about x-axis [rad] YROT FLOAT C1 0.00106705 rotation about y-axis [rad] ZROT FLOAT C1 -0.00022241 rotation about z-axis [rad] PNTS FLOAT C1 Array[3,3] [xyz,T12/T4/T8] corner points DOK INT 1 if all 6 distances measured ok -1 use dist 135 if use3 set -2 use dist 246 if use3 set SECPERPNT INT 120 spacing between measurements [secs] NOTES: You need to do @lrinit once before calling this routine to define the {lrdat} structure. History: 28feb18: include computation if disti 1,3,5 or 2,6,4 are valid this will use the model fit for 3 dist. update dok to be: dok=1 all 6 ok dok=-1 1,3,5 used for computation dok=-2 2,4,6 used for computation.

(See /pkg/rsi/local/libao/phil/lr/lrpcinp.pro)

## LRPCINPRANGE - INPUT A RANGE OF PC LASER RANGING DATA.

[Previous Routine] [Next Routine] [List of Routines]NAME: lrpcinprange - input a range of pc laser ranging data. SYNTAX: istat=lrpcinprange(year,mmdd1,mmdd2,b,ext=ext) ARGS: year: long 4 digit year of interest mmdd1: long mon,day to start mmdd2: long mon,day to end KEYWORDS: ext: if set then try and return extended info.. az,gr,ch positions. This uses the tdsummary info. It is not available for the current month. use3: if set then use 3 disto for avg hght if needed RETURNS: b[npts]: {lrdat} array holding the data istat : int number of entries found use current year. -1 if an error DESCRIPTION: The routine inputs multiple days worth of laser ranging data. It returns the data from the laser ranging PC as well as the heigts converted to feet above sea level (the conversion factors were measured in 1990 and have probably changed!). The data available goes back to 2000. The routine constrains you to 1 year at a time. see lrpcinp for a description of the data. NOTES: You need to do @lrinit once before calling this routine to define the {lrdat} structure.

(See /pkg/rsi/local/libao/phil/lr/lrpcinprange.pro)

## LRPLOTDIAG - PLOT DIAGNOSTIC INFO

[Previous Routine] [Next Routine] [List of Routines]NAME: lrplotdiag - plot diagnostic info SYNTAX:istat=lrplotdiag(yymmdd,tmr=tmr,diag=diag,v=v,psname=psname) ARGS: yymmdd: int yymmdd to plot KEYWORDS: tmr[2]: float time range for plot. hour of day [hr0,hr1] if only 1 value, then plot from hr0 to end of day. def: all day diag : int which diag to plot 1 - integration for each distomat vs hour of day (default) v[2] : float vertical scale for plot, if not supplied then autoscale with 5% slop on each end psname :string if supplied then generate a ps file with this name. (no terminal output) RETURNS: istat : int 1 ok -1 illegal diag code -2 illegal time range -3 illegal vertical scan . none or 2 numbers -4 no lr data for date -5 no lr data for time range DESCRIPTION: Plot diagnostic data vs hour of day. To use the routine: * The user specifies the date to use (yymmdd format). * You can optionally select a time range (in hours of day) using the tmr= keyword * Next you select the diagnostic to plot (curently only diag=1 is supported.. integegration time). * If you specify a filename for psname=filename then the plot will be sent to the postscript file Examples: idl71 @phil @lrinit psname='lrdiag_180514.ps' istat=lrplotdiag(180514,tmr=[14.,16.5],psname=psname .. to plot to screen istat=lrplotdiag(180514,tmr=[14.,16.5]

(See /pkg/rsi/local/libao/phil/lr/lrplotdiag.pro)

## LRPLOTDISTFAIL - PLOT DISTOMAT FAILURES BY AZ,ZA

[Previous Routine] [Next Routine] [List of Routines]NAME: lrplotdistfail - plot distomat failures by az,za SYNTAX: lrplotdistfail,d,year,gooddist=gooddist,includehr=includehr,$ exclHr=exclhr,totcnt=totcnt,badcnt=badcnt ARGS: d[npts]: {lrdat} laser ranging data input via lrpcinprange with the /ext option set. year: long 4 digit year for data in d (d had daynumber but no year) KEYWORDS: gooddist: int number of distomats that have to have good data before the measurement is used (default is 3). includehr:fltarr[2] range of hours (min,max) to use. default is 0 to 24. exclhr:fltarr[2] range of hours (min,max) to exclude. 0 to 24. title : string title to use on top of plot.. default is date range. RETURNS: totcnt:lonarr[2]: totcnt[0]: number of measurments made (after applying includehr, exclude hr, and the ch at stow. totcnt[1]: number of measurements that had at least 1 distomat bad but at least goodist ok. badcnt:lonarr[6]: number of bad counts for each distomat. also outputs the plot.. DESCRIPTION: Make a plot of distomat failures versus az,za for the data set passed in. To input the dataset use: lrpcinprange(y,mmdd1,mmdd2,d,/ext) Data is made available after the monthly processing of each month ( so the current months is not available unless the processing is run manually). The points in the dataset will be constrained so that: 1. there are at least "gooddist" distomat measurements for each point used. This is to eliminate heavy rainfall where all of them were out. The default value is that 3 distomats must be working. 2. The hour of the meausurment must fall within includehdr (default is 0 to 24) and it must not fall within excludehr (default is to not exclude anything. The hour include/exclude allows to to look at daytime or nighttime eg. includehr[6.,19.] will use 6am to 7pm (daylight) exclhr=[6.,19.] will exclude 6am to 7pm (to keep nighttime) The routine then plots the distomats that were not working versus azimuth and zenith angle. The distomats at the same platform corner are grouped together (1,6 td12), (2,3 td 4), (4,5 td8). Colors are used to differentiate the two distomats at each color. Yellow dashed lines are plotted at the azimuth of the corner that contains the two distomat targets and at 180 degrees away. This is the azimuth where the dome can cause the maximum platform tilt for this pair. Example: istat=lrpcinprange(2004,1201,1231,d,/ext) pscol,'lrfail_dec04.ps',/full lrplotdistfail,d,totcnt=totcnt,badcnt=badcnt hardcopy x

(See /pkg/rsi/local/libao/phil/lr/lrplotdistfail.pro)

## LRPLOTHGHT - PLOT THE PLATFORM HEIGHT VERSUS TIME

[Previous Routine] [Next Routine] [List of Routines]NAME: lrplothght - plot the platform height versus time SYNTAX: lrplothght,b,defhght=defhght,sym=sym,year=year ARGS: b[npts]: {lrdat} laser ranging data input via lrpcinp. KEYWORDS: defhght: float value to print out as default height (1256.22) sym: int symbol to use for each point (-1 to -8). def: no symbol year: long 4 digit year to use. Default is current year DESCRIPTION: Make a plot of platform height versus hour of day. The data in b[] must first be read in using the routine lrpcinp. The output is in feet above sea level and includes: white: the average platform height red: tower 12 height green: tower 4 height yellow: tower 8 height The date at the middle of the plot and the time,temp, and average height at the last point of the plot are printed (note that the last point is usually from the start of the next day). The plots show that the tiedowns are trying to keep the average height of the platform fixed while the corners move depending on the unbalanced load (which is a function of the dome/carriage house positions). Example: istat=lrpcinp(010505,b) ver,1256,1257 hor,0,24 lrplothght,b

(See /pkg/rsi/local/libao/phil/lr/lrplothght.pro)

## LRPLOTTEMP - PLOT PLATFORM TEMP FOR THE DATA SET PASSED IN.

[Previous Routine] [List of Routines]NAME: lrplottemp - plot platform temp for the data set passed in. SYNTAX: lrplottemp,d ,title=title,cs=cs,xp=xp,off=off,sep=sep,clip=clip,year=year ARGS: d[n]: {lrdist} data input from lrpcinprange KEYWORDS: title - string title for top of each plot cs - float scale factor for labels. For multiple windows you may want to increase this to 1.5 or 1.8. default is 1. xp - float xposition [0.,1.] where dates are printed. default:.02. For hardcopy setting this to 1. puts the dates on the right column. off - float number of degrees to offset each day within it's window so the plots don't lay on top of each other. defaut:0. sep - if set then make 1 plot per day user should set !p.multi before calling the routine. clip[] -float clip the data to [mintemp,maxtemp]. allows auto scaling with bad data points.. year - long for the first point of the file. If not supplied then assume the current year. DESCRIPTION Plot the platform temperature by hour of day for the data passed in. (the routine limits the output to a maximum of 31 days). The plot will have N subwindows with up to 7 consecutive days per window. Each day will be color coded within a window. Any extra days (>28 will appear in the last window). The routine internally uses daynumber of year for computations so it will not cross year boundaries gracefully. You should call ldcolph to setup the colortables for indices 0-10. You should also set the vertical scale to temperature range you want via ver,vmin,vmax. The horizontal scale should be set to hor,0,24. The extra keywords that may be used are: charsize=cs. If the multiple windows cause the letters to come out too small. EXAMPLES: hor,0,24 ver,70,90 lrplottemp,d,title='platform temps for jul01', cs=1.6 NOTES: The routine is setup to plot 1 month of data at a time.

(See /pkg/rsi/local/libao/phil/lr/lrplottemp.pro)