source: MML/trunk/mml/doc_html/mml/physics2hw.html @ 4

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

Initial import--MML version from SOLEIL@2013

File size: 39.5 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 physics2hw</title>
6  <meta name="keywords" content="physics2hw">
7  <meta name="description" content="PHYSICS2HW - Converts from 'Physics' units to 'Hardware' 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; physics2hw.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>physics2hw
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>PHYSICS2HW - Converts from 'Physics' units to 'Hardware' 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 = physics2hw(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">PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units
31  ValHW = hw2physics(Family, Field, ValPhysics, DeviceList, Energy)
32
33  For data structure inputs:
34  ValHW = hw2physics(DataStructure, Energy)
35
36  PHYSICS2HW converts the values from 'Physics' units to 'Hardware'
37  units for writting to PV's using the conversion function and
38  conversion paramaters stored in the AO
39
40  Energy can be anything getenergy accepts, like 'Model' or 'Online'
41
42  NOTES
43  1. Field is typically 'Monitor' or 'Setpoint'
44  2. For structure inputs, if the data is already in hardware units
45     then no conversion will be done!
46  3. Energy may not be dealt with directly in this function, it
47     depends on how Physics2HWFcn deals with energy change.
48  4. The gain/offset conversions are done in raw2real &amp; real2raw.
49
50  See also <a href="hw2physics.html" class="code" title="function S = hw2physics(Family, Field, value, DeviceList, Energy)">hw2physics</a>, <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>
51
52  Written by A. Terebilo and G. Portmann</pre></div>
53
54<!-- crossreference -->
55<h2><a name="_cross"></a>CROSS-REFERENCE INFORMATION <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
56This function calls:
57<ul style="list-style-image:url(../matlabicon.gif)">
58<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="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="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>   PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units</li><li><a href="real2raw.html" class="code" title="function DataOut = real2raw(varargin)">real2raw</a>  REAL2RAW - Converts "real" data (calibrated values) to control system data</li></ul>
59This function is called by:
60<ul style="list-style-image:url(../matlabicon.gif)">
61<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="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="getrespmat.html" class="code" title="function [S, FileName] = getrespmat(varargin)">getrespmat</a>      GETRESPMAT - Get response matrix data from a file</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="measdisp.html" class="code" title="function [Dx, Dy, FileName] = measdisp(varargin);">measdisp</a>        MEASDISP - Measures the dispersion function</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="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>        PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units</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="plotdisp.html" class="code" title="function [DxOut, DyOut, FileName] = plotdisp(varargin)">plotdisp</a>      PLOTDISP - Plots the dispersion function</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></ul>
62<!-- crossreference -->
63
64
65<h2><a name="_source"></a>SOURCE CODE <a href="#_top"><img alt="^" border="0" src="../up.png"></a></h2>
66<div class="fragment"><pre>0001 <a name="_sub0" href="#_subfunctions" class="code">function S = physics2hw(Family, Field, value, DeviceList, Energy)</a>
670002 <span class="comment">%PHYSICS2HW - Converts from 'Physics' units to 'Hardware' units</span>
680003 <span class="comment">%  ValHW = hw2physics(Family, Field, ValPhysics, DeviceList, Energy)</span>
690004 <span class="comment">%</span>
700005 <span class="comment">%  For data structure inputs:</span>
710006 <span class="comment">%  ValHW = hw2physics(DataStructure, Energy)</span>
720007 <span class="comment">%</span>
730008 <span class="comment">%  PHYSICS2HW converts the values from 'Physics' units to 'Hardware'</span>
740009 <span class="comment">%  units for writting to PV's using the conversion function and</span>
750010 <span class="comment">%  conversion paramaters stored in the AO</span>
760011 <span class="comment">%</span>
770012 <span class="comment">%  Energy can be anything getenergy accepts, like 'Model' or 'Online'</span>
780013 <span class="comment">%</span>
790014 <span class="comment">%  NOTES</span>
800015 <span class="comment">%  1. Field is typically 'Monitor' or 'Setpoint'</span>
810016 <span class="comment">%  2. For structure inputs, if the data is already in hardware units</span>
820017 <span class="comment">%     then no conversion will be done!</span>
830018 <span class="comment">%  3. Energy may not be dealt with directly in this function, it</span>
840019 <span class="comment">%     depends on how Physics2HWFcn deals with energy change.</span>
850020 <span class="comment">%  4. The gain/offset conversions are done in raw2real &amp; real2raw.</span>
860021 <span class="comment">%</span>
870022 <span class="comment">%  See also hw2physics, raw2real, real2raw</span>
880023 <span class="comment">%</span>
890024 <span class="comment">%  Written by A. Terebilo and G. Portmann</span>
900025
910026 S = [];
920027
930028 <span class="keyword">if</span> nargin &lt; 1
940029     error(<span class="string">'1 (data structure), 3, or 4 inputs required'</span>);
950030 <span class="keyword">end</span>
960031
970032 <span class="keyword">if</span> ischar(Family)
980033     <span class="keyword">if</span> nargin &lt; 3
990034         error(<span class="string">'At least 3 inputs required.'</span>);
1000035     <span class="keyword">end</span>
1010036     <span class="keyword">if</span> nargin &lt; 4
1020037         DeviceList = [];
1030038     <span class="keyword">end</span>
1040039     <span class="keyword">if</span> isempty(DeviceList)
1050040         DeviceList = <a href="family2dev.html" class="code" title="function DeviceList = family2dev(Family, varargin);">family2dev</a>(Family);
1060041     <span class="keyword">end</span>
1070042     <span class="keyword">if</span> nargin &lt; 5
1080043         Energy = <span class="string">'Production'</span>;
1090044     <span class="keyword">end</span>
1100045     
1110046     <span class="keyword">if</span> size(DeviceList,1) ~= size(value,1)
1120047         <span class="keyword">if</span> size(value,1) == 1
1130048             value = value * ones(size(DeviceList,1),1);
1140049         <span class="keyword">else</span>
1150050             error(<span class="string">'The length of ValPhysics must match the number of devices'</span>);
1160051         <span class="keyword">end</span>
1170052     <span class="keyword">end</span>
1180053     
1190054     
1200055     FunctionStr = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(Family, Field, <span class="string">'Physics2HWFcn'</span>);
1210056     Params      = <a href="getfamilydata.html" class="code" title="function [Data, ErrorFlag] = getfamilydata(Family, Field1, Field2, DeviceList)">getfamilydata</a>(Family, Field, <span class="string">'Physics2HWParams'</span>, DeviceList);
1220057
1230058
1240059     <span class="keyword">if</span> isempty(FunctionStr)
1250060         <span class="keyword">if</span> isempty(Params)
1260061             <span class="comment">% No info on how to convert, so use a gain of 1</span>
1270062             S = value;
1280063         <span class="keyword">else</span>
1290064             <span class="comment">% If no function, use a constant scaling</span>
1300065             <span class="keyword">for</span> i = 1:size(value,2)
1310066                 S(:,i) = value(:,i) .* Params(:,1);
1320067             <span class="keyword">end</span>
1330068         <span class="keyword">end</span>
1340069
1350070         <span class="comment">% Energy scaling this way works for magnets but not BPMs or maybe other stuff!</span>
1360071         <span class="comment">% So if you want energy scaling do it with a function like k2amp</span>
1370072         <span class="comment">% if ~ismemberof(Family,'BPM')</span>
1380073         <span class="comment">%    if isempty(Energy)</span>
1390074         <span class="comment">%        Energy = getenergy;</span>
1400075         <span class="comment">%    elseif ischar(Energy)</span>
1410076         <span class="comment">%        Energy = getenergy(Energy);</span>
1420077         <span class="comment">%    end</span>
1430078         <span class="comment">%    S(:,i) = S(:,i) * getbrho(Energy) / getbrho(getenergy('Production'));</span>
1440079         <span class="comment">% end</span>
1450080         <span class="keyword">if</span> ~ischar(Energy)
1460081             <span class="comment">% Expand to the length of Energy input</span>
1470082             <span class="keyword">if</span> size(S,1) == 1
1480083                 S = S * ones(1,size(Energy,2));
1490084             <span class="keyword">end</span>
1500085         <span class="keyword">end</span>
1510086
1520087     <span class="keyword">else</span>
1530088         <span class="comment">% Use inline or user specified function</span>
1540089         <span class="keyword">if</span> isempty(Energy)
1550090             Energy = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>;
1560091         <span class="keyword">elseif</span> ischar(Energy)
1570092             Energy = <a href="getenergy.html" class="code" title="function [Energy, HCMEnergy] = getenergy(varargin)">getenergy</a>(Energy);
1580093         <span class="keyword">end</span>
1590094         <span class="keyword">if</span> iscell(Params)
1600095             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, Params{:});
1610096         <span class="keyword">elseif</span> isempty(Params)
1620097             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy);
1630098         <span class="keyword">elseif</span> isstr(Params)
1640099             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, Params);
1650100         <span class="keyword">else</span>
1660101             <span class="comment">% This will make all elements in the row vector a separate input</span>
1670102             ParamsList = num2cell(Params,1);
1680103             S = feval(FunctionStr, Family, Field, value, DeviceList, Energy, ParamsList{:});
1690104         <span class="keyword">end</span>
1700105     <span class="keyword">end</span>
1710106
1720107     
1730108     <span class="comment">% Lastly convert to raw hardware units (usually based on LOCO gains)</span>
1740109     S = <a href="real2raw.html" class="code" title="function DataOut = real2raw(varargin)">real2raw</a>(Family, Field, S, DeviceList);
1750110     
1760111     
1770112 <span class="keyword">elseif</span> isstruct(Family)
1780113     S = Family;
1790114
1800115     <span class="keyword">for</span> j = 1:size(S,1)
1810116         <span class="keyword">for</span> k = 1:size(S,2)
1820117
1830118             <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Monitor'</span>) &amp; isfield(S(j,k),<span class="string">'Actuator'</span>)
1840119                 <span class="comment">% Response matrix structure</span>
1850120
1860121                 <span class="keyword">if</span> nargin &lt; 2
1870122                     <span class="comment">%Energy = 'Production';</span>
1880123                     Energy = S(j,k).GeV;
1890124                 <span class="keyword">else</span>
1900125                     Energy = Field;
1910126                 <span class="keyword">end</span>
1920127
1930128                 <span class="comment">% Note: Chromaticity and Dispersion are special cases</span>
1940129                 <span class="keyword">if</span> strcmpi(S(j,k).Monitor.FamilyName, <span class="string">'Chromaticity'</span>)
1950130                     <span class="comment">% Chromaticity response matrix</span>
1960131                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Hardware'</span>)
1970132                         RF = S(j,k).Monitor.Actuator.Data;
1980133                         MCF = S(j,k).Monitor.MCF;
1990134                         S(j,k).Data = - S(j,k).Data / RF(1) / MCF;
2000135                         S(j,k).Monitor = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Monitor);   <span class="comment">% Chromaticity structure (also a response structure)</span>
2010136                         
2020137                         ActuatorDeltaPhysics = S(j,k).ActuatorDelta;
2030138                         S(j,k).ActuatorDelta = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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>
2040139                                                <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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);
2050140                         ActuatorScaleFactor = S(j,k).ActuatorDelta ./ ActuatorDeltaPhysics;
2060141                         ActuatorScaleFactor = ActuatorScaleFactor(:)';
2070142                         S(j,k).Actuator = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Actuator, S(j,k).GeV);  <span class="comment">% Sextupole</span>
2080143                         
2090144                         <span class="comment">% Scalar row by the actuator scaling</span>
2100145                         <span class="keyword">for</span> i = 1:size(S(j,k).Data,1)
2110146                             S(j,k).Data(i,:) = S(j,k).Data(i,:) ./ ActuatorScaleFactor;
2120147                         <span class="keyword">end</span>
2130148
2140149 <span class="comment">%                         if abs(S(j,k).GeV-Energy)&gt;1e-2 &amp; (S(j,k).GeV~=NaN)  &amp; (Energy~=NaN)</span>
2150150 <span class="comment">%                             fprintf('   Response matrix scaled to %.3f GeV using R(%.3f) = %.3f * R(%.3f) / %.3f (physics2hw)\n', Energy, Energy, S(j,k).GeV, S(j,k).GeV, Energy);</span>
2160151 <span class="comment">%                         end</span>
2170152 <span class="comment">%                         S(j,k).GeV = Energy;</span>
2180153
2190154                         <span class="comment">% Change units and UnitsString fields</span>
2200155                         <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Units'</span>)
2210156                             S(j,k).Units = <span class="string">'Hardware'</span>;
2220157                         <span class="keyword">end</span>
2230158                         <span class="keyword">if</span> isfield(S(j,k),<span class="string">'UnitsString'</span>)
2240159                             <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>)
2250160                                 S(j,k).UnitsString = [S(j,k).Monitor.UnitsString , <span class="string">'/'</span>, S(j,k).Actuator.UnitsString];
2260161                             <span class="keyword">else</span>
2270162                                 S(j,k).UnitsString = <span class="string">''</span>;
2280163                             <span class="keyword">end</span>
2290164                         <span class="keyword">end</span>
2300165                     <span class="keyword">end</span>
2310166                     
2320167                 <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>)
2330168                     <span class="comment">% Chromaticity measurement</span>
2340169                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Hardware'</span>)
2350170                         <span class="comment">% Convert the Monitor and Actuator fields</span>
2360171                         <span class="comment">%S(j,k).Monitor  = physics2hw(S(j,k).Monitor);   % Tune structure (same in Hardware and Physics)</span>
2370172                         S(j,k).ActuatorDelta = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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>
2380173                                                <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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);
2390174                         S(j,k).Actuator = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Actuator, S(j,k).GeV);  <span class="comment">% RF</span>
2400175                         
2410176                         RF = S(j,k).Actuator.Data;
2420177                         MCF = S(j,k).MCF;
2430178                         DeltaRF = S(j,k).ActuatorDelta;       
2440179                         
2450180                         S(j,k).Data = - S(j,k).Data / RF(1) / MCF;
2460181                         p = polyfit(DeltaRF, S(j,k).Tune(1,:), 2);
2470182                         S(j,k).PolyFit(1,:) = p;
2480183                         <span class="comment">%S(j,k).Data(1,1) = p(2);</span>
2490184                         p = polyfit(DeltaRF, S(j,k).Tune(2,:), 2);
2500185                         S(j,k).PolyFit(2,:) = p;
2510186                         <span class="comment">%S(j,k).Data(2,1) = p(2);</span>
2520187                         S(j,k).Units = <span class="string">'Hardware'</span>;
2530188                         S(j,k).UnitsString = [S(j,k).Monitor.UnitsString,<span class="string">'/'</span>,S(j,k).Actuator.UnitsString];
2540189                     <span class="keyword">end</span>
2550190                     
2560191                 <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>)
2570192                     <span class="comment">% Dispersion measurement</span>
2580193                     <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Hardware'</span>)
2590194                         <span class="comment">% Change to Hardware units</span>
2600195                         
2610196                         <span class="comment">% Change the numerator as if it was a BPM (but remove the offset)</span>
2620197                         d = S(j,k).Monitor;
2630198                         d.Data = S(j,k).Data;
2640199                         d = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(d, S(j,k).GeV);
2650200                         d.Data = d.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>);
2660201                         S(j,k).Data = d.Data;
2670202                         
2680203                         <span class="comment">% Change the Monitor and Actuator fields</span>
2690204                         S(j,k).Monitor  = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Monitor);
2700205                         S(j,k).ActuatorDelta = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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>
2710206                                                <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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);
2720207                         S(j,k).Actuator = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Actuator, S(j,k).GeV);
2730208                         
2740209                         <span class="comment">% Change to denominator to energy shift (dp/p)</span>
2750210                         RF = S(j,k).Actuator.Data;
2760211                         MCF = S(j,k).MCF;
2770212                         S(j,k).Data = -S(j,k).Data / RF(1) / MCF;
2780213                         S(j,k).Units = <span class="string">'Hardware'</span>;
2790214                         S(j,k).UnitsString = [S(j,k).Monitor.UnitsString,<span class="string">'/'</span>,S(j,k).Actuator.UnitsString];
2800215                     <span class="keyword">end</span>
2810216                     
2820217                 <span class="keyword">else</span>
2830218                     <span class="comment">% Typical response matrix (usually orbit/corrector)</span>
2840219                     <span class="comment">% Need to determine the hw2physics scaling for delta monitor / delta actuator</span>
2850220                     
2860221 <span class="comment">%                     % For BPM response matrices the coupling needs to be taken into account</span>
2870222 <span class="comment">%                     if ismemberof(S(j,k).Monitor.FamilyName,'BPM') &amp; ismemberof(S(j,k).Actuator.FamilyName,'COR')</span>
2880223 <span class="comment">%                         % The loco corrected orbit is,</span>
2890224 <span class="comment">%                         % X = (1./Gx) .* X  +  Cx .* Y</span>
2900225 <span class="comment">%                         % Y = (1./Gy) .* Y  +  Cy .* X</span>
2910226 <span class="comment">%                         %</span>
2920227 <span class="comment">%                         % Since real2raw (in physics2hw) will divide by Gy, multiple the above</span>
2930228 <span class="comment">%                         % equation by Gy so that the hardware units output is correct</span>
2940229 <span class="comment">%                         BPMxGain = getgain(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, );</span>
2950230 <span class="comment">%                         BPMyGain = getgain(BPMyFamily, BPMyList);</span>
2960231 <span class="comment">%                         BPMxCoupling = getcoupling(BPMxFamily, BPMxList);</span>
2970232 <span class="comment">%                         BPMyCoupling = getcoupling(BPMyFamily, BPMyList);</span>
2980233 <span class="comment">%</span>
2990234 <span class="comment">%                         C = [diag(ones(size(BPMxList,1),1))  diag(BPMxGain .* BPMxCoupling)</span>
3000235 <span class="comment">%                              diag(BPMyGain .* BPMyCoupling)  diag(ones(size(BPMyList,1),1))];</span>
3010236 <span class="comment">%</span>
3020237 <span class="comment">%                         % Rotate Mmodel</span>
3030238 <span class="comment">%                         R0 = C * R0;</span>
3040239 <span class="comment">%                     end</span>
3050240                     
3060241                     
3070242                     <span class="comment">% Only change units if in 'Physics' units</span>
3080243                     <span class="keyword">if</span> strcmpi(S(j,k).Actuator.Units, <span class="string">'Physics'</span>)                       
3090244                         <span class="comment">% Convert .ActuatorDelta</span>
3100245                         ActuatorDeltaPhysics = S(j,k).ActuatorDelta;
3110246                         
3120247                         <span class="comment">% Scale Factor w/o energy scaling</span>
3130248                         <span class="comment">%ActuatorDeltaNoEnergyScaling = physics2hw(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>
3140249                         <span class="comment">%                               physics2hw(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, S(j,k).GeV);</span>
3150250                         <span class="comment">%ActuatorScaleFactorNoEnergyScaling = ActuatorDeltaNoEnergyScaling ./ ActuatorDeltaPhysics;</span>
3160251                         <span class="comment">%ActuatorScaleFactorNoEnergyScaling = ActuatorScaleFactorNoEnergyScaling(:)';</span>
3170252                         
3180253                         <span class="comment">% Scale Factor with energy scaling</span>
3190254                         S(j,k).ActuatorDelta = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</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, Energy) - <span class="keyword">...</span>
3200255                                                <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field,                        S(j,k).Actuator.Data, S(j,k).Actuator.DeviceList, Energy);
3210256                         
3220257                         <span class="comment">% HW units (@ Energy) / Physics units (@ S(j,k).GeV)</span>
3230258                         ActuatorScaleFactor = S(j,k).ActuatorDelta ./ ActuatorDeltaPhysics;
3240259                         ActuatorScaleFactor = ActuatorScaleFactor(:)';
3250260                                               
3260261                         <span class="comment">% Convert .Actuator field</span>
3270262                         S(j,k).Actuator = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Actuator, Energy);
3280263                         
3290264                         
3300265                         <span class="comment">%ActuatorData = S(j,k).Actuator.Data;</span>
3310266                         <span class="comment">%S(j,k).Actuator = physics2hw(S(j,k).Actuator);</span>
3320267                         <span class="comment">%if any(ActuatorData == 0)</span>
3330268                         <span class="comment">%    ActuatorScaleFactor = physics2hw(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, 1, S(j,k).Actuator.DeviceList, Energy);</span>
3340269                         <span class="comment">%else</span>
3350270                         <span class="comment">%    ActuatorScaleFactor = S(j,k).Actuator.Data ./ ActuatorData;</span>
3360271                         <span class="comment">%end</span>
3370272
3380273                     <span class="keyword">else</span>
3390274                         <span class="comment">% Include energy scaling of actuator</span>
3400275                         ActuatorScaleFactor = Energy / S(j,k).GeV;
3410276                         ActuatorDeltaPhysics = S(j,k).ActuatorDelta;
3420277                     <span class="keyword">end</span>
3430278
3440279                     <span class="keyword">if</span> abs(S(j,k).GeV-Energy)&gt;1e-2 &amp; (S(j,k).GeV~=NaN)  &amp; (Energy~=NaN)
3450280                         fprintf(<span class="string">'   Response matrix scaled to %.3f GeV using R(%.3f) = %.3f * R(%.3f) / %.3f (physics2hw)\n'</span>, Energy, Energy, S(j,k).GeV, S(j,k).GeV, Energy);
3460281                     <span class="keyword">end</span>
3470282
3480283                     
3490284                     <span class="comment">% Only change units if in 'Physics' units</span>
3500285                     <span class="keyword">if</span> strcmpi(S(j,k).Monitor.Units, <span class="string">'Physics'</span>)                       
3510286                         <span class="comment">% Just to get an approximate scaling for the monitor size</span>
3520287                         <span class="comment">%MonitorDeltaPhysics = max(abs(S(j,k).Data(:,1) * ActuatorDeltaPhysics(1)));</span>
3530288                         <span class="comment">%MonitorDelta = physics2hw(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, MonitorDeltaPhysics + S(j,k).Monitor.Data, S(j,k).Monitor.DeviceList, S(j,k).GeV) - ...</span>
3540289                         <span class="comment">%               physics2hw(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>
3550290                         <span class="comment">%%MonitorDelta = physics2hw(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, MonitorDeltaPhysics, S(j,k).Monitor.DeviceList, S(j,k).GeV) - getoffset(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 'Hardware');</span>
3560291                         <span class="comment">%</span>
3570292                         <span class="comment">%MonitorScaleFactor = MonitorDelta ./ MonitorDeltaPhysics;</span>
3580293                         <span class="comment">%MonitorScaleFactor = MonitorScaleFactor(:);</span>
3590294                         
3600295                         <span class="comment">% physics2hw must be linear for this to work, but the other methods have issues with small numbers</span>
3610296                         MonitorScaleFactor = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 1, S(j,k).Monitor.DeviceList, Energy) - <span class="keyword">...</span>
3620297                                              <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 0, S(j,k).Monitor.DeviceList, Energy);
3630298
3640299                         <span class="comment">% Convert .Monitor field</span>
3650300                         S(j,k).Monitor = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).Monitor, Energy);
3660301                         
3670302                         <span class="comment">%MonitorData = S(j,k).Monitor.Data;</span>
3680303                         <span class="comment">%S(j,k).Monitor = physics2hw(S(j,k).Monitor);</span>
3690304                         <span class="comment">%if any(MonitorData == 0)</span>
3700305                         <span class="comment">%    % This might introduce an error if physics2hw is nonlinear</span>
3710306                         <span class="comment">%    MonitorScaleFactor = physics2hw(S(j,k).Monitor.FamilyName, S(j,k).Monitor.Field, 1, S(j,k).Monitor.DeviceList, S(j,k).GeV);</span>
3720307                         <span class="comment">%else</span>
3730308                         <span class="comment">%    MonitorScaleFactor = S(j,k).Monitor.Data ./ MonitorData;</span>
3740309                         <span class="comment">%end</span>
3750310                     <span class="keyword">else</span>
3760311                         MonitorScaleFactor = 1;
3770312                     <span class="keyword">end</span>
3780313
3790314                     
3800315                     <span class="comment">% Scalar column by the monitor scaling</span>
3810316                     <span class="keyword">for</span> i = 1:size(S(j,k).Data,2)
3820317                         S(j,k).Data(:,i) = MonitorScaleFactor .* S(j,k).Data(:,i);
3830318                     <span class="keyword">end</span>
3840319                     <span class="comment">%S(j,k).MonitorScaleFactor = MonitorScaleFactor;</span>
3850320                     
3860321                     <span class="comment">% Scalar row by the actuator scaling</span>
3870322                     <span class="keyword">for</span> i = 1:size(S(j,k).Data,1)
3880323                         S(j,k).Data(i,:) = S(j,k).Data(i,:) ./ ActuatorScaleFactor;
3890324                     <span class="keyword">end</span>
3900325                     <span class="comment">%S(j,k).ActuatorScaleFactor = ActuatorScaleFactor;</span>
3910326                     
3920327                     S(j,k).GeV = Energy;
3930328
3940329                     <span class="comment">% Change units and UnitsString fields</span>
3950330                     <span class="keyword">if</span> isfield(S(j,k),<span class="string">'Units'</span>)
3960331                         S(j,k).Units = <span class="string">'Hardware'</span>;
3970332                     <span class="keyword">end</span>
3980333                     <span class="keyword">if</span> isfield(S(j,k),<span class="string">'UnitsString'</span>)
3990334                         <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>)
4000335                             S(j,k).UnitsString = [ <span class="keyword">...</span>
4010336                                     S(j,k).Monitor.UnitsString , <span class="string">'/'</span>, <span class="keyword">...</span>
4020337                                     S(j,k).Actuator.UnitsString];
4030338                             <span class="comment">%S(j,k).UnitsString = [ ...</span>
4040339                             <span class="comment">%        getfamilydata(S(j,k).Monitor.FamilyName,  S(j,k).Monitor.Field,  'PhysicsUnits') , '/', ...</span>
4050340                             <span class="comment">%        getfamilydata(S(j,k).Actuator.FamilyName, S(j,k).Actuator.Field, 'PhysicsUnits')];</span>
4060341                         <span class="keyword">else</span>
4070342                             S(j,k).UnitsString = <span class="string">''</span>;
4080343                         <span class="keyword">end</span>
4090344                     <span class="keyword">end</span>
4100345                 <span class="keyword">end</span>
4110346                 
4120347             <span class="keyword">elseif</span> isfield(S(j,k),<span class="string">'FamilyName'</span>) &amp; isfield(S(j,k),<span class="string">'Field'</span>)
4130348                 <span class="comment">% Data structure</span>
4140349
4150350                 <span class="keyword">if</span> nargin &lt; 2
4160351                     <span class="keyword">if</span> isfield(S(j,k), <span class="string">'GeV'</span>)
4170352                         Energy = S(j,k).GeV;
4180353                     <span class="keyword">else</span>
4190354                         Energy = <span class="string">'NoEnergyScaling'</span>;
4200355                         <span class="comment">%Energy = 'Production';</span>
4210356                     <span class="keyword">end</span>
4220357                 <span class="keyword">else</span>
4230358                     Energy = Field;
4240359                 <span class="keyword">end</span>
4250360
4260361                 <span class="comment">% Only change units if in 'Physics' units</span>
4270362                 <span class="keyword">if</span> ~strcmpi(S(j,k).Units, <span class="string">'Hardware'</span>)
4280363                     S(j,k).Data = <a href="physics2hw.html" class="code" title="function S = physics2hw(Family, Field, value, DeviceList, Energy)">physics2hw</a>(S(j,k).FamilyName, S(j,k).Field, S(j,k).Data, S(j,k).DeviceList, Energy);
4290364                     S(j,k).Units = <span class="string">'Hardware'</span>;
4300365                     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">'HWUnits'</span>);
4310366                 <span class="keyword">end</span>
4320367             <span class="keyword">else</span>
4330368                 error(<span class="string">'Unknown data structure type'</span>);
4340369             <span class="keyword">end</span>           
4350370         <span class="keyword">end</span>
4360371     <span class="keyword">end</span>
4370372     
4380373
4390374 <span class="keyword">elseif</span> iscell(Family)
4400375     error(<span class="string">'Cell array inputs not programmed yet'</span>);
4410376     
4420377 <span class="keyword">else</span> 
4430378     error(<span class="string">'Input #1 type unknown'</span>);
4440379 <span class="keyword">end</span></pre></div>
445<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>
446</body>
447</html>
Note: See TracBrowser for help on using the repository browser.