|
34 | 34 |
|
35 | 35 | from orbit.py_linac.linac_parsers import SNS_LinacLatticeFactory |
36 | 36 |
|
| 37 | +# import the XmlDataAdaptor XML parser |
| 38 | +from orbit.utils.xml import XmlDataAdaptor |
| 39 | + |
37 | 40 | # from linac import the C++ RF gap classes |
38 | 41 | from orbit.core.linac import BaseRfGap, MatrixRfGap, RfGapTTF |
39 | 42 |
|
@@ -86,7 +89,50 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg): |
86 | 89 | # print "debug cav=",cav_name," phase=",cav_phase," delta_e max=",(e_kin_max-e_kin_in)/1.0e-3 |
87 | 90 | return cav_phase |
88 | 91 |
|
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 | + |
90 | 136 | # ------------------------------------------------------------------- |
91 | 137 | # Start of the script |
92 | 138 | # ------------------------------------------------------------------- |
@@ -411,6 +457,8 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg): |
411 | 457 | cav_synch_phases["SCL:Cav32d"] = -30.0 |
412 | 458 | # ------scl25 added -----stop---- |
413 | 459 |
|
| 460 | +for key in cav_synch_phases: |
| 461 | + cav_synch_phases[key] -= 12.06 |
414 | 462 |
|
415 | 463 | # -----TWISS Parameters at the entrance of MEBT --------------- |
416 | 464 | # transverse emittances are unnormalized and in pi*mm*mrad |
@@ -472,20 +520,48 @@ def setSynchPhase(bunch_in, accLattice, cav_name, synchPhaseDeg): |
472 | 520 | print("Bunch Generation completed.") |
473 | 521 |
|
474 | 522 | 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)) |
477 | 526 |
|
478 | 527 | # set up design |
479 | | -accLattice.trackDesignBunch(bunch_in) |
| 528 | +bunch_out = accLattice.trackDesignBunch(bunch_in) |
| 529 | + |
480 | 530 |
|
481 | 531 | # ----- Print out the average phases for the RF gaps in SCL RF Cavities |
482 | 532 | # ----- the charge of H- is negative, so the phases are shifted by -180. |
483 | 533 | cavs = accLattice.getRF_Cavities() |
484 | 534 | for cav in cavs: |
485 | 535 | 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()) |
487 | 537 |
|
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) |
489 | 565 |
|
490 | 566 | # track through the lattice |
491 | 567 | paramsDict = {"old_pos": -1.0, "count": 0, "pos_step": 0.1} |
@@ -540,6 +616,7 @@ def action_entrance(paramsDict): |
540 | 616 | s += " %6.4f %6.4f %6.4f %6.4f " % (alphaY, betaY, emittY, norm_emittY) |
541 | 617 | s += " %6.4f %6.4f %6.4f %6.4f " % (alphaZ, betaZ, emittZ, phi_de_emittZ) |
542 | 618 | s += " %5.3f %5.3f %5.3f " % (x_rms, y_rms, z_rms_deg) |
| 619 | + s += " %10.6f %8d " % (eKin, nParts) |
543 | 620 | file_out.write(s + "\n") |
544 | 621 | file_out.flush() |
545 | 622 | s_prt = " %5d %35s %4.5f " % (paramsDict["count"], node.getName(), pos + pos_start) |
|
0 commit comments