summaryrefslogtreecommitdiff
path: root/src/main/Particle.h
blob: 1df2827d123b214e724646451695acaace32feb2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
 * Particle.h
 *
 *  Created on: Mar 9, 2011
 *      Author: jakob
 */

#ifndef PARTICLE_H_
#define PARTICLE_H_

#include <sstream>
#include <math.h>
#include "Vector3D.h"
#include "Printable.h"
#include "constants.h"

namespace vhc {

/** Classe représentant une particule.
 * TODO poser question sur l'energie, gamma, qdm
 * TODO rajouter un pointeur sur l'element dans lequel la particule se trouve*/
class Particle: public Printable {

private:

	/** Position de cette particule. */
	Vector3D position;

	/** Vitesse de cette particule. */
	Vector3D velocity;

	/** Force résultante sur cette particule. */
	Vector3D force;

	/** Masse de cette particule. */
	double mass;

	/** Charge de cette particule. */
	double charge;

	double gamma;

public:


	Particle(const Vector3D& position, double mass, double charge):
			position(position),
			velocity(0, 0, 0),
			force(0, 0, 0),
			mass(mass),
			charge(charge)
	{};

	Particle(const Vector3D& position, double mass, double charge, double energy, const Vector3D& direction):
		position(position),
		velocity(constants::c * sqrt(1 - (mass * mass) / (energy * energy)) * direction.unit()),
		gamma(energy / (mass * constants::c2)),
		force(0, 0, 0),
		mass(mass),
		charge(charge)
	{};


	/** Retourne la position de cette particule. */
	Vector3D getPosition() const {return position;}

	/** Affecte la position de cette particule. */
	void setPosition(const Vector3D& pos) {position = pos;}

	/** Retourne la force résultante sur cette particule. */
	Vector3D getForce() const {return force;}

	/** Affecte la force résultante sur cette particule. */
	void setForce(const Vector3D& f) {force = f;}

	/** Applique une force sur cette particule. */
	void applyForce(const Vector3D& f) {force = force + f;}

	void applyMagneticForce(const Vector3D& b, double dt) {
		if (b != Vector3D::Null) {
			Vector3D f = charge * velocity.cross(b);
			force = force + f.rotate(velocity.cross(f), (dt * f.norm()) / (2 * gamma * getMassKg() * velocity.norm()));
		}
	}

	/** Retourne la masse de cette particule en GeV. */
	double getMass() const {return mass;}

	/** Retourne la masse de cette particule en Kg. */
	double getMassKg() const {return mass * 1E-9 * constants::e / constants::c2;}

	/** Retourne la charge de cette particule. */
	double getCharge() const {return charge;}

	/** Retourne la vitesse de cette particule. */
	Vector3D getVelocity() const {return velocity;}

	void setVelocity(const Vector3D& v) {
		velocity = v;
		gamma = 1.0 / sqrt(1.0 - v.normSquare() / constants::c2);
	}

	//GeV
	double getEnergy() const {return gamma * mass * constants::c2;}

	double getGamma() const {return gamma;}

	/** Retourne une représentation en chaîne de cette particule. */
	virtual std::string toString() const {
		std::stringstream s;
		s << "Particle:"	<< "\n";
		s << "\tposition: "	<< position	<< "\n";
		s << "\tvelocity: "	<< velocity	<< "\n";
		s << "\t|v|: "		<< velocity.norm() << "\n";
		s << "\tgamma: "	<< gamma << "\n";
		s << "\tmass:     "	<< mass		<< "\n";
		s << "\tcharge:   "	<< charge	<< "\n";
		s << "\tforce:    "	<< force;
		return s.str();
	}

};

}

#endif /* PARTICLE_H_ */