Belle II Software development
NoKickRTSel.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <tracking/trackFindingVXD/sectorMapTools/NoKickRTSel.h>
10#include <tracking/trackFindingVXD/sectorMapTools/NoKickCuts.h>
11
12#include <tracking/dataobjects/hitXPDerivate.h>
13
14#include <mdst/dataobjects/MCParticle.h>
15#include <pxd/dataobjects/PXDTrueHit.h>
16#include <svd/dataobjects/SVDTrueHit.h>
17
18using namespace Belle2;
19
20
22{
23 StoreArray<SVDCluster> SVDClusters;
24 StoreArray<SVDTrueHit> SVDTrueHits;
25 StoreArray<MCParticle> MCParticles;
26 StoreArray<RecoTrack> recoTracks;
27
28 if (track.getRelationsTo<MCParticle>().size() > 0) {
29
30 const MCParticle* particle = track.getRelationsTo<MCParticle>()[0];
31
32 std::vector<Belle2::RecoHitInformation::UsedSVDHit*> clusterListSVD = track.getSVDHitList();
33 for (const SVDCluster* cluster : clusterListSVD) {
34 for (const SVDTrueHit& hit : cluster->getRelationsTo<SVDTrueHit>()) {
35 RelationVector<MCParticle> hitFromParticle = hit.getRelationsFrom<MCParticle>();
36 if (hitFromParticle.size() > 0) {
37 if (hitFromParticle[0]->getIndex() != particle->getIndex()) {
38 continue;
39 }
40 } else continue;
41 VxdID trueHitSensorID = hit.getSensorID();
42 const VXD::SensorInfoBase& sensorInfo = VXD::GeoCache::getInstance().getSensorInfo(trueHitSensorID);
43 hitXPDerivate entry(hit, *cluster, *particle, sensorInfo);
44 int NClusterU = 0;
45 int NClusterV = 0;
46 for (const SVDCluster& Ncluster : hit.getRelationsFrom<SVDCluster>()) {
47 if (Ncluster.isUCluster()) NClusterU++;
48 else NClusterV++;
49 }
50 entry.setClusterU(NClusterU);
51 entry.setClusterV(NClusterV);
52
53 bool isReconstructed(false);
54 for (const RecoTrack& aRecoTrack : particle->getRelationsFrom<RecoTrack>())
55 isReconstructed |= aRecoTrack.hasSVDHits();
56 entry.setReconstructed(isReconstructed);
57
58 m_setHitXP.insert(entry);
59 }
60 }
61
62
63 StoreArray<PXDCluster> PXDClusters;
64 StoreArray<PXDTrueHit> PXDTrueHits;
65
66 std::vector<Belle2::RecoHitInformation::UsedPXDHit*> clusterListPXD = track.getPXDHitList();
67 for (const PXDCluster* cluster : clusterListPXD) {
68 for (const PXDTrueHit& hit : cluster->getRelationsTo<PXDTrueHit>()) {
69 RelationVector<MCParticle> hitFromParticle = hit.getRelationsFrom<MCParticle>();
70 if (hitFromParticle.size() > 0) {
71 if (hitFromParticle[0]->getIndex() != particle->getIndex()) {
72 continue;
73 }
74 } else continue;
75 VxdID trueHitSensorID = hit.getSensorID();
76 const VXD::SensorInfoBase& sensorInfo = VXD::GeoCache::getInstance().getSensorInfo(trueHitSensorID);
77 hitXPDerivate entry(hit, *particle, sensorInfo);
78
79 bool isReconstructed(false);
80 for (const RecoTrack& aRecoTrack : particle->getRelationsFrom<RecoTrack>())
81 isReconstructed |= aRecoTrack.hasPXDHits();
82 entry.setReconstructed(isReconstructed);
83
84 m_setHitXP.insert(entry);
85 }
86 }
87
88 for (const auto& element : m_setHitXP) {
89 m_hitXP.push_back(element);
90 }
91
92 }
93
94}
95
97{
98 hitXPBuilder(track);
99 for (const hitXP& XP : m_hitXP) {
100 if (m_8hitTrack.size() < 1) {
101 m_8hitTrack.push_back(XP);
102 } else if (XP.m_sensorLayer != m_8hitTrack.back().m_sensorLayer ||
103 XP.m_sensorLadder != m_8hitTrack.back().m_sensorLadder ||
104 XP.m_sensorSensor != m_8hitTrack.back().m_sensorSensor) {
105 m_8hitTrack.push_back(XP);
106 }
107 }
108
109}
110
111bool NoKickRTSel::globalCut(const std::vector<hitXP>& track8)
112{
113 int flagd0 = 1;
114 int flagz0 = 1;
115 int lay3 = 0;
116 int lay4 = 0;
117 int lay5 = 0;
118 int lay6 = 0;
119 for (const hitXP& XP : track8) {
120 if (XP.getSensorLayer() == 3) lay3 = 1;
121 if (XP.getSensorLayer() == 4) lay4 = 1;
122 if (XP.getSensorLayer() == 5) lay5 = 1;
123 if (XP.getSensorLayer() == 6) lay6 = 1;
124 // if (fabs(XP.getD0Entry()) > 1.) flagd0 = 0;
125 // if (fabs(XP.getZ0Entry()) > 1.) flagz0 = 0;
126 }
127 int N_lay = lay3 + lay4 + lay5 + lay6;
128 if (N_lay >= 3) N_lay = 1;
129 else N_lay = 0;
130 int flagTot = flagd0 * flagz0 * N_lay;
131 if (flagTot == 1) return true;
132 else return false;
133}
134
135bool NoKickRTSel::segmentSelector(const hitXP& hit1, const hitXP& hit2, const std::vector<double>& selCut,
136 NoKickCuts::EParameters par, bool is0)
137{
138 if (hit2.m_sensorLayer - hit1.m_sensorLayer > 1) return true;
139 else {
140 double deltaPar = 0;
141 switch (par) {
142 case NoKickCuts::c_Omega:
143 deltaPar = fabs(hit1.getOmegaEntry() - hit2.getOmegaEntry());
144 if (is0) deltaPar = fabs(hit1.getOmega0() - hit2.getOmegaEntry());
145 // selCutPXD =0.4;
146 break;
147
148 case NoKickCuts::c_D0:
149 deltaPar = hit1.getD0Entry() - hit2.getD0Entry();
150 if (is0) deltaPar = hit1.getD00() - hit2.getD0Entry();
151 // selCutPXD =1;
152 break;
153
154 case NoKickCuts::c_Phi0:
155 deltaPar = asin(sin(hit1.getPhi0Entry())) - asin(sin(hit2.getPhi0Entry()));
156 if (is0) deltaPar = asin(sin(hit1.getPhi00())) - asin(sin(hit2.getPhi0Entry()));
157 // selCutPXD =0.3;
158 break;
159
160 case NoKickCuts::c_Z0:
161 deltaPar = hit1.getZ0Entry() - hit2.getZ0Entry();
162 if (is0) deltaPar = hit1.getZ00() - hit2.getZ0Entry();
163 // selCutPXD =1;
164 break;
165
166 case NoKickCuts::c_Tanlambda:
167 deltaPar = hit1.getTanLambdaEntry() - hit2.getTanLambdaEntry();
168 if (is0) deltaPar = hit1.getTanLambda0() - hit2.getTanLambdaEntry();
169 // selCutPXD =0.3;
170 break;
171 }
172
173 double usedCut = 0;
174 if (fabs(selCut.at(0)) > fabs(selCut.at(1))) {
175 usedCut = fabs(selCut.at(0));
176 } else usedCut = fabs(selCut.at(1));
177
178 if (deltaPar > -usedCut && deltaPar < usedCut) return true;
179 else {
180 B2DEBUG(20, "--------------------------");
181 B2DEBUG(20, "lay1=" << hit1.m_sensorLayer);
182 B2DEBUG(20, "lay2=" << hit2.m_sensorLayer);
183 B2DEBUG(20, "parameter=" << par);
184 B2DEBUG(20, "Min=" << selCut.at(0));
185 B2DEBUG(20, "Max=" << selCut.at(1));
186 B2DEBUG(20, "deltaPar=" << deltaPar);
187 B2DEBUG(20, "momentum=" << hit1.m_momentum0.R());
188 return false;
189 }
190 }
191}
192
193
194
196{
198 hit8TrackBuilder(track);
199
200 if (m_outputFlag) {
201 m_pdgID = m_8hitTrack[0].getPDGID();
202 m_pMag = track.getMomentumSeed().R();
203 m_pt = sqrt(track.getMomentumSeed().X() * track.getMomentumSeed().X() + track.getMomentumSeed().Y() * track.getMomentumSeed().Y());
204 }
205
206 bool good = globalCut(m_8hitTrack);
207 if (good == false) {
208 if (m_outputFlag) {
209 m_numberOfCuts = -1; //it means "no specific cuts applied, but rejected for global cuts"
211 m_isCutted = true;
213 m_momCut->Fill(track.getMomentumSeed().R());
214 m_PDGIDCut->Fill(track.getRelationsTo<MCParticle>()[0]->getPDG());
215 m_noKickTree->Fill();
216 }
217 return false;
218 }
219
220 if (track.getMomentumSeed().R() > m_pmax) {
221 if (m_outputFlag) {
223 m_isCutted = false;
225 m_momSel->Fill(track.getMomentumSeed().R());
226 m_PDGIDSel->Fill(track.getRelationsTo<MCParticle>()[0]->getPDG());
227 m_noKickTree->Fill();
228 }
229 return good;
230 }
231 for (int i = 0; i < (int)(m_8hitTrack.size() - 2); i++) {
232 double sinTheta = fabs(m_8hitTrack.at(i).m_momentum0.Y()) /
233 sqrt(pow(m_8hitTrack.at(i).m_momentum0.Y(), 2) +
234 pow(m_8hitTrack.at(i).m_momentum0.Z(), 2));
235
236 double momentum =
237 sqrt(pow(m_8hitTrack.at(i).m_momentum0.X(), 2) +
238 pow(m_8hitTrack.at(i).m_momentum0.Y(), 2) +
239 pow(m_8hitTrack.at(i).m_momentum0.Z(), 2));
240
241 for (int j = NoKickCuts::c_Omega; j <= NoKickCuts::c_Tanlambda; j++) { //track parameters loop
242 std::vector<double> selCut = m_trackCuts.cutSelector(sinTheta, momentum, m_8hitTrack.at(i).m_sensorLayer,
243 m_8hitTrack.at(i + 1).m_sensorLayer, (NoKickCuts::EParameters) j);
244 bool goodSeg = segmentSelector(m_8hitTrack.at(i), m_8hitTrack.at(i + 1), selCut, (NoKickCuts::EParameters) j);
245
246 if (!goodSeg) {
247 good = false;
249 }
250 if (i == 0) { //beampipe crossing
251 bool goodSeg0 = segmentSelector(m_8hitTrack.at(i), m_8hitTrack.at(i), selCut, (NoKickCuts::EParameters) j, true);
252 if (!goodSeg0) {
253 good = false;
255 }
256 }
257
258 }
259 }
260 if (m_outputFlag) {
263 if (good) {
264 m_isCutted = false;
265 m_momSel->Fill(track.getMomentumSeed().R());
266 m_PDGIDSel->Fill(track.getRelationsTo<MCParticle>()[0]->getPDG());
267 } else {
268 m_isCutted = true;
269 m_momCut->Fill(track.getMomentumSeed().R());
270 m_PDGIDCut->Fill(track.getRelationsTo<MCParticle>()[0]->getPDG());
271 }
272 m_noKickTree->Fill();
273 }
274 return good;
275}
276
277
279{
280 if (m_outputFlag) {
282 m_momSel->Write();
283 m_momCut->Write();
284
285 m_momEff->Add(m_momSel, 1);
286 m_momEff->Add(m_momCut, 1);
287 m_momEff->Divide(m_momSel, m_momEff, 1, 1);
288 m_momEff->Write();
289
290 m_PDGIDSel->Write();
291 m_PDGIDCut->Write();
292
293 m_PDGIDEff->Add(m_PDGIDSel, 1);
294 m_PDGIDEff->Add(m_PDGIDCut, 1);
295 m_PDGIDEff->Divide(m_PDGIDSel, m_PDGIDEff, 1, 1);
296 m_PDGIDEff->Write();
297
298 m_nCutHit->Write();
299
300 m_noKickTree->Write();
301
302 delete m_noKickOutputTFile;
303 }
304}
A Class to store the Monte Carlo particle information.
Definition MCParticle.h:32
int getPDG() const
Return PDG code of particle.
Definition MCParticle.h:101
EParameters
enum for parameters name
Definition NoKickCuts.h:44
TFile * m_noKickOutputTFile
validation output TFile
Definition NoKickRTSel.h:45
int m_numberOfCuts
number of catastrophic interaction for each track
Definition NoKickRTSel.h:55
NoKickCuts m_trackCuts
auxiliary member to apply the cuts
Definition NoKickRTSel.h:39
double m_pmax
range analyzed with cuts
Definition NoKickRTSel.h:40
std::vector< hitXP > m_8hitTrack
vector of selected hit
Definition NoKickRTSel.h:38
int m_Ncuts
number of times the cut is applied on a particle
Definition NoKickRTSel.h:56
double m_pdgID
pdg Code
Definition NoKickRTSel.h:43
TH1F * m_momEff
histogram for efficiency
Definition NoKickRTSel.h:49
void hitXPBuilder(const RecoTrack &track)
this method build a vector of hitXP from a track.
bool segmentSelector(const hitXP &hit1, const hitXP &hit2, const std::vector< double > &selCut, NoKickCuts::EParameters par, bool is0=false)
This method return true if a couple of hits resects the cuts constraints.
TTree * m_noKickTree
TTree to which the information is written.
Definition NoKickRTSel.h:46
void initNoKickRTSel()
Initialize the class cleaning the member vectors.
Definition NoKickRTSel.h:77
TH1F * m_PDGIDCut
histogram for PDGID of cut track
Definition NoKickRTSel.h:50
TH1F * m_PDGIDSel
histogram for PDGID of selected track
Definition NoKickRTSel.h:51
bool globalCut(const std::vector< hitXP > &track8)
This method make some global cuts on the tracks (layer 3 and 6 required, d0 and z0 inside beam pipe).
double m_pMag
momentum magnitut
Definition NoKickRTSel.h:41
TH1F * m_PDGIDEff
histogram for efficiency for each PDGID
Definition NoKickRTSel.h:52
TH1F * m_momCut
histogram of cut tracks
Definition NoKickRTSel.h:48
std::set< hitXP, hitXP::timeCompare > m_setHitXP
set of hit to order the hit in time
Definition NoKickRTSel.h:37
bool trackSelector(const RecoTrack &track)
This method return true if every segment (see segmentSelector) of the input track respects the cuts c...
void produceHistoNoKick()
This method produce the validation histograms (to be used the endrun combined with the filling in tra...
bool m_isCutted
Indicator if cut is applied.
Definition NoKickRTSel.h:58
bool m_outputFlag
true=produce validation output
Definition NoKickRTSel.h:57
TH1F * m_nCutHit
histogram for number of cut hist per track
Definition NoKickRTSel.h:53
std::vector< hitXP > m_hitXP
vector of hit, to convert the track
Definition NoKickRTSel.h:36
TH1F * m_momSel
histogram of selected tracks
Definition NoKickRTSel.h:47
void hit8TrackBuilder(const RecoTrack &track)
this method build a vector of hitXP from a track selecting the first hit on each layer of VXD (8 hit ...
double m_pt
transverse momentum
Definition NoKickRTSel.h:42
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
Definition PXDCluster.h:30
Class PXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Definition PXDTrueHit.h:31
This is the Reconstruction Event-Data Model Track.
Definition RecoTrack.h:79
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
RelationVector< FROM > getRelationsFrom(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from another store array to this object.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition SVDCluster.h:29
Class SVDTrueHit - Records of tracks that either enter or leave the sensitive volume.
Definition SVDTrueHit.h:33
Accessor to arrays stored in the data store.
Definition StoreArray.h:113
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a reference to the SensorInfo of a given SensorID.
Definition GeoCache.cc:67
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition GeoCache.cc:214
Base class to provide Sensor Information for PXD and SVD.
Class to uniquely identify a any structure of the PXD and SVD.
Definition VxdID.h:32
This class is the derivate of HitXP, and complete it with a constructor that use all other complex ty...
This class collects some information of a TrueHit, using SVDCLuster and MCParticle information too.
Definition hitXP.h:32
double getOmegaEntry() const
evaluate relative parameter using entrypoint position and momentum
Definition hitXP.h:325
double getPhi00() const
evaluate relative parameter using IP position and momentum
Definition hitXP.h:367
double getZ0Entry() const
evaluate relative parameter using entrypoint position and momentum
Definition hitXP.h:373
void setClusterU(int cluster)
get the relative member
Definition hitXP.h:264
double getOmega0() const
evaluate relative parameter using IP position and momentum
Definition hitXP.h:331
int m_sensorLayer
layer of the hit
Definition hitXP.h:58
double getD00() const
evaluate relative parameter using IP position and momentum
Definition hitXP.h:355
void setReconstructed(bool isReconstructed)
get the relative member
Definition hitXP.h:276
void setClusterV(int cluster)
get the relative member
Definition hitXP.h:270
double getPhi0Entry() const
evaluate relative parameter using entrypoint position and momentum
Definition hitXP.h:361
double getZ00() const
evaluate relative parameter using IP position and momentum
Definition hitXP.h:379
double getTanLambda0() const
evaluate relative parameter using IP position and momentum
Definition hitXP.h:343
double getD0Entry() const
evaluate relative parameter using entrypoint position and momentum
Definition hitXP.h:349
double getTanLambdaEntry() const
evaluate relative parameter using entrypoint position and momentum
Definition hitXP.h:337
ROOT::Math::XYZVector m_momentum0
momentum at IP
Definition hitXP.h:47
double sqrt(double a)
sqrt for double
Definition beamHelpers.h:28
Abstract base class for different kinds of events.