From f87118d2cd47e354cb3f5de3c62b0d2d711d8265 Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Thu, 2 Mar 2023 17:04:52 +0100 Subject: [PATCH 01/10] git ignore figures and logs --- .gitignore | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.gitignore b/.gitignore index fc501ed..c724924 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,12 @@ # exclude .str files generated by MADX when studying different optics **.str + +# exclude plots/figs +**.fig +**.png +**.ps +**.eps + +# exclude .log files +**.log From ab526cc7cd111a9be0e2c18bee1ce912a17c5403 Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Thu, 2 Mar 2023 17:06:29 +0100 Subject: [PATCH 02/10] a first MADX script to perform optics calculations for beam tomography --- HEBT/cmdx/beamTomography.cmdx | 171 ++++++++++++++++++++++++++++++++++ HEBT/hebt.madx | 7 +- macros.cmdx | 22 +++-- 3 files changed, 191 insertions(+), 9 deletions(-) create mode 100644 HEBT/cmdx/beamTomography.cmdx diff --git a/HEBT/cmdx/beamTomography.cmdx b/HEBT/cmdx/beamTomography.cmdx new file mode 100644 index 0000000..b62e76d --- /dev/null +++ b/HEBT/cmdx/beamTomography.cmdx @@ -0,0 +1,171 @@ +! ======================================================================== +! macros +! ======================================================================== + +! define all observations +writeSummary(fileName,MatchWhere): macro{ + assign, echo=fileName; + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E", + VALUE=Brho, BP, myID, I_H2_012A_QUE, I_H2_016A_QUE, I_H2_022A_QUE, I_HE_018A_QUE, I_HE_020A_QUE, I_HE_023A_QUE, I_HE_025A_QUE, + table(twiss,MatchWhere,MUX),table(twiss,MatchWhere,MUY); + assign, echo=terminal; +}; + +! a useful header to file written by writeObservations(fileName,monName) macro +writeHeader(fileName,MatchWhere): macro{ + assign, echo=fileName; + PRINT, TEXT=# Brho[Tm], BP[mm], ID[], + I_H2_012A_QUE[A], I_H2_016A_QUE[A], I_H2_022A_QUE[m-1], I_HE_018A_QUE[], I_HE_020A_QUE[m], I_HE_023A_QUE[], I_HE_025A_QUE[], + MUX:MatchWhere[],MUY:MatchWhere[]; + assign, echo=terminal; +}; + +MatchMe(MatchWhat,MatchWhere,fileName): macro = { + + ! clean files + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs; + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs; + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_rmatrix.tfs; + REMOVEFILE, FILE=fileName; + exec, writeHeader(fileName,MatchWhere); + myID=0; + + ! compute optics + nOfInterest=1; + SETVARS, TABLE=LGEN_HEBT_table, ROW=nOfInterest; + K0MB=K0MB_ref; + call, file="strengths/settings_from_LGEN_table.str"; + ! notify user where we are + PRINTF, TEXT="at Ek = %g MeV/u - Brho = %g Tm - BP = %g mm - row = %.0f ...", VALUE= Ek,Brho,BP,n; + + exec, setBeam(MyLine); + use, sequence=MyLine; + exec, saveOptics(LGEN); + COPYFILE, FILE="xpr_iso3_lgen_geometry.tfs", TO="output/xpr_iso3_lgen_geometry.tfs"; + COPYFILE, FILE="xpr_iso3_lgen_optics.tfs", TO="output/xpr_iso3_lgen_optics.tfs"; + COPYFILE, FILE="xpr_iso3_lgen_rmatrix.tfs", TO="output/xpr_iso3_lgen_rmatrix.tfs"; + REMOVEFILE, FILE="xpr_iso3_lgen_geometry.tfs"; + REMOVEFILE, FILE="xpr_iso3_lgen_optics.tfs"; + REMOVEFILE, FILE="xpr_iso3_lgen_rmatrix.tfs"; + origMUX=table(twiss,MatchWhere,MUX); + origMUY=table(twiss,MatchWhere,MUY); + origBETX=table(twiss,MatchWhere,BETX); + origBETY=table(twiss,MatchWhere,BETY); + origALFX=table(twiss,MatchWhere,ALFX); + origALFY=table(twiss,MatchWhere,ALFY); + ! value, origMuX, origMuY; + ! stop; + exec, writeSummary(fileName,MatchWhere); + I_H2_012A_QUE_MIN= 0.0; I_H2_012A_QUE_MAX=350.0; + I_H2_016A_QUE_MIN=-350.0; I_H2_016A_QUE_MAX= 0.0; + I_H2_022A_QUE_MIN= 0.0; I_H2_022A_QUE_MAX=350.0; + I_HE_018A_QUE_MIN=-350.0; I_HE_018A_QUE_MAX= 0.0; + I_HE_020A_QUE_MIN= 0.0; I_HE_020A_QUE_MAX=350.0; + I_HE_023A_QUE_MIN=-350.0; I_HE_023A_QUE_MAX= 0.0; + I_HE_025A_QUE_MIN= 0.0; I_HE_025A_QUE_MAX=350.0; + + ! match loop + WHILE (dmu <= dmuMax ) { + + myID=myID+1; + + ! actually match + USE, sequence=MyLine; + MATCH, sequence=MyLine, BETA0=initial; + CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; + CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; + + VARY, NAME=I_H2_012A_QUE, STEP=1E-1, LOWER=I_H2_012A_QUE_MIN, UPPER=I_H2_012A_QUE_MAX; + VARY, NAME=I_H2_016A_QUE, STEP=1E-1, LOWER=I_H2_016A_QUE_MIN, UPPER=I_H2_016A_QUE_MAX; + VARY, NAME=I_H2_022A_QUE, STEP=1E-1, LOWER=I_H2_022A_QUE_MIN, UPPER=I_H2_022A_QUE_MAX; + VARY, NAME=I_HE_018A_QUE, STEP=1E-1, LOWER=I_HE_018A_QUE_MIN, UPPER=I_HE_018A_QUE_MAX; + VARY, NAME=I_HE_020A_QUE, STEP=1E-1, LOWER=I_HE_020A_QUE_MIN, UPPER=I_HE_020A_QUE_MAX; + VARY, NAME=I_HE_023A_QUE, STEP=1E-1, LOWER=I_HE_023A_QUE_MIN, UPPER=I_HE_023A_QUE_MAX; + VARY, NAME=I_HE_025A_QUE, STEP=1E-1, LOWER=I_HE_025A_QUE_MIN, UPPER=I_HE_025A_QUE_MAX; + +! VARY, NAME=K1_H2_012A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_H2_016A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_H2_022A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_018A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_020A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; + + LMDIF, CALLS=10000, TOLERANCE=1.0E-6; + JACOBIAN, CALLS=10000, TOLERANCE=1.0E-6; + ENDMATCH; + + ! show optics + use, sequence=MyLine; + exec, saveOptics(mod_LGEN); + value, origMatchWhat, table(twiss,MatchWhere,MatchWhat); + COPYFILE, FILE="xpr_iso3_mod_lgen_geometry.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs, APPEND=true; + COPYFILE, FILE="xpr_iso3_mod_lgen_optics.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs, APPEND=true; + COPYFILE, FILE="xpr_iso3_mod_lgen_rmatrix.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_rmatrix.tfs, APPEND=true; + REMOVEFILE, FILE="xpr_iso3_mod_lgen_geometry.tfs"; + REMOVEFILE, FILE="xpr_iso3_mod_lgen_optics.tfs"; + REMOVEFILE, FILE="xpr_iso3_mod_lgen_rmatrix.tfs"; + exec, writeSummary(fileName,MatchWhere); + + ! get ready for new step +! ! limit current from IminScan to ImaxScan +! I_H2_012A_QUE_MIN=I_H2_012A_QUE; +! I_H2_016A_QUE_MAX=I_H2_016A_QUE; +! I_H2_022A_QUE_MIN=I_H2_022A_QUE; +! I_HE_018A_QUE_MAX=I_HE_018A_QUE; +! I_HE_020A_QUE_MIN=I_HE_020A_QUE; +! I_HE_023A_QUE_MAX=I_HE_023A_QUE; +! I_HE_025A_QUE_MIN=I_HE_025A_QUE; + dmu=dmu+dmuStp; + }; +}; + +! ======================================================================== +! actual script +! ======================================================================== + +! --------------------------------------------------------------------------- +! extract portion of beam line of interest +! --------------------------------------------------------------------------- +exec, insertMarkerUpstreamOf(MYINS,H2_007A_CEB,APICLS009); +SEQEDIT, SEQUENCE=APICLS009; +FLATTEN; +EXTRACT, SEQUENCE=APICLS009, FROM=MYINS, TO=X3_015A_MOB, NEWNAME=MyLine; +ENDEDIT; +seqedit, sequence=MyLine; flatten; endedit; + +! --------------------------------------------------------------------------- +! parse LGEN table and load currents +! --------------------------------------------------------------------------- +exec, parseHEBTtableLGEN(); +lunghezza=table(LGEN_HEBT_table,tablelength); + +! --------------------------------------------------------------------------- +! starting conditions +! V.Lante, "XPR optics design" +! --------------------------------------------------------------------------- +initial: BETA0, + betx = 8.184, + alfx =-0.443, + bety = 4.526, + alfy =-1.985, + dx = 0.0, + dpx = 0.0, + dy = 0.0, + dpy = 0.0; + +! --------------------------------------------------------------------------- +! match +! --------------------------------------------------------------------------- +! - MUX +dmuMin=-0.35; dmuMax= 0.65; dmuStp= 0.05; ! MUX scan [2pi] +dmu=dmuMin; +exec, MatchMe(MUX,X3_011B_VWN,"output/summary_X3_011B_VWN_MUX.tfs"); +! - MUY +dmuMin=-0.45; dmuMax= 0.55; dmuStp= 0.05; ! MUY scan [2pi] +dmu=dmuMin; +exec, MatchMe(MUY,X3_011B_VWN,"output/summary_X3_011B_VWN_MUY.tfs"); diff --git a/HEBT/hebt.madx b/HEBT/hebt.madx index 7b46476..ee661a7 100644 --- a/HEBT/hebt.madx +++ b/HEBT/hebt.madx @@ -29,7 +29,7 @@ iChopper=0; ! 6: XPR, ISO2 ! 7: XPR, ISO3 ! 8: XPR, ISO4 -iLine=2; +iLine=7; ! consider also H1 line (kicks are available only in case of LGEN currents) ! the H1 line is automatically extracted from synchro sequence @@ -125,7 +125,7 @@ exec, saveStrengths(example,HEBT); ! ============================================================================== ! loop through .tfs file out of the repo with currents -call, file="cmdx/loopThroughLGENFile.cmdx"; +! call, file="cmdx/loopThroughLGENFile.cmdx"; ! compute response matrices ! call, file="cmdx/compute_RM.cmdx"; @@ -137,3 +137,6 @@ call, file="cmdx/loopThroughLGENFile.cmdx"; ! call, file="cmdx/guessOptics.cmdx"; ! call, file="cmdx/myGuessOptics.cmdx"; ! call, file="cmdx/myMatchOptics.cmdx"; + +! Beam tomography +call, file="cmdx/beamTomography.cmdx"; diff --git a/macros.cmdx b/macros.cmdx index 60731dd..11d8a1c 100644 --- a/macros.cmdx +++ b/macros.cmdx @@ -226,13 +226,21 @@ I2K_QUs_fifth(MagName,biro) : macro { ! eg. H2_012A_QUE -> I_H2_012A_QUE, K1_H2_012A_QUE, F_H2_012A_QUE ! ...as well as coefficients of the polynomial ! eg. H2_012A_QUE -> a0_FIF_H2_012A_QUE, a1_FIF_H2_012A_QUE, ... and a5_FIF_H2_012A_QUE - K1_MagName = ( a0_FIF_MagName - +a1_FIF_MagName*abs(I_MagName) - +a2_FIF_MagName*abs(I_MagName)^2 - +a3_FIF_MagName*abs(I_MagName)^3 - +a4_FIF_MagName*abs(I_MagName)^4 - +a5_FIF_MagName*abs(I_MagName)^5) /biro *abs(F_MagName); - if (I_MagName<0){ K1_MagName=-K1_MagName; }; + if (I_MagName<0){ + K1_MagName:=-( a0_FIF_MagName + +a1_FIF_MagName*abs(I_MagName) + +a2_FIF_MagName*abs(I_MagName)^2 + +a3_FIF_MagName*abs(I_MagName)^3 + +a4_FIF_MagName*abs(I_MagName)^4 + +a5_FIF_MagName*abs(I_MagName)^5) /biro *abs(F_MagName); + }else{ + K1_MagName:=+( a0_FIF_MagName + +a1_FIF_MagName*abs(I_MagName) + +a2_FIF_MagName*abs(I_MagName)^2 + +a3_FIF_MagName*abs(I_MagName)^3 + +a4_FIF_MagName*abs(I_MagName)^4 + +a5_FIF_MagName*abs(I_MagName)^5) /biro *abs(F_MagName); + }; }; ! duplicate an existing sequence From 7840ead13f313068f48898744dfa0c1f913548cb Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Thu, 2 Mar 2023 17:07:47 +0100 Subject: [PATCH 03/10] possibility to show scanned optics --- HEBT/Reference_Results/showMyOptics.m | 146 +++++++++++++++++++------- 1 file changed, 109 insertions(+), 37 deletions(-) diff --git a/HEBT/Reference_Results/showMyOptics.m b/HEBT/Reference_Results/showMyOptics.m index cda89d0..36326bb 100644 --- a/HEBT/Reference_Results/showMyOptics.m +++ b/HEBT/Reference_Results/showMyOptics.m @@ -1,59 +1,131 @@ % {}~ % template analysis script -%% include Matlab library -pathToLibrary="..\..\..\MatLabTools"; -addpath(genpath(pathToLibrary)); +% %% include Matlab library +% pathToLibrary="..\..\..\MatLabTools"; +% addpath(genpath(pathToLibrary)); +% +% %% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % show single optics files +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% %% files +% opticsFileName="../xpr_iso3_lgen_optics.tfs"; +% geometryFileName="../xpr_iso3_lgen_geometry.tfs"; +% rMatrixFileName="../xpr_iso3_lgen_rmatrix.tfs"; +% +% %% acquire data +% optics = ParseTfsTable(opticsFileName,'optics'); +% [Qx,Qy,Chrx,Chry,Laccel,headerNames,headerValues] = ... +% ParseTfsTableHeader(opticsFileName); +% geometries = ParseTfsTable(geometryFileName,'geometry'); +% rMatrix = ParseTfsTable(rMatrixFileName,'rMatrix'); +% +% %% show the optics +% myTitle="ISO3 (XPR) - Proton - 30mm"; +% ShowOptics(optics,geometries,myTitle,Laccel,Qx,Qy,Chrx,Chry); +% ShowRmatrix(rMatrix,geometries,myTitle); +% +% %% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % compare different optics files (in principle also different geometries) +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% %% files +% labels=[ +% "reference" +% "new" +% ]; +% myTitle="ISO3 (XPR) - Proton - 30mm"; +% opticsFileNames=[ ... +% "../xpr_iso3_lgen_optics.tfs" ... +% "../xpr_iso3_mod_lgen_optics.tfs" ... +% ]; +% geometryFileNames=[ ... +% "../xpr_iso3_lgen_geometry.tfs" ... +% "../xpr_iso3_mod_lgen_geometry.tfs" ... +% ]; +% +% %% acquire data +% optics = ParseTfsTable(opticsFileNames,'optics'); +% [Qx,Qy,Chrx,Chry,Laccel,headerNames,headerValues] = ... +% ParseTfsTableHeader(opticsFileNames); +% geometries = ParseTfsTable(geometryFileNames,'geometry'); +% +% %% show the optics +% % CompareOptics(optics,labels,geometries,"CO",myTitle); +% CompareOptics(optics,labels,geometries,"BET",myTitle); +% % CompareOptics(optics,labels,geometries,"D",myTitle); %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% show single optics files +% compare different optics obtained via a scan %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% files -opticsFileName="../linez_lgen_optics.tfs"; -geometryFileName="../linez_lgen_geometry.tfs"; -rMatrixFileName="../linez_lgen_rmatrix.tfs"; +clear all; -%% acquire data -optics = ParseTfsTable(opticsFileName,'optics'); -[Qx,Qy,Chrx,Chry,Laccel,headerNames,headerValues] = ... - ParseTfsTableHeader(opticsFileName); -geometries = ParseTfsTable(geometryFileName,'geometry'); -rMatrix = ParseTfsTable(rMatrixFileName,'rMatrix'); - -%% show the optics -myTitle="Line Z (sala 1) - Carbon - 30mm"; -ShowOptics(optics,geometries,myTitle,Laccel,Qx,Qy,Chrx,Chry); -ShowRmatrix(rMatrix,geometries,myTitle); - -%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% compare different optics files (in principle also different geometries) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% files -labels=[ - "reference" - "new" - ]; -myTitle="Line T (sala s) - Carbon - 30mm"; +%% user settings +whatScan="MUY"; +eleScan="X3_011B_VWN"; opticsFileNames=[ ... - "linet_lgen_optics.tfs" ... - "../linet_lgen_optics.tfs" ... + "../output/xpr_iso3_lgen_optics.tfs" ... ]; geometryFileNames=[ ... - "linet_lgen_geometry.tfs" ... - "../linet_lgen_geometry.tfs" ... + "../output/xpr_iso3_lgen_geometry.tfs" ... ]; +myTitle=sprintf("%s scan at %s - ISO3 (XPR) - Proton - 30mm",whatScan,LabelMe(eleScan)); +splitFiles=[sprintf("../output/xpr_iso3_Scan%s_%s_lgen_optics.tfs",whatScan,eleScan)]; + +%% split files +clear oFid; +for ii=1:length(splitFiles) + fprintf("splitting file %s ...\n",splitFiles(ii)); + iFid = fopen(splitFiles(ii),"r"); + jj=0; + while ~feof(iFid) + tline = fgetl(iFid); + if (startsWith(tline,"@ NAME")) + jj=jj+1; + if (exist("oFid","var")) + fclose(oFid); + end + oFileName=strrep(splitFiles(ii),whatScan,sprintf("%s%03i",whatScan,jj)); + opticsFileNames=[opticsFileNames oFileName]; + fprintf("...saving data to file %s ...\n",oFileName); + oFid=fopen(oFileName,"w"); + end + fprintf(oFid,"%s\n",tline); + end + fclose(oFid); +end +% fclose(iFid); +fclose('all'); + %% acquire data optics = ParseTfsTable(opticsFileNames,'optics'); [Qx,Qy,Chrx,Chry,Laccel,headerNames,headerValues] = ... ParseTfsTableHeader(opticsFileNames); geometries = ParseTfsTable(geometryFileNames,'geometry'); +% build labels +labels=strings(length(opticsFileNames),1); +% - column mapping +[ colNames, colUnits, colFacts, mapping, readFormat ] = GetColumnsAndMappingTFS('optics'); +idCol=mapping(find(strcmp(colNames,whatScan))); +% idColX=mapping(find(strcmp(colNames,"MUX"))); +% idColY=mapping(find(strcmp(colNames,"MUY"))); +for ii=1:length(opticsFileNames) + idEle=find(contains(string(optics{ii,mapping(find(strcmp(colNames,"NAME")))}),eleScan)); + if (ii==1) + labels(ii)=sprintf("%s=%g (ref)",whatScan,optics{ii,idCol}(idEle)); + else + labels(ii)=sprintf("%s=%g",whatScan,optics{ii,idCol}(idEle)); + end +end + %% show the optics -CompareOptics(optics,labels,geometries,"CO",myTitle); +% CompareOptics(optics,labels,geometries,"CO",myTitle); CompareOptics(optics,labels,geometries,"BET",myTitle); -CompareOptics(optics,labels,geometries,"D",myTitle); +% CompareOptics(optics,labels,geometries,"D",myTitle); From d59b04264abc564af4de7d52e4f8f40d955171aa Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Thu, 2 Mar 2023 17:08:21 +0100 Subject: [PATCH 04/10] adding a MatLab script to show summary data on scans --- HEBT/Reference_Results/ShowSummaryFile.m | 43 ++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 HEBT/Reference_Results/ShowSummaryFile.m diff --git a/HEBT/Reference_Results/ShowSummaryFile.m b/HEBT/Reference_Results/ShowSummaryFile.m new file mode 100644 index 0000000..3a27253 --- /dev/null +++ b/HEBT/Reference_Results/ShowSummaryFile.m @@ -0,0 +1,43 @@ +% {}~ +% template analysis script + +% %% include Matlab library +% pathToLibrary="..\..\..\MatLabTools"; +% addpath(genpath(pathToLibrary)); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% parse .tfs summary table and plot stuff +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear all; + +whatScan="MUY"; +eleScan="X3_011B_VWN"; +iFileName=sprintf("../output/summary_%s_%s.tfs",eleScan,whatScan); +myTitle=sprintf("%s scan at %s - ISO3 (XPR) - Proton - 30mm",whatScan,LabelMe(eleScan)); + +summdaryData=readmatrix(iFileName,'HeaderLines',1,'Delimiter',',','FileType','text'); + +%% plot +% - preparatory stuff +nDataSets=7; +labels=LabelMe([ + "H2_012A_QUE" "H2_016A_QUE" "H2_022A_QUE" "HE_018A_QUE" "HE_020A_QUE" "HE_023A_QUE" "HE_025A_QUE" + ]); +% - actually plot +figure(); +cm=colormap(jet(length(labels))); +yyaxis left; +for ii=1:length(labels) + if (ii>1), hold on; end + plot(summdaryData(:,3),summdaryData(:,ii+3),".-","Color",cm(ii,:)); +end +ylabel("I [A]"); +yyaxis right; +plot(summdaryData(:,3),summdaryData(:,end-1),"k*-",summdaryData(:,3),summdaryData(:,end),"r*-"); +ylabel("\phi [2\pi]"); +yyaxis left; +title(myTitle); +legend([labels "MUX" "MUY"],"Location","best"); +grid on; xlabel("ID []"); From 83c3748074b8a0772c3d529f89f3465039150d41 Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Fri, 28 Apr 2023 11:56:17 +0200 Subject: [PATCH 05/10] implementing general purpose macros for reporting optics, geometry and Rmatrix at a specific element in a matching/scanning loop --- macros.cmdx | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/macros.cmdx b/macros.cmdx index 11d8a1c..3d2b8f4 100644 --- a/macros.cmdx +++ b/macros.cmdx @@ -112,6 +112,74 @@ saveAPIC(): macro = { }; }; +! save a .tfs file with linear optics functions in a specific column order +! the column order is the same as that of the saveGeometryTFS macro, apart from +! the very frist columns +! the optics functions are computed at a specific element in the context of a current scan +saveOpticsTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E", + VALUE=Brho, BP, myID, + table(twiss,eleName,BETX),table(twiss,eleName,ALFX),table(twiss,eleName,BETY),table(twiss,eleName,ALFY), + table(twiss,eleName,X),table(twiss,eleName,PX),table(twiss,eleName,Y),table(twiss,eleName,PY), + table(twiss,eleName,DX),table(twiss,eleName,DPX),table(twiss,eleName,DY),table(twiss,eleName,DPY), + table(twiss,eleName,MUX),table(twiss,eleName,MUY); + assign, echo=terminal; +}; +headOpticsTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINT, TEXT=# Brho[Tm], BP[mm], ID[], + BETX[m]:eleName, ALFX[]:eleName, BETY[m]:eleName, ALFY[]:eleName, + X[m]:eleName, PX[]:eleName, Y[m]:eleName, PY[]:eleName, + DX[m]:eleName, DPX[]:eleName, DY[m]:eleName, DPY[]:eleName, + MUX[2pi]:eleName, MUY[2pi]:eleName; + assign, echo=terminal; +}; + +! save a .tfs file with geometry infos (strengths, aperture, etc...) in a specific column order +! the column order is the same as that of the saveGeometryTFS macro, apart from +! the very frist columns +! the optics functions are computed at a specific element in the context of a current scan +saveGeometryTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,%-19s,%12.4f,%12.4f,%12.4f,%12.4f,% 12.4f,% 12.4f", + VALUE=Brho, BP, myID, + eleName->KICK,eleName->HKICK,eleName->VKICK,eleName->ANGLE, + eleName->K0*eleName->L,eleName->K1*eleName->L,eleName->K2*eleName->L, + eleName->APERTYPE,eleName->APER_1,eleName->APER_2,eleName->APER_3,eleName->APER_4,eleName->APOFF_1,eleName->APOFF_2; + assign, echo=terminal; +}; +headGeometryTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINT, TEXT=# Brho[Tm], BP[mm], ID[], + KICK[rad]:eleName, HKICK[rad]:eleName, VKICK[rad]:eleName, ANGLE[rad]:eleName, + K0L[rad]:eleName, K1L[rad/m]:eleName, K2L[rad/m2]:eleName, + APERTYPE[]:eleName, APER_1[m]:eleName, APER_2[m]:eleName, APER_3[m]:eleName, APER_4[m]:eleName, APOFF_1[m]:eleName, APOFF_2[m]:eleName; + assign, echo=terminal; +}; + +! save a .tfs file with main elements of R matrix in a specific column order +! the column order is the same as that of the saveRmatrixTFS macro, apart from +! the very frist columns +! the optics functions are computed at a specific element in the context of a current scan +saveRmatrixTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,%-19s,%12.4f,%12.4f,%12.4f,%12.4f,% 12.4f,% 12.4f", + VALUE=Brho, BP, myID, + eleName->RE11,eleName->RE12,eleName->RE21,eleName->RE22,eleName->RE16,eleName->RE26, + eleName->RE33,eleName->RE34,eleName->RE43,eleName->RE44,eleName->RE36,eleName->RE46, + eleName->RE51,eleName->RE52,eleName->RE55,eleName->RE56,eleName->RE66; + assign, echo=terminal; +}; +headRmatrixTFSatEle(fileName,eleName): macro = { + assign, echo=fileName; + PRINT, TEXT=# Brho[Tm], BP[mm], ID[], + RE11[]:eleName, RE12[m]:eleName, RE21[rad]:eleName, RE22[]:eleName, RE16[m]:eleName, RE26[rad]:eleName, + RE33[]:eleName, RE34[m]:eleName, RE43[rad]:eleName, RE44[]:eleName, RE36[m]:eleName, RE46[rad]:eleName, + RE51[s m-1]:eleName, RE52[s rad-1]:eleName, RE55[]:eleName, RE56[s]:eleName, RE66[m]:eleName; + assign, echo=terminal; +}; + ! insert a thin kicker up/dostream of a specific element surroundKICKER(MagName,SeqName): macro={ MagName->HKICK=0.0; MagName->VKICK=0.0; From 97d70d57c3e3bdf2c0187a020fb3c875a3e51127 Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Fri, 28 Apr 2023 11:57:21 +0200 Subject: [PATCH 06/10] major changes in script for computing optics: * possibility to use all magnets or only a series - code implementation not super-flexible, though... * possibility to constrain current values in a specific range based on previous iteration in scan; * possibility to reproduce optics with matched currents, to check actual optics; * possibility to scan upstream/downstream and combine different scans; * implemented a switch for cleaning output files; * appending results to output files; --- HEBT/cmdx/beamTomography.cmdx | 349 ++++++++++++++++++++++++++++------ 1 file changed, 290 insertions(+), 59 deletions(-) diff --git a/HEBT/cmdx/beamTomography.cmdx b/HEBT/cmdx/beamTomography.cmdx index b62e76d..eb8f539 100644 --- a/HEBT/cmdx/beamTomography.cmdx +++ b/HEBT/cmdx/beamTomography.cmdx @@ -3,40 +3,107 @@ ! ======================================================================== ! define all observations -writeSummary(fileName,MatchWhere): macro{ +writeCurrents(fileName,MatchWhere): macro{ assign, echo=fileName; - PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E", - VALUE=Brho, BP, myID, I_H2_012A_QUE, I_H2_016A_QUE, I_H2_022A_QUE, I_HE_018A_QUE, I_HE_020A_QUE, I_HE_023A_QUE, I_HE_025A_QUE, - table(twiss,MatchWhere,MUX),table(twiss,MatchWhere,MUY); + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E", + VALUE=Brho, BP, myID, I_H2_012A_QUE, I_H2_016A_QUE, I_H2_022A_QUE, I_HE_018A_QUE, I_HE_020A_QUE, I_HE_023A_QUE, I_HE_025A_QUE; assign, echo=terminal; }; ! a useful header to file written by writeObservations(fileName,monName) macro -writeHeader(fileName,MatchWhere): macro{ +writeCurrentsHeader(fileName,MatchWhere): macro{ assign, echo=fileName; PRINT, TEXT=# Brho[Tm], BP[mm], ID[], - I_H2_012A_QUE[A], I_H2_016A_QUE[A], I_H2_022A_QUE[m-1], I_HE_018A_QUE[], I_HE_020A_QUE[m], I_HE_023A_QUE[], I_HE_025A_QUE[], - MUX:MatchWhere[],MUY:MatchWhere[]; + I_H2_012A_QUE[A], I_H2_016A_QUE[A], I_H2_022A_QUE[A], I_HE_018A_QUE[A], I_HE_020A_QUE[A], I_HE_023A_QUE[A], I_HE_025A_QUE[A]; assign, echo=terminal; }; -MatchMe(MatchWhat,MatchWhere,fileName): macro = { +MatchMeActualSel(MatchWhat,MatchWhere): macro={ + USE, sequence=MyLine; + MATCH, sequence=MyLine, BETA0=initial; + CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; + CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; + + VARY, NAME=I_H2_012A_QUE, STEP=1E-3, LOWER=I_H2_012A_QUE_MIN, UPPER=I_H2_012A_QUE_MAX; + VARY, NAME=I_H2_016A_QUE, STEP=1E-3, LOWER=I_H2_016A_QUE_MIN, UPPER=I_H2_016A_QUE_MAX; + VARY, NAME=I_H2_022A_QUE, STEP=1E-3, LOWER=I_H2_022A_QUE_MIN, UPPER=I_H2_022A_QUE_MAX; + VARY, NAME=I_HE_018A_QUE, STEP=1E-3, LOWER=I_HE_018A_QUE_MIN, UPPER=I_HE_018A_QUE_MAX; +! VARY, NAME=I_HE_020A_QUE, STEP=1E-3, LOWER=I_HE_020A_QUE_MIN, UPPER=I_HE_020A_QUE_MAX; + VARY, NAME=I_HE_023A_QUE, STEP=1E-3, LOWER=I_HE_023A_QUE_MIN, UPPER=I_HE_023A_QUE_MAX; +! VARY, NAME=I_HE_025A_QUE, STEP=1E-3, LOWER=I_HE_025A_QUE_MIN, UPPER=I_HE_025A_QUE_MAX; + +! VARY, NAME=K1_H2_012A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_H2_016A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_H2_022A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_018A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_020A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; + + LMDIF, CALLS=10000, TOLERANCE=1.0E-6; + JACOBIAN, CALLS=1000, TOLERANCE=1.0E-6; + ENDMATCH; +}; + +MatchMeActual(MatchWhat,MatchWhere): macro={ + USE, sequence=MyLine; + MATCH, sequence=MyLine, BETA0=initial; + CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; + CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; + ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; + + VARY, NAME=I_H2_012A_QUE, STEP=1E-3, LOWER=I_H2_012A_QUE_MIN, UPPER=I_H2_012A_QUE_MAX; + VARY, NAME=I_H2_016A_QUE, STEP=1E-3, LOWER=I_H2_016A_QUE_MIN, UPPER=I_H2_016A_QUE_MAX; + VARY, NAME=I_H2_022A_QUE, STEP=1E-3, LOWER=I_H2_022A_QUE_MIN, UPPER=I_H2_022A_QUE_MAX; + VARY, NAME=I_HE_018A_QUE, STEP=1E-3, LOWER=I_HE_018A_QUE_MIN, UPPER=I_HE_018A_QUE_MAX; + VARY, NAME=I_HE_020A_QUE, STEP=1E-3, LOWER=I_HE_020A_QUE_MIN, UPPER=I_HE_020A_QUE_MAX; + VARY, NAME=I_HE_023A_QUE, STEP=1E-3, LOWER=I_HE_023A_QUE_MIN, UPPER=I_HE_023A_QUE_MAX; + VARY, NAME=I_HE_025A_QUE, STEP=1E-3, LOWER=I_HE_025A_QUE_MIN, UPPER=I_HE_025A_QUE_MAX; + +! VARY, NAME=K1_H2_012A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_H2_016A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_H2_022A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_018A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_020A_QUE, STEP=1E-5, LOWER=0.0; +! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; +! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; + + LMDIF, CALLS=10000, TOLERANCE=1.0E-6; + JACOBIAN, CALLS=1000, TOLERANCE=1.0E-6; + ENDMATCH; +}; + +MatchMe(MatchWhat,MatchWhere,CurrentsFileName): macro = { ! clean files - REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs; - REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs; - REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_rmatrix.tfs; - REMOVEFILE, FILE=fileName; - exec, writeHeader(fileName,MatchWhere); + if (iClean<>0) { + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs; + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs; + REMOVEFILE, FILE=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_rmatrix.tfs; + REMOVEFILE, FILE=output/CurrentsFileName; + REMOVEFILE, FILE=output/MatchWhere_summary_optics.tfs; + REMOVEFILE, FILE=output/MatchWhere_summary_rmatrix.tfs; + exec, writeCurrentsHeader(CurrentsFileName,MatchWhere); + exec, headOpticsTFSatEle(MatchWhere_summary_optics.tfs,MatchWhere); + exec, headRmatrixTFSatEle(MatchWhere_summary_rmatrix.tfs,MatchWhere); + }; myID=0; ! compute optics - nOfInterest=1; + nOfInterest=1; ! p@30mm + ! nOfInterest=lunghezza; ! p@320mm SETVARS, TABLE=LGEN_HEBT_table, ROW=nOfInterest; K0MB=K0MB_ref; call, file="strengths/settings_from_LGEN_table.str"; ! notify user where we are - PRINTF, TEXT="at Ek = %g MeV/u - Brho = %g Tm - BP = %g mm - row = %.0f ...", VALUE= Ek,Brho,BP,n; + PRINTF, TEXT="at Ek = %g MeV/u - Brho = %g Tm - BP = %g mm - row = %.0f ...", VALUE= Ek,Brho,BP,nOfInterest; exec, setBeam(MyLine); use, sequence=MyLine; @@ -55,7 +122,9 @@ MatchMe(MatchWhat,MatchWhere,fileName): macro = { origALFY=table(twiss,MatchWhere,ALFY); ! value, origMuX, origMuY; ! stop; - exec, writeSummary(fileName,MatchWhere); + exec, writeCurrents(CurrentsFileName,MatchWhere); + exec, saveOpticsTFSatEle(MatchWhere_summary_optics.tfs,MatchWhere); + exec, saveRmatrixTFSatEle(MatchWhere_summary_rmatrix.tfs,MatchWhere); I_H2_012A_QUE_MIN= 0.0; I_H2_012A_QUE_MAX=350.0; I_H2_016A_QUE_MIN=-350.0; I_H2_016A_QUE_MAX= 0.0; I_H2_022A_QUE_MIN= 0.0; I_H2_022A_QUE_MAX=350.0; @@ -65,65 +134,145 @@ MatchMe(MatchWhat,MatchWhere,fileName): macro = { I_HE_025A_QUE_MIN= 0.0; I_HE_025A_QUE_MAX=350.0; ! match loop - WHILE (dmu <= dmuMax ) { + WHILE (abs(dmu) <= abs(dmuMax) ) { myID=myID+1; + if (myID>1) { + if ( dmuStp>0 ) { + I_H2_012A_QUE_MIN=I_H2_012A_QUE; I_H2_012A_QUE_MAX=350.0; + I_H2_016A_QUE_MIN=-350.0; I_H2_016A_QUE_MAX=I_H2_016A_QUE; + I_H2_022A_QUE_MIN=I_H2_022A_QUE; I_H2_022A_QUE_MAX=350.0; + I_HE_018A_QUE_MIN=-350.0; I_HE_018A_QUE_MAX=I_HE_018A_QUE; + I_HE_020A_QUE_MIN=I_HE_020A_QUE; I_HE_020A_QUE_MAX=350.0; + I_HE_023A_QUE_MIN=-350.0; I_HE_023A_QUE_MAX=I_HE_023A_QUE; + I_HE_025A_QUE_MIN=I_HE_025A_QUE; I_HE_025A_QUE_MAX=350.0; + }else{ + I_H2_012A_QUE_MIN= 0.0; I_H2_012A_QUE_MAX=I_H2_012A_QUE; + I_H2_016A_QUE_MIN=I_H2_016A_QUE; I_H2_016A_QUE_MAX= 0.0; + I_H2_022A_QUE_MIN= 0.0; I_H2_022A_QUE_MAX=I_H2_022A_QUE; + I_HE_018A_QUE_MIN=I_HE_018A_QUE; I_HE_018A_QUE_MAX= 0.0; + I_HE_020A_QUE_MIN= 0.0; I_HE_020A_QUE_MAX=I_HE_020A_QUE; + I_HE_023A_QUE_MIN=I_HE_023A_QUE; I_HE_023A_QUE_MAX= 0.0; + I_HE_025A_QUE_MIN= 0.0; I_HE_025A_QUE_MAX=I_HE_025A_QUE; + }; + }; + ! actually match - USE, sequence=MyLine; - MATCH, sequence=MyLine, BETA0=initial; - CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; - ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; - ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; - CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; - ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; - ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; - - VARY, NAME=I_H2_012A_QUE, STEP=1E-1, LOWER=I_H2_012A_QUE_MIN, UPPER=I_H2_012A_QUE_MAX; - VARY, NAME=I_H2_016A_QUE, STEP=1E-1, LOWER=I_H2_016A_QUE_MIN, UPPER=I_H2_016A_QUE_MAX; - VARY, NAME=I_H2_022A_QUE, STEP=1E-1, LOWER=I_H2_022A_QUE_MIN, UPPER=I_H2_022A_QUE_MAX; - VARY, NAME=I_HE_018A_QUE, STEP=1E-1, LOWER=I_HE_018A_QUE_MIN, UPPER=I_HE_018A_QUE_MAX; - VARY, NAME=I_HE_020A_QUE, STEP=1E-1, LOWER=I_HE_020A_QUE_MIN, UPPER=I_HE_020A_QUE_MAX; - VARY, NAME=I_HE_023A_QUE, STEP=1E-1, LOWER=I_HE_023A_QUE_MIN, UPPER=I_HE_023A_QUE_MAX; - VARY, NAME=I_HE_025A_QUE, STEP=1E-1, LOWER=I_HE_025A_QUE_MIN, UPPER=I_HE_025A_QUE_MAX; - -! VARY, NAME=K1_H2_012A_QUE, STEP=1E-5, LOWER=0.0; -! VARY, NAME=K1_H2_016A_QUE, STEP=1E-5, UPPER=0.0; -! VARY, NAME=K1_H2_022A_QUE, STEP=1E-5, LOWER=0.0; -! VARY, NAME=K1_HE_018A_QUE, STEP=1E-5, UPPER=0.0; -! VARY, NAME=K1_HE_020A_QUE, STEP=1E-5, LOWER=0.0; -! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; -! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; + if (myID>idMaxFullFree) { + exec, MatchMeActualSel(MatchWhat,MatchWhere); + }else{ + exec, MatchMeActual(MatchWhat,MatchWhere); + }; + + ! check quality of matching + if (myID>1) { + use, sequence=MyLine; + exec, saveOptics(mod_LGEN); + value, origMatchWhat, table(twiss,MatchWhere,MatchWhat); + myRelVar=(table(twiss,MatchWhere,MatchWhat)-(origMatchWhat+oldDmu))/dmuStp; + if (abs(myRelVar)<0.9) { + ! not successful match (tune out by more than 10%): break monothony of currents + I_H2_012A_QUE_MIN= 0.0; I_H2_012A_QUE_MAX=350.0; + I_H2_016A_QUE_MIN=-350.0; I_H2_016A_QUE_MAX= 0.0; + I_H2_022A_QUE_MIN= 0.0; I_H2_022A_QUE_MAX=350.0; + I_HE_018A_QUE_MIN=-350.0; I_HE_018A_QUE_MAX= 0.0; + I_HE_020A_QUE_MIN= 0.0; I_HE_020A_QUE_MAX=350.0; + I_HE_023A_QUE_MIN=-350.0; I_HE_023A_QUE_MAX= 0.0; + I_HE_025A_QUE_MIN= 0.0; I_HE_025A_QUE_MAX=350.0; + exec, MatchMeActual(MatchWhat,MatchWhere); + }; + }; - LMDIF, CALLS=10000, TOLERANCE=1.0E-6; - JACOBIAN, CALLS=10000, TOLERANCE=1.0E-6; - ENDMATCH; - ! show optics use, sequence=MyLine; exec, saveOptics(mod_LGEN); value, origMatchWhat, table(twiss,MatchWhere,MatchWhat); + ! append optics COPYFILE, FILE="xpr_iso3_mod_lgen_geometry.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs, APPEND=true; COPYFILE, FILE="xpr_iso3_mod_lgen_optics.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs, APPEND=true; COPYFILE, FILE="xpr_iso3_mod_lgen_rmatrix.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_rmatrix.tfs, APPEND=true; REMOVEFILE, FILE="xpr_iso3_mod_lgen_geometry.tfs"; REMOVEFILE, FILE="xpr_iso3_mod_lgen_optics.tfs"; REMOVEFILE, FILE="xpr_iso3_mod_lgen_rmatrix.tfs"; - exec, writeSummary(fileName,MatchWhere); + ! append summary + exec, writeCurrents(CurrentsFileName,MatchWhere); + COPYFILE, FILE=CurrentsFileName, TO=output/CurrentsFileName, APPEND=true; + REMOVEFILE, FILE=CurrentsFileName; + exec, saveOpticsTFSatEle(MatchWhere_summary_optics.tfs,MatchWhere); + COPYFILE, FILE=MatchWhere_summary_optics.tfs, TO=output/MatchWhere_summary_optics.tfs, APPEND=true; + REMOVEFILE, FILE=MatchWhere_summary_optics.tfs; + exec, saveRmatrixTFSatEle(MatchWhere_summary_rmatrix.tfs,MatchWhere); + COPYFILE, FILE=MatchWhere_summary_rmatrix.tfs, TO=output/MatchWhere_summary_rmatrix.tfs, APPEND=true; + REMOVEFILE, FILE=MatchWhere_summary_rmatrix.tfs; + ! debug output + ! value, dmu, dmuMax, myID; + ! get ready for new step -! ! limit current from IminScan to ImaxScan -! I_H2_012A_QUE_MIN=I_H2_012A_QUE; -! I_H2_016A_QUE_MAX=I_H2_016A_QUE; -! I_H2_022A_QUE_MIN=I_H2_022A_QUE; -! I_HE_018A_QUE_MAX=I_HE_018A_QUE; -! I_HE_020A_QUE_MIN=I_HE_020A_QUE; -! I_HE_023A_QUE_MAX=I_HE_023A_QUE; -! I_HE_025A_QUE_MIN=I_HE_025A_QUE; + oldDmu=dmu; dmu=dmu+dmuStp; }; }; +ReproduceMe(obsEle,CurrentsFileName): macro = { + + ! clean files + if (iClean<>0) { + REMOVEFILE, FILE=output/xpr_iso3_lgen_rep_geometry.tfs; + REMOVEFILE, FILE=output/xpr_iso3_lgen_rep_optics.tfs; + REMOVEFILE, FILE=output/xpr_iso3_lgen_rep_rmatrix.tfs; + REMOVEFILE, FILE=output/rep_summary_optics.tfs; + REMOVEFILE, FILE=output/rep_summary_rmatrix.tfs; + exec, headOpticsTFSatEle(rep_summary_optics.tfs,obsEle); + exec, headRmatrixTFSatEle(rep_summary_rmatrix.tfs,obsEle); + }; + + ! load starting optics + nOfInterest=1; ! p@30mm + ! nOfInterest=lunghezza; ! p@320mm + SETVARS, TABLE=LGEN_HEBT_table, ROW=nOfInterest; + K0MB=K0MB_ref; + call, file="strengths/settings_from_LGEN_table.str"; + ! notify user where we are + PRINTF, TEXT="at Ek = %g MeV/u - Brho = %g Tm - BP = %g mm - row = %.0f ...", VALUE= Ek,Brho,BP,nOfInterest; + + ! load scan table + READTABLE, file=output/CurrentsFileName, table=SCAN_table; + lunghezzaScan=table(SCAN_table,tablelength); + + ! loop through table + ! first data line is 1 (i.e. .txt header is skipped) + Nstart=1; Nstop=lunghezzaScan; Nstep=1; + n=Nstart; myID=0; + WHILE (n <= Nstop ) { + myID=myID+1; + SETVARS, TABLE=SCAN_table, ROW=n; + call, file="strengths/settings_from_LGEN_table_H2-H4.str"; + call, file="strengths/settings_from_LGEN_table_XPR.str"; + PRINTF, TEXT="at Ek = %g MeV/u - Brho = %g Tm - BP = %g mm - row = %.0f ...", VALUE= Ek,Brho,BP,n; + exec, setBeam(MyLine); + use, sequence=MyLine; + exec, saveOptics(LGEN_REP); + exec, saveOpticsTFSatEle(rep_summary_optics.tfs,obsEle); + exec, saveRmatrixTFSatEle(rep_summary_rmatrix.tfs,obsEle); + + ! save data + COPYFILE, FILE=xpr_iso3_lgen_rep_geometry.tfs, TO=output/xpr_iso3_lgen_rep_geometry.tfs, APPEND=true; + COPYFILE, FILE=xpr_iso3_lgen_rep_optics.tfs, TO=output/xpr_iso3_lgen_rep_optics.tfs, APPEND=true; + COPYFILE, FILE=xpr_iso3_lgen_rep_rmatrix.tfs, TO=output/xpr_iso3_lgen_rep_rmatrix.tfs, APPEND=true; + COPYFILE, FILE=rep_summary_optics.tfs, TO=output/rep_summary_optics.tfs, APPEND=true; + COPYFILE, FILE=rep_summary_rmatrix.tfs, TO=output/rep_summary_rmatrix.tfs, APPEND=true; + REMOVEFILE, FILE="xpr_iso3_lgen_rep_geometry.tfs"; + REMOVEFILE, FILE="xpr_iso3_lgen_rep_optics.tfs"; + REMOVEFILE, FILE="xpr_iso3_lgen_rep_rmatrix.tfs"; + REMOVEFILE, FILE=rep_summary_optics.tfs; + REMOVEFILE, FILE=rep_summary_rmatrix.tfs; + n=n+Nstep; + }; + +}; + ! ======================================================================== ! actual script ! ======================================================================== @@ -162,10 +311,92 @@ initial: BETA0, ! match ! --------------------------------------------------------------------------- ! - MUX -dmuMin=-0.35; dmuMax= 0.65; dmuStp= 0.05; ! MUX scan [2pi] +! dmuMin=-0.35; dmuMax= 0.65; dmuStp= 0.05; ! general MUX scan [2pi] +! dmuMin=-0.15; dmuMax= 0.6; dmuStp= 0.005; ! detailed MUX scan [2pi] +/* +iClean=1; dmuMin=0.0; dmuMax=-91.0; dmuStp=-10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=0; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +stop; +*/ +/* +iClean=0; dmuMin=0.0; dmuMax=41.0; dmuStp= 10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; -exec, MatchMe(MUX,X3_011B_VWN,"output/summary_X3_011B_VWN_MUX.tfs"); -! - MUY -dmuMin=-0.45; dmuMax= 0.55; dmuStp= 0.05; ! MUY scan [2pi] +idMaxFullFree=0; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +stop; +*/ +/* +iClean=0; dmuMin=40.0; dmuMax=81.0; dmuStp= 10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; -exec, MatchMe(MUY,X3_011B_VWN,"output/summary_X3_011B_VWN_MUY.tfs"); +idMaxFullFree=1; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +stop; +*/ +/* +iClean=0; dmuMin=80.0; dmuMax=181.0; dmuStp= 10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +stop; +*/ +/* +iClean=1; dmuMin=0.0; dmuMax=-91.0; dmuStp=-10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +! stop; +iClean=0; dmuMin=0.0; dmuMax=181.0; dmuStp= 10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); +stop; +*/ + +! iClean=1; dmuMin=-55.0; dmuMax=215.0; dmuStp= 5.0; ! detailed MUX scan [degs] +! dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +! dmu=dmuMin; +! exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); + +! - MUY +! dmuMin=-0.45; dmuMax= 0.55; dmuStp= 0.05; ! MUY scan [2pi] +! dmuMin=-0.15; dmuMax= 0.6; dmuStp= 0.005; ! detailed MUY scan [2pi] +! iClean=1; dmuMin=0.0; dmuMax=-55.0; dmuStp=-5.0; ! detailed MUY scan [degs] +! dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +! dmu=dmuMin; +! exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); +! iClean=0; dmuMin=0.0; dmuMax=215.0; dmuStp= 5.0; ! detailed MUY scan [degs] +! dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +! dmu=dmuMin; +! exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); +! iClean=1; dmuMin=-55.0; dmuMax=215.0; dmuStp= 5.0; ! detailed MUY scan [degs] +! dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +! dmu=dmuMin; +! exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); +/* +iClean=1; dmuMin=0.0; dmuMax=-131.0; dmuStp=-10.0; ! detailed MUY scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); +! stop; +iClean=0; dmuMin=0.0; dmuMax=131.0; dmuStp= 10.0; ! detailed MUY scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); +stop; +*/ + +! --------------------------------------------------------------------------- +! reproduce optics +! --------------------------------------------------------------------------- +iClean=1; +exec, ReproduceMe(X3_011B_VWN,applied_currents.tfs); From d209f77c0b3e39dee4ddca7fa16a035680dd7a44 Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Fri, 28 Apr 2023 12:02:05 +0200 Subject: [PATCH 07/10] improving tool for analysing matched optics: * prepare .xlsx file for QA scans + .tfs files for reproducing optics; * compare matched optics and that from actual currents - only values at observation point... * more flexible code; --- HEBT/Reference_Results/ShowSummaryFile.m | 149 ++++++++++++++++++++--- HEBT/Reference_Results/showMyOptics.m | 24 ++-- 2 files changed, 148 insertions(+), 25 deletions(-) diff --git a/HEBT/Reference_Results/ShowSummaryFile.m b/HEBT/Reference_Results/ShowSummaryFile.m index 3a27253..749fff7 100644 --- a/HEBT/Reference_Results/ShowSummaryFile.m +++ b/HEBT/Reference_Results/ShowSummaryFile.m @@ -2,7 +2,7 @@ % template analysis script % %% include Matlab library -% pathToLibrary="..\..\..\MatLabTools"; +% pathToLibrary="../../../MatLabTools"; % addpath(genpath(pathToLibrary)); %% @@ -10,34 +10,151 @@ % parse .tfs summary table and plot stuff %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -clear all; +% clear all; -whatScan="MUY"; +whatScan="MUX"; +otherMu="MUY"; eleScan="X3_011B_VWN"; -iFileName=sprintf("../output/summary_%s_%s.tfs",eleScan,whatScan); -myTitle=sprintf("%s scan at %s - ISO3 (XPR) - Proton - 30mm",whatScan,LabelMe(eleScan)); +beam="P030"; +% outputFolder="../output_p030_MUX_free_10p0degs"; +outputFolder="../output"; +iFileNameCurrentSummary=sprintf("%s/summary_currents.tfs",outputFolder); +iFileNameOpticsSummary=sprintf("%s/%s_summary_optics.tfs",outputFolder,lower(eleScan)); +iFileNameRepOpticsSummary=sprintf("%s/rep_summary_optics.tfs",outputFolder); +myTitle=sprintf("%s scan at %s - ISO3 (XPR) - %s",whatScan,LabelMe(eleScan),beam); -summdaryData=readmatrix(iFileName,'HeaderLines',1,'Delimiter',',','FileType','text'); +% acquire currents +[summaryData,summaryHead,MagNames,iMagNames]=ParseTfsTableCurrent(iFileNameCurrentSummary); +% acquire optics +scannedOptics=ParseTfsTable(iFileNameOpticsSummary,'optics',"SCAN"); +[ colNames, colUnits, colFacts, mapping, readFormat ] = ... + GetColumnsAndMappingTFS("optics","SCAN"); +iID=mapping(find(strcmp(colNames,'ID'))); +iMU=mapping(find(strcmp(colNames,whatScan))); +iMUX=mapping(find(strcmp(colNames,"MUX"))); +iMUY=mapping(find(strcmp(colNames,"MUY"))); +ioMU=mapping(find(strcmp(colNames,otherMu))); +zeroPos=find([scannedOptics{:,iID}' 0]==0); +sortedIDs=NaN(size(summaryData,1),1); iLast=0; +for ii=1:length(zeroPos)-1 + myRange=zeroPos(ii):zeroPos(ii+1)-1; + [~,mySortedIDs]=sort(scannedOptics{iMU}(myRange)); % sort by phase advance + nPoints=length(mySortedIDs); + sortedIDs(1+iLast:nPoints+iLast)=mySortedIDs+iLast; + iLast=iLast+nPoints; +end +nPoints=length(sortedIDs); +% selMagnets=MagNames; +allMagnets=[ + "H2_012A_QUE" + "H2_016A_QUE" + "H2_022A_QUE" + "HE_018A_QUE" + "HE_020A_QUE" + "HE_023A_QUE" + "HE_025A_QUE" + ]; +allLGENs=[ + "P7-008A-LGEN" + "P7-009A-LGEN" + "P7-010A-LGEN" + "PX-001A-LGEN" + "PX-002A-LGEN" + "PX-003A-LGEN" + "PX-004A-LGEN" + ]; +[selMagnets,ia,ib]=intersect(allMagnets,MagNames); +nDataSets=length(selMagnets); %% plot % - preparatory stuff -nDataSets=7; -labels=LabelMe([ - "H2_012A_QUE" "H2_016A_QUE" "H2_022A_QUE" "HE_018A_QUE" "HE_020A_QUE" "HE_023A_QUE" "HE_025A_QUE" - ]); +labels=LabelMe(selMagnets); % - actually plot figure(); -cm=colormap(jet(length(labels))); +cm=colormap(jet(nDataSets)); yyaxis left; +lFirst=true; for ii=1:length(labels) - if (ii>1), hold on; end - plot(summdaryData(:,3),summdaryData(:,ii+3),".-","Color",cm(ii,:)); + if (~lFirst), hold on; end + plot(1:nPoints,summaryData(sortedIDs,iMagNames(ib(ii))),".-","Color",cm(ii,:)); + if (lFirst), lFirst=false; end end ylabel("I [A]"); yyaxis right; -plot(summdaryData(:,3),summdaryData(:,end-1),"k*-",summdaryData(:,3),summdaryData(:,end),"r*-"); -ylabel("\phi [2\pi]"); +plot(1:nPoints,scannedOptics{iMUX}(sortedIDs)*360,"k*-",1:nPoints,scannedOptics{iMUY}(sortedIDs)*360,"r*-"); +ylabel("\phi [degs]"); yyaxis left; title(myTitle); -legend([labels "MUX" "MUY"],"Location","best"); +legend([labels' "MUX" "MUY"],"Location","best"); grid on; xlabel("ID []"); + +%% +return; + +%% create QA file +MyData=NaN(nDataSets+1,3*nPoints); +iCol=0; iWritten=0; lWash=false; +for ii=1:nPoints + % skip repetitions + if (ii>1) + if (all(abs(summaryData(sortedIDs(ii),iMagNames(ib))')==abs(summaryData(sortedIDs(ii-1),iMagNames(ib))'))) + continue; + elseif (scannedOptics{iMU}(sortedIDs(ii))*360<=MyData(end,iWritten)) + continue; + end + end + if (iWritten>0) + % check if washing is needed + lWash=any(abs(summaryData(sortedIDs(ii),iMagNames(ib))') Date: Thu, 11 May 2023 15:40:03 +0200 Subject: [PATCH 08/10] now RE matrix is actually written --- macros.cmdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/macros.cmdx b/macros.cmdx index 3d2b8f4..5a0dce4 100644 --- a/macros.cmdx +++ b/macros.cmdx @@ -164,11 +164,11 @@ headGeometryTFSatEle(fileName,eleName): macro = { ! the optics functions are computed at a specific element in the context of a current scan saveRmatrixTFSatEle(fileName,eleName): macro = { assign, echo=fileName; - PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,%-19s,%12.4f,%12.4f,%12.4f,%12.4f,% 12.4f,% 12.4f", + PRINTF, TEXT="% 19.12E,% 6.1f,% 6.0f,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E,% 19.12E", VALUE=Brho, BP, myID, - eleName->RE11,eleName->RE12,eleName->RE21,eleName->RE22,eleName->RE16,eleName->RE26, - eleName->RE33,eleName->RE34,eleName->RE43,eleName->RE44,eleName->RE36,eleName->RE46, - eleName->RE51,eleName->RE52,eleName->RE55,eleName->RE56,eleName->RE66; + table(twiss,eleName,RE11),table(twiss,eleName,RE12),table(twiss,eleName,RE21),table(twiss,eleName,RE22),table(twiss,eleName,RE16),table(twiss,eleName,RE26), + table(twiss,eleName,RE33),table(twiss,eleName,RE34),table(twiss,eleName,RE43),table(twiss,eleName,RE44),table(twiss,eleName,RE36),table(twiss,eleName,RE46), + table(twiss,eleName,RE51),table(twiss,eleName,RE52),table(twiss,eleName,RE55),table(twiss,eleName,RE56),table(twiss,eleName,RE66); assign, echo=terminal; }; headRmatrixTFSatEle(fileName,eleName): macro = { From eb0e9437c0c043757e667a028f119b9f9585821c Mon Sep 17 00:00:00 2001 From: Mereghetti Alessio Date: Tue, 16 May 2023 13:03:10 +0200 Subject: [PATCH 09/10] when creating QA files, the currents for the ref point can be chosen between TM and one of the matched configurations with same phase advance --- HEBT/Reference_Results/ShowSummaryFile.m | 34 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/HEBT/Reference_Results/ShowSummaryFile.m b/HEBT/Reference_Results/ShowSummaryFile.m index 749fff7..5eb6713 100644 --- a/HEBT/Reference_Results/ShowSummaryFile.m +++ b/HEBT/Reference_Results/ShowSummaryFile.m @@ -15,7 +15,9 @@ whatScan="MUX"; otherMu="MUY"; eleScan="X3_011B_VWN"; -beam="P030"; +beam="P320"; +dmu=10; % [degs] +i0=1; % take i0-th matched point with same phase advance as nominal as reference value % outputFolder="../output_p030_MUX_free_10p0degs"; outputFolder="../output"; iFileNameCurrentSummary=sprintf("%s/summary_currents.tfs",outputFolder); @@ -92,27 +94,43 @@ return; %% create QA file -MyData=NaN(nDataSets+1,3*nPoints); +[~,iQAsorted]=sort(scannedOptics{iMU}); +mu0=scannedOptics{iMU}(zeroPos(1)); % nominal phase advance +iMU0s_QA=find(mu0-dmu/(360*2)1) + % erase elements from iQAsorted + iQAsorted(iMU0s_QA(2:end))=[]; +end +if (i0==0) + % currents at nominal phase advance are those from TM + iQAsorted(iMU0s_QA(1))=zeroPos(1); +else + % currents at nominal phase advance are those from i0 + iMU0s=find(mu0-dmu/(360*2)1) - if (all(abs(summaryData(sortedIDs(ii),iMagNames(ib))')==abs(summaryData(sortedIDs(ii-1),iMagNames(ib))'))) + if (all(abs(summaryData(iQAsorted(ii),iMagNames(ib))')==abs(summaryData(iQAsorted(ii-1),iMagNames(ib))'))) continue; - elseif (scannedOptics{iMU}(sortedIDs(ii))*360<=MyData(end,iWritten)) + elseif (scannedOptics{iMU}(iQAsorted(ii))*360<=MyData(end,iWritten)) continue; end end if (iWritten>0) % check if washing is needed - lWash=any(abs(summaryData(sortedIDs(ii),iMagNames(ib))') Date: Wed, 31 May 2023 13:56:28 +0200 Subject: [PATCH 10/10] possibility to perform matching also at last SFP At the same time, actual mu value at iteration 0 (and no longer the original one) is used for mu-scan --- HEBT/cmdx/beamTomography.cmdx | 87 ++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 23 deletions(-) diff --git a/HEBT/cmdx/beamTomography.cmdx b/HEBT/cmdx/beamTomography.cmdx index eb8f539..9aa2e31 100644 --- a/HEBT/cmdx/beamTomography.cmdx +++ b/HEBT/cmdx/beamTomography.cmdx @@ -21,10 +21,10 @@ writeCurrentsHeader(fileName,MatchWhere): macro{ MatchMeActualSel(MatchWhat,MatchWhere): macro={ USE, sequence=MyLine; MATCH, sequence=MyLine, BETA0=initial; - CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; + CONSTRAINT, sequence=MyLine, range=#S/MatchWhere, BETX<8000, BETY<8000; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; - CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; + CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=4*origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; @@ -44,18 +44,18 @@ MatchMeActualSel(MatchWhat,MatchWhere): macro={ ! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; ! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; - LMDIF, CALLS=10000, TOLERANCE=1.0E-6; - JACOBIAN, CALLS=1000, TOLERANCE=1.0E-6; + LMDIF, CALLS=20000, TOLERANCE=1.0E-6; + JACOBIAN, CALLS=2000, TOLERANCE=1.0E-6; ENDMATCH; }; MatchMeActual(MatchWhat,MatchWhere): macro={ USE, sequence=MyLine; MATCH, sequence=MyLine, BETA0=initial; - CONSTRAINT, sequence=MyLine, range=#S/#E, BETX<120, BETY<120; + CONSTRAINT, sequence=MyLine, range=#S/HE_030B_SFP, BETX<50, BETY<800; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, MatchWhat=origMatchWhat+dmu; - CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, MatchWhat=origMatchWhat+dmu; + CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=8*origBETY, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, ALFX=origALFX, MatchWhat=origMatchWhat+dmu; ! CONSTRAINT, sequence=MyLine, range=MatchWhere, BETX=origBETX, BETY=origBETY, ALFX=origALFX, ALFY=origALFY, MatchWhat=origMatchWhat+pi/10, MUY=origMuY; @@ -75,8 +75,8 @@ MatchMeActual(MatchWhat,MatchWhere): macro={ ! VARY, NAME=K1_HE_023A_QUE, STEP=1E-5, UPPER=0.0; ! VARY, NAME=K1_HE_025A_QUE, STEP=1E-5, LOWER=0.0; - LMDIF, CALLS=10000, TOLERANCE=1.0E-6; - JACOBIAN, CALLS=1000, TOLERANCE=1.0E-6; + LMDIF, CALLS=20000, TOLERANCE=1.0E-6; + JACOBIAN, CALLS=2000, TOLERANCE=1.0E-6; ENDMATCH; }; @@ -97,8 +97,8 @@ MatchMe(MatchWhat,MatchWhere,CurrentsFileName): macro = { myID=0; ! compute optics - nOfInterest=1; ! p@30mm - ! nOfInterest=lunghezza; ! p@320mm + ! nOfInterest=1; ! p@30mm + nOfInterest=lunghezza; ! p@320mm SETVARS, TABLE=LGEN_HEBT_table, ROW=nOfInterest; K0MB=K0MB_ref; call, file="strengths/settings_from_LGEN_table.str"; @@ -137,7 +137,7 @@ MatchMe(MatchWhat,MatchWhere,CurrentsFileName): macro = { WHILE (abs(dmu) <= abs(dmuMax) ) { myID=myID+1; - +/* if (myID>1) { if ( dmuStp>0 ) { I_H2_012A_QUE_MIN=I_H2_012A_QUE; I_H2_012A_QUE_MAX=350.0; @@ -157,14 +157,14 @@ MatchMe(MatchWhat,MatchWhere,CurrentsFileName): macro = { I_HE_025A_QUE_MIN= 0.0; I_HE_025A_QUE_MAX=I_HE_025A_QUE; }; }; - +*/ ! actually match if (myID>idMaxFullFree) { exec, MatchMeActualSel(MatchWhat,MatchWhere); }else{ exec, MatchMeActual(MatchWhat,MatchWhere); }; - +/* ! check quality of matching if (myID>1) { use, sequence=MyLine; @@ -183,11 +183,16 @@ MatchMe(MatchWhat,MatchWhere,CurrentsFileName): macro = { exec, MatchMeActual(MatchWhat,MatchWhere); }; }; - +*/ ! show optics use, sequence=MyLine; exec, saveOptics(mod_LGEN); value, origMatchWhat, table(twiss,MatchWhere,MatchWhat); + ! record actual mu0 + if (myID==1) { + origMUX=table(twiss,MatchWhere,MUX); + origMUY=table(twiss,MatchWhere,MUY); + }; ! append optics COPYFILE, FILE="xpr_iso3_mod_lgen_geometry.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_geometry.tfs, APPEND=true; COPYFILE, FILE="xpr_iso3_mod_lgen_optics.tfs", TO=output/xpr_iso3_ScanMatchWhat_MatchWhere_lgen_optics.tfs, APPEND=true; @@ -229,8 +234,8 @@ ReproduceMe(obsEle,CurrentsFileName): macro = { }; ! load starting optics - nOfInterest=1; ! p@30mm - ! nOfInterest=lunghezza; ! p@320mm + ! nOfInterest=1; ! p@30mm + nOfInterest=lunghezza; ! p@320mm SETVARS, TABLE=LGEN_HEBT_table, ROW=nOfInterest; K0MB=K0MB_ref; call, file="strengths/settings_from_LGEN_table.str"; @@ -314,7 +319,7 @@ initial: BETA0, ! dmuMin=-0.35; dmuMax= 0.65; dmuStp= 0.05; ! general MUX scan [2pi] ! dmuMin=-0.15; dmuMax= 0.6; dmuStp= 0.005; ! detailed MUX scan [2pi] /* -iClean=1; dmuMin=0.0; dmuMax=-91.0; dmuStp=-10.0; ! detailed MUX scan [degs] +iClean=1; dmuMin=0.0; dmuMax=-91.0; dmuStp=-2.5; ! detailed MUX scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=0; @@ -322,7 +327,7 @@ exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); stop; */ /* -iClean=0; dmuMin=0.0; dmuMax=41.0; dmuStp= 10.0; ! detailed MUX scan [degs] +iClean=0; dmuMin=0.0; dmuMax=41.0; dmuStp= 2.5; ! detailed MUX scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=0; @@ -330,7 +335,7 @@ exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); stop; */ /* -iClean=0; dmuMin=40.0; dmuMax=81.0; dmuStp= 10.0; ! detailed MUX scan [degs] +iClean=0; dmuMin=40.0; dmuMax=81.0; dmuStp= 2.5; ! detailed MUX scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=1; @@ -338,7 +343,7 @@ exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); stop; */ /* -iClean=0; dmuMin=80.0; dmuMax=181.0; dmuStp= 10.0; ! detailed MUX scan [degs] +iClean=0; dmuMin=80.0; dmuMax=181.0; dmuStp= 2.5; ! detailed MUX scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=1000; @@ -360,6 +365,25 @@ exec, MatchMe(MUX,X3_011B_VWN,summary_currents.tfs); stop; */ + +! ------------------------ +! HE-030B-SFP +! ------------------------ +/* +iClean=1; dmuMin=0.0; dmuMax=-91.0; dmuStp=-10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUX,HE_030B_SFP,summary_currents.tfs); +! stop; +iClean=0; dmuMin=0.0; dmuMax=181.0; dmuStp= 10.0; ! detailed MUX scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUX,HE_030B_SFP,summary_currents.tfs); +stop; +*/ + ! iClean=1; dmuMin=-55.0; dmuMax=215.0; dmuStp= 5.0; ! detailed MUX scan [degs] ! dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] ! dmu=dmuMin; @@ -381,22 +405,39 @@ stop; ! dmu=dmuMin; ! exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); /* -iClean=1; dmuMin=0.0; dmuMax=-131.0; dmuStp=-10.0; ! detailed MUY scan [degs] +iClean=1; dmuMin=0.0; dmuMax=-181.0; dmuStp=-10.0; ! detailed MUY scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=1000; exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); ! stop; -iClean=0; dmuMin=0.0; dmuMax=131.0; dmuStp= 10.0; ! detailed MUY scan [degs] +iClean=0; dmuMin=0.0; dmuMax=181.0; dmuStp= 10.0; ! detailed MUY scan [degs] dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] dmu=dmuMin; idMaxFullFree=1000; exec, MatchMe(MUY,X3_011B_VWN,summary_currents.tfs); stop; */ - +! ------------------------ +! HE-030B-SFP +! ------------------------ +/* +iClean=1; dmuMin=0.0; dmuMax=-161.0; dmuStp=-10.0; ! detailed MUY scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUY,HE_030B_SFP,summary_currents.tfs); +! stop; +iClean=0; dmuMin=0.0; dmuMax=91.0; dmuStp= 10.0; ! detailed MUY scan [degs] +dmuMin=dmuMin/360.; dmuMax=dmuMax/360.; dmuStp=dmuStp/360.; ! [2pi] +dmu=dmuMin; +idMaxFullFree=1000; +exec, MatchMe(MUY,HE_030B_SFP,summary_currents.tfs); +stop; +*/ ! --------------------------------------------------------------------------- ! reproduce optics ! --------------------------------------------------------------------------- iClean=1; exec, ReproduceMe(X3_011B_VWN,applied_currents.tfs); +! exec, ReproduceMe(HE_030B_SFP,applied_currents.tfs);