def make_Test_Swarm_And_Lattice(numParticles=100,
                                totalTime=.1
                                ) -> (Swarm, ParticleTracerLattice):
    PTL = ParticleTracerLattice(200.0)
    PTL.add_Lens_Ideal(.4, 1.0, .025)
    PTL.add_Drift(.1)
    PTL.add_Lens_Ideal(.4, 1.0, .025)
    # PTL.add_Bender_Ideal_Segmented_With_Cap(200,.01,.1,1.0,.01,1.0,.001,1e-6)
    PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .025)
    PTL.add_Drift(.2)
    PTL.add_Lens_Ideal(.2, 1.0, .025)
    PTL.add_Drift(.1)
    PTL.add_Lens_Ideal(.2, 1.0, .025)
    PTL.add_Drift(.2)
    PTL.add_Bender_Ideal(np.pi, 1.0, 1.0, .025)
    PTL.end_Lattice()

    swarmTracer = SwarmTracer(PTL)
    swarm = swarmTracer.initalize_PseudoRandom_Swarm_In_Phase_Space(
        5e-3, 5.0, 1e-5, numParticles)
    swarm = swarmTracer.trace_Swarm_Through_Lattice(swarm,
                                                    5e-6,
                                                    totalTime,
                                                    fastMode=False,
                                                    parallel=True)
    # file=open('swarmFile','wb')
    # dill.dump(swarm,file)
    # file=open('swarmFile','rb')
    # swarm=dill.load(file)
    print('swarm and lattice done')
    return swarm, PTL
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