ARTEMIS-CRIB
 
Loading...
Searching...
No Matches
TRandomBeamGenerator.cc
Go to the documentation of this file.
1/**
2 * @file TRandomBeamGenerator.cc
3 * @brief position and angle random beam generator
4 * @author Kodai Okawa<okawa@cns.s.u-tokyo.ac.jp>
5 * @date 2023-06-09 15:57:01
6 * @note last modified: 2024-09-03 17:19:07
7 * @details
8 */
9
11
12#include "TParticleInfo.h"
13#include <Mass.h> // TSrim library
14#include <TRandom.h>
15
17
19
21 RegisterOutputCollection("OutputCollection", "simulation result collection", fOutputColName, TString("beam"));
22 RegisterOutputCollection("OutputTrackCollection", "simulation tracking information (used for reconstraction simulation)",
23 fOutputTrackColName, TString("track"));
24
25 RegisterProcessorParameter("MassNum", "beam mass number", fMassNum, 0);
26 RegisterProcessorParameter("AtomicNum", "beam atomic number", fAtmNum, 0);
27 RegisterProcessorParameter("ChargeNum", "beam charge number", fChargeNum, 0);
28 RegisterProcessorParameter("IniEnergy", "beam energy (MeV)", fBeamEnergy, 100.0);
29
30 DoubleVec_t init_d_vec = {0.0, 0.0, 0.0};
31 RegisterProcessorParameter("InitialPosition", "initial position of the beam", fInitialPosition, init_d_vec);
32 RegisterProcessorParameter("Xsigma", "dispersion of X position (mm)", fXsigma, 1.0);
33 RegisterProcessorParameter("Ysigma", "dispersion of Y position (mm)", fYsigma, 1.0);
34 RegisterProcessorParameter("Asigma", "dispersion of A angle (deg)", fAsigma, 1.0);
35 RegisterProcessorParameter("Bsigma", "dispersion of B angle (deg)", fBsigma, 1.0);
36 RegisterProcessorParameter("Esigma", "dispersion of beam energy (MeV)", fEsigma, 1.0);
37}
38
40 delete fOutData;
41 fOutData = nullptr;
42 delete fOutTrackData;
43 fOutTrackData = nullptr;
44}
45
46void TRandomBeamGenerator::Init(TEventCollection *col) {
47 Info("Init", "making => %s, %s", fOutputColName.Data(), fOutputTrackColName.Data());
48
49 Double_t deg2rad = TMath::Pi() / 180.;
50 fAsigma *= deg2rad;
51 fBsigma *= deg2rad;
52
53 /// using TSrim library
54 fMass = amdc::Mass(fAtmNum, fMassNum) * amdc::amu; // MeV
55 Info("Init", "beam: (Z, A, M) = (%d, %d, %.5lf)", fAtmNum, fMassNum, fMass / amdc::amu);
56
57 if (fInitialPosition.size() != 3) {
58 SetStateError("position size is not 3");
59 return;
60 }
61
62 fOutData = new TClonesArray("art::crib::TParticleInfo");
63 fOutData->SetName(fOutputColName);
64 col->Add(fOutputColName, fOutData, fOutputIsTransparent);
65
66 fOutTrackData = new TClonesArray("art::TTrack");
68 col->Add(fOutputTrackColName, fOutTrackData, fOutputIsTransparent);
69
70 gRandom->SetSeed(time(nullptr));
71}
72
74 fOutData->Clear("C");
75 fOutTrackData->Clear("C");
76
77 TParticleInfo *outData = static_cast<TParticleInfo *>(fOutData->ConstructedAt(0));
78 outData->SetMassNumber(fMassNum);
79 outData->SetAtomicNumber(fAtmNum);
80 outData->SetCharge(fChargeNum);
81
82 Double_t posx = gRandom->Gaus(fInitialPosition[0], fXsigma);
83 Double_t posy = gRandom->Gaus(fInitialPosition[1], fYsigma);
84 Double_t angx = gRandom->Gaus(0., fAsigma);
85 Double_t angy = gRandom->Gaus(0., fBsigma);
86 Double_t energy = gRandom->Gaus(fBeamEnergy, fEsigma);
87
88 Double_t beta = TMath::Sqrt(1.0 - TMath::Power(fMass / (fMass + energy), 2)); // kinematics
89 Double_t norm =
90 TMath::Sqrt(TMath::Tan(angx) * TMath::Tan(angx) + TMath::Tan(angy) * TMath::Tan(angy) + 1.0); // kinematics
91 Double_t beta_x = beta * TMath::Tan(angx) / norm;
92 Double_t beta_y = beta * TMath::Tan(angy) / norm;
93 Double_t beta_z = beta * 1.0 / norm;
94
95 TLorentzVector beam(0., 0., 0., fMass);
96 beam.Boost(beta_x, beta_y, beta_z);
97
98 outData->SetID(0);
99 outData->SetLorentzVector(beam);
100 outData->SetEnergy(energy);
101 outData->SetCurrentZ(0.);
102 outData->SetZeroTime();
103 outData->SetTrack(posx, posy, fInitialPosition[2], angx, angy);
104
105 TTrack *outTrackData = static_cast<TTrack *>(fOutTrackData->ConstructedAt(0));
106 outTrackData->SetID(0);
107 outTrackData->SetPos(posx, posy, fInitialPosition[2]);
108 outTrackData->SetAngle(angx, angy);
109}
particle information class
ClassImp(TRandomBeamGenerator)
position and angle random beam generator
void SetTrack(Double_t x, Double_t y, Double_t z, Double_t a, Double_t b)
void SetMassNumber(Int_t val)
void SetLorentzVector(Double_t x, Double_t y, Double_t z, Double_t t)
void SetCurrentZ(Double_t val)
void SetCharge(Int_t val)
void SetAtomicNumber(Int_t val)
void SetEnergy(Double_t val)
void Init(TEventCollection *) override
return to the guide