BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnPid.cxx
Go to the documentation of this file.
1#include "BmnPid.h"
2
3#include "BmnMath.h"
4#include "TCanvas.h"
5#include "TFitResult.h"
6#include "TGraph.h"
7
8#include <TStopwatch.h>
9
10static Double_t workTime = 0.0;
11
12using namespace std;
13using namespace TMath;
14
16{
17 fEventNo = 0;
18 fGlobalTracksArray = NULL;
19 fGlobalTracksBranchName = "BmnGlobalTrack";
20 fModelPower = power;
21}
22
24
25InitStatus BmnPid::Init()
26{
27 if (fVerbose > 1)
28 cout << "=========================== PID init started ====================" << endl;
29
31
32 // Add several types of particles to the database.
33 // p, pi, K, e are already in it
34 db->AddParticle("D", "D", 1.876123928, true, 0, 3, "Core", 1000010020, 1000010020, 1000010020);
35 db->AddParticle("T", "T", 2.809432115, true, 0, 3, "Core", 1000010030, 1000010030, 1000010030);
36 db->AddParticle("He3", "He3", 2.809413523, true, 0, 6, "Core", 1000020030, 1000020030, 1000020030);
37 db->AddParticle("He4", "He4", 3.728401326, true, 0, 6, "Core", 1000020040, 1000020040, 1000020040);
38
39 // Get ROOT Manager
40 FairRootManager* ioman = FairRootManager::Instance();
41 if (NULL == ioman)
42 Fatal("Init", "FairRootManager is not instantiated");
43
45 if (!fGlobalTracksArray) {
46 cout << "PID::Init(): branch " << fGlobalTracksBranchName << " not found! Task will be deactivated" << endl;
47 SetActive(kFALSE);
48 return kERROR;
49 }
50
51 if (fVerbose > 1)
52 cout << "=========================== PID init finished ===================" << endl;
53
54 return kSUCCESS;
55}
56
58{
59
60 TStopwatch sw;
61 sw.Start();
62
63 if (!IsActive())
64 return;
65
66 if (fVerbose > 1)
67 cout << "======================== PID exec started ======================" << endl;
68 if (fVerbose > 1)
69 cout << "Event number: " << fEventNo++ << endl;
70
71 SetVector();
72 if (fVerbose > 1)
73 cout << "\n======================== PID exec finished ======================" << endl;
74
75 sw.Stop();
76 workTime += sw.RealTime();
77}
78
80{
81 Int_t size = fGlobalTracksArray->GetEntriesFast();
82 Double_t rigidity, beta400, beta700, mass, charge, p;
83
84 for (Int_t iTrack = 0; iTrack < size; ++iTrack) {
85 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracksArray->UncheckedAt(iTrack); // get iTrack'th track
86 vector<Double_t> vectorTof400;
87 vector<Double_t> vectorTof700;
88
89 for (PidParticles iSort = (PidParticles)0; iSort != EndPidEnum; iSort = (PidParticles)(iSort + 1)) {
90 Int_t pdg = EnumToPdg(iSort);
91 TParticlePDG* iParticle = db->GetParticle(pdg);
92 rigidity = track->GetP();
93 beta400 = track->GetBeta(1);
94 beta700 = track->GetBeta(2);
95 mass = iParticle->Mass();
96 charge = iParticle->Charge() / 3;
97 p = rigidity * charge;
98 if (beta400 > -999)
99 vectorTof400.push_back(EstimateProbability(p, beta400, mass, fModelPower));
100 if (beta700 > -999)
101 vectorTof700.push_back(EstimateProbability(p, beta700, mass, fModelPower));
102 }
103 NormalizeVector(vectorTof400);
104 NormalizeVector(vectorTof700);
105
106 // track->SetPidVectorTof400(vectorTof400);
107 // track->SetPidVectorTof700(vectorTof700);
108 }
109}
110
112{
113 return 1 / pow(abs(beta - abs((p / sqrt(p * p + mass * mass)))), power);
114}
115
116Int_t BmnPid::EnumToPdg(PidParticles part)
117{
118 switch (part) {
119 case PidProton:
120 return 2212;
121 case PidPion:
122 return 211;
123 case PidKaon:
124 return 321;
125 case PidElectron:
126 return 11;
127 case PidDeuteron:
128 return 1000010020;
129 case PidTriton:
130 return 1000010030;
131 case PidHelium3:
132 return 1000020030;
133 case PidHelium4:
134 return 1000020040;
135 default:
136 cout << "No such particle in PidParticles\n";
137 return -1;
138 }
139}
140
141void BmnPid::NormalizeVector(vector<Double_t>& vec)
142{
143 Double_t sum = GetSum(vec);
144 for (auto iter = vec.begin(); iter != vec.end(); iter++)
145 *iter = *iter / sum;
146}
147
148Double_t BmnPid::GetSum(const vector<Double_t>& vec)
149{
150 Double_t sum = 0;
151 for (auto i : vec)
152 sum += i;
153 return sum;
154}
155
157{
158 printf("Work time of BmnPid: %4.2f sec.\n", workTime);
159}
static Double_t workTime
Definition BmnPid.cxx:10
int i
Definition P4_F32vec4.h:22
int Int_t
constexpr Bool_t kFALSE
double Double_t
const char Option_t
void Fatal(const char *location, const char *msgfmt,...)
BmnGlobalTrack.h.
Double_t GetSum(const vector< Double_t > &vec)
Definition BmnPid.cxx:148
TString fGlobalTracksBranchName
Definition BmnPid.h:39
Int_t fModelPower
Definition BmnPid.h:42
virtual ~BmnPid()
Definition BmnPid.cxx:23
TClonesArray * fGlobalTracksArray
Definition BmnPid.h:50
void SetVector()
Definition BmnPid.cxx:79
Int_t fEventNo
Definition BmnPid.h:48
TDatabasePDG * db
Definition BmnPid.h:40
BmnPid(Int_t power=1)
Definition BmnPid.cxx:15
void NormalizeVector(vector< Double_t > &vec)
Definition BmnPid.cxx:141
Double_t EstimateProbability(Double_t p, Double_t beta, Double_t mass, Int_t power)
Definition BmnPid.cxx:111
virtual void Exec(Option_t *opt)
Definition BmnPid.cxx:57
virtual InitStatus Init()
Definition BmnPid.cxx:25
virtual void Finish()
Definition BmnPid.cxx:156
Int_t EnumToPdg(PidParticles part)
Definition BmnPid.cxx:116
Double_t GetP()
Definition BmnTrack.h:67
static TDatabasePDG * Instance()
Double_t Charge() const
Double_t Mass() const
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
void Stop()
double beta(double x, double y)
RVec< PromoteType< T > > abs(const RVec< T > &v)
RVec< PromoteTypes< T0, T1 > > pow(const RVec< T0 > &v, const T1 &y)
RVec< PromoteType< T > > sqrt(const RVec< T > &v)
Definition json.hpp:4446