Example #1
0
    def outline_from_length(self, target_length, nPts=1000):

        self.smooth_well()

        if target_length > self.length:
            raise excpt.BunchSizeError("target_length longer than bucket")

        def len_func(potential):

            try:
                lTime, rTime = self._interp_time_from_potential(potential[0])
            except excpt.InputError:
                return self.time[-1] - self.time[0]

            return np.abs(target_length - (rTime - lTime))

        result = opt.minimize(len_func,
                              np.max(self.well) / 2,
                              method='Nelder-Mead')
        interpTime = self._interp_time_from_potential(result['x'][0], nPts)
        interpWell = self._well_smooth_func(interpTime)
        interpWell[interpWell > interpWell[0]] = interpWell[0]

        energyContour = np.sqrt(
            pot.potential_to_hamiltonian(interpTime, interpWell, self.beta,
                                         self.energy, self.eta))

        outlineTime = interpTime.tolist() + interpTime[::-1].tolist()
        outlineEnergy = energyContour.tolist() \
                        + (-energyContour[::-1]).tolist()

        return np.array([outlineTime, outlineEnergy])
Example #2
0
    def calc_separatrix(self):

        hamil = pot.potential_to_hamiltonian(self.time, self.well, self.beta,
                                             self.energy, self.eta)

        self.upper_energy_bound = np.sqrt(hamil)

        sepTime = self.time.tolist() + self.time[::-1].tolist()
        sepEnergy = self.upper_energy_bound.tolist() \
                    + (-self.upper_energy_bound[::-1]).tolist()

        self.separatrix = np.array([sepTime, sepEnergy])
Example #3
0
    def inner_buckets(self):

        self.inner_separatrices = []
        for t, w in zip(self.inner_times, self.inner_wells):
            hamil = pot.potential_to_hamiltonian(t, w, self.beta, self.energy,
                                                 self.eta)

            upper_energy_bound = np.sqrt(hamil)

            sepTime = t.tolist() + t[::-1].tolist()
            sepEnergy = upper_energy_bound.tolist() \
                    + (-upper_energy_bound[::-1]).tolist()

            self.inner_separatrices.append(np.array([sepTime, sepEnergy]))
Example #4
0
    def outline_from_emittance(self, target_emittance, nPts=1000):

        self.smooth_well()

        if target_emittance > self.area:
            raise excpt.BunchSizeError("target_emittance exceeds bucket area")

        def emit_func(potential, *args):

            nPts = args[0]
            try:
                interpTime = self._interp_time_from_potential(
                    potential[0], nPts)
            except excpt.InputError:
                return self.area

            interpWell = self._well_smooth_func(interpTime)
            interpWell[interpWell > interpWell[0]] = interpWell[0]

            energyContour = np.sqrt(
                pot.potential_to_hamiltonian(interpTime, interpWell, self.beta,
                                             self.energy, self.eta))

            emittance = 2 * np.trapz(energyContour, interpTime)

            return np.abs(target_emittance - emittance)

        result = opt.minimize(emit_func,
                              np.max(self.well) / 2,
                              method='Nelder-Mead',
                              args=(nPts, ))

        try:
            interpTime = self._interp_time_from_potential(result['x'][0], nPts)
        except excpt.InputError:
            interpTime = self.time.copy()
            interpWell = self.well.copy()
        else:
            interpWell = self._well_smooth_func(interpTime)
            interpWell[interpWell > interpWell[0]] = interpWell[0]

        energyContour = np.sqrt(
            pot.potential_to_hamiltonian(interpTime, interpWell, self.beta,
                                         self.energy, self.eta))

        outlineTime = interpTime.tolist() + interpTime[::-1].tolist()
        outlineEnergy = energyContour.tolist() \
                        + (-energyContour[::-1]).tolist()

        return np.array([outlineTime, outlineEnergy])
Example #5
0
        def emit_func(potential, *args):

            nPts = args[0]
            try:
                interpTime = self._interp_time_from_potential(
                    potential[0], nPts)
            except excpt.InputError:
                return self.area

            interpWell = self._well_smooth_func(interpTime)
            interpWell[interpWell > interpWell[0]] = interpWell[0]

            energyContour = np.sqrt(
                pot.potential_to_hamiltonian(interpTime, interpWell, self.beta,
                                             self.energy, self.eta))

            emittance = 2 * np.trapz(energyContour, interpTime)

            return np.abs(target_emittance - emittance)
Example #6
0
    def outline_from_dE(self, target_height):

        self.smooth_well()

        if target_height > self.half_height:
            raise excpt.BunchSizeError("target_height higher than bucket")

        potential = target_height**2 * self.eta / (2 * self.beta**2 *
                                                   self.energy)

        interpTime = self._interp_time_from_potential(potential, 1000)
        interpWell = self._well_smooth_func(interpTime)
        interpWell[interpWell > interpWell[0]] = interpWell[0]

        energyContour = np.sqrt(
            pot.potential_to_hamiltonian(interpTime, interpWell, self.beta,
                                         self.energy, self.eta))

        outlineTime = interpTime.tolist() + interpTime[::-1].tolist()
        outlineEnergy = energyContour.tolist() \
                        + (-energyContour[::-1]).tolist()

        return np.array([outlineTime, outlineEnergy])