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