PageRenderTime 33ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/ATF2/FlightSim/coreApps/FlLoadExternal.m

http://atf2flightsim.googlecode.com/
MATLAB | 788 lines | 660 code | 69 blank | 59 comment | 86 complexity | 7e6e3032926abffb9cde97a9d6267397 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0, IPL-1.0, BSD-3-Clause
  1. function [stat,retVals]=FlLoadExternal(request,comstack_get,retValsIn)
  2. % [stat,retVals]=FlLoadExternal(request,comstack_get,retValsIn);
  3. % ------------------------------------------------------------------------------
  4. % Generate magnet currents from either a SET file or a MAD Twiss tape-file;
  5. % file names are defined in:
  6. %
  7. % ExternalDataFiles.m (must be somewhere in Matlab's path)
  8. %
  9. % Input Arguments
  10. %
  11. % request : "loadSET" or "loadMAD"
  12. % comstack_get : list of EPICS PV names generated by FlUpdate:getPut
  13. % retValsIn : list of EPICS PV values returned by lcaGet in FlUpdate
  14. %
  15. % Output Arguments
  16. %
  17. % stat : return status ... 1 means success
  18. % retVals : list of EPICS PV values from SET file or computed from
  19. % MAD Twiss tape-file
  20. % ------------------------------------------------------------------------------
  21. % check arguments; check for existence of ExternalDataFiles.m; check for proper
  22. % definition of file name
  23. retVals=[];
  24. stat=0;
  25. if (nargin<3)
  26. warning('FlLoadExternal requires 3 input arguments')
  27. return
  28. elseif (nargout<2)
  29. warning('FlLoadExternal requires 2 output arguments')
  30. return
  31. end
  32. if (~isequal(request,'loadSET')&&~isequal(request,'loadMAD'))
  33. warning('Invalid request to FlLoadExternal')
  34. return
  35. end
  36. retVals=retValsIn;
  37. % check for the existence of ExternalDataFiles.m; run it; check defined files
  38. dataFile='ExternalDataFiles';
  39. if (~isequal(exist(dataFile,'file'),2))
  40. warning(sprintf('%s not found by FlLoadExternal',dataFile))
  41. return
  42. end
  43. eval(dataFile)
  44. if (isequal(request,'loadSET'))
  45. if (~exist('SETfile','var')||isempty(SETfile))
  46. warning(sprintf('SETfile not defined in %s',dataFile))
  47. return
  48. elseif (~isequal(exist(SETfile,'file'),2))
  49. warning(sprintf('%s not found by FlLoadExternal',SETfile))
  50. return
  51. end
  52. else
  53. if (~exist('MADfile','var')||isempty(MADfile))
  54. warning(sprintf('MADfile not defined in %s',dataFile))
  55. return
  56. elseif (~isequal(exist(MADfile,'file'),2))
  57. warning(sprintf('%s not found by FlLoadExternal',MADfile))
  58. return
  59. end
  60. end
  61. % initialize local psList
  62. psList=FlLoadInit(comstack_get);
  63. % get currents
  64. curflag=[1,1,1,1,0]; % [SBEN,QUAD,SEXT,MULT,XYCOR] ... change to arg? global?
  65. if (isequal(request,'loadSET'))
  66. psList=FlLoadSETfile(psList,SETfile,curflag);
  67. else
  68. psList=FlLoadDesign(psList,MADfile,curflag);
  69. end
  70. % stuff currents into retVals
  71. verbose=0;
  72. for n=1:length(psList)
  73. id=psList(n).id;
  74. retVals(id)=psList(n).cur;
  75. if (verbose)
  76. disp(sprintf('%4d) %9.3f (%9.3f) %s',id,retVals(id), ...
  77. retValsIn(id),char(comstack_get{id})))
  78. end
  79. end
  80. stat=1;
  81. end
  82. function psList=FlLoadInit(comstack_get)
  83. haDbUDF=1; % set if atf-ioc DB doesn't initialize
  84. % locate PS entries in comstack_get
  85. id=strmatch('c1:qmov',comstack_get);id1=id(end)+1;
  86. id=strmatch('ATF:BPMS',comstack_get);id2=id(1)-1;
  87. idps=[id1:id2]';
  88. Nps=length(idps);
  89. % construct a list for PS entries of interest
  90. psList=[];
  91. for nps=1:length(idps)
  92. ncg=idps(nps);
  93. pvname=char(comstack_get{ncg});
  94. psList(nps).id=ncg; % pointer into comstack_get
  95. psList(nps).pvname=pvname; % local copy of comstack_get PV name
  96. %disp(sprintf('comstack_get{%d}=%s',ncg,pvname))
  97. ic=strfind(pvname,':');
  98. if (strmatch('ATF:',pvname))
  99. name=pvname(ic(2)+1:ic(3)-1);
  100. if (strcmp(name,'BH1X')||strcmp(name,'BH2X')||strcmp(name,'BH3X'))
  101. keyw=pvname(ic(1)+1:ic(2)-1);
  102. if (strcmp(keyw,'SBEN-TRIM'))
  103. name(1:2)='ZX';
  104. end
  105. end
  106. elseif (strmatch('PS',pvname))
  107. if (haDbUDF)
  108. pv=strcat(pvname(1:ic(1)),'name.PROC');
  109. lcaPut(pv,1); % change undefined to defined
  110. end
  111. pv=strcat(pvname(1:ic(1)),'name');
  112. name=char(lcaGet(pv));
  113. else
  114. name=pvname(1:ic(1)-1);
  115. end
  116. psList(nps).name=name;
  117. psList(nps).cur=0;
  118. end
  119. end
  120. function psList=FlLoadSETfile(psListIn,setfile,curflag)
  121. psList=psListIn;
  122. % ------------------------------------------------------------------------------
  123. % DR
  124. % ------------------------------------------------------------------------------
  125. % device names
  126. bname=[ ...
  127. 'BH1R '];
  128. qname=[ ...
  129. 'QF1R ';'QF2R '; ...
  130. 'QM1R ';'QM2R ';'QM3R ';'QM4R ';'QM5R ';'QM6R '; ...
  131. 'QM7R ';'QM8R ';'QM9R ';'QM10R ';'QM11R ';'QM12R '; ...
  132. 'QM13R ';'QM14R ';'QM15R ';'QM16R ';'QM17R ';'QM18R '; ...
  133. 'QM19R ';'QM20R ';'QM21R ';'QM22R ';'QM23R ';'QM7AR '];
  134. sname=[ ...
  135. 'SF1R ';'SD1R '];
  136. cname=[ ...
  137. 'ZH1R ';'ZH2R ';'ZH3R ';'ZH4R ';'ZH5R ';'ZH6R '; ...
  138. 'ZH7R ';'ZH8R ';'ZH9R ';'ZH10R ';'ZH11R ';'ZH12R '; ...
  139. 'ZH13R ';'ZH14R '; 'ZH16R ';'ZH17R ';'ZH18R '; ...
  140. 'ZH19R ';'ZH20R ';'ZH21R ';'ZH22R ';'ZH23R ';'ZH24R '; ...
  141. 'ZH25R ';'ZH26R ';'ZH27R ';'ZH28R ';'ZH29R ';'ZH30R '; ...
  142. 'ZH31R ';'ZH32R ';'ZH33R ';'ZH34R ';'ZH35R ';'ZH36R '; ...
  143. 'ZH37R ';'ZH38R ';'ZH39R ';'ZH40R ';'ZH41R ';'ZH42R '; ...
  144. 'ZH43R ';'ZH44R ';'ZH45R ';'ZH46R ';'ZH47R ';'ZH48R '; ...
  145. 'ZV1R ';'ZV2R ';'ZV3R ';'ZV4R ';'ZV5R ';'ZV6R '; ...
  146. 'ZV7R ';'ZV8R ';'ZV9R ';'ZV10R ';'ZV11R ';'ZV12R '; ...
  147. 'ZV13R ';'ZV14R ';'ZV15R '; 'ZV17R ';'ZV18R '; ...
  148. 'ZV19R ';'ZV20R ';'ZV21R ';'ZV22R ';'ZV23R ';'ZV24R '; ...
  149. 'ZV25R ';'ZV26R ';'ZV27R ';'ZV28R ';'ZV29R ';'ZV30R '; ...
  150. 'ZV31R ';'ZV32R ';'ZV33R ';'ZV34R ';'ZV35R ';'ZV36R '; ...
  151. 'ZV37R ';'ZV38R ';'ZV39R ';'ZV40R ';'ZV41R ';'ZV42R '; ...
  152. 'ZV43R ';'ZV44R ';'ZV45R ';'ZV46R ';'ZV47R ';'ZV48R '; ...
  153. 'ZV49R ';'ZV50R ';'ZV51R '; ...
  154. 'ZH100R ';'ZH101R ';'ZH102R ';'ZV100R '];
  155. % construct trim names (quadrupole trims)
  156. [nr,nc]=size(qname);
  157. Nt=[28,26,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0];
  158. tname=[];
  159. for n=1:nr
  160. for m=1:Nt(n)
  161. name=sprintf('%s.%d',deblank(qname(n,:)),m);
  162. name=[name,blanks(nc-length(name))];
  163. tname=[tname;name];
  164. end
  165. end
  166. % construct trim names (skew quadrupole trims on sextupoles)
  167. [nr,nc]=size(sname);
  168. Nt=[34,34];
  169. mname=[];
  170. for n=1:nr
  171. for m=1:Nt(n)
  172. name=sprintf('%s.%d',deblank(sname(n,:)),m);
  173. name=[name,blanks(nc-length(name))];
  174. mname=[mname;name];
  175. end
  176. end
  177. % set up SET file data arrays
  178. names=[bname;qname;tname;sname;mname;cname];
  179. [Nb,dummy]=size(bname);
  180. [Nq,dummy]=size(qname);
  181. [Nt,dummy]=size(tname);
  182. [Ns,dummy]=size(sname);
  183. [Nm,dummy]=size(mname);
  184. [Nc,dummy]=size(cname);
  185. Ibend=zeros(Nb,1);
  186. Iquad=zeros(Nq,1);
  187. Itrim=zeros(Nt,1);
  188. Isext=zeros(Ns,1);
  189. Imult=zeros(Nm,1);
  190. Icorr=zeros(Nc,1);
  191. I=zeros(Nb+Nq+Nt+Ns+Nm+Nc,1);
  192. % read the SET file
  193. fid=fopen(setfile,'rt');
  194. while (1)
  195. s=fgetl(fid);
  196. if (~isstr(s)),break,end
  197. [t,r]=strtok(s);
  198. n=strmatch(t,names,'exact');
  199. if (~isempty(n))
  200. I(n)=str2num(strtok(r));
  201. end
  202. end
  203. fclose(fid);
  204. % assign currents
  205. Ibend=I(1:Nb);
  206. Iquad=I(Nb+1:Nb+Nq);
  207. Itrim=I(Nb+Nq+1:Nb+Nq+Nt);
  208. Isext=I(Nb+Nq+Nt+1:Nb+Nq+Nt+Ns);
  209. Imult=I(Nb+Nq+Nt+Ns+1:Nb+Nq+Nt+Ns+Nm);
  210. Icorr=I(Nb+Nq+Nt+Ns+Nm+1:Nb+Nq+Nt+Ns+Nm+Nc);
  211. % load currents into psList structure
  212. psName=char(psList.name);
  213. for n=1:Nb
  214. name=deblank(bname(n,:));
  215. id=strmatch(name,psName,'exact');
  216. for m=1:length(id)
  217. psList(id(m)).class=1; % SBEN
  218. if (curflag(1))
  219. psList(id(m)).cur=Ibend(n);
  220. else
  221. psList(id(m)).cur=0;
  222. end
  223. end
  224. end
  225. for n=1:Nq
  226. name=deblank(qname(n,:));
  227. id=strmatch(name,psName,'exact');
  228. for m=1:length(id)
  229. psList(id(m)).class=2; % QUAD
  230. if (curflag(2))
  231. psList(id(m)).cur=Iquad(n);
  232. else
  233. psList(id(m)).cur=0;
  234. end
  235. end
  236. end
  237. for n=1:Nt
  238. name=deblank(strrep(tname(n,:),'.','_'));
  239. id=strmatch(name,psName,'exact');
  240. for m=1:length(id)
  241. psList(id(m)).class=3; % trim
  242. if (curflag(2)) % QUAD trim
  243. psList(id(m)).cur=Itrim(n);
  244. else
  245. psList(id(m)).cur=0;
  246. end
  247. end
  248. end
  249. for n=1:Ns
  250. name=deblank(sname(n,:));
  251. id=strmatch(name,psName,'exact');
  252. for m=1:length(id)
  253. psList(id(m)).class=4; % SEXT
  254. if (curflag(3))
  255. psList(id(m)).cur=Isext(n);
  256. else
  257. psList(id(m)).cur=0;
  258. end
  259. end
  260. end
  261. for n=1:Nm
  262. name=deblank(strrep(mname(n,:),'.','_'));
  263. id=strmatch(name,psName,'exact');
  264. for m=1:length(id)
  265. psList(id(m)).class=5; % MULT
  266. if (curflag(4))
  267. psList(id(m)).cur=Imult(n);
  268. else
  269. psList(id(m)).cur=0;
  270. end
  271. end
  272. end
  273. for n=1:Nc
  274. name=deblank(cname(n,:));
  275. id=strmatch(name,psName,'exact');
  276. for m=1:length(id)
  277. psList(id(m)).class=6; % XCOR or YCOR
  278. if (curflag(5))
  279. psList(id(m)).cur=Icorr(n);
  280. else
  281. psList(id(m)).cur=0;
  282. end
  283. end
  284. end
  285. % ------------------------------------------------------------------------------
  286. % ATF2
  287. % ------------------------------------------------------------------------------
  288. % device names
  289. bname=[ ...
  290. 'BS1X ';'BS2X ';'BS3X '; ...
  291. 'BH1X ';'BH2X ';'BH3X ';'B5FF ';'B2FF ';'B1FF ';'BDUMP '];
  292. qname=[ ...
  293. 'QS1X ';'QF1X ';'QD2X ';'QF3X ';'QF4X ';'QD5X '; ...
  294. 'QF6X ';'QS2X ';'QF7X ';'QD8X ';'QF9X ';'QK1X '; ...
  295. 'QD10X ';'QF11X ';'QK2X ';'QD12X ';'QF13X ';'QD14X '; ...
  296. 'QF15X ';'QK3X ';'QD16X ';'QF17X ';'QK4X ';'QD18X '; ...
  297. 'QF19X ';'QD20X ';'QF21X ';'QM16FF ';'QM15FF ';'QM14FF '; ...
  298. 'QM13FF ';'QM12FF ';'QM11FF ';'QD10BFF';'QD10AFF';'QF9BFF '; ...
  299. 'QF9AFF ';'QD8FF ';'QF7FF ';'QD6FF ';'QF5BFF ';'QF5AFF '; ...
  300. 'QD4BFF ';'QD4AFF ';'QF3FF ';'QD2BFF ';'QD2AFF ';'QF1FF '; ...
  301. 'QD0FF '];
  302. sname=[ ...
  303. 'SF6FF ';'SF5FF ';'SD4FF ';'SF1FF ';'SD0FF '];
  304. cname=[ ...
  305. 'ZX1X ';'ZX2X ';'ZX3X '; ...
  306. 'ZH1X ';'ZH2X ';'ZH3X ';'ZH4X ';'ZH5X ';'ZH6X ';'ZH7X '; ...
  307. 'ZH8X ';'ZH9X ';'ZH10X ';'ZH1FF '; ...
  308. 'ZV1X ';'ZV2X ';'ZV3X ';'ZV4X ';'ZV5X ';'ZV6X ';'ZV7X '; ...
  309. 'ZV8X ';'ZV9X ';'ZV10X ';'ZV11X ';'ZV1FF '];
  310. names=[bname;qname;sname;cname];
  311. [Nb,dummy]=size(bname);
  312. [Nq,dummy]=size(qname);
  313. [Ns,dummy]=size(sname);
  314. [Nc,dummy]=size(cname);
  315. Ibend=zeros(Nb,1);
  316. Iquad=zeros(Nq,1);
  317. Isext=zeros(Ns,1);
  318. Icorr=zeros(Nc,1);
  319. I=zeros(Nb+Nq+Ns+Nc,1);
  320. % READ the setdata file
  321. fid=fopen(setfile,'rt');
  322. while (1)
  323. s=fgetl(fid);
  324. if (~isstr(s)),break,end
  325. [t,r]=strtok(s);
  326. if (strcmp(t,'FFMAG'))
  327. [t,r]=strtok(r);
  328. end
  329. n=strmatch(t,names,'exact');
  330. if (~isempty(n))
  331. I(n)=str2num(strtok(r));
  332. end
  333. end
  334. fclose(fid);
  335. % assign currents
  336. Ibend=I(1:Nb);
  337. Iquad=I(Nb+1:Nb+Nq);
  338. Isext=I(Nb+Nq+1:Nb+Nq+Ns);
  339. Icorr=I(Nb+Nq+Ns+1:Nb+Nq+Ns+Nc);
  340. % distribute currents to family members
  341. id1=strmatch('BS1X ',bname);
  342. id2=strmatch('BS2X ',bname);
  343. Ibend(id2)=Ibend(id1);
  344. id1=strmatch('BH1X ',bname);
  345. id2=strmatch('BH2X ',bname);
  346. Ibend(id2)=Ibend(id1);
  347. id1=strmatch('QF15X ',qname);
  348. id2=strmatch('QF13X ',qname);
  349. Iquad(id2)=Iquad(id1);
  350. % load currents into psList structure
  351. psName=char(psList.name);
  352. for n=1:Nb
  353. name=deblank(bname(n,:));
  354. id=strmatch(name,psName,'exact');
  355. for m=1:length(id)
  356. psList(id(m)).class=1; % SBEN
  357. if (curflag(1))
  358. psList(id(m)).cur=Ibend(n);
  359. else
  360. psList(id(m)).cur=0;
  361. end
  362. end
  363. end
  364. for n=1:Nq
  365. name=deblank(qname(n,:));
  366. id=strmatch(name,psName,'exact');
  367. for m=1:length(id)
  368. psList(id(m)).class=2; % QUAD
  369. if (curflag(2))
  370. psList(id(m)).cur=Iquad(n);
  371. else
  372. psList(id(m)).cur=0;
  373. end
  374. end
  375. end
  376. for n=1:Ns
  377. name=deblank(sname(n,:));
  378. id=strmatch(name,psName,'exact');
  379. for m=1:length(id)
  380. psList(id(m)).class=4; % SEXT
  381. if (curflag(3))
  382. psList(id(m)).cur=Isext(n);
  383. else
  384. psList(id(m)).cur=0;
  385. end
  386. end
  387. end
  388. for n=1:Nc
  389. name=deblank(cname(n,:));
  390. id=strmatch(name,psName,'exact');
  391. for m=1:length(id)
  392. psList(id(m)).class=6; % XCOR or YCOR
  393. if (curflag(5))
  394. psList(id(m)).cur=Icorr(n);
  395. else
  396. psList(id(m)).cur=0;
  397. end
  398. end
  399. end
  400. % ------------------------------------------------------------------------------
  401. end
  402. function psList=FlLoadDesign(psListIn,MADfile,curflag)
  403. global FL % for initial Twiss
  404. psList=psListIn;
  405. %[tt,K,N,L,P,A,T,E,FDN,twss,orbt,S]=xtfft2mat(MADfile); % mex version
  406. [tt,K,N,L,P,twss,orbt,S]=xtfft2mat5(MADfile); % non-mex version
  407. FL.SimModel.Initial.x.Twiss.nu=twss(1,1);
  408. FL.SimModel.Initial.x.Twiss.beta=twss(1,2);
  409. FL.SimModel.Initial.x.Twiss.alpha=twss(1,3);
  410. FL.SimModel.Initial.x.Twiss.eta=twss(1,4);
  411. FL.SimModel.Initial.x.Twiss.etap=twss(1,5);
  412. FL.SimModel.Initial.y.Twiss.nu=twss(1,6);
  413. FL.SimModel.Initial.y.Twiss.beta=twss(1,7);
  414. FL.SimModel.Initial.y.Twiss.alpha=twss(1,8);
  415. FL.SimModel.Initial.y.Twiss.eta=twss(1,9);
  416. FL.SimModel.Initial.y.Twiss.etap=twss(1,10);
  417. energy=FL.SimModel.Initial.Momentum;
  418. clight=299792458; % m/s
  419. Cb=1e9/clight; % T-m/GeV
  420. brho=Cb*energy; % T-m
  421. % ------------------------------------------------------------------------------
  422. % DR
  423. % ------------------------------------------------------------------------------
  424. % device names
  425. bname=[ ...
  426. 'BH1R '];
  427. qname=[ ...
  428. 'QF1R ';'QF2R '; ...
  429. 'QM1R ';'QM2R ';'QM3R ';'QM4R ';'QM5R ';'QM6R '; ...
  430. 'QM7R ';'QM8R ';'QM9R ';'QM10R ';'QM11R ';'QM12R '; ...
  431. 'QM13R ';'QM14R ';'QM15R ';'QM16R ';'QM17R ';'QM18R '; ...
  432. 'QM19R ';'QM20R ';'QM21R ';'QM22R ';'QM23R ';'QM7AR '];
  433. sname=[ ...
  434. 'SF1R ';'SD1R '];
  435. cname=[ ...
  436. 'ZH1R ';'ZH2R ';'ZH3R ';'ZH4R ';'ZH5R ';'ZH6R '; ...
  437. 'ZH7R ';'ZH8R ';'ZH9R ';'ZH10R ';'ZH11R ';'ZH12R '; ...
  438. 'ZH13R ';'ZH14R '; 'ZH16R ';'ZH17R ';'ZH18R '; ...
  439. 'ZH19R ';'ZH20R ';'ZH21R ';'ZH22R ';'ZH23R ';'ZH24R '; ...
  440. 'ZH25R ';'ZH26R ';'ZH27R ';'ZH28R ';'ZH29R ';'ZH30R '; ...
  441. 'ZH31R ';'ZH32R ';'ZH33R ';'ZH34R ';'ZH35R ';'ZH36R '; ...
  442. 'ZH37R ';'ZH38R ';'ZH39R ';'ZH40R ';'ZH41R ';'ZH42R '; ...
  443. 'ZH43R ';'ZH44R ';'ZH45R ';'ZH46R ';'ZH47R ';'ZH48R '; ...
  444. 'ZV1R ';'ZV2R ';'ZV3R ';'ZV4R ';'ZV5R ';'ZV6R '; ...
  445. 'ZV7R ';'ZV8R ';'ZV9R ';'ZV10R ';'ZV11R ';'ZV12R '; ...
  446. 'ZV13R ';'ZV14R ';'ZV15R '; 'ZV17R ';'ZV18R '; ...
  447. 'ZV19R ';'ZV20R ';'ZV21R ';'ZV22R ';'ZV23R ';'ZV24R '; ...
  448. 'ZV25R ';'ZV26R ';'ZV27R ';'ZV28R ';'ZV29R ';'ZV30R '; ...
  449. 'ZV31R ';'ZV32R ';'ZV33R ';'ZV34R ';'ZV35R ';'ZV36R '; ...
  450. 'ZV37R ';'ZV38R ';'ZV39R ';'ZV40R ';'ZV41R ';'ZV42R '; ...
  451. 'ZV43R ';'ZV44R ';'ZV45R ';'ZV46R ';'ZV47R ';'ZV48R '; ...
  452. 'ZV49R ';'ZV50R ';'ZV51R '; ...
  453. 'ZH100R ';'ZH101R ';'ZH102R ';'ZV100R '];
  454. % SBEN
  455. Ibh1r=DR_energy(2,energy);
  456. name=deblank(bname);
  457. id=strmatch(name,char(psList.name));
  458. for m=1:length(id)
  459. psname=psList(id(m)).name;
  460. if (strcmp(psname,name))
  461. if (curflag(1))
  462. psList(id(m)).cur=Ibh1r;
  463. else
  464. psList(id(m)).cur=0;
  465. end
  466. end
  467. end
  468. % QUAD
  469. [nr,nc]=size(qname);
  470. KL=zeros(nr,1);
  471. for n=1:nr
  472. name=deblank(qname(n,:));
  473. if (strcmp(name,'QM7R'))
  474. name='QM7R2';
  475. elseif (strcmp(name,'QM7AR'))
  476. name='QM7R1';
  477. else
  478. name=strcat(qname(n,:),'1');
  479. end
  480. id=strmatch(name,N,'exact');
  481. KL(n)=sum(P(id,2).*L(id));
  482. end
  483. Iquad=get_DR_quads(2,energy,KL,0);
  484. for n=1:nr
  485. name=deblank(qname(n,:));
  486. id=strmatch(name,char(psList.name));
  487. for m=1:length(id)
  488. psname=psList(id(m)).name;
  489. if (strcmp(psname,name))
  490. if (curflag(2))
  491. psList(id(m)).cur=Iquad(n);
  492. else
  493. psList(id(m)).cur=0;
  494. end
  495. end
  496. end
  497. end
  498. % SEXT
  499. [nr,nc]=size(sname);
  500. KL=zeros(nr,1);
  501. for n=1:nr
  502. name=strcat(sname(n,:),'1');
  503. id=strmatch(name,N,'exact');
  504. KL(n)=sum(P(id,3).*L(id));
  505. end
  506. Isext=get_DR_sexts(2,energy,KL,0);
  507. for n=1:nr
  508. name=deblank(sname(n,:));
  509. id=strmatch(name,char(psList.name));
  510. for m=1:length(id)
  511. psname=psList(id(m)).name;
  512. if (strcmp(psname,name))
  513. if (curflag(3))
  514. psList(id(m)).cur=Isext(n);
  515. else
  516. psList(id(m)).cur=0;
  517. end
  518. end
  519. end
  520. end
  521. % MULT
  522. [nr,nc]=size(sname);
  523. Nt=[34,34];
  524. mname=[];
  525. for n=1:nr
  526. for m=1:Nt(n)
  527. name=sprintf('SQ%s%d',sname(n,1:2),m);
  528. name=[name,blanks(nc-length(name))];
  529. mname=[mname;name];
  530. end
  531. end
  532. [nr,nc]=size(mname);
  533. KL=zeros(nr,1);
  534. for n=1:nr
  535. name=deblank(mname(n,:));
  536. id=strmatch(name,N,'exact');
  537. KL(n)=P(id,2); % K1L
  538. end
  539. Imult=get_DR_skews(2,energy,KL,0);
  540. for n=1:nr
  541. name=deblank(mname(n,:));
  542. id=strmatch(name,char(psList.name));
  543. for m=1:length(id)
  544. psname=psList(id(m)).name;
  545. if (strcmp(psname,name))
  546. if (curflag(4))
  547. psList(id(m)).cur=Imult(n);
  548. else
  549. psList(id(m)).cur=0;
  550. end
  551. end
  552. end
  553. end
  554. % XCOR and YCOR
  555. [nr,nc]=size(cname);
  556. KL=zeros(nr,1);
  557. for n=1:nr
  558. name=deblank(cname(n,:));
  559. id=strmatch(name,N,'exact');
  560. if (strcmp(K(id,:),'HKIC'))
  561. KL(n)=P(id,4);
  562. else
  563. KL(n)=P(id,5);
  564. end
  565. end
  566. Icorr=get_DR_corrs(2,energy,KL,0);
  567. for n=1:nr
  568. name=deblank(cname(n,:));
  569. id=strmatch(name,char(psList.name));
  570. for m=1:length(id)
  571. psname=psList(id(m)).name;
  572. if (strcmp(psname,name))
  573. if (curflag(5))
  574. psList(id(m)).cur=Icorr(n);
  575. else
  576. psList(id(m)).cur=0;
  577. end
  578. end
  579. end
  580. end
  581. % ------------------------------------------------------------------------------
  582. % ATF2
  583. % ------------------------------------------------------------------------------
  584. % device names
  585. bname=[ ...
  586. 'BH1X ';'BH2X ';'BH3X ';'B5FF ';'B2FF ';'B1FF ';'BDUMP '];
  587. qname=[ ...
  588. 'QM6RX ';'QM7RX ';'QS1X ';'QF1X ';'QD2X ';'QF3X ';'QF4X '; ...
  589. 'QD5X ';'QF6X ';'QS2X ';'QF7X ';'QD8X ';'QF9X ';'QK1X '; ...
  590. 'QD10X ';'QF11X ';'QK2X ';'QD12X ';'QF13X ';'QD14X ';'QF15X '; ...
  591. 'QK3X ';'QD16X ';'QF17X ';'QK4X ';'QD18X ';'QF19X ';'QD20X '; ...
  592. 'QF21X ';'QM16FF ';'QM15FF ';'QM14FF ';'QM13FF ';'QM12FF ';'QM11FF '; ...
  593. 'QD10BFF';'QD10AFF';'QF9BFF ';'QF9AFF ';'QD8FF ';'QF7FF ';'QD6FF '; ...
  594. 'QF5BFF ';'QF5AFF ';'QD4BFF ';'QD4AFF ';'QF3FF ';'QD2BFF ';'QD2AFF '; ...
  595. 'QF1FF ';'QD0FF '];
  596. sname=[ ...
  597. 'SF6FF ';'SF5FF ';'SD4FF ';'SF1FF ';'SD0FF '];
  598. cname=[ ...
  599. 'ZH100RX';'ZH101RX'; ...
  600. 'ZX1X ';'ZX2X ';'ZX3X '; ...
  601. 'ZH1X ';'ZH2X ';'ZH3X ';'ZH4X ';'ZH5X ';'ZH6X ';'ZH7X '; ...
  602. 'ZH8X ';'ZH9X ';'ZH10X ';'ZH1FF '; ...
  603. 'ZV100RX'; ...
  604. 'ZV1X ';'ZV2X ';'ZV3X ';'ZV4X ';'ZV5X ';'ZV6X ';'ZV7X '; ...
  605. 'ZV8X ';'ZV9X ';'ZV10X ';'ZV11X ';'ZV1FF '];
  606. idqmff=(30:35)'; % FF matching quads
  607. % SBEN
  608. [nr,nc]=size(bname);
  609. KL=zeros(nr,1);
  610. for n=1:nr
  611. name=deblank(bname(n,:));
  612. id=strmatch(name,N);
  613. KL(n)=sum(P(id,1));
  614. end
  615. Ibend=get_ATF2_bends(2,energy,KL,0);
  616. for n=1:nr
  617. name=deblank(bname(n,:));
  618. id=strmatch(name,char(psList.name));
  619. for m=1:length(id)
  620. psname=psList(id(m)).name;
  621. if (strcmp(psname,name))
  622. if (curflag(1))
  623. psList(id(m)).cur=Ibend(n);
  624. else
  625. psList(id(m)).cur=0;
  626. end
  627. end
  628. end
  629. end
  630. % QUAD
  631. [nr,nc]=size(qname);
  632. KL=zeros(nr,1);
  633. for n=1:nr
  634. name=deblank(qname(n,:));
  635. id=strmatch(name,N,'exact');
  636. KL(n)=sum(P(id,2).*L(id));
  637. end
  638. QMFFpol=[1;-1;-1;1;1;-1]; % "normal" polarity defined (as wired)
  639. rev=sign(KL(idqmff)).*QMFFpol; % -1=reversed, 0=off, +1=normal
  640. idrev=find(rev==-1);
  641. QMFFrev=[1;1;1;1;1;1]; % start with normal polarity ...
  642. QMFFrev(idrev)=-1; % ... and make the necessary reversals
  643. Iquad=get_ATF2_quads(2,energy,KL,QMFFrev,0);
  644. for n=1:nr
  645. name=deblank(qname(n,:));
  646. id=strmatch(name,char(psList.name));
  647. for m=1:length(id)
  648. psname=psList(id(m)).name;
  649. if (strcmp(psname,name))
  650. if (curflag(2))
  651. psList(id(m)).cur=Iquad(n);
  652. else
  653. psList(id(m)).cur=0;
  654. end
  655. end
  656. end
  657. end
  658. % SEXT
  659. [nr,nc]=size(sname);
  660. KL=zeros(nr,1);
  661. for n=1:nr
  662. name=deblank(sname(n,:));
  663. id=strmatch(name,N,'exact');
  664. KL(n)=sum(P(id,3).*L(id));
  665. end
  666. Isext=get_ATF2_sexts(2,energy,KL,0);
  667. for n=1:nr
  668. name=deblank(sname(n,:));
  669. id=strmatch(name,char(psList.name));
  670. for m=1:length(id)
  671. psname=psList(id(m)).name;
  672. if (strcmp(psname,name))
  673. if (curflag(3))
  674. psList(id(m)).cur=Isext(n);
  675. else
  676. psList(id(m)).cur=0;
  677. end
  678. end
  679. end
  680. end
  681. % XCOR and YCOR
  682. [nr,nc]=size(cname);
  683. KL=zeros(nr,1);
  684. for n=1:nr
  685. name=deblank(cname(n,:));
  686. id=strmatch(name,N,'exact');
  687. if (strcmp(K(id,:),'HKIC'))
  688. KL(n)=P(id,4);
  689. else
  690. KL(n)=P(id,5);
  691. end
  692. end
  693. Icorr=get_ATF2_corrs(2,energy,KL,[0;0;0;0;Ibend],0);
  694. for n=1:nr
  695. name=deblank(cname(n,:));
  696. id=strmatch(name,char(psList.name));
  697. for m=1:length(id)
  698. psname=psList(id(m)).name;
  699. if (strcmp(psname,name))
  700. if (curflag(5))
  701. psList(id(m)).cur=Icorr(n);
  702. else
  703. psList(id(m)).cur=0;
  704. end
  705. end
  706. end
  707. end
  708. end