hpstr
The Heavy Photon Search Toolkit for Reconstruction (hpstr) provides an interface to physics data from the HPS experiment saved in the LCIO format and converts it into an ROOT based format.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
TrackEfficHistos.cxx
Go to the documentation of this file.
1#include "TrackEfficHistos.h"
2#include "TLorentzVector.h"
3#include "TVector3.h"
4#include <iostream>
5
6//void TrackEfficHistos::BuildAxes(){}
7// histos2d[m_name+"_vtxY_vs_vtxX"] = plot2D(m_name+"_vtxY_vs_vtxX",
8// "vtxX",axes["vtx_X"][0],axes["vtx_X"][1],axes["vtx_X"][2],
9// "vtxY",axes["vtx_Y"][0],axes["vtx_Y"][1],axes["vtx_Y"][2]);
10// */
11
12
13//}//define 2dhistos
14
15
17 Particle* pos,
18 float weight) {
19 CalCluster eleClu=ele->getCluster();
20 CalCluster posClu=pos->getCluster();
21 Track eleTrk=ele->getTrack();
22 Track posTrk=pos->getTrack();
23 bool hasElectronTrack=false;
24 bool hasPositronTrack=false;
25 if(eleTrk.getTrackerHitCount()>0)
26 hasElectronTrack=true;
27 if(posTrk.getTrackerHitCount()>0)
28 hasPositronTrack=true;
29
30 if(hasElectronTrack)
31 if(eleTrk.getCharge()==1){
32 std::cout<<"Oops...positron pointing to electron-side cluster...lets skip it...return without filling"<<std::endl;
33 return;
34 }
35
36 if(hasPositronTrack)
37 if(posTrk.getCharge()==-1){
38 std::cout<<"Oops...electron pointing to positron-side cluster...lets skip it...return without filling"<<std::endl;
39 return;
40 }
41
42
43 double eleE=eleClu.getEnergy();
44 double eleX=eleClu.getPosition().at(0);
45 double eleY=eleClu.getPosition().at(1);
46 double eleZ=eleClu.getPosition().at(2);
47 double posE=posClu.getEnergy();
48 double posX=posClu.getPosition().at(0);
49 double posY=posClu.getPosition().at(1);
50 double posZ=posClu.getPosition().at(2);
51 double coplan=_ah->GetClusterCoplanarity(&eleClu, &posClu);
52 int eleTrkNHits=eleTrk.getTrackerHitCount();
53 int posTrkNHits=posTrk.getTrackerHitCount();
54 double eleTrkMom=eleTrk.getMomentum()[2];
55 double posTrkMom=posTrk.getMomentum()[2];
56 //roughly the amount of "energy in E"...true for photons, approximation for charged tracks
57 double eleClYEne=sin(atan2(eleY,eleZ))*eleE;
58 double posClYEne=sin(atan2(posY,posZ))*posE;
59 double netClYEne=posClYEne+eleClYEne;
60 Fill1DHisto("clE_ele_allpos_allele_h",eleE,weight);
61 Fill1DHisto("clX_ele_allpos_allele_h",eleX,weight);
62 Fill1DHisto("clY_ele_allpos_allele_h",eleY,weight);
63 Fill1DHisto("clE_pos_allpos_allele_h",posE,weight);
64 Fill1DHisto("clX_pos_allpos_allele_h",posX,weight);
65 Fill1DHisto("clY_pos_allpos_allele_h",posY,weight);
66 Fill1DHisto("clE_sum_allpos_allele_h",eleE+posE,weight);
67 Fill1DHisto("coplan_allpos_allele_h",coplan);
68 Fill2DHisto("clY_vs_clX_ele_allpos_allele_hh",eleX,eleY,weight);
69 Fill2DHisto("clY_vs_clE_ele_allpos_allele_hh",eleE,eleY,weight);
70 Fill2DHisto("clE_vs_clX_ele_allpos_allele_hh",eleX,eleE,weight);
71 Fill2DHisto("clY_vs_clX_pos_allpos_allele_hh",posX,posY,weight);
72 Fill2DHisto("clY_vs_clE_pos_allpos_allele_hh",posE,posY,weight);
73 Fill2DHisto("clE_vs_clX_pos_allpos_allele_hh",posX,posE,weight);
74
75 if(hasElectronTrack && hasPositronTrack){
76 Fill1DHisto("clE_ele_foundpos_foundele_h",eleE,weight);
77 Fill1DHisto("clX_ele_foundpos_foundele_h",eleX,weight);
78 Fill1DHisto("clY_ele_foundpos_foundele_h",eleY,weight);
79 Fill1DHisto("clE_pos_foundpos_foundele_h",posE,weight);
80 Fill1DHisto("clX_pos_foundpos_foundele_h",posX,weight);
81 Fill1DHisto("clY_pos_foundpos_foundele_h",posY,weight);
82 Fill1DHisto("clE_sum_foundpos_foundele_h",eleE+posE,weight);
83 Fill1DHisto("clNet_EY_foundpos_foundele_h",netClYEne,weight);
84 Fill1DHisto("coplan_foundpos_foundele_h",coplan);
85 Fill2DHisto("clY_vs_clX_ele_foundpos_foundele_hh",eleX,eleY,weight);
86 Fill2DHisto("clY_vs_clE_ele_foundpos_foundele_hh",eleE,eleY,weight);
87 Fill2DHisto("clE_vs_clX_ele_foundpos_foundele_hh",eleX,eleE,weight);
88 Fill2DHisto("clY_vs_clX_pos_foundpos_foundele_hh",posX,posY,weight);
89 Fill2DHisto("clY_vs_clE_pos_foundpos_foundele_hh",posE,posY,weight);
90 Fill2DHisto("clE_vs_clX_pos_foundpos_foundele_hh",posX,posE,weight);
91 Fill1DHisto("nHits_ele_foundpos_foundele_h",eleTrkNHits,weight);
92 Fill1DHisto("trkMom_ele_foundpos_foundele_h",eleTrkMom,weight);
93 Fill1DHisto("trkEoverP_ele_foundpos_foundele_h",eleE/eleTrkMom,weight);
94 Fill1DHisto("nHits_pos_foundpos_foundele_h",posTrkNHits,weight);
95 Fill1DHisto("trkMom_pos_foundpos_foundele_h",posTrkMom,weight);
96 Fill1DHisto("trkEoverP_pos_foundpos_foundele_h",posE/posTrkMom,weight);
97
98 }else if(!hasElectronTrack && hasPositronTrack){
99 Fill1DHisto("clE_ele_foundpos_missele_h",eleE,weight);
100 Fill1DHisto("clX_ele_foundpos_missele_h",eleX,weight);
101 Fill1DHisto("clY_ele_foundpos_missele_h",eleY,weight);
102 Fill1DHisto("clE_pos_foundpos_missele_h",posE,weight);
103 Fill1DHisto("clX_pos_foundpos_missele_h",posX,weight);
104 Fill1DHisto("clY_pos_foundpos_missele_h",posY,weight);
105 Fill1DHisto("clE_sum_foundpos_missele_h",eleE+posE,weight);
106 Fill1DHisto("clNet_EY_foundpos_missele_h",netClYEne,weight);
107 Fill1DHisto("coplan_foundpos_missele_h",coplan);
108 Fill2DHisto("clY_vs_clX_ele_foundpos_missele_hh",eleX,eleY,weight);
109 Fill2DHisto("clY_vs_clE_ele_foundpos_missele_hh",eleE,eleY,weight);
110 Fill2DHisto("clE_vs_clX_ele_foundpos_missele_hh",eleX,eleE,weight);
111 Fill2DHisto("clY_vs_clX_pos_foundpos_missele_hh",posX,posY,weight);
112 Fill2DHisto("clY_vs_clE_pos_foundpos_missele_hh",posE,posY,weight);
113 Fill2DHisto("clE_vs_clX_pos_foundpos_missele_hh",posX,posE,weight);
114 Fill1DHisto("nHits_pos_foundpos_missele_h",posTrkNHits,weight);
115 Fill1DHisto("trkMom_pos_foundpos_missele_h",posTrkMom,weight);
116 Fill1DHisto("trkEoverP_pos_foundpos_missele_h",posE/posTrkMom,weight);
117 }else if(hasElectronTrack && !hasPositronTrack){
118 Fill1DHisto("clE_ele_misspos_foundele_h",eleE,weight);
119 Fill1DHisto("clX_ele_misspos_foundele_h",eleX,weight);
120 Fill1DHisto("clY_ele_misspos_foundele_h",eleY,weight);
121 Fill1DHisto("clE_pos_misspos_foundele_h",posE,weight);
122 Fill1DHisto("clX_pos_misspos_foundele_h",posX,weight);
123 Fill1DHisto("clY_pos_misspos_foundele_h",posY,weight);
124 Fill1DHisto("clE_sum_misspos_foundele_h",eleE+posE,weight);
125 Fill1DHisto("clNet_EY_misspos_foundele_h",netClYEne,weight);
126 Fill1DHisto("coplan_misspos_foundele_h",coplan);
127 Fill2DHisto("clY_vs_clX_ele_misspos_foundele_hh",eleX,eleY,weight);
128 Fill2DHisto("clY_vs_clE_ele_misspos_foundele_hh",eleE,eleY,weight);
129 Fill2DHisto("clE_vs_clX_ele_misspos_foundele_hh",eleX,eleE,weight);
130 Fill2DHisto("clY_vs_clX_pos_misspos_foundele_hh",posX,posY,weight);
131 Fill2DHisto("clY_vs_clE_pos_misspos_foundele_hh",posE,posY,weight);
132 Fill2DHisto("clE_vs_clX_pos_misspos_foundele_hh",posX,posE,weight);
133 Fill1DHisto("nHits_ele_misspos_foundele_h",eleTrkNHits,weight);
134 Fill1DHisto("trkMom_ele_misspos_foundele_h",eleTrkMom,weight);
135 Fill1DHisto("trkEoverP_ele_misspos_foundele_h",eleE/eleTrkMom,weight);
136
137 } else{
138 Fill1DHisto("clE_ele_misspos_missele_h",eleE,weight);
139 Fill1DHisto("clX_ele_misspos_missele_h",eleX,weight);
140 Fill1DHisto("clY_ele_misspos_missele_h",eleY,weight);
141 Fill1DHisto("clE_pos_misspos_missele_h",posE,weight);
142 Fill1DHisto("clX_pos_misspos_missele_h",posX,weight);
143 Fill1DHisto("clY_pos_misspos_missele_h",posY,weight);
144 Fill1DHisto("clE_sum_misspos_missele_h",eleE+posE,weight);
145 Fill1DHisto("clNet_EY_misspos_missele_h",netClYEne,weight);
146 Fill1DHisto("coplan_misspos_missele_h",coplan);
147 Fill2DHisto("clY_vs_clX_ele_misspos_missele_hh",eleX,eleY,weight);
148 Fill2DHisto("clY_vs_clE_ele_misspos_missele_hh",eleE,eleY,weight);
149 Fill2DHisto("clE_vs_clX_ele_misspos_missele_hh",eleX,eleE,weight);
150 Fill2DHisto("clY_vs_clX_pos_misspos_missele_hh",posX,posY,weight);
151 Fill2DHisto("clY_vs_clE_pos_misspos_missele_hh",posE,posY,weight);
152 Fill2DHisto("clE_vs_clX_pos_misspos_missele_hh",posX,posE,weight);
153 }
154
155}
156
157
159 float weight) {
160
161
162 // std::cout<<"FillPreSelectionPlots::filling plots"<<std::endl;
163 Fill1DHisto("clTime_preselect_h",clu->getTime()-timeOffset_,weight);
164 // Fill1DHisto("clTime_preselect_h",clu->getTime(),weight);
165 Fill1DHisto("clE_preselect_h",clu->getEnergy(),weight);
166 Fill1DHisto("clX_preselect_h",clu->getPosition().at(0),weight);
167 Fill1DHisto("clY_preselect_h",clu->getPosition().at(1),weight);
168 Fill2DHisto("clY_vs_clX_preselect_hh",clu->getPosition().at(0),clu->getPosition().at(1),weight);
169 Fill2DHisto("clY_vs_clE_preselect_hh",clu->getEnergy(),clu->getPosition().at(1),weight);
170 Fill2DHisto("clE_vs_clX_preselect_hh",clu->getPosition().at(0),clu->getEnergy(),weight);
171
172}
173
175 float weight) {
176 // std::cout<<"FillPairSelectionPlots::filling plots"<<std::endl;
177 Fill1DHisto("clE_ele_allpairs_h",eleClu->getEnergy(),weight);
178 Fill1DHisto("clX_ele_allpairs_h",eleClu->getPosition().at(0),weight);
179 Fill1DHisto("clY_ele_allpairs_h",eleClu->getPosition().at(1),weight);
180 Fill1DHisto("clE_pos_allpairs_h",posClu->getEnergy(),weight);
181 Fill1DHisto("clX_pos_allpairs_h",posClu->getPosition().at(0),weight);
182 Fill1DHisto("clY_pos_allpairs_h",posClu->getPosition().at(1),weight);
183 Fill2DHisto("clY_vs_clX_ele_allpairs_hh",eleClu->getPosition().at(0),eleClu->getPosition().at(1),weight);
184 Fill2DHisto("clY_vs_clE_ele_allpairs_hh",eleClu->getEnergy(),eleClu->getPosition().at(1),weight);
185 Fill2DHisto("clE_vs_clX_ele_allpairs_hh",eleClu->getPosition().at(0),eleClu->getEnergy(),weight);
186 Fill2DHisto("clY_vs_clX_pos_allpairs_hh",posClu->getPosition().at(0),posClu->getPosition().at(1),weight);
187 Fill2DHisto("clY_vs_clE_pos_allpairs_hh",posClu->getEnergy(),posClu->getPosition().at(1),weight);
188 Fill2DHisto("clE_vs_clX_pos_allpairs_hh",posClu->getPosition().at(0),posClu->getEnergy(),weight);
189
190 double clTimeDiff=eleClu->getTime()-posClu->getTime();
191 double eSum=eleClu->getEnergy()+posClu->getEnergy();
192
193 Fill1DHisto("clTime_ele_allpairs_h",eleClu->getTime()-timeOffset_,weight);
194 Fill1DHisto("clTime_pos_allpairs_h",posClu->getTime()-timeOffset_,weight);
195 //Fill1DHisto("clTime_ele_allpairs_h",eleClu->getTime(),weight);
196 //Fill1DHisto("clTime_pos_allpairs_h",posClu->getTime(),weight);
197 Fill1DHisto("clTime_eleMinusPos_allpairs_h",clTimeDiff,weight);
198
199}
200
201
202/*
203 * Do track-cluster matching based on distance between cluster and extrapolated track
204 */
205std::pair<CalCluster*, Track*> TrackEfficHistos::getClusterTrackPair(CalCluster* cluster,std::vector<Track*>& tracks, float weight){
206
207 double clX=(cluster->getPosition()).at(0);
208 double clY=(cluster->getPosition()).at(1);
209 double minDelta=666666;
210 double minDeltaX=666666;
211 double minDeltaY=666666;
212 Track* bestTrack=NULL;
213 double minDeltaCut=20.0;
214 for(auto trk:tracks){
215 if(trk->getTanLambda()*clY<0)//trk and cluster in same half
216 continue;
217 int trkCh=trk->getCharge();
218 if(trkCh*clX>0) //positrons on positron side and vice/versa...sign is flipped in track collection?
219 continue;
220 std::vector<double> posAtECal=trk->getPositionAtEcal();
221 double delY=clY-posAtECal.at(1);
222 double delX=clX-posAtECal.at(0);
223 if(abs(delY)<minDelta){//right now, just take delta Y
224 bestTrack=trk;
225 minDelta=abs(delY);
226 minDeltaX=delX;
227 minDeltaY=delY;
228 }
229 }
230
231 if(minDelta<minDeltaCut){
232 Fill1DHisto("trkClMinDelta_h",minDelta,weight); //should equal deltaY for now
233 Fill1DHisto("trkClDeltaX_h",minDeltaX,weight);
234 Fill1DHisto("trkClDeltaY_h",minDeltaY,weight);
235 Fill2DHisto("trkClDeltaXY_hh",minDeltaX,minDeltaY,weight);
236 Fill2DHisto("trkClDeltaXvsX_hh",clX,minDeltaX,weight);
237 Fill2DHisto("trkClDeltaYvsY_hh",clY,minDeltaY,weight);
238 Fill2DHisto("trkClDeltaYvsX_hh",clX,minDeltaY,weight);
239 Fill2DHisto("trkClDeltaXvsY_hh",clY,minDeltaX,weight);
240 }
241
242
243 return std::pair<CalCluster*,Track*>(cluster,bestTrack);
244
245
246}
double getEnergy() const
Definition CalCluster.h:73
std::vector< double > getPosition() const
Definition CalCluster.h:63
double getTime() const
Definition CalCluster.h:83
void Fill2DHisto(const std::string &histoName, float valuex, float valuey, float weight=1.)
description
void Fill1DHisto(const std::string &histoName, float value, float weight=1.)
description
Track getTrack() const
Definition Particle.h:48
CalCluster getCluster() const
Definition Particle.h:62
void FillEffPlots(std::pair< CalCluster *, Track * > ele, std::pair< CalCluster *, Track * > pos, float weight=1.)
void FillPairSelectionPlots(CalCluster *eleClu, CalCluster *posClu, float weight)
std::pair< CalCluster *, Track * > getClusterTrackPair(CalCluster *cluster, std::vector< Track * > &tracks, float weight=1.0)
void FillPreSelectionPlots(CalCluster *, float weight=1.)
std::shared_ptr< AnaHelpers > _ah
Definition Track.h:32
int getTrackerHitCount() const
Definition Track.h:345
int getCharge() const
Definition Track.h:247
std::vector< double > getMomentum()
Definition Track.h:285