GRSISort "v4.1.1.0"
An extension of the ROOT analysis Framework
Loading...
Searching...
No Matches
TReaction.cxx
Go to the documentation of this file.
1// g++ -c -fPIC TReaction.cxx -I./ `root-config --cflags`
2
3#include "TReaction.h"
4
5#include <iostream>
6
7#include "TStyle.h"
8#include "TMath.h"
9
10TReaction::TReaction(const char* beam, const char* targ, const char* ejec, const char* reco, double eBeam, double ex3, bool inverse)
11 : fTBeam(eBeam), fInverse(inverse), fExc(ex3)
12{
13 // I THINK INVERSE KINEMATICS NECESSITATES THE BEAM<->TARGET ENTIRELY ?
14 fNuc[0] = new TNucleus(beam);
15 fNuc[1] = new TNucleus(targ);
16 fNuc[2] = new TNucleus(ejec);
17 fNuc[3] = new TNucleus(reco);
18
19 for(int i = 0; i < 4; i++) {
20 fM[i] = fNuc[i]->GetMass();
21 }
22
23 fQVal = (fM[0] + fM[1]) - (fM[2] + fM[3]) - ex3; // effective Q value (includes excitation)
24
25 if(fInverse) {
26 SetName(Form("%s(%s,%s)%s", beam, targ, ejec, reco));
27 } else {
28 SetName(Form("%s(%s,%s)%s", targ, beam, ejec, reco));
29 }
30
32}
33
35{
36
37 // An initializing function that sets the energies and momenta of the beam and target in the lab and CM frame,
38 // as well as a few basic calculations.
39
40 fTLab[0] = fTBeam; // target kinetic energy is ebeam
41 fELab[0] = fTLab[0] + fM[0]; // total E of beam in lab
42 fPLab[0] = sqrt(pow(fTLab[0], 2) + 2 * fTLab[0] * fM[0]); // momentum of beam in lab
43 fVLab[0] = fPLab[0] / fELab[0]; // velocity of beam in lab
44 fGLab[0] = 1 / sqrt(1 - pow(fVLab[0], 2)); // gamma factor of beam
45
46 fTLab[1] = 0; // target kinetic energy is always 0
47 fELab[1] = fM[1]; // total E of target in lab
48 fPLab[1] = 0; // momentum of target in lab
49 fVLab[1] = 0; // velocity of target in lab
50 fGLab[1] = 1; // gamma factor of target
51
52 fS = pow(fM[0], 2) + pow(fM[1], 2) + 2 * fELab[0] * fM[1]; // fELab[1] = fM[1]
53 fInvariantMass = sqrt(fS); // √s
54
55 // CM motion
57 fCmTi = fCmE - fM[0] - fM[1];
58 fCmTf = fCmTi + fQVal;
59 fCmV = fPLab[0] / (fELab[0] + fM[1]);
60 fCmP = fCmV * fCmE;
61 fCmG = 1 / sqrt(1 - pow(fCmV, 2));
62
63 // take care of particles in CM frame using the reaction excitation energy
65
66 // options to make graphs draw nicely
67 gStyle->SetTitleYOffset(1.5);
68 gStyle->SetTitleXOffset(1.2);
69 gStyle->SetDrawOption("AC");
70}
71
72double TReaction::GetTBeam(bool inverse) const
73{
74 if(fInverse || inverse) {
75 return (fGLab[0] - 1) * fM[1];
76 }
77 return fTLab[0];
78}
79
80void TReaction::SetCmFrame(double exc)
81{
82
83 // particles in CM frame
84 fPCm[0] = sqrt((fS - pow(fM[0] - fM[1], 2)) * (fS - pow(fM[0] + fM[1], 2))) / (2 * sqrt(fS));
85 fPCm[1] = fPCm[0];
86 fPCm[2] = sqrt((fS - pow(exc + fM[2] - fM[3], 2)) * (fS - pow(exc + fM[2] + fM[3], 2))) / (2 * sqrt(fS));
87 fPCm[3] = fPCm[2];
88
89 for(int i = 0; i < 4; i++) {
90 fECm[i] = sqrt(pow(fM[i], 2) + pow(fPCm[i], 2));
91 fTCm[i] = fECm[i] - fM[i];
92 fVCm[i] = fPCm[i] / fECm[i];
93 fGCm[i] = 1 / sqrt(1 - pow(fVCm[i], 2));
94
95 // max lab frame theta
96 if(i < 2) {
97 fThetaMax[i] = 0;
98 } else {
99 double val = fPCm[i] / (fM[i] * fCmV * fCmG);
100 if(val < 1) {
101 fThetaMax[i] = asin(val);
102 } else if(val < 1.001) { // catches elastic channels with small numerical rounding errors
103 fThetaMax[i] = PI / 2;
104 } else {
105 fThetaMax[i] = PI;
106 }
107 }
108 }
109}
110
111// particle properties in LAB frame
112// These guys do the math to get lab frame values using CM angles
113double TReaction::GetELabFromThetaCm(double theta_cm, int part) const
114{
115 if(part == 0 || part == 1) {
116 return fTLab[part];
117 }
118
119 return fCmG * (fECm[part] - fCmV * fPCm[part] * cos(theta_cm));
120}
121
122double TReaction::GetTLabFromThetaCm(double theta_cm, int part) const
123{
124 if(part == 0 || part == 1) {
125 return fTLab[part];
126 }
127
128 double ELab = GetELabFromThetaCm(theta_cm, part);
129 return ELab - fM[part]; // T = E - M
130}
131
132double TReaction::GetVLabFromThetaCm(double theta_cm, int part) const
133{
134 if(part == 0 || part == 1) {
135 return fTLab[part];
136 }
137
138 double PLab = GetPLabFromThetaCm(theta_cm, part);
139 double ELab = GetELabFromThetaCm(theta_cm, part);
140 return PLab / ELab; // V = P / E
141}
142
143double TReaction::GetPLabFromThetaCm(double theta_cm, int part) const
144{
145 if(part == 0 || part == 1) {
146 return fTLab[part];
147 }
148
149 double Pz = fCmG * (fPCm[part] * cos(theta_cm) - fCmV * fECm[part]);
150 double Pperp = fPCm[part] * sin(theta_cm);
151 return sqrt(pow(Pperp, 2) + pow(Pz, 2));
152}
153
154double TReaction::GetGLabFromThetaCm(double theta_cm, int part) const
155{
156 if(part == 0 || part == 1) {
157 return fTLab[part];
158 }
159
160 double VLab = GetVLabFromThetaCm(theta_cm, part);
161 return 1 / sqrt(1 - pow(VLab, 2));
162}
163
164double TReaction::GetExcEnergy(double ekin, double theta_lab, int) const
165{
166 if(ekin == 0.00 && theta_lab == 0.00) {
167 return fExc;
168 }
169
170 double val1 = pow(fM[0] + fM[1], 2) + pow(fM[2], 2) + 2 * fM[1] * fTLab[0];
171 double val2 = 2 * fCmG * sqrt(pow(fM[0] + fM[1], 2) + 2 * fM[1] * fTLab[0]);
172 double val3 = fM[2] + ekin - fCmV * sqrt(pow(ekin, 2) + 2 * fM[2] * ekin) * TMath::Cos(theta_lab);
173
174 return sqrt(val1 - val2 * val3) - fM[3];
175}
176
177void TReaction::AnalysisAngDist(double ekin, double theta_lab, int part, double& exc, double& theta_cm, double& omega_lab2cm)
178{
179 exc = GetExcEnergy(ekin, theta_lab, part);
180
181 // adjust cm frame to include the excited state
182 SetCmFrame(exc);
183
184 theta_cm = ConvertThetaLabToCm(theta_lab, part);
185 omega_lab2cm = ConvertOmegaLabToCm(theta_lab, part);
186
187 // reset the cm frame to normal
189}
190
191double TReaction::AnalysisBeta(double ekin, int part) const
192{
193 return sqrt(pow(ekin, 2) + 2 * fM[part] * ekin) / (ekin + fM[part]);
194}
195
196// THIS IS ACTUALLY MOTT SCATTERING (RELATIVISTIC RUTHERFORD)
197// taken from http://www7b.biglobe.ne.jp/~kcy05t/rathef.html (eqn. 61)
198// alpha obtained from http://www.pas.rochester.edu/~cline/Gosia/Gosia_Manual_20120510.pdf
199double TReaction::GetRutherfordCm(double theta_cm, int, bool Units_mb) const
200{
201 static const double alpha = 1.29596; // 0.359994;
202 double scale = 1;
203 if(!Units_mb) {
204 scale = 0.1; // fm^2 = 10^-30 m^2, mb = 10^-31 m^2
205 }
206 // motion is described in lab frame (so TLab instead of TCm) because
207 // Rutherford scattering approximates lab frame == cm frame
208 double a = pow(fNuc[0]->GetZ() * fNuc[1]->GetZ() / fTLab[0], 2);
209 return scale * alpha * a / pow(sin(theta_cm / 2), 4); // ?
210}
211
212double TReaction::GetRutherfordLab(double theta_lab, int part, bool Units_mb) const
213{
214 double theta_cm = ConvertThetaLabToCm(theta_lab, part);
215 double jacobian = ConvertOmegaCmToLab(theta_cm, part);
216
217 return GetRutherfordCm(theta_cm, part, Units_mb) * jacobian;
218}
219
220// Conversion from LAB frame to CM frame
221double TReaction::ConvertThetaLabToCm(double theta_lab, int part) const
222{
223 theta_lab = std::min(theta_lab, fThetaMax[part]);
224
225 // Uses the particle velocity in the CM frame, which makes it more complex
226 double gtan2 = pow(tan(theta_lab) * fCmG, 2);
227 double x = fCmV / fVCm[part];
228 double expr = sqrt(1 + gtan2 * (1 - pow(x, 2)));
229 double theta_cm = 0.;
230
231 // deals with double valued thetas in lab frame
232 if(tan(theta_lab) >= 0) {
233 theta_cm = acos((-x * gtan2 + expr) / (1 + gtan2));
234 } else {
235 theta_cm = acos((-x * gtan2 - expr) / (1 + gtan2));
236 }
237
238 if(fInverse) {
239 theta_cm = PI - theta_cm;
240 }
241
242 if(part == 3) {
243 theta_cm = -theta_cm;
244 }
245
246 return theta_cm;
247}
248
249// dOmegaLab/dOmegaCm[ThetaLab,ThetaCm]
250double TReaction::ConvertOmegaLabToCm(double theta_lab, int part) const
251{
252 // the way to test this function is to use the known 4*cos(theta_lab) for elastics
253 double theta_cm = ConvertThetaLabToCm(theta_lab, part);
254 return 1 / ConvertOmegaCmToLab(theta_cm, part);
255}
256
257void TReaction::ConvertLabToCm(double theta_lab, double omega_lab, double& theta_cm, double& omega_cm, int part) const
258{
259 theta_cm = ConvertThetaLabToCm(theta_lab, part);
260 omega_cm = ConvertOmegaLabToCm(omega_lab, part);
261}
262
263// Conversion from CM frame to LAB frame
264double TReaction::ConvertThetaCmToLab(double theta_cm, int part) const
265{
266 if(fInverse) {
267 theta_cm = PI - theta_cm;
268 }
269
270 double theta_lab = TMath::ATan2(sin(theta_cm), fCmG * (cos(theta_cm) + fCmV / fVCm[part]));
271
272 if(theta_lab > fThetaMax[part]) {
273 return fThetaMax[part];
274 }
275 return theta_lab;
276}
277
278double TReaction::ConvertOmegaCmToLab(double theta_cm, int part) const
279{
280 // the way to test this function is to use the known 4*cos(theta_lab) for elastics
281 double x = fCmV / fVCm[part];
282 if(fInverse) {
283 theta_cm = PI - theta_cm;
284 }
285 double val1 = pow(pow(sin(theta_cm), 2) + pow(fCmG * (x + cos(theta_cm)), 2), 1.5);
286 double val2 = (fCmG * (1 + x * cos(theta_cm)));
287
288 return val1 / val2;
289}
290
291void TReaction::ConvertCmToLab(double theta_cm, double omega_cm, double& theta_lab, double& omega_lab, int part) const
292{
293 theta_lab = ConvertThetaCmToLab(theta_cm, part);
294 omega_lab = ConvertOmegaCmToLab(omega_cm, part);
295}
296
297////////////////////////////////////////////////////////////////////////////////////
298// // // // // // // GRAPHS // // // // // // // // // // // // // // //
299////////////////////////////////////////////////////////////////////////////////////
300
301// Kinetic energy (lab frame) versus theta (either frame)
302TGraph* TReaction::KinVsTheta(double thmin, double thmax, int part, bool Frame_Lab, bool Units_keV) const
303{
304 auto* g = new TGraph();
305 const char* frame = Form("%s", Frame_Lab ? "Lab" : "Cm");
306
307 g->SetName(Form("KinVsTheta%s_%s", frame, GetName()));
308 g->SetTitle(
309 Form("Kinematics for %s; Theta_{%s} [deg]; Kinetic energy [%s]", GetName(), frame, Units_keV ? "keV" : "MeV"));
310
311 double theta = 0.;
312 double T = 0.;
313
314 for(int i = 0; i <= 180; i++) {
315 theta = static_cast<double>(i); // always in CM frame since function is continuous
316
317 T = GetTLabFromThetaCm(theta * D2R, part);
318 if(Units_keV) {
319 T *= 1e3;
320 }
321
322 if(Frame_Lab) { // this is now converted to specified frame (from Frame_Lab)
323 theta = ConvertThetaCmToLab(theta * D2R, part) * R2D;
324 // if(theta==g->GetX[g->GetN()-1]) // if angle is the same
325 // continue;
326 }
327
328 if(theta < thmin || theta > thmax) {
329 continue; // set angular range
330 }
331 g->SetPoint(i, theta, T);
332 }
333
334 return g;
335}
336
337// Frame_Lab -> ThetaCm[ThetaLab] and Frame_Cm -> ThetaLab[ThetaCm]
338TGraph* TReaction::ThetaVsTheta(double thmin, double thmax, int part, bool Frame_Lab) const
339{
340 auto* g = new TGraph();
341 const char* frame = Form("%s", Frame_Lab ? "Lab" : "Cm");
342 const char* other = Form("%s", !Frame_Lab ? "Lab" : "Cm");
343
344 g->SetName(Form("ThetaVsTheta%s_%s", frame, GetName()));
345 g->SetTitle(Form("Angle conversion for %s; Theta_{%s} [deg]; Theta_{%s} [deg]", GetName(), frame, other));
346
347 double theta_cm = 0.;
348 double theta_lab = 0.;
349
350 for(int i = 0; i <= 180; i++) {
351 theta_cm = static_cast<double>(i); // always in CM frame
352 theta_lab = ConvertThetaCmToLab(theta_cm * D2R, part) * R2D;
353
354 if((Frame_Lab && (theta_lab < thmin || theta_lab > thmax))) {
355 continue;
356 }
357 if(!Frame_Lab && (theta_cm < thmin || theta_cm > thmax)) {
358 continue;
359 }
360 // set angular range
361
362 if(Frame_Lab) { // this is now converted to specified frame (from Frame_Lab)
363 g->SetPoint(i, theta_lab, theta_cm);
364 } else {
365 g->SetPoint(i, theta_cm, theta_lab);
366 }
367 }
368
369 return g;
370}
371
372// Frame_Lab -> dOmegaCm/dOmegaLab[ThetaLab] and Frame_Cm -> dOmegaLab/dOmegaCm[ThetaCm]
373TGraph* TReaction::OmegaVsTheta(double thmin, double thmax, int part, bool Frame_Lab) const
374{
375 auto* g = new TGraph();
376 const char* frame = Form("%s", Frame_Lab ? "Lab" : "Cm");
377 const char* other = Form("%s", !Frame_Lab ? "Lab" : "Cm");
378
379 g->SetName(Form("%s_OmegaVsTheta%s", GetName(), frame));
380 g->SetTitle(Form("Solid angle conversion for %s; Theta_{%s} [deg]; dOmega_{%s} / dOmega_{%s}", GetName(), frame,
381 other, frame));
382
383 double theta = 0.;
384 double Om = 0.;
385 for(int i = 0; i <= 180; i++) {
386
387 theta = static_cast<double>(i); // always in CM frame
388 Om = 1 / ConvertOmegaCmToLab(theta * D2R, part);
389
390 if(Frame_Lab) { // this is now converted to specified frame (from Frame_Lab)
391 theta = ConvertThetaCmToLab(theta * D2R, part) * R2D;
392 Om = 1 / Om;
393 }
394
395 if(theta < thmin || theta > thmax || Om > 1e3) { //|| Om<=0 || isnan(Om) || isinf(Om))
396 continue; // set angular range and remove singularities
397 }
398 g->SetPoint(g->GetN(), theta, Om);
399 }
400
401 return g;
402}
403
404// Frame_Lab -> dSigma/dOmegaLab[ThetaLab] and Frame_Cm -> dSigma/dOmegaCm[ThetaCm]
405TGraph* TReaction::RutherfordVsTheta(double thmin, double thmax, int part, bool Frame_Lab, bool Units_mb) const
406{
407 auto* g = new TGraph();
408 const char* frame = Form("%s", Frame_Lab ? "Lab" : "Cm");
409
410 g->SetName(Form("%s_RutherfordVsTheta%s", GetName(), frame));
411 g->SetTitle(Form("Rutherford cross section for %s; Theta_{%s} [deg]; dSigma / dOmega_{%s} [%s/sr]", GetName(), frame,
412 frame, Units_mb ? "mb" : "fm^2"));
413
414 double theta = 0.;
415 double R = 0.;
416
417 for(int i = 1; i <= 180; i++) {
418 theta = static_cast<double>(i); // always in CM frame
419
420 R = GetRutherfordCm(theta * D2R, part, Units_mb); //*ConvertOmega?
421
422 if(Frame_Lab) { // this is now converted to specified frame (from Frame_Lab)
423 R *= ConvertOmegaCmToLab(theta * D2R, part);
424 theta = ConvertThetaCmToLab(theta * D2R, part) * R2D;
425 }
426
427 if(theta < thmin || theta > thmax) {
428 continue; // set angular range
429 }
430 g->SetPoint(g->GetN(), theta, R);
431 }
432
433 return g;
434}
435
436void TReaction::Print(Option_t* opt) const
437{
438 std::string pstring;
439 pstring.assign(opt);
440
441 std::cout << std::endl
442 << std::endl
443 << " * * * * * * * * * * * * * * * * * * * * * * * * *" << std::endl;
444 std::cout << std::endl
445 << std::endl
446 << "\tTReaction '" << GetName() << "' :" << std::endl
447 << std::endl;
448
449 std::cout << " -> Beam '" << fNuc[0]->GetName() << "' kinetic energy = " << fTBeam << " [MeV]" << std::endl;
450 std::cout << " -> Reaction Q value (total) = " << fQVal << " [MeV]" << std::endl;
451 std::cout << " -> Reaction kinematics type = '" << (fInverse ? "INVERSE" : "NORMAL") << "'" << std::endl;
452 if(fInverse) {
453 std::cout << std::endl
454 << " Inverse beam '" << fNuc[1]->GetName() << "' [lab frame] :- " << std::endl;
455 std::cout << "\t Kinetic energy = " << (fGLab[0] - 1) * fM[1] << " [MeV]" << std::endl;
456 std::cout << "\t Velocity = " << fVLab[0] << " [/c] " << std::endl;
457 }
458
459 std::cout << std::endl
460 << " Center of mass motion :- " << std::endl;
461 std::cout << "\t CmE = " << fCmE << " [MeV]" << std::endl;
462 std::cout << "\t CmTi = " << fCmTi << " [MeV]" << std::endl;
463 std::cout << "\t CmTf = " << fCmTf << " [MeV]" << std::endl;
464 std::cout << "\t CmV = " << fCmV << " [/c]" << std::endl;
465 std::cout << "\t CmP = " << fCmP << " [MeV/c]" << std::endl;
466 std::cout << "\t CmG = " << fCmG << std::endl;
467 std::cout << std::endl;
468
469 if(pstring.find("all") != std::string::npos) {
470 for(int i = 0; i < 4; i++) {
471 std::cout << std::endl
472 << " Particle " << i << " : '" << fNuc[i]->GetName() << "' : \t A = " << fNuc[i]->GetA() << ", Z = " << fNuc[i]->GetZ() << ", Mass = " << fM[i] << " [MeV]" << std::endl;
473
474 if(i < 2) {
475 std::cout << "\t ECm = " << fECm[i] << " [MeV]\t\t ELab = " << fELab[i] << " [MeV]" << std::endl;
476 std::cout << "\t TCm = " << fTCm[i] << " [MeV]\t\t TLab = " << fTLab[i] << " [MeV]" << std::endl;
477 std::cout << "\t VCm = " << fVCm[i] << " [/c]\t\t VLab = " << fVLab[i] << " [/c]" << std::endl;
478 std::cout << "\t PCm = " << fPCm[i] << " [MeV/c]\t PLab = " << fPLab[i] << " [MeV/c]" << std::endl;
479 std::cout << "\t GCm = " << fGCm[i] << " \t\t GLab = " << fGLab[i] << std::endl;
480 } else {
481 std::cout << "\t ECm = " << fECm[i] << " [MeV]\t\t ELab = N/A" << std::endl;
482 std::cout << "\t TCm = " << fTCm[i] << " [MeV]\t\t TLab = N/A" << std::endl;
483 std::cout << "\t VCm = " << fVCm[i] << " [/c]\t\t VLab = N/A" << std::endl;
484 std::cout << "\t PCm = " << fPCm[i] << " [MeV/c]\t PLab = N/A" << std::endl;
485 std::cout << "\t GCm = " << fGCm[i] << " \t\t GLab = N/A" << std::endl;
486 std::cout << "\t\t ThetaLab_max = " << fThetaMax[i] * R2D << " [deg]" << std::endl;
487 }
488 }
489 }
490 std::cout << std::endl
491 << std::endl
492 << " * * * * * * * * * * * * * * * * * * * * * * * * *" << std::endl
493 << std::endl;
494}
495
496void TReaction::Clear(Option_t*)
497{
498 fQVal = 0.;
499 fS = 0.;
500 fInvariantMass = 0.;
501 fTBeam = 0.;
502 fInverse = false;
503
504 fCmTi = 0.;
505 fCmTf = 0.;
506 fCmE = 0.;
507 fCmV = 0.;
508 fCmP = 0.;
509 fCmG = 0.;
510
511 for(int i = 0; i < 4; i++) {
512 fNuc[i] = nullptr;
513 fM[i] = 0.;
514
515 fTCm[i] = 0.;
516 fECm[i] = 0.;
517 fVCm[i] = 0.;
518 fPCm[i] = 0.;
519 fGCm[i] = 0.;
520
521 fThetaMax[i] = 0.;
522
523 if(i < 2) {
524 fTLab[i] = 0.;
525 fELab[i] = 0.;
526 fVLab[i] = 0.;
527 fPLab[i] = 0.;
528 fGLab[i] = 0.;
529 }
530 }
531}
int GetZ() const
Gets the Z (# of protons) of the nucleus.
Definition TNucleus.h:57
int GetA() const
Gets the A (Z + N) of the nucleus.
Definition TNucleus.h:59
double GetMass() const
Gets the mass of the nucleus (in MeV)
Definition TNucleus.h:61
double fCmG
Definition TReaction.h:171
TGraph * OmegaVsTheta(double thmin=0.0, double thmax=180.0, int part=2, bool Frame_Lab=true) const
double fTLab[2]
Definition TReaction.h:182
TGraph * KinVsTheta(double thmin=0.0, double thmax=180.0, int part=2, bool Frame_Lab=true, bool Units_keV=true) const
double ConvertThetaLabToCm(double theta_lab, int part=2) const
double GetVLabFromThetaCm(double theta_cm=0.0, int part=0) const
void ConvertCmToLab(double theta_cm, double omega_cm, double &theta_lab, double &omega_lab, int part=2) const
double AnalysisBeta(double ekin, int part) const
double GetELabFromThetaCm(double theta_cm=0.0, int part=0) const
double fECm[4]
Definition TReaction.h:175
void Clear(Option_t *opt="") override
double ConvertThetaCmToLab(double theta_cm, int part=2) const
double GetTBeam(bool inverse) const
Definition TReaction.cxx:72
double ConvertOmegaLabToCm(double theta_lab, int part=2) const
double fM[4]
Definition TReaction.h:160
double fQVal
Definition TReaction.h:163
double fS
Definition TReaction.h:164
double fCmV
Definition TReaction.h:169
double fCmTi
Definition TReaction.h:166
double fTBeam
Definition TReaction.h:157
double fGCm[4]
Definition TReaction.h:178
double fVCm[4]
Definition TReaction.h:177
double GetPLabFromThetaCm(double theta_cm=0.0, int part=0) const
void Print(Option_t *opt="") const override
TReaction(const char *beam, const char *targ, const char *ejec, const char *reco, double eBeam=0.0, double ex3=0.0, bool inverse=false)
Definition TReaction.cxx:10
double fGLab[2]
Definition TReaction.h:186
TGraph * RutherfordVsTheta(double thmin=1.0, double thmax=179.0, int part=2, bool Frame_Lab=true, bool Units_mb=true) const
void ConvertLabToCm(double theta_lab, double omega_lab, double &theta_cm, double &omega_cm, int part=2) const
void AnalysisAngDist(double ekin, double theta_lab, int part, double &exc, double &theta_cm, double &omega_lab2cm)
double fInvariantMass
Definition TReaction.h:165
TGraph * ThetaVsTheta(double thmin=0.0, double thmax=180.0, int part=2, bool Frame_Lab=true) const
double fPLab[2]
Definition TReaction.h:184
double GetRutherfordCm(double theta_cm, int part=2, bool Units_mb=true) const
void InitReaction()
Definition TReaction.cxx:34
double ConvertOmegaCmToLab(double theta_cm, int part=2) const
double GetGLabFromThetaCm(double theta_cm=0.0, int part=0) const
double fELab[2]
Definition TReaction.h:183
double fPCm[4]
Definition TReaction.h:176
bool fInverse
Definition TReaction.h:158
double fTCm[4]
Definition TReaction.h:174
double fCmP
Definition TReaction.h:170
double fExc
Definition TReaction.h:159
double fCmE
Definition TReaction.h:168
double GetRutherfordLab(double theta_lab, int part=2, bool Units_mb=true) const
void SetCmFrame(double exc)
Definition TReaction.cxx:80
double GetExcEnergy(double ekin=0.00, double theta_lab=0.00, int part=2) const
double fCmTf
Definition TReaction.h:167
TNucleus * fNuc[4]
Definition TReaction.h:156
double fVLab[2]
Definition TReaction.h:185
double fThetaMax[4]
Definition TReaction.h:187
double GetTLabFromThetaCm(double theta_cm=0.0, int part=0) const
#define D2R
Definition TReaction.h:24
#define R2D
Definition TReaction.h:20
#define PI
Definition TReaction.h:16