0001 function [Chromaticity, FileName] = measchro(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091 NRFSteps = 1;
0092 WaitFlag = 4;
0093 MCF = [];
0094 BPMxFamily = gethbpmfamily;
0095 BPMyFamily = getvbpmfamily;
0096 StructOutputFlag = 0;
0097 FileName = -1;
0098 ArchiveFlag = 0;
0099 DisplayFlag = -1;
0100 ModeFlag = '';
0101 UnitsFlag = 'Physics';
0102
0103
0104
0105 for i = length(varargin):-1:1
0106 if strcmpi(varargin{i},'Struct')
0107 StructOutputFlag = 1;
0108 varargin(i) = [];
0109 elseif iscell(varargin{i})
0110
0111 elseif strcmpi(varargin{i},'Numeric')
0112 StructOutputFlag = 0;
0113 varargin(i) = [];
0114 elseif strcmpi(varargin{i},'Archive')
0115 ArchiveFlag = 1;
0116 if length(varargin) > i
0117
0118 if ischar(varargin{i+1})
0119 FileName = varargin{i+1};
0120 varargin(i+1) = [];
0121 end
0122 end
0123 varargin(i) = [];
0124 elseif strcmpi(varargin{i},'NoArchive')
0125 ArchiveFlag = 0;
0126 varargin(i) = [];
0127 elseif strcmpi(varargin{i},'Zeta') || strcmpi(varargin{i},'Physics')
0128 UnitsFlag = 'Physics';
0129 varargin(i) = [];
0130 if length(varargin) >= i
0131 if isnumeric(varargin{i})
0132 MCF = varargin{i};
0133 varargin(i) = [];
0134 if any(size(MCF)>1)
0135 error('Input MCF must be a scalar');
0136 end
0137 end
0138 end
0139 elseif strcmpi(varargin{i},'Hardware')
0140 UnitsFlag = 'Hardware';
0141 varargin(i) = [];
0142 if length(varargin) >= i
0143 if isnumeric(varargin{i})
0144 MCF = varargin{i};
0145 varargin(i) = [];
0146 if any(size(MCF)>1)
0147 error('Input MCF must be a scalar');
0148 end
0149 end
0150 end
0151 elseif strcmpi(varargin{i},'Simulator') || strcmpi(varargin{i},'Model') || strcmpi(varargin{i},'Online') || strcmpi(varargin{i},'Manual')
0152 ModeFlag = varargin{i};
0153 varargin(i) = [];
0154 elseif strcmpi(varargin{i},'NoDisplay')
0155 DisplayFlag = 0;
0156 varargin(i) = [];
0157 elseif strcmpi(varargin{i},'Display')
0158 DisplayFlag = 1;
0159 varargin(i) = [];
0160 end
0161 end
0162
0163
0164 if DisplayFlag == -1 && strcmpi(ModeFlag,'Model')
0165 DisplayFlag = 0;
0166 end
0167 if ArchiveFlag == -1 && strcmpi(ModeFlag,'Model')
0168 ArchiveFlag = 0;
0169 end
0170
0171
0172
0173 if length(varargin) >= 1
0174 if isnumeric(varargin{1})
0175 DeltaRF = varargin{1};
0176 else
0177 DeltaRF = [];
0178 end
0179 else
0180 DeltaRF = [];
0181 end
0182
0183
0184 if length(varargin) >= 2
0185 WaitFlag = varargin{2};
0186 end
0187 if isempty(WaitFlag) || WaitFlag == -3
0188 WaitFlag = 2.2 * getfamilydata('TuneDelay');
0189 end
0190 if isempty(WaitFlag)
0191 WaitFlag = input(' Delay for Tune Measurement (Seconds, Keyboard Pause = -4, or Manual Tune Input = -5) = ');
0192 end
0193
0194
0195
0196 if ArchiveFlag
0197 if isempty(FileName)
0198 FileName = appendtimestamp(getfamilydata('Default', 'ChroArchiveFile'));
0199 DirectoryName = getfamilydata('Directory','ChroData');
0200 if isempty(DirectoryName)
0201 DirectoryName = [getfamilydata('Directory','DataRoot') 'Chromaticity', filesep];
0202 else
0203
0204 DirStart = pwd;
0205 [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
0206 cd(DirStart);
0207 end
0208 [FileName, DirectoryName] = uiputfile('*.mat', 'Select Chromaticity File', [DirectoryName FileName]);
0209 if FileName == 0
0210 ArchiveFlag = 0;
0211 disp(' Chromaticity measurement canceled.');
0212 Chromaticity=[]; FileName='';
0213 return
0214 end
0215 FileName = [DirectoryName, FileName];
0216 elseif FileName == -1
0217 FileName = appendtimestamp(getfamilydata('Default', 'ChroArchiveFile'));
0218 DirectoryName = getfamilydata('Directory','ChroData');
0219 if isempty(DirectoryName)
0220 DirectoryName = [getfamilydata('Directory','DataRoot') 'Chromaticity', filesep];
0221 end
0222 FileName = [DirectoryName, FileName];
0223 end
0224 end
0225
0226
0227
0228 if isempty(UnitsFlag)
0229 UnitsFlag = getfamilydata('RF','Setpoint','Units');
0230 end
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243 if strcmpi(UnitsFlag,'Hardware')
0244 RFUnitsString = getfamilydata('RF','Setpoint','HWUnits');
0245 elseif strcmpi(UnitsFlag,'Physics')
0246 RFUnitsString = getfamilydata('RF','Setpoint','PhysicsUnits');
0247 else
0248 error('RF units unknown. Inputs DeltaRF directly.');
0249 end
0250
0251
0252 if isempty(DeltaRF)
0253
0254 DeltaRF = getfamilydata('DeltaRFChro');
0255
0256
0257 if isempty(DeltaRF)
0258 DeltaRF = getrf('Hardware') * getmcf * [-.004 -.002 0 .002 .004] ;
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 else
0272 if strcmpi(UnitsFlag,'Physics')
0273
0274 DeltaRF = hw2physics('RF', 'Setpoint', DeltaRF, [1 1], ModeFlag);
0275 end
0276 end
0277 end
0278
0279
0280
0281 if strcmpi(RFUnitsString, 'MHz')
0282 if abs(max(DeltaRF)-min(DeltaRF)) > .020;
0283 tmp = questdlg(sprintf('%f MHz is a large RF change. Do you want to continue?', abs(max(DeltaRF)-min(DeltaRF))),'Dispersion Measurement','YES','NO','YES');
0284 if strcmp(tmp,'NO')
0285 Chromaticity=[];
0286 return
0287 end
0288 end
0289 elseif strcmpi(RFUnitsString, 'kHz')
0290 if abs(max(DeltaRF)-min(DeltaRF)) > 20;
0291 tmp = questdlg(sprintf('%f kHz is a large RF change. Do you want to continue?', abs(max(DeltaRF)-min(DeltaRF))),'Dispersion Measurement','YES','NO','YES');
0292 if strcmp(tmp,'NO')
0293 Chromaticity=[];
0294 return
0295 end
0296 end
0297 elseif strcmpi(RFUnitsString, 'Hz')
0298 if abs(max(DeltaRF)-min(DeltaRF)) > 20000;
0299 tmp = questdlg(sprintf('%f Hz is a large RF change. Do you want to continue?', abs(max(DeltaRF)-min(DeltaRF))),'Dispersion Measurement','YES','NO','YES');
0300 if strcmp(tmp,'NO')
0301 Chromaticity=[];
0302 return
0303 end
0304 end
0305 else
0306
0307 end
0308
0309
0310
0311
0312 RFsp = getrf('Struct', UnitsFlag, ModeFlag);
0313
0314 if isempty(MCF)
0315 MCF = getmcf(ModeFlag);
0316 end
0317
0318
0319
0320 c.Data = [];
0321 c.FamilyName = 'Chromaticity';
0322 if isfamily('TUNE')
0323 c.Monitor = family2datastruct('TUNE','Monitor',[1 1;1 2]);
0324 else
0325 c.Monitor = gettune('Struct', 'Model');
0326 c.Monitor.Data = NaN * c.Monitor.Data;
0327 end
0328 c.Monitor = gettune('Struct', ModeFlag);
0329 c.Actuator = RFsp;
0330 c.ActuatorDelta = DeltaRF;
0331 c.GeV = getenergy(ModeFlag);
0332 c.DCCT = getam('DCCT', ModeFlag);
0333 c.ModulationMethod = 'Unipolar';
0334 c.WaitFlag = WaitFlag;
0335 c.TimeStamp = clock;
0336 c.Mode = ModeFlag;
0337 c.Units = UnitsFlag;
0338 c.UnitsString = [];
0339 c.DataDescriptor = 'Chromaticity';
0340 c.CreatedBy = 'measchro';
0341 c.OperationalMode = getfamilydata('OperationalMode');
0342
0343
0344 if strcmpi(ModeFlag,'Manual')
0345 c.X = NaN;
0346 c.Y = NaN;
0347 else
0348 c.X = getx('Struct', UnitsFlag, ModeFlag);
0349 c.Y = gety('Struct', UnitsFlag, ModeFlag);
0350 end
0351 c.MCF = MCF;
0352 RF0 = RFsp.Data(1);
0353 c.dp = -DeltaRF / (RF0*MCF);
0354
0355
0356 if strcmpi(ModeFlag,'Model') || strcmpi(ModeFlag,'Simulator')
0357
0358 WaitFlag = 0;
0359 ExtraDelay = 0;
0360 end
0361
0362
0363 if strcmpi(ModeFlag,'Model')
0364 c.Data = modelchro('Physics');
0365
0366 if strcmpi(UnitsFlag,'Physics')
0367 TuneUnitsString = getfamilydata('TUNE','Monitor','PhysicsUnits');
0368 if isempty(TuneUnitsString)
0369 TuneUnitsString = 'Fractional Tune';
0370 end
0371 c.UnitsString = [TuneUnitsString, '/(dp/p)'];
0372 else
0373
0374 c.Data(1,1) = c.Data(1,1) / (-RF0 * MCF);
0375 c.Data(2,1) = c.Data(2,1) / (-RF0 * MCF);
0376 TuneUnitsString = getfamilydata('TUNE','Monitor','HWUnits');
0377 if isempty(TuneUnitsString)
0378 TuneUnitsString = 'Fractional Tune';
0379 end
0380 c.UnitsString = [TuneUnitsString, '/',getfamilydata('RF','Setpoint','HWUnits')];
0381 end
0382
0383 else
0384
0385
0386 if DisplayFlag
0387 fprintf(' Begin chromaticity measurement\n');
0388 end
0389 for i = 1:length(DeltaRF)
0390
0391 if (isempty(ModeFlag) && strcmpi(getfamilydata('RF','Setpoint','Mode'),'Manual')) || strcmpi(ModeFlag,'Manual')
0392
0393 setrf(RF0 + DeltaRF(i), UnitsFlag, ModeFlag);
0394 else
0395
0396 rf = getrf(UnitsFlag, ModeFlag);
0397 for k = 1:NRFSteps
0398 setsp('RF', rf + k/NRFSteps * (RF0+DeltaRF(i)-rf), [], -1, UnitsFlag, ModeFlag);
0399 pause(0.1);
0400 end
0401 end
0402
0403 RF(:,i) = getrf(UnitsFlag, ModeFlag);
0404 if DisplayFlag
0405 fprintf(' %d. RF frequency is %.5f\n', i, RF(:,i));
0406 end
0407
0408
0409 if WaitFlag >= 0
0410 if DisplayFlag && ~strcmpi(ModeFlag,'Manual')
0411 fprintf(' Pausing %f seconds for the tune measurement\n', WaitFlag);
0412 pause(0);
0413 end
0414 sleep(WaitFlag);
0415 Tune(:,i) = gettune(ModeFlag);
0416 elseif WaitFlag == -4
0417 tmp = input(' Hit return when the tune measurement is ready. ');
0418 Tune(:,i) = gettune(ModeFlag);
0419 elseif WaitFlag == -5
0420 Tune(1,i) = input(' Input the horizontal tune = ');
0421 Tune(2,i) = input(' Input the vertical tune = ');
0422 else
0423 error('Tune delay method unknown');
0424 end
0425
0426
0427
0428
0429
0430
0431
0432 end
0433
0434
0435
0436
0437 if isempty(ModeFlag) && strcmpi(getfamilydata('RF','Setpoint','Mode'),'Manual')
0438
0439 setrf(RF0, UnitsFlag, ModeFlag);
0440 else
0441
0442 rf = getrf(UnitsFlag, ModeFlag);
0443 for k = 1:NRFSteps
0444 setsp('RF', rf + k/NRFSteps * (RF0-rf), [], -1, UnitsFlag, ModeFlag);
0445 pause(0.1);
0446 end
0447 end
0448
0449
0450
0451 c.Tune = Tune;
0452
0453 if strcmpi(UnitsFlag,'Physics')
0454
0455
0456
0457
0458
0459 p = polyfit(c.dp, Tune(1,:), 2);
0460 c.PolyFit(1,:) = p;
0461 c.Data(1,1) = p(2);
0462
0463
0464 p = polyfit(c.dp, Tune(2,:), 2);
0465 c.PolyFit(2,:) = p;
0466 c.Data(2,1) = p(2);
0467
0468 TuneUnitsString = getfamilydata('TUNE','Monitor','PhysicsUnits');
0469 if isempty(TuneUnitsString)
0470 c.UnitsString = ['Fractional Tune/(dp/p)'];
0471 else
0472 c.UnitsString = [TuneUnitsString,'/(dp/p)'];
0473 end
0474
0475
0476
0477 else
0478
0479
0480
0481
0482
0483 p = polyfit(DeltaRF, Tune(1,:), 2);
0484 c.PolyFit(1,:) = p;
0485 c.Data(1,1) = p(2);
0486
0487
0488 p = polyfit(DeltaRF, Tune(2,:), 2);
0489 c.PolyFit(2,:) = p;
0490 c.Data(2,1) = p(2);
0491
0492 TuneUnitsString = getfamilydata('TUNE','Monitor','HWUnits');
0493 if isempty(TuneUnitsString)
0494 c.UnitsString = ['Fractional Tune/',getfamilydata('RF','Setpoint','HWUnits')];
0495 else
0496 c.UnitsString = [TuneUnitsString,'/',getfamilydata('RF','Setpoint','HWUnits')];
0497 end
0498 end
0499 end
0500
0501 if DisplayFlag
0502 fprintf(' Chromaticity = %f [%s]\n', c.Data(1), c.UnitsString);
0503 fprintf(' Chromaticity = %f [%s]\n', c.Data(2), c.UnitsString);
0504 end
0505
0506 if DisplayFlag && ~strcmpi(ModeFlag,'Model')
0507
0508 plotchro(c);
0509 end
0510
0511
0512
0513 if ArchiveFlag
0514
0515 [DirectoryName, FileName, Ext] = fileparts(FileName);
0516 DirStart = pwd;
0517 [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
0518 Chromaticity = c;
0519 save(FileName, 'Chromaticity');
0520 if DisplayFlag
0521 fprintf(' Chromaticity data saved to %s.mat\n', [DirectoryName FileName]);
0522 if ErrorFlag
0523 fprintf(' Warning: %s was not the desired directory\n', DirectoryName);
0524 end
0525 end
0526 cd(DirStart);
0527 FileName = [DirectoryName, FileName, '.mat'];
0528 end
0529 if FileName == -1
0530 FileName = '';
0531 end
0532
0533
0534
0535 if StructOutputFlag
0536 Chromaticity = c;
0537 else
0538 Chromaticity = c.Data;
0539 end
0540
0541
0542 if DisplayFlag
0543 fprintf(' Chromaticity measurement is complete.\n');
0544 end
0545
0546