def generate_Injector_Lattice(injectorFactor, rpInjectorFactor, parallel=False) -> ParticleTracerLattice: assert type(parallel) == bool if is_Valid_Injector_Phase(injectorFactor, rpInjectorFactor) == False: return None LInjector = injectorFactor * .15 rpInjector = rpInjectorFactor * .02 fringeFrac = 1.5 LMagnet = LInjector - 2 * fringeFrac * rpInjector if LMagnet < 1e-9: # minimum fringe length must be respected. return None PTL_Injector = ParticleTracerLattice(200.0, latticeType='injector', parallel=parallel) PTL_Injector.add_Drift(.1, ap=.025) try: PTL_Injector.add_Halbach_Lens_Sim(rpInjector, LInjector, apFrac=.9) except: print(LInjector, rpInjector) PTL_Injector.add_Drift(.2, ap=.01) # PTL_Injector.add_Combiner_Sim('combinerV3.txt') PTL_Injector.add_Combiner_Sim_Lens(.2, .02) PTL_Injector.end_Lattice(constrain=False, enforceClosedLattice=False) return PTL_Injector
def generate_Injector_Lattice_Double_Lens(X) -> ParticleTracerLattice: L_InjectorMagnet1, rpInjectorMagnet1,L_InjectorMagnet2, rpInjectorMagnet2, \ LmCombiner, rpCombiner,loadBeamDiam,L1,L2,L3=X fringeFrac = 1.5 apFrac = .98 LMagnet1 = L_InjectorMagnet1 - 2 * fringeFrac * rpInjectorMagnet1 LMagnet2 = L_InjectorMagnet2 - 2 * fringeFrac * rpInjectorMagnet2 aspect1, aspect2 = LMagnet1 / rpInjectorMagnet1, LMagnet2 / rpInjectorMagnet2 if aspect1 < 1.0 or aspect2 < 1.0: return None if LMagnet1 < 1e-9 or LMagnet2 < 1e-9: # minimum fringe length must be respected. return None if loadBeamDiam > apFrac * rpCombiner: #silly if load beam doens't fit in half of magnet return None PTL_Injector = ParticleTracerLattice(V0, latticeType='injector', parallel=False) PTL_Injector.add_Drift(L1, ap=apFrac * rpInjectorMagnet1) PTL_Injector.add_Halbach_Lens_Sim(rpInjectorMagnet1, L_InjectorMagnet1, apFrac=apFrac) PTL_Injector.add_Drift(L2, ap=apFrac * max([rpInjectorMagnet1, rpInjectorMagnet2])) PTL_Injector.add_Halbach_Lens_Sim(rpInjectorMagnet2, L_InjectorMagnet2, apFrac=apFrac) PTL_Injector.add_Drift(L3, ap=apFrac * rpInjectorMagnet2) PTL_Injector.add_Combiner_Sim_Lens(LmCombiner, rpCombiner, loadBeamDiam=loadBeamDiam) PTL_Injector.end_Lattice(constrain=False, enforceClosedLattice=False) return PTL_Injector
def generate_Injector_Lattice(L_Injector, rpInjector, LmCombiner, rpCombiner,loadBeamDiam,L1,L2)->ParticleTracerLattice: fringeFrac=1.5 apFrac=.95 L_InjectorMagnet=L_Injector-2*fringeFrac*rpInjector if L_InjectorMagnet<1e-9: # minimum fringe length must be respected. return None if loadBeamDiam>rpCombiner: #don't waste time exploring silly configurations return None PTL_Injector=ParticleTracerLattice(V0,latticeType='injector') PTL_Injector.add_Drift(L1,ap=rpInjector) PTL_Injector.add_Halbach_Lens_Sim(rpInjector,L_Injector,apFrac=apFrac) PTL_Injector.add_Drift(L2,ap=apFrac*rpInjector) PTL_Injector.add_Combiner_Sim_Lens(LmCombiner,rpCombiner,loadBeamDiam=loadBeamDiam) PTL_Injector.end_Lattice(constrain=False,enforceClosedLattice=False) return PTL_Injector
def generate_Ring_Surrogate_Lattice(X) -> ParticleTracerLattice: jeremyGap = 5e-2 rpLensLast = .02 rplensFirst = .02 lastGap = 5e-2 L_InjectorMagnet1, rpInjectorMagnet1, L_InjectorMagnet2, rpInjectorMagnet2, \ LmCombiner, rpCombiner, loadBeamDiam, L1, L2, L3 = X PTL_Ring = ParticleTracerLattice(V0, latticeType='storageRing', parallel=False) PTL_Ring.add_Drift(rpLensLast) #models the size of the lengs PTL_Ring.add_Drift(lastGap) PTL_Ring.add_Combiner_Sim_Lens(LmCombiner, rpCombiner, loadBeamDiam=loadBeamDiam) PTL_Ring.add_Drift(jeremyGap) PTL_Ring.add_Halbach_Lens_Sim(rplensFirst, .2) PTL_Ring.end_Lattice(enforceClosedLattice=False, constrain=False, surpressWarning=True) # 17.8 % of time here return PTL_Ring
def generate_Ring_Lattice(rpBend, rpLens, rpLensFirst, Lm, LLens, parallel=False) -> ParticleTracerLattice: tunableDriftGap = 2.54e-2 assert type(parallel) == bool fringeFrac = 1.5 if LLens - 2 * rpLens * fringeFrac < 0 or LLens - 2 * rpLensFirst * fringeFrac < 0: # minimum fringe length must be respected return None PTL_Ring = ParticleTracerLattice(200.0, latticeType='storageRing', parallel=parallel) rOffsetFact = PTL_Ring.find_Optimal_Offset_Factor( rpBend, 1.0, Lm, parallel=parallel) # 25% of time here, 1.0138513851385138 if rOffsetFact is None: return None PTL_Ring.add_Drift(tunableDriftGap / 2, ap=rpLens) PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens) PTL_Ring.add_Drift(tunableDriftGap / 2, ap=rpLens) PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens) PTL_Ring.add_Combiner_Sim_Lens(.2, .02) PTL_Ring.add_Halbach_Lens_Sim(rpLensFirst, LLens) PTL_Ring.add_Drift(tunableDriftGap / 2) PTL_Ring.add_Halbach_Lens_Sim(rpLens, LLens) PTL_Ring.add_Drift(tunableDriftGap / 2) PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap( Lm, rpBend, None, 1.0, rOffsetFact=rOffsetFact) # PTL_Ring.add_Halbach_Lens_Sim(rpLens,None,constrain=True) # PTL_Ring.add_Drift(probeSpace) PTL_Ring.add_Halbach_Lens_Sim(rpLens, None, constrain=True) PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap( Lm, rpBend, None, 1.0, rOffsetFact=rOffsetFact) PTL_Ring.end_Lattice(enforceClosedLattice=True, constrain=True) # 17.8 % of time here return PTL_Ring
def generate_Injector_Lattice_Double_Magnet(L_InjectorMagnet1, rpInjectorMagnet1, L_InjectorMagnet2, rpInjectorMagnet2, LmCombiner, rpCombiner, loadBeamDiam, L1, L2, L3)->ParticleTracerLattice: fringeFrac = 1.5 apFrac = .95 LMagnet1 = L_InjectorMagnet1 - 2 * fringeFrac * rpInjectorMagnet1 LMagnet2 = L_InjectorMagnet2 - 2 * fringeFrac * rpInjectorMagnet2 if LMagnet1 < 1e-9 or LMagnet2 < 1e-9: # minimum fringe length must be respected. return None if loadBeamDiam > apFrac * rpCombiner: # silly if load beam doens't fit in half of magnet return None PTL_Injector = ParticleTracerLattice(V0, latticeType='injector', parallel=False) PTL_Injector.add_Drift(L1, ap=apFrac * rpInjectorMagnet1) PTL_Injector.add_Halbach_Lens_Sim(rpInjectorMagnet1, L_InjectorMagnet1, apFrac=apFrac) PTL_Injector.add_Drift(L2, ap=apFrac * max([rpInjectorMagnet1, rpInjectorMagnet2])) PTL_Injector.add_Halbach_Lens_Sim(rpInjectorMagnet2, L_InjectorMagnet2, apFrac=apFrac) PTL_Injector.add_Drift(L3, ap=apFrac * rpInjectorMagnet2) try: # even with guards it can still derp out PTL_Injector.add_Combiner_Sim_Lens(LmCombiner, rpCombiner, loadBeamDiam=loadBeamDiam) except: return None PTL_Injector.end_Lattice(constrain=False, enforceClosedLattice=False) return PTL_Injector
def generate_Ring_Lattice(rpLens,rpLensFirst,rpLensLast,rpBend,L_Lens, LmCombiner, rpCombiner,loadBeamDiam,tuning)->ParticleTracerLattice: tunableDriftGap=2.54e-2 jeremyGap=.05 Lm=.0254/2.0 lastGap=5e-2 fringeFrac=1.5 if L_Lens-2*rpLens*fringeFrac<0 or L_Lens-2*rpLensFirst*fringeFrac<0 or L_Lens-2*rpLensLast*fringeFrac<0: # minimum fringe length must be respected return None PTL_Ring=ParticleTracerLattice(V0,latticeType='storageRing') if abs(rpBend-1e-2)<SMALL_NUMBER and abs(Lm-.0254/2.0)<SMALL_NUMBER: rOffsetFact = 1.0106 else: # rOffsetFact=PTL_Ring.find_Optimal_Offset_Factor(rpBend,1.0,Lm) raise ValueError if rOffsetFact is None: return None if tuning=='spacing': PTL_Ring.add_Drift(tunableDriftGap/2) PTL_Ring.add_Halbach_Lens_Sim(rpLens,L_Lens) PTL_Ring.add_Drift(tunableDriftGap/2) PTL_Ring.add_Halbach_Lens_Sim(rpLensLast,L_Lens) PTL_Ring.add_Drift(lastGap) PTL_Ring.add_Combiner_Sim_Lens(LmCombiner,rpCombiner,loadBeamDiam=loadBeamDiam) PTL_Ring.add_Drift(jeremyGap) PTL_Ring.add_Halbach_Lens_Sim(rpLensFirst,L_Lens) if tuning=='spacing': PTL_Ring.add_Drift(tunableDriftGap/2) PTL_Ring.add_Halbach_Lens_Sim(rpLens,L_Lens) PTL_Ring.add_Drift(tunableDriftGap/2) PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(Lm,rpBend,None,1.0,rOffsetFact=rOffsetFact) PTL_Ring.add_Halbach_Lens_Sim(rpLens,None,constrain=True) PTL_Ring.add_Halbach_Bender_Sim_Segmented_With_End_Cap(Lm,rpBend,None,1.0,rOffsetFact=rOffsetFact) PTL_Ring.end_Lattice(enforceClosedLattice=True,constrain=True) # 17.8 % of time here return PTL_Ring
def generate_Lattice(configuration): #a variety of lattice configurations are tested if configuration == '1': PTL = ParticleTracerLattice(200.0, latticeType='storageRing') PTL.add_Drift(.25) PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254, .01, 150, 1.0, 0.0, rOffsetFact=1.015) PTL.add_Lens_Ideal(1.0, 1.0, .01) PTL.add_Halbach_Lens_Sim(.01, 1.0) PTL.add_Drift(.1) PTL.end_Lattice(constrain=False, surpressWarning=True, enforceClosedLattice=False) elif configuration in ('2', '5'): PTL = ParticleTracerLattice(200.0, latticeType='injector') PTL.add_Drift(.25) PTL.add_Halbach_Lens_Sim(.01, .5) PTL.add_Drift(.1) if configuration == '2': PTL.add_Combiner_Sim('combinerV3.txt') else: PTL.add_Combiner_Sim_Lens(.1, .02) PTL.add_Halbach_Lens_Sim(.01, .5) PTL.end_Lattice() elif configuration == '3': PTL = ParticleTracerLattice(200.0, latticeType='storageRing') PTL.add_Lens_Ideal(1.0, 1.0, .01) PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .01) PTL.add_Lens_Ideal(1.0, 1.0, .01) PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .01) PTL.end_Lattice() elif configuration in ('4', '6'): PTL = ParticleTracerLattice(200.0, latticeType='storageRing') PTL.add_Halbach_Lens_Sim(.01, .5) if configuration == '4': PTL.add_Combiner_Sim('combinerV3.txt') else: PTL.add_Combiner_Sim_Lens(.1, .02) PTL.add_Halbach_Lens_Sim(.01, .5) PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254 / 2, .01, None, 1.0, 0.0, rOffsetFact=1.015) PTL.add_Halbach_Lens_Sim(.01, None, constrain=True) PTL.add_Halbach_Bender_Sim_Segmented_With_End_Cap(.0254 / 2, .01, None, 1.0, 0.0, rOffsetFact=1.015) PTL.end_Lattice(enforceClosedLattice=True, constrain=True) PTL.elList[0].fieldFact = .3 PTL.elList[2].fieldFact = .3 else: raise Exception('no proper configuration name provided') return PTL