Skip to content

Commit c10d921

Browse files
authored
Merge pull request #24 from shishlo/development
The examples in the /examples/SNS_Linac/pyorbit3_linac_model were corrected
2 parents 757ae68 + d83b63f commit c10d921

File tree

4 files changed

+9373
-932
lines changed

4 files changed

+9373
-932
lines changed

examples/SNS_Linac/pyorbit3_linac_model/pyorbit3_sns_sts_linac_mebt_hebt2.py

Lines changed: 83 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434

3535
from orbit.py_linac.linac_parsers import SNS_LinacLatticeFactory
3636

37+
# import the XmlDataAdaptor XML parser
38+
from orbit.utils.xml import XmlDataAdaptor
39+
3740
# from linac import the C++ RF gap classes
3841
from orbit.core.linac import BaseRfGap, MatrixRfGap, RfGapTTF
3942

@@ -86,7 +89,50 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg):
8689
# print "debug cav=",cav_name," phase=",cav_phase," delta_e max=",(e_kin_max-e_kin_in)/1.0e-3
8790
return cav_phase
8891

89-
92+
def correctLatticeXML(xml_file_name,gap_phases_dict):
93+
"""
94+
This function will replace RF Gap phases in xml_file_name,
95+
and it will return the new Data Adaptor with values.
96+
The lattice XML file is in a file with the name 'xml_file_name'
97+
and gap_phases_dict[rf_gap_name] = phase
98+
"""
99+
acc_da = XmlDataAdaptor.adaptorForFile(xml_file_name)
100+
seq_names = ["SCLHigh",]
101+
for seq_name in seq_names:
102+
#print ("======== Sequence = ",seq_name," ==========")
103+
accSeq_da = acc_da.childAdaptors(seq_name)[0]
104+
for node_da in accSeq_da.childAdaptors("accElement"):
105+
if(node_da.hasAttribute("type") and (node_da.stringValue("type") == "RFGAP")):
106+
rf_gap_name = node_da.stringValue("name")
107+
params_da = node_da.childAdaptors("parameters")[0]
108+
#print ("debug node=",rf_gap_name)
109+
if(rf_gap_name in gap_phases_dict):
110+
phase_new = gap_phases_dict[rf_gap_name]
111+
phase_old = params_da.doubleValue("phase")
112+
params_da.setValue("phase","%9.4f"%phase_new)
113+
print ("debug gap=",rf_gap_name," old_phase= %+9.4f "%phase_old," new phase= %+9.4f "%params_da.doubleValue("phase"))
114+
return acc_da
115+
116+
def removeDuplicates(acc_da):
117+
"""
118+
It will remove the duplicates entries with the same names.
119+
It will do this only for 1st level of accElement XML elements.
120+
"""
121+
acc_da = acc_da.getDeepCopy()
122+
seqs_da = acc_da.childAdaptors()
123+
for accSeq_da in seqs_da:
124+
accElem_repeat_names = []
125+
accElems_repeat_da = []
126+
for accElem_da in accSeq_da.childAdaptors("accElement"):
127+
if(accElem_da.stringValue("name") in accElem_repeat_names):
128+
accElems_repeat_da.append(accElem_da)
129+
else:
130+
accElem_repeat_names.append(accElem_da.stringValue("name"))
131+
#-------- remove reperted elements
132+
for accElem_da in accElems_repeat_da:
133+
accSeq_da.data_adaptors.remove(accElem_da)
134+
return acc_da
135+
90136
# -------------------------------------------------------------------
91137
# Start of the script
92138
# -------------------------------------------------------------------
@@ -411,6 +457,8 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg):
411457
cav_synch_phases["SCL:Cav32d"] = -30.0
412458
# ------scl25 added -----stop----
413459

460+
for key in cav_synch_phases:
461+
cav_synch_phases[key] -= 12.06
414462

415463
# -----TWISS Parameters at the entrance of MEBT ---------------
416464
# transverse emittances are unnormalized and in pi*mm*mrad
@@ -472,20 +520,48 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg):
472520
print("Bunch Generation completed.")
473521

474522
for cav_name in cav_names:
475-
cav_synch_phase = cav_synch_phases[cav_name]
476-
setSynchPhase(bunch_in, accLattice, cav_name, cav_synch_phase)
523+
cav_synch_phase = cav_synch_phases[cav_name]
524+
setSynchPhase(bunch_in, accLattice, cav_name, cav_synch_phase)
525+
print ("debug cav=",cav_name," eKIn_In=",(bunch_in.getSyncParticle().kinEnergy() * 1.0e3))
477526

478527
# set up design
479-
accLattice.trackDesignBunch(bunch_in)
528+
bunch_out = accLattice.trackDesignBunch(bunch_in)
529+
480530

481531
# ----- Print out the average phases for the RF gaps in SCL RF Cavities
482532
# ----- the charge of H- is negative, so the phases are shifted by -180.
483533
cavs = accLattice.getRF_Cavities()
484534
for cav in cavs:
485535
avg_phase = phaseNearTargetPhaseDeg(cav.getAvgGapPhaseDeg() - 180.0, 0.0)
486-
print("debug cav=", cav.getName(), " gaps phaseAvg=", avg_phase, " cav_amp=", cav.getAmp())
536+
print("debug cav=", cav.getName(), " gaps phaseAvg= %+8.3f "%avg_phase," cav phase= %+8.3f"%(cav.getPhase()*180./math.pi), " cav_amp=", cav.getAmp())
487537

488-
print("Design tracking completed.")
538+
print("Design tracking completed. eKin_Out = ",(bunch_out.getSyncParticle().kinEnergy() * 1.0e3))
539+
540+
cav_gap_phases_dict = {}
541+
gap_phases_dict = {}
542+
for cav in cavs:
543+
if(cav.getName() in cav_synch_phases):
544+
cav_gap_phases = []
545+
print ("debug cav=",cav.getName()," ==========================")
546+
rf_gaps = cav.getRF_GapNodes()
547+
for rf_gap in rf_gaps:
548+
phase = phaseNearTargetPhaseDeg(rf_gap.getGapPhase()*180./math.pi,0.)
549+
gap_phases_dict[rf_gap.getName()] = phase
550+
#print (" gap name=",rf_gap.getName())
551+
cav_gap_phases.append(phase)
552+
cav_gap_phases_dict[cav.getName()] = cav_gap_phases
553+
print ("cav=",cav.getName()," rf gap phases = %+6.3f %+6.3f %+6.3f %+6.3f %+6.3f %+6.3f "%tuple(cav_gap_phases))
554+
555+
556+
new_acc_da = correctLatticeXML(xml_file_name,gap_phases_dict)
557+
558+
#----------------------------------------------------------------------
559+
# This was and addition to get the correct sts linac lattice XML file
560+
#----------------------------------------------------------------------
561+
#new_acc_da.writeToFile("../sns_linac_xml/sns_sts_linac_new.xml")
562+
#new_acc_da = removeDuplicates(new_acc_da)
563+
#new_acc_da.writeToFile("../sns_linac_xml/sns_sts_linac_new_new.xml")
564+
#sys.exit(0)
489565

490566
# track through the lattice
491567
paramsDict = {"old_pos": -1.0, "count": 0, "pos_step": 0.1}
@@ -540,6 +616,7 @@ def action_entrance(paramsDict):
540616
s += " %6.4f %6.4f %6.4f %6.4f " % (alphaY, betaY, emittY, norm_emittY)
541617
s += " %6.4f %6.4f %6.4f %6.4f " % (alphaZ, betaZ, emittZ, phi_de_emittZ)
542618
s += " %5.3f %5.3f %5.3f " % (x_rms, y_rms, z_rms_deg)
619+
s += " %10.6f %8d " % (eKin, nParts)
543620
file_out.write(s + "\n")
544621
file_out.flush()
545622
s_prt = " %5d %35s %4.5f " % (paramsDict["count"], node.getName(), pos + pos_start)

0 commit comments

Comments
 (0)