source: MML/trunk/mml/doc_html/mml/hw2physics.html

Last change on this file was 4, checked in by zhangj, 11 years ago

Initial import--MML version from SOLEIL@2013

File size: 40.3 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2                "http://www.w3.org/TR/REC-html40/loose.dtd">
3<html>
4<head>
5  <title>Description of hw2physics</title>
6  <meta name="keywords" content="hw2physics">
7  <meta name="description" content="HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units">
8  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
9  <meta name="generator" content="m2html &copy; 2003 Guillaume Flandin">
10  <meta name="robots" content="index, follow">
11  <link type="text/css" rel="stylesheet" href="../m2html.css">
12</head>
13<body>
14<a name="_top"></a>
15<div><a href="../index.html">Home</a> &gt;  <a href="index.html">mml</a> &gt; hw2physics.m</div>
16
17<!--<table width="100%"><tr><td align="left"><a href="../index.html"><img alt="<" border="0" src="../left.png">&nbsp;Master index</a></td>
18<td align="right"><a href="index.html">Index for mml&nbsp;<img alt=">" border="0" src="../right.png"></a></td></tr></table>-->
19
20<h1>hw2physics
21</h1>
22
23<h2><a name="_name"></a>PURPOSE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
24<div class="box"><strong>HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</strong></div>
25
26<h2><a name="_synopsis"></a>SYNOPSIS <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
27<div class="box"><strong>function S = hw2physics(Family, Field, value, DeviceList, Energy) </strong></div>
28
29<h2><a name="_description"></a>DESCRIPTION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
30<div class="fragment"><pre class="comment">HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units
31  ValPhysics = hw2physics(Family, Field, ValHW, DeviceList, Energy)
32
33  For data structure inputs:
34  ValPhysics = hw2physics(DataStructure, Energy)
35
36  HW2PHYSICS converts the values in 'Hardware' units read from PV's
37  to 'Physics' units using the conversion function and conversion paramaters
38  stored in the AO fields HW2PhysicsFcn and HW2PhysicsParams
39
40  Energy can be anything getenergy accepts, like 'Model' or 'Online' {Default: 'Production'}
41
42  INPUTS
43  1.  Family - Familyname
44  2.  Field - Typically 'Monitor' or 'Setpoint'
45  3.  value - Data for conversion
46  4.  DeviceList - List of devices
47  5.  Energy - Extra parameter for energy. Default is 'Production'
48
49  OUTPUTS
50  1. S - Result of conversion from hardwareto physics units
51
52  NOTES
53  1. Field is typically 'Monitor' or 'Setpoint'
54  2. For structure inputs, if the data is already in physics units
55     then no conversion will be done!
56  3. Energy may not be dealt with directly in this function, it
57     depends on how HW2PhysicsFcn deals with energy change.
58  4. The gain/offset conversions are done in raw2real &amp; real2raw.
59
60  See also hw2physic, <a href="raw2real.html" class="code" title="function DataOut = raw2real(varargin)">raw2real</a>, <a href="real2raw.html" class="code" title="function DataOut = real2raw(varargin)">real2raw</a>
61
62  Written by A. Terebilo and G. Portmann</pre></div>
63
64<!-- crossreference -->
65<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
66This function calls:
67<ul style="list-style-image:url(../matlabicon.gif)">
68<li><a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>   FAMILY2DEV - Return the device list for a family</li><li><a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a> GETENERGY - Returns the beam energy base on the bend magnet</li><li><a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>  GETFAMILYDATA - Gets data associated with the accelerator control</li><li><a href="getoffset.html" class="code" title="function Data = getoffset(varargin)">getoffset</a>       GETOFFSET - Returns the offset values for a family</li><li><a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>      HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</li><li><a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>    ISMEMBEROF - Returns turn if the membership information of a family (cell of strings)</li><li><a href="raw2real.html" class="code" title="function DataOut = raw2real(varargin)">raw2real</a>   RAW2REAL - Converts raw control system data to calibrated values</li></ul>
69This function is called by:
70<ul style="list-style-image:url(../matlabicon.gif)">
71<li><a href="bpmresp2loco.html" class="code" title="function [R, Data, DataMM] = bpmresp2loco(R)">bpmresp2loco</a>      BPMRESP2LOCO - Convert a MML response matrix to LOCO units</li><li><a href="calceta.html" class="code" title="function [d, Dy] = calceta(d, varargin)">calceta</a>      CALCETA - Calculates the dispersion function in physics or hardware units</li><li><a href="family2tol.html" class="code" title="function [Data, ErrorFlag] = family2tol(varargin)">family2tol</a>       FAMILY2TOL - Return the (SP-AM) tolerance for a family</li><li><a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>   GETENERGY - Returns the beam energy base on the bend magnet</li><li><a href="getgolden.html" class="code" title="function Data = getgolden(varargin)">getgolden</a>     GETGOLDEN - Returns the golden values for a family</li><li><a href="getoffset.html" class="code" title="function Data = getoffset(varargin)">getoffset</a>      GETOFFSET - Returns the offset values for a family</li><li><a href="getpv.html" class="code" title="function [AM, tout, DataTime, ErrorFlag] = getpv(varargin)">getpv</a>       GETPV - Returns a variable from the online system or the model</li><li><a href="getramprate.html" class="code" title="function RampRate = getramprate(varargin)">getramprate</a>        GETRAMPRATE - Returns the ramp rate for a family</li><li><a href="getrespmat.html" class="code" title="function [S, FileName] = getrespmat(varargin)">getrespmat</a>    GETRESPMAT - Get response matrix data from a file</li><li><a href="getsigma.html" class="code" title="function [Data, FileName] = getsigma(varargin)">getsigma</a>      GETSIGMA - Return the standard deviation in the monitor for a family</li><li><a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>    HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</li><li><a href="maxpv.html" class="code" title="function [Data, ErrorFlag] = maxpv(varargin)">maxpv</a> MAXPV - Maximum value of a process variable</li><li><a href="measbpmresp.html" class="code" title="function [Rmat, OutputFileName] = measbpmresp(varargin)">measbpmresp</a>     MEASBPMRESP - Measures the BPM response matrix in the horizontal and vertical planes</li><li><a href="measchro.html" class="code" title="function [Chromaticity, FileName] = measchro(varargin)">measchro</a>   MEASCHRO -  measures the chromaticity function emperically</li><li><a href="measchroresp.html" class="code" title="function [Rmat, OutputFileName] = measchroresp(varargin)">measchroresp</a>   MEASCHRORESP - measures the response from sextupoles to chromaticity</li><li><a href="measdisp.html" class="code" title="function [Dx, Dy, FileName] = measdisp(varargin);">measdisp</a>        MEASDISP - Measures the dispersion function</li><li><a href="measrespmat.html" class="code" title="function S = measrespmat(varargin)">measrespmat</a>  MEASRESPMAT - Measure a response matrix</li><li><a href="minpv.html" class="code" title="function [Data, ErrorFlag] = minpv(varargin)">minpv</a>        MinPV - Maximum value of a process variable</li><li><a href="monmags.html" class="code" title="function [MagnetSetpoints, MagnetMonitors, BPMMonitors, MagnetSetpointsEnd, FileName] = monmags(varargin)">monmags</a>   MONMAGS - Monitors all magnet power supplies and plots various statistics</li><li><a href="orbitcorrectionmethods.html" class="code" title="function [OCS, SmatNoWeights, S, U, V] = orbitcorrectionmethods(OCS, Smat, S, U, V)">orbitcorrectionmethods</a>     ORBITCORRECTIONMETHODS - Some the orbit correction methods used on light sources</li><li><a href="plotbpmrespsym.html" class="code" title="function plotbpmrespsym(R)">plotbpmrespsym</a>       PLOTBPMRESPSYM - Looks for symmetry of the orbit response matrix</li><li><a href="plotchro.html" class="code" title="function [c, FileName] = plotchro(varargin)">plotchro</a>  PLOTCHRO - Plot the chromaticity function</li><li><a href="plotcm.html" class="code" title="function [DeltaRF, HCMEnergyChangeTotal, DeltaL] = plotcm(varargin)">plotcm</a>     PLOTCM - Plots the horizontal and vertical corrector magnet families and</li><li><a href="plotdisp.html" class="code" title="function [DxOut, DyOut, FileName] = plotdisp(varargin)">plotdisp</a>       PLOTDISP - Plots the dispersion function</li><li><a href="plotgoldenorbit.html" class="code" title="function plotgoldenorbit(varargin)">plotgoldenorbit</a>     PLOTGOLDENORBIT - Plots the golden orbit</li><li><a href="plotoffsetorbit.html" class="code" title="function plotoffsetorbit(varargin)">plotoffsetorbit</a>     PLOTOFFSETORBIT - Plots the offset orbit</li><li><a href="setenergy.html" class="code" title="function [ConfigSetpointEnd, ConfigSetpointStart, ConfigSetpointPhysics] = setenergy(varargin)">setenergy</a>     SETENERGY - Sets the storage ring energy (GeV) by ramping all lattice magnets</li><li><a href="setpv.html" class="code" title="function ErrorFlag = setpv(varargin)">setpv</a>  SETPV - Setpoint change of the online system or model</li><li><a href="showmachinedata.html" class="code" title="function showmachinedata(families)">showmachinedata</a>        SHOWMACHINEDATA - Display setpoints and readbacks for families in AcceleratorObjects</li></ul>
72<!-- crossreference -->
73
74
75<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
76<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function S = hw2physics(Family, Field, value, DeviceList, Energy)</a>
770002 <span class="comment">%HW2PHYSICS - Converts from 'Hardware' units to 'Physics' units</span>
780003 <span class="comment">%  ValPhysics = hw2physics(Family, Field, ValHW, DeviceList, Energy)</span>
790004 <span class="comment">%</span>
800005 <span class="comment">%  For data structure inputs:</span>
810006 <span class="comment">%  ValPhysics = hw2physics(DataStructure, Energy)</span>
820007 <span class="comment">%</span>
830008 <span class="comment">%  HW2PHYSICS converts the values in 'Hardware' units read from PV's</span>
840009 <span class="comment">%  to 'Physics' units using the conversion function and conversion paramaters</span>
850010 <span class="comment">%  stored in the AO fields HW2PhysicsFcn and HW2PhysicsParams</span>
860011 <span class="comment">%</span>
870012 <span class="comment">%  Energy can be anything getenergy accepts, like 'Model' or 'Online' {Default: 'Production'}</span>
880013 <span class="comment">%</span>
890014 <span class="comment">%  INPUTS</span>
900015 <span class="comment">%  1.  Family - Familyname</span>
910016 <span class="comment">%  2.  Field - Typically 'Monitor' or 'Setpoint'</span>
920017 <span class="comment">%  3.  value - Data for conversion</span>
930018 <span class="comment">%  4.  DeviceList - List of devices</span>
940019 <span class="comment">%  5.  Energy - Extra parameter for energy. Default is 'Production'</span>
950020 <span class="comment">%</span>
960021 <span class="comment">%  OUTPUTS</span>
970022 <span class="comment">%  1. S - Result of conversion from hardwareto physics units</span>
980023 <span class="comment">%</span>
990024 <span class="comment">%  NOTES</span>
1000025 <span class="comment">%  1. Field is typically 'Monitor' or 'Setpoint'</span>
1010026 <span class="comment">%  2. For structure inputs, if the data is already in physics units</span>
1020027 <span class="comment">%     then no conversion will be done!</span>
1030028 <span class="comment">%  3. Energy may not be dealt with directly in this function, it</span>
1040029 <span class="comment">%     depends on how HW2PhysicsFcn deals with energy change.</span>
1050030 <span class="comment">%  4. The gain/offset conversions are done in raw2real &amp; real2raw.</span>
1060031 <span class="comment">%</span>
1070032 <span class="comment">%  See also hw2physic, raw2real, real2raw</span>
1080033 <span class="comment">%</span>
1090034 <span class="comment">%  Written by A. Terebilo and G. Portmann</span>
1100035
1110036 S = [];
1120037
1130038 <span class="keyword">if</span> nargin &lt; 1
1140039     error(<span class="string">'1 (data structure), 3, or 4 inputs required'</span>);
1150040 <span class="keyword">end</span>
1160041
1170042 <span class="keyword">if</span> ischar(Family)
1180043     <span class="keyword">if</span> nargin &lt; 3
1190044         error(<span class="string">'3-4 inputs required'</span>);
1200045     <span class="keyword">end</span>
1210046     <span class="keyword">if</span> nargin &lt; 4
1220047         DeviceList = [];
1230048     <span class="keyword">end</span>
1240049     <span class="keyword">if</span> isempty(DeviceList)
1250050         DeviceList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(Family);
1260051     <span class="keyword">end</span>
1270052     <span class="keyword">if</span> nargin &lt; 5
1280053         Energy = <span class="string">'Production'</span>;
1290054     <span class="keyword">end</span>
1300055     
1310056     <span class="keyword">if</span> size(DeviceList,1) ~= size(value,1)
1320057         <span class="keyword">if</span> size(value,1) == 1
1330058             value = ones(size(DeviceList,1),1) * value;
1340059         <span class="keyword">else</span>
1350060             error(<span class="string">'The length of ValHW must match the number of devices'</span>);
1360061         <span class="keyword">end</span>
1370062     <span class="keyword">end</span>
1380063     
1390064     FunctionStr = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(Family, Field, <span class="string">'HW2PhysicsFcn'</span>);
1400065     Params      = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(Family, Field, <span class="string">'HW2PhysicsParams'</span>, DeviceList);
1410066     
1420067     
1430068     <span class="comment">% First convert to &quot;corrected&quot; hardware units (usually based on LOCO gains)</span>
1440069     value = <a href="raw2real.html" class="code" title="function DataOut = raw2real(varargin)">raw2real</a>(Family, Field, value, DeviceList);
1450070
1460071     <span class="keyword">if</span> isempty(FunctionStr)
1470072         <span class="keyword">if</span> isempty(Params)
1480073             <span class="comment">% No info on how to convert, so use a gain of 1</span>
1490074             S = value;
1500075         <span class="keyword">else</span>
1510076             <span class="comment">% If no function, use a constant scaling</span>
1520077             <span class="keyword">for</span> i = 1:size(value,2)
1530078                 S(:,i) = value(:,i) .* Params(:,1);
1540079             <span class="keyword">end</span>
1550080         <span class="keyword">end</span>
1560081
1570082         <span class="comment">% Energy scaling this way works for magnets but not BPMs, RF, or maybe other stuff!</span>
1580083         <span class="comment">% So if you want energy scaling do it with a function like amp2k</span>
1590084         <span class="comment">% if ~ismemberof(Family,'BPM')</span>
1600085         <span class="comment">%    if isempty(Energy)</span>
1610086         <span class="comment">%        Energy = getenergy;</span>
1620087         <span class="comment">%    elseif ischar(Energy)</span>
1630088         <span class="comment">%        Energy = getenergy(Energy);</span>
1640089         <span class="comment">%    end</span>
1650090         <span class="comment">%    S(:,i) = S(:,i) * getbrho(getenergy('Production')) / getbrho(Energy);</span>
1660091         <span class="comment">% end</span>
1670092         <span class="keyword">if</span> ~ischar(Energy)
1680093             <span class="comment">% Expand to the length of Energy input</span>
1690094             <span class="keyword">if</span> size(S,1) == 1
1700095                 S = S * ones(1,size(Energy,2));
1710096             <span class="keyword">end</span>
1720097         <span class="keyword">end</span>
1730098
1740099     <span class="keyword">else</span>
1750100         <span class="comment">% Use inline or user specified function</span>
1760101         <span class="keyword">if</span> isempty(Energy)
1770102             Energy = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>;
1780103         <span class="keyword">elseif</span> ischar(Energy)
1790104             Energy = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>(Energy);
1800105         <span class="keyword">end</span>
1810106         <span class="keyword">if</span> iscell(Params)
1820107             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, Params{:});
1830108         <span class="keyword">elseif</span> isempty(Params)
1840109             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy);
1850110         <span class="keyword">elseif</span> isstr(Params)
1860111             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, Params);
1870112         <span class="keyword">else</span>
1880113             <span class="comment">% This will make all elements in the row vector a separate input</span>
1890114             ParamsList = num2cell(Params,1);
1900115             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, ParamsList{:});
1910116         <span class="keyword">end</span>
1920117     <span class="keyword">end</span>
1930118
1940119 <span class="keyword">elseif</span> isstruct(Family)   
1950120     <span class="comment">% Convert entire data structure e.g. response matrix</span>
1960121     S = Family;
1970122   
1980123     <span class="keyword">for</span> j = 1:size(S,1)
1990124         <span class="keyword">for</span> k = 1:size(S,2)
2000125
2010126             <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Monitor'</span>) &amp; isfield(S(j,k),<span class="string">'Actuator'</span>)
2020127                 <span class="comment">% Response matrix structure</span>
2030128
2040129                 <span class="keyword">if</span> nargin &lt; 2
2050130                     <span class="comment">%Energy = 'Production';</span>
2060131                     Energy = S(j,k).GeV;
2070132                 <span class="keyword">else</span>
2080133                     Energy = Field;
2090134                 <span class="keyword">end</span>
2100135
2110136                 <span class="comment">% Note: Chromaticity and Dispersion are special cases</span>
2120137                 <span class="keyword">if</span> strcmpi(S(j,k).Monitor.FamilyName, <span class="string">'Chromaticity'</span>)
2130138                     <span class="comment">% Chromaticity response matrix</span>
2140139                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Physics'</span>)
2150140                         RF = S(j,k).Monitor.Actuator.Data;
2160141                         MCF = S(j,k).Monitor.MCF;
2170142                         S(j,k).Data = - S(j,k).Data * RF(1) * MCF;
2180143                         S(j,k).Monitor  = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Monitor);    <span class="comment">% Chromaticity structure (also a response structure)</span>
2190144                         
2200145                         ActuatorDeltaHardware = S(j,k).ActuatorDelta;
2210146                         S(j,k).ActuatorDelta = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, S(j,k).ActuatorDelta + S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV) - <span class="keyword">...</span>
2220147                                                <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV);
2230148                         ActuatorScaleFactor = S(j,k).ActuatorDelta ./ ActuatorDeltaHardware;
2240149                         ActuatorScaleFactor = ActuatorScaleFactor(:)';
2250150                         S(j,k).Actuator = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator, S(j,k).GeV);  <span class="comment">% Sextupole</span>
2260151                         
2270152                         <span class="comment">% Scalar row by the actuator scaling</span>
2280153                         <span class="keyword">for</span> i = 1:size(S(j,k).Data,1)
2290154                             S(j,k).Data(i,:) = S(j,k).Data(i,:) ./ ActuatorScaleFactor;
2300155                         <span class="keyword">end</span>
2310156                         
2320157                         <span class="comment">% Change units and UnitsString fields</span>
2330158                         <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Units'</span>)
2340159                             S(j,k).Units = <span class="string">'Physics'</span>;
2350160                         <span class="keyword">end</span>
2360161                         <span class="keyword">if</span> isfield(S(j,k),<span class="string">'UnitsString'</span>)
2370162                             <span class="keyword">if</span> isfield(S(j,k).Monitor,<span class="string">'UnitsString'</span>) &amp; isfield(S(j,k).Actuator,<span class="string">'UnitsString'</span>)
2380163                                 <span class="comment">%S(j,k).UnitsString = '(Fractional Tune/(dp/p))/meter^-3';</span>
2390164                                 S(j,k).UnitsString = [S(j,k).Monitor.UnitsString , <span class="string">'/'</span>, S(j,k).Actuator.UnitsString];
2400165                             <span class="keyword">else</span>
2410166                                 S(j,k).UnitsString = <span class="string">''</span>;
2420167                             <span class="keyword">end</span>
2430168                         <span class="keyword">end</span>
2440169                     <span class="keyword">end</span>
2450170                 <span class="keyword">elseif</span> strcmpi(S(j,k).Monitor.FamilyName, <span class="string">'TUNE'</span>) &amp; strcmpi(S(j,k).Actuator.FamilyName, <span class="string">'RF'</span>)
2460171                     <span class="comment">% Chromaticity measurement</span>
2470172                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Physics'</span>)
2480173                         RF = S(j,k).Actuator.Data;
2490174                         MCF = S(j,k).MCF;
2500175                         S(j,k).Data = - S(j,k).Data * RF(1) * MCF;
2510176                         
2520177                         <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Tune'</span>) &amp; isfield(S(j,k),<span class="string">'PolyFit'</span>)
2530178                             p = polyfit(S(j,k).dp, S(j,k).Tune(1,:), 2);
2540179                             S(j,k).PolyFit(1,:) = p;
2550180                             <span class="comment">% S(j,k).Data(1,1) = p(2);</span>
2560181                             p = polyfit(S(j,k).dp, S(j,k).Tune(2,:), 2);
2570182                             S(j,k).PolyFit(2,:) = p;
2580183                             <span class="comment">% S(j,k).Data(2,1) = p(2);</span>
2590184                         <span class="keyword">end</span>
2600185                         
2610186                         <span class="comment">% Convert the Monitor and Actuator fields</span>
2620187                         <span class="comment">%S(j,k).Monitor  = hw2physics(S(j,k).Monitor);   % Tune structure (same in Hardware and Physics)</span>
2630188                         S(j,k).ActuatorDelta = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, S(j,k).ActuatorDelta + S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV) - <span class="keyword">...</span>
2640189                                                <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV);
2650190                         S(j,k).Actuator = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator, S(j,k).GeV);  <span class="comment">% RF</span>
2660191
2670192                         S(j,k).Units = <span class="string">'Physics'</span>;
2680193                         <span class="comment">%S(j,k).UnitsString = '1/(dp/p)';</span>
2690194                         S(j,k).UnitsString = [S(j,k).Monitor.UnitsString,<span class="string">'/(dp/p)'</span>];
2700195                     <span class="keyword">end</span>
2710196                 <span class="keyword">elseif</span> <a href="ismemberof.html" class="code" title="function  [IsTest, Index] = ismemberof(FamilyName, Field, MemberString)">ismemberof</a>(S(j,k).Monitor.FamilyName, <span class="string">'BPM'</span>) &amp; strcmpi(S(j,k).Actuator.FamilyName, <span class="string">'RF'</span>)
2720197                     <span class="comment">% Dispersion measurement</span>
2730198                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Physics'</span>)
2740199                         <span class="comment">% Change to physics units</span>
2750200                         
2760201                         <span class="comment">% Change the numerator as if it was a BPM (but remove the offset)</span>
2770202                         d = S(j,k).Monitor;
2780203                         d.Data = S(j,k).Data + <a href="getoffset.html" class="code" title="function Data = getoffset(varargin)">getoffset</a>(S(j,k).Monitor.FamilyName, <span class="string">'Monitor'</span>, S(j,k).Monitor.DeviceList, <span class="string">'Hardware'</span>);
2790204                         d = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(d, S(j,k).GeV);
2800205                         S(j,k).Data = d.Data;
2810206                         
2820207                         <span class="comment">% Change to denominator to energy shift (dp/p)</span>
2830208                         RF = S(j,k).Actuator.Data;
2840209                         MCF = S(j,k).MCF;
2850210                         S(j,k).Data = -RF(1) * MCF * S(j,k).Data;
2860211                         
2870212                         <span class="comment">% Change the Monitor and Actuator fields</span>
2880213                         S(j,k).Monitor  = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Monitor, S(j,k).GeV);
2890214                         S(j,k).ActuatorDelta = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, S(j,k).ActuatorDelta + S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV) - <span class="keyword">...</span>
2900215                                                <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV);
2910216                         S(j,k).Actuator = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator, S(j,k).GeV);
2920217
2930218                         S(j,k).Units = <span class="string">'Physics'</span>;
2940219                         S(j,k).UnitsString = [S(j,k).Monitor.UnitsString,<span class="string">'/(dp/p)'</span>];
2950220                     <span class="keyword">end</span>
2960221                     
2970222                 <span class="keyword">else</span>
2980223                     <span class="comment">% Typical response matrix  (usually orbit/corrector)</span>
2990224                     <span class="comment">% Need to determine the hw2physics scaling for delta monitor / delta actuator</span>
3000225                     
3010226                     <span class="comment">% Only change units if in 'Hardware' units</span>
3020227                     <span class="keyword">if</span> strcmpi(S(j,k).Actuator.Units, <span class="string">'Hardware'</span>)                       
3030228                         <span class="comment">% Convert .ActuatorDelta</span>
3040229                         ActuatorDeltaHW = S(j,k).ActuatorDelta;
3050230                         
3060231                         <span class="comment">% Scale Factor without energy scaling (since physics units are the same at all energies)</span>
3070232                         S(j,k).ActuatorDelta = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, S(j,k).ActuatorDelta + S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV) - <span class="keyword">...</span>
3080233                                                <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV);
3090234
3100235                         <span class="comment">% Physics units / HW units</span>
3110236                         ActuatorScaleFactor = S(j,k).ActuatorDelta ./ ActuatorDeltaHW;
3120237                         ActuatorScaleFactor = ActuatorScaleFactor(:)';
3130238             
3140239                         <span class="comment">% Convert .Actuator field</span>
3150240                         S(j,k).Actuator = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Actuator, S(j,k).GeV);
3160241                         
3170242                         <span class="comment">%ActuatorData = S(j,k).Actuator.Data;</span>
3180243                         <span class="comment">%S(j,k).Actuator = physics2hw(S(j,k).Actuator);</span>
3190244                         <span class="comment">%if any(ActuatorData == 0)</span>
3200245                         <span class="comment">%    ActuatorScaleFactor = hw2physics(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, 1, S(j,k).Actuator.DeviceList, S(j,k).GeV);</span>
3210246                         <span class="comment">%else</span>
3220247                         <span class="comment">%    ActuatorScaleFactor = S(j,k).Actuator.Data ./ ActuatorData;</span>
3230248                         <span class="comment">%end</span>
3240249                     <span class="keyword">else</span>
3250250                         <span class="comment">% Don't include energy scaling of actuator if already in physics units</span>
3260251                         ActuatorScaleFactor = 1; <span class="comment">%Energy/S(j,k).GeV;</span>
3270252                         ActuatorDeltaHW = S(j,k).ActuatorDelta;
3280253                     <span class="keyword">end</span>
3290254                     
3300255
3310256                     <span class="comment">% Only change units if in 'Hardware' units</span>
3320257                     <span class="keyword">if</span> strcmpi(S(j,k).Monitor.Units, <span class="string">'Hardware'</span>)                       
3330258                         <span class="comment">% Just to get an approximate scaling for the monitor size</span>
3340259                         <span class="comment">%MonitorDeltaHW = max(abs(S(j,k).Data(:,1) * ActuatorDeltaHW(1)));</span>
3350260                         <span class="comment">%MonitorDelta = hw2physics(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, MonitorDeltaHW + S(j,k).Monitor.Data, S(j,k).Monitor.DeviceList, S(j,k).GeV) - ...</span>
3360261                         <span class="comment">%               hw2physics(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field,                  S(j,k).Monitor.Data, S(j,k).Monitor.DeviceList, S(j,k).GeV);</span>
3370262                         <span class="comment">%%MonitorDelta = hw2physics(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, MonitorDeltaHW, S(j,k).Monitor.DeviceList, Energy) - getoffset(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 'Hardware');</span>
3380263                         <span class="comment">%</span>
3390264                         <span class="comment">%MonitorScaleFactor = MonitorDelta ./ MonitorDeltaHW;</span>
3400265                         <span class="comment">%MonitorScaleFactor = MonitorScaleFactor(:);</span>
3410266                         
3420267                         <span class="comment">% hw2physics must be linear for this to work, but the other methods have issues with small numbers</span>
3430268                         <span class="comment">%MonitorScaleFactor = hw2physics(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 1+getoffset(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field), S(j,k).Monitor.DeviceList, S(j,k).GeV, 'Hardware');</span>
3440269                         MonitorScaleFactor = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 1, S(j,k).Monitor.DeviceList, S(j,k).GeV) - <span class="keyword">...</span>
3450270                                              <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 0, S(j,k).Monitor.DeviceList, S(j,k).GeV);
3460271
3470272                         <span class="comment">% Convert .Monitor field</span>
3480273                         S(j,k).Monitor = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).Monitor, S(j,k).GeV);
3490274                         
3500275                         <span class="comment">%MonitorData = S(j,k).Monitor.Data;</span>
3510276                         <span class="comment">%S(j,k).Monitor = physics2hw(S(j,k).Monitor);</span>
3520277                         <span class="comment">%if any(MonitorData == 0)</span>
3530278                         <span class="comment">%    % This might introduce an error if physics2hw is nonlinear</span>
3540279                         <span class="comment">%    MonitorScaleFactor = hw2physics(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 1, S(j,k).Monitor.DeviceList, S(j,k).GeV);</span>
3550280                         <span class="comment">%else</span>
3560281                         <span class="comment">%    MonitorScaleFactor = S(j,k).Monitor.Data ./ MonitorData;</span>
3570282                         <span class="comment">%end</span>
3580283                     <span class="keyword">else</span>
3590284                         MonitorScaleFactor = 1;
3600285                     <span class="keyword">end</span>
3610286
3620287                     
3630288                     <span class="comment">% Scalar column by the monitor scaling</span>
3640289                     <span class="keyword">for</span> i = 1:size(S(j,k).Data,2)
3650290                         S(j,k).Data(:,i) = MonitorScaleFactor .* S(j,k).Data(:,i);
3660291                     <span class="keyword">end</span>
3670292                     <span class="comment">%S(j,k).MonitorScaleFactor = MonitorScaleFactor;</span>
3680293                     
3690294                     <span class="comment">% Scalar row by the actuator scaling</span>
3700295                     <span class="keyword">for</span> i = 1:size(S(j,k).Data,1)
3710296                         S(j,k).Data(i,:) = S(j,k).Data(i,:) ./ ActuatorScaleFactor;
3720297                     <span class="keyword">end</span>
3730298                     <span class="comment">%S(j,k).ActuatorScaleFactor = ActuatorScaleFactor;</span>
3740299                     
3750300                     S(j,k).GeV = Energy;
3760301
3770302                     <span class="comment">% Change units and unitsstring fields</span>
3780303                     <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Units'</span>)
3790304                         S(j,k).Units = <span class="string">'Physics'</span>;
3800305                     <span class="keyword">end</span>
3810306                     <span class="keyword">if</span> isfield(S(j,k),<span class="string">'UnitsString'</span>)
3820307                         <span class="keyword">if</span> isfield(S(j,k).Monitor,<span class="string">'UnitsString'</span>) &amp;&amp; isfield(S(j,k).Actuator,<span class="string">'UnitsString'</span>)
3830308                             S(j,k).UnitsString = [ <span class="keyword">...</span>
3840309                                     S(j,k).Monitor.UnitsString , <span class="string">'/'</span>, <span class="keyword">...</span>
3850310                                     S(j,k).Actuator.UnitsString];
3860311                             <span class="comment">%S(j,k).UnitsString = [ ...</span>
3870312                             <span class="comment">%        getfamilydata(S(j,k).Monitor.FamilyName,  S(j,k).Monitor.Field,  'PhysicsUnits') , '/', ...</span>
3880313                             <span class="comment">%        getfamilydata(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, 'PhysicsUnits')];</span>
3890314                         <span class="keyword">else</span>
3900315                             S(j,k).UnitsString = <span class="string">''</span>;
3910316                         <span class="keyword">end</span>
3920317                     <span class="keyword">end</span>
3930318                 <span class="keyword">end</span>
3940319
3950320             <span class="keyword">elseif</span> isfield(S(j,k),<span class="string">'FamilyName'</span>) &amp; isfield(S(j,k),<span class="string">'Field'</span>)
3960321                 <span class="comment">% Data structure</span>
3970322
3980323                 <span class="keyword">if</span> nargin &lt; 2
3990324                     <span class="keyword">if</span> isfield(S(j,k), <span class="string">'GeV'</span>)
4000325                         Energy = S(j,k).GeV;
4010326                     <span class="keyword">else</span>
4020327                         Energy = <span class="string">'NoEnergyScaling'</span>;
4030328                         <span class="comment">%Energy = 'Production';</span>
4040329                     <span class="keyword">end</span>
4050330                 <span class="keyword">else</span>
4060331                     Energy = Field;
4070332                 <span class="keyword">end</span>
4080333
4090334                 <span class="comment">% Only change units if in 'Hardware' units</span>
4100335                 <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Physics'</span>)
4110336                     <span class="comment">% First convert to &quot;corrected&quot; hardware units</span>
4120337                     <span class="comment">%S(j,k) = raw2real(S(j,k));  Done in hw2physics for FamilyName inputs</span>
4130338                     
4140339                     S(j,k).Data = <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>(S(j,k).FamilyName, S(j,k).Field, S(j,k).Data, S(j,k).DeviceList, Energy);
4150340                     S(j,k).Units = <span class="string">'Physics'</span>;
4160341                     S(j,k).UnitsString = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(S(j,k).FamilyName, S(j,k).Field, <span class="string">'PhysicsUnits'</span>);
4170342                 <span class="keyword">end</span>
4180343                 
4190344             <span class="keyword">else</span>
4200345                 error(<span class="string">'Unknown data structure type'</span>);
4210346             <span class="keyword">end</span>
4220347         <span class="keyword">end</span>
4230348     <span class="keyword">end</span>
4240349     
4250350 <span class="keyword">elseif</span> iscell(Family)
4260351     error(<span class="string">'Cell array inputs not programmed yet'</span>);
4270352     
4280353 <span class="keyword">else</span> 
4290354     error(<span class="string">'Input #1 type unknown'</span>);
4300355 <span class="keyword">end</span>
4310356
4320357</pre></div>
433<hr><address>Generated on Mon 21-May-2007 15:29:18 by <strong><a href="http://www.artefact.tk/software/matlab/m2html/">m2html</a></strong> &copy; 2003</address>
434</body>
435</html>
Note: See TracBrowser for help on using the repository browser.