BOSS 7.0.4
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcRecShowerEnergy.cxx
Go to the documentation of this file.
1
2#include "EmcRec/EmcRecShowerEnergy.h"
3#include "EmcRec/EmcRecNeighbor.h"
4#include "EmcRec/EmcRecParameter.h"
5
7{
8 RecEmcFractionMap::const_iterator cit;
10 RecEmcEnergy e9=0;
11 RecEmcEnergy e25=0;
12 RecEmcEnergy elepton=0;
13 RecEmcEnergy eall=0;
14
16
17 RecEmcID CellId=aShower.getShowerId();
18 int module=EmcID::barrel_ec(CellId);
19 RecEmcIDVector NearCell=nhb.GetNeighbors(CellId);
20 RecEmcIDVector NextNearCell=nhb.GetNextNeighbors(CellId);
21 RecEmcIDVector tmpNearCell;
22 RecEmcIDVector tmpNextNearCell;
23 i_RecEmcIDVector pNearCell;
24 i_RecEmcIDVector pNextNearCell;
25 vector<RecEmcEnergy> eVec;
26 vector<RecEmcEnergy>::const_iterator ciVec;
27
28 tmpNearCell.push_back(CellId);
29 tmpNextNearCell.push_back(CellId);
30
31 cit=aShower.Find(CellId);
32 //int time_seed = cit->second.getTime();
33 e1=(cit->second.getEnergy())*(cit->second.getFraction());
34 e9+=(cit->second.getEnergy())*(cit->second.getFraction());
35 e25+=(cit->second.getEnergy())*(cit->second.getFraction());
36
37 //e3x3
38 for(pNearCell=NearCell.begin();
39 pNearCell!=NearCell.end();
40 pNearCell++) {
41 cit=aShower.Find(*pNearCell);
42 if(cit!=aShower.End()) {
43 tmpNearCell.push_back(*pNearCell);
44 tmpNextNearCell.push_back(*pNearCell);
45 e9+=cit->second.getEnergy()*cit->second.getFraction();
46 e25+=cit->second.getEnergy()*cit->second.getFraction();
47 }
48 }
49
50 //e5x5
51 for(pNextNearCell=NextNearCell.begin();
52 pNextNearCell!=NextNearCell.end();
53 pNextNearCell++) {
54 cit=aShower.Find(*pNextNearCell);
55 if(cit!=aShower.End()) {
56 tmpNextNearCell.push_back(*pNextNearCell);
57 e25+=cit->second.getEnergy()*cit->second.getFraction();
58 }
59 }
60
61 //eall
62 for(cit=aShower.Begin();cit!=aShower.End();++cit) {
63 eall+=(cit->second.getEnergy())*(cit->second.getFraction());
64 eVec.push_back(cit->second.getEnergy()*cit->second.getFraction());
65 }
66
67 //calculate number of hits from MC
68 int nHit,n;
70 nHit=(int)(Para.HitNb(0)*log(Para.HitNb(1)*e9+Para.HitNb(2)));
71 n=0;
72
73 //sort by energy
74 sort(eVec.begin(), eVec.end(), greater<RecEmcEnergy>());
75
76 for(ciVec=eVec.begin();ciVec!=eVec.end();ciVec++) {
77 if(n<nHit) {
78 elepton+=*ciVec;
79 n++;
80 }
81 }
82
83 //energy correction
84 //RecEmcEnergy eCorr=ECorrTheta(e25,CellId);
85 //RecEmcEnergy eCorr=ECorrection(e25);
86 int getthetaid = EmcID::theta_module(CellId);
87 int getmodule = EmcID::barrel_ec(CellId);
88 if(getthetaid>21)getthetaid=43-getthetaid;
89 if(getmodule==1)getthetaid=getthetaid+6;
90 double dthetaid=double(getthetaid);
91 double eCorr = Para.ECorrMC(e25,dthetaid);
92
93 //energy error
94 RecEmcEnergy de,de1,de2,de3;
95 de1 = Para.SigE(0)/eCorr;
96 de2 = Para.SigE(1)/pow(eCorr,0.25);
97 de3 = Para.SigE(2);
98 de = sqrt(de1*de1+de2*de2+de3*de3)*perCent*eCorr;
99
100 double err = Para.ErrMC(e25,dthetaid);
101 if(err>0) de = err*e25;
102
103 aShower.setTrackId(-1);
104 aShower.setCellId(CellId);
105 aShower.setModule(module);
106 aShower.setNumHits(aShower.getSize());
107 aShower.setDE(de);
108 aShower.CellId3x3(tmpNearCell);
109 aShower.CellId5x5(tmpNextNearCell);
110 aShower.setESeed(e1);
111 aShower.setE3x3(e9);
112 aShower.setE5x5(e25);
113 aShower.ELepton(elepton);
114 aShower.EAll(eall);
115 aShower.setEnergy(eCorr);
116
117 //cout<<"e1="<<aShower.eSeed()
118 // <<"\te9="<<aShower.e3x3()
119 // <<"\te25="<<aShower.e5x5()
120 // <<"\telepton="<<aShower.getELepton()
121 // <<"\teall="<<aShower.getEAll()
122 // <<"\tenergy="<<aShower.energy()<<endl;
123}
124
126{
127 if(eIn>3.) return eIn;
128
130
131 RecEmcEnergy eOut=0;
132 double par[4];
133 for(int i=0;i<4;i++) {
134 par[i]=Para.ECorr(i);
135 }
136
137 eOut = eIn/(par[0]+par[1]*eIn+par[2]*eIn*eIn+par[3]*eIn*eIn*eIn);
138 return eOut;
139}
140
142{
144 RecEmcEnergy eOut=eIn;
145
146 unsigned int npart = EmcID::barrel_ec(id);
147 unsigned int ntheta = EmcID::theta_module(id);
148
149 if(npart==1) {
150 eOut *= 1.843/Para.Peak(ntheta);
151 } else if(npart==0) {
152 eOut *= 1.843/Para.Peak(ntheta+44);
153 } else if(npart==2) {
154 eOut *= 1.843/Para.Peak(ntheta+50);
155 }
156
157 return eOut;
158}
const Int_t n
Double_t e1
static unsigned int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0)
Definition: EmcID.cxx:38
static unsigned int theta_module(const Identifier &id)
Definition: EmcID.cxx:43
RecEmcIDVector GetNeighbors(const Identifier &id)
RecEmcIDVector GetNextNeighbors(const Identifier &id)
double ECorr(int n) const
double SigE(int n) const
double ECorrMC(double eg, double theid) const
static EmcRecParameter & GetInstance()
double HitNb(int n) const
double Peak(int n) const
double ErrMC(double eg, double theid) const
RecEmcEnergy ECorrection(const RecEmcEnergy eIn)
RecEmcEnergy ECorrTheta(const RecEmcEnergy eIn, const RecEmcID &id)
void Energy(RecEmcShower &aShower)
RecEmcFractionMap::const_iterator End() const
void CellId3x3(RecEmcIDVector &id3x3)
RecEmcEnergy EAll(RecEmcEnergy e)
RecEmcEnergy ELepton(RecEmcEnergy e)
RecEmcFractionMap::const_iterator Begin() const
RecEmcFractionMap::const_iterator Find(const RecEmcID &CellId) const
unsigned int getSize() const
void CellId5x5(RecEmcIDVector &id5x5)