def test_copy(self): K = 1.87 lambda_u = 0.035 L = 0.035 * 14 E=1.3 I=1.0 undulator = Undulator(K=K, period_length=lambda_u, length=L) beam=ElectronBeam(Electron_energy=E, I_current=I) source=SourceUndulatorPlane(undulator=undulator, electron_beam=beam) source2=source.copy() source2.electron_beam.I_current=0.3 self.assertEqual(source.I_current(),1.0) self.assertEqual(source2.I_current() ,0.3) self.assertAlmostEqual(source.harmonic_frequency(1)/1e17, 2.5346701615509917,5) self.assertAlmostEqual(source.Lorentz_factor(), 2544.0367765521196,2 ) self.assertAlmostEqual(source.electron_speed(), 0.99999992274559524,5) self.assertEqual(source.magnetic_structure.period_number(), 14) self.assertAlmostEqual(source.choose_distance_automatic(2),49.000000000000,10 )
def test_copy(self): K = 1.87 lambda_u = 0.035 L = 0.035 * 14 E = 1.3 I = 1.0 undulator = Undulator(K=K, period_length=lambda_u, length=L) beam = ElectronBeam(Electron_energy=E, I_current=I) source = SourceUndulatorPlane(undulator=undulator, electron_beam=beam) source2 = source.copy() source2.electron_beam.I_current = 0.3 self.assertEqual(source.I_current(), 1.0) self.assertEqual(source2.I_current(), 0.3) self.assertAlmostEqual( source.harmonic_frequency(1) / 1e17, 2.5346701615509917, 5) self.assertAlmostEqual(source.Lorentz_factor(), 2544.0367765521196, 2) self.assertAlmostEqual(source.electron_speed(), 0.99999992274559524, 5) self.assertEqual(source.magnetic_structure.period_number(), 14) self.assertAlmostEqual(source.choose_distance_automatic(2), 49.000000000000, 10)
def _buildForXY(self, electron_beam, x_0, y_0, xp_0, yp_0, z, X, Y): #TODO: X dimension equals Y dimension? Y = X beam = ElectronBeam(Electron_energy=electron_beam.energy(), I_current=electron_beam.averageCurrent()) undulator = Undulator(K=self._undulator.K_vertical(), period_length=self._undulator.periodLength(), length=self._undulator.length()) initial_conditions = SourceUndulatorPlane( undulator=undulator, electron_beam=beam, magnetic_field=None).choose_initial_contidion_automatic() v_z = initial_conditions[2] initial_conditions[0] = xp_0 * speed_of_light initial_conditions[1] = yp_0 * speed_of_light initial_conditions[2] = np.sqrt(beam.electron_speed()**2 - xp_0**2 - yp_0**2) * speed_of_light initial_conditions[3] = x_0 initial_conditions[4] = y_0 if self._source_position == VIRTUAL_SOURCE_CENTER: initial_conditions[5] = 0.0 print("initial cond:", initial_conditions) simulation = create_simulation( magnetic_structure=undulator, electron_beam=beam, traj_method=TRAJECTORY_METHOD_ODE, rad_method=RADIATION_METHOD_NEAR_FIELD, #RADIATION_METHOD_FARFIELD, distance=z, X=X, Y=Y, photon_energy=self._photon_energy, initial_condition=initial_conditions) #simulation.trajectory.plot_3D() #simulation.trajectory.plot() #simulation.radiation.plot() electrical_field = simulation.radiation_fact.calculate_electrical_field( trajectory=simulation.trajectory, source=simulation.source, distance=simulation.radiation.distance, X_array=simulation.radiation.X, Y_array=simulation.radiation.Y) efield = electrical_field.electrical_field()[np.newaxis, :, :, :] efield = efield[:, :, :, 0:2] calc_wavefront = NumpyWavefront( e_field=efield, x_start=X.min(), x_end=X.max(), y_start=Y.min(), y_end=Y.max(), z=z, energies=np.array([self._photon_energy]), ) #calc_wavefront.showEField() self._last_simulation = simulation self._last_initial_conditions = initial_conditions.copy() return calc_wavefront
def _buildForXY(self, electron_beam, x_0, y_0, xp_0, yp_0, z, X, Y): #TODO: X dimension equals Y dimension? Y = X beam = ElectronBeam(Electron_energy=electron_beam.energy(), I_current=electron_beam.averageCurrent()) undulator = Undulator(K=self._undulator.K_vertical(), period_length=self._undulator.periodLength(), length=self._undulator.length()) initial_conditions = SourceUndulatorPlane(undulator=undulator, electron_beam=beam, magnetic_field=None).choose_initial_contidion_automatic() v_z = initial_conditions[2] initial_conditions[0] = xp_0 * speed_of_light initial_conditions[1] = yp_0 * speed_of_light initial_conditions[2] = np.sqrt(beam.electron_speed()**2-xp_0**2-yp_0**2) * speed_of_light initial_conditions[3] = x_0 initial_conditions[4] = y_0 if self._source_position == VIRTUAL_SOURCE_CENTER: initial_conditions[5] = 0.0 print("initial cond:", initial_conditions) simulation = create_simulation(magnetic_structure=undulator, electron_beam=beam, traj_method=TRAJECTORY_METHOD_ODE, rad_method=RADIATION_METHOD_NEAR_FIELD, #RADIATION_METHOD_FARFIELD, distance=z, X=X, Y=Y, photon_energy=self._photon_energy, initial_condition=initial_conditions) #simulation.trajectory.plot_3D() #simulation.trajectory.plot() #simulation.radiation.plot() electrical_field = simulation.radiation_fact.calculate_electrical_field(trajectory=simulation.trajectory, source=simulation.source, distance=simulation.radiation.distance, X_array=simulation.radiation.X, Y_array=simulation.radiation.Y) efield = electrical_field.electrical_field()[np.newaxis, :, :, :] efield = efield[:, :, :, 0:2] calc_wavefront = NumpyWavefront(e_field=efield, x_start=X.min(), x_end=X.max(), y_start=Y.min(), y_end=Y.max(), z=z, energies=np.array([self._photon_energy]), ) #calc_wavefront.showEField() self._last_simulation = simulation self._last_initial_conditions = initial_conditions.copy() return calc_wavefront