CMS 3D CMS Logo

MuonDTSeedFromRecHits.cc
Go to the documentation of this file.
1 
12 
14 
18 
20 
21 #include "gsl/gsl_statistics.h"
22 
23 using namespace std;
24 
25 
26 
29 {
30 }
31 
32 
34  double pt[16] = { 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. };
35  // these weights are supposed to be 1/sigma^2(pt), but they're so small.
36  // Instead of the 0.2-0.5 GeV here, we'll add something extra in quadrature later
37  double spt[8] = { 1/0.048 , 1/0.075 , 1/0.226 , 1/0.132 , 1/0.106 , 1/0.175 , 1/0.125 , 1/0.185 };
38 
39  const std::string metname = "Muon|RecoMuon|MuonDTSeedFromRecHits";
40 
42  computePtWithVtx(pt, spt);
43 
45  computePtWithoutVtx(pt, spt);
46 
47  // some dump...
48  LogTrace(metname) << " Pt MB1 @vtx: " << pt[0] << " w: " << spt[0] << "\n"
49  << " Pt MB2 @vtx: " << pt[1] << " w: " << spt[1]<< endl ;
50 
51  LogTrace(metname) << " Pt MB2-MB1 " << pt[2] << " w: " << spt[2]<< "\n"
52  << " Pt MB3-MB1 " << pt[3] << " w: " << spt[3]<< "\n"
53  << " Pt MB3-MB2 " << pt[4] << " w: " << spt[4]<< "\n"
54  << " Pt MB4-MB1 " << pt[5] << " w: " << spt[5]<< "\n"
55  << " Pt MB4-MB2 " << pt[6] << " w: " << spt[6]<< "\n"
56  << " Pt MB4-MB3 " << pt[7] << " w: " << spt[7]<< endl ;
57 
59  float ptmean=0.;
60  float sptmean=0.;
61  //@@ Use Shih-Chuan's
62  computeBestPt(pt, spt, ptmean, sptmean);
63 
64  // add an extra term to the error in quadrature, 30% of pT per point
65  int npoints = 0;
66  for(int i = 0; i < 8; ++i)
67  if(pt[i] != 0) ++npoints;
68  if(npoints != 0) {
69  sptmean = sqrt(sptmean*sptmean + 0.09*ptmean*ptmean/npoints);
70  }
71 
72  LogTrace(metname) << " Seed Pt: " << ptmean << " +/- " << sptmean << endl;
73  // take the best candidate
75  return createSeed(ptmean, sptmean,last);
76 }
77 
78 
81 
82  int alt_npt = 0;
83  int best_npt = 0;
84  int cur_npt = 0;
85  MuonRecHitPointer best = 0;
86  MuonRecHitPointer alter=0;
87 
88  for (MuonRecHitContainer::const_iterator iter=barrelHits.begin();
89  iter!=barrelHits.end(); iter++ ) {
90 
91  bool hasZed = ((*iter)->projectionMatrix()[1][1]==1);
92 
93  cur_npt = 0;
94  vector<TrackingRecHit*> slrhs=(*iter)->recHits();
95  for (vector<TrackingRecHit*>::const_iterator slrh=slrhs.begin(); slrh!=slrhs.end(); ++slrh ) {
96  cur_npt+=(*slrh)->recHits().size();
97  }
98  float radius1 = (*iter)->det()->position().perp();
99 
100  if (hasZed) {
101  if ( cur_npt > best_npt ) {
102  best = (*iter);
103  best_npt = cur_npt;
104  }
105  else if ( best && cur_npt == best_npt ) {
106  float radius2 = best->det()->position().perp();
107  if (radius1 < radius2) {
108  best = (*iter);
109  best_npt = cur_npt;
110  }
111  }
112  }
113 
114  if ( cur_npt > alt_npt ) {
115  alter = (*iter);
116  alt_npt = cur_npt;
117  }
118  else if ( alter && cur_npt == alt_npt ) {
119  float radius2 = alter->det()->position().perp();
120  if (radius1 < radius2) {
121  alter = (*iter);
122  alt_npt = cur_npt;
123  }
124  }
125  }
126 
127  if ( !best ) best = alter;
128 
129  return best;
130 }
131 
132 
134 
135  int Maxseg = 0;
136  float Msdeta = 100.;
137  float result = (*theRhits.begin())->globalPosition().eta();
138 
139  for (MuonRecHitContainer::const_iterator iter=theRhits.begin(); iter!=theRhits.end(); iter++ ) {
140 
141  float eta1= (*iter)->globalPosition().eta();
142 
143  int Nseg = 0;
144  float sdeta = .0;
145 
146  for (MuonRecHitContainer::const_iterator iter2=theRhits.begin(); iter2!=theRhits.end(); iter2++ ) {
147 
148  if ( iter2 == iter ) continue;
149 
150  float eta2 = (*iter2)->globalPosition().eta();
151 
152  if ( fabs (eta1-eta2) > .2 ) continue;
153 
154  Nseg++;
155  sdeta += fabs (eta1-eta2);
156 
157  if ( Nseg > Maxseg || (Nseg == Maxseg && sdeta < Msdeta) ) {
158  Maxseg = Nseg;
159  Msdeta = sdeta;
160  result = eta1;
161  }
162 
163  }
164  } // +v.
165  return result;
166 }
167 
168 
169 void MuonDTSeedFromRecHits::computePtWithVtx(double* pt, double* spt) const {
170 
171  float eta0 = bestEta();
172 
173  for (MuonRecHitContainer::const_iterator iter=theRhits.begin(); iter!=theRhits.end(); iter++ ) {
174 
175  //+vvp !:
176 
177  float eta1= (*iter)->globalPosition().eta();
178  if ( fabs (eta1-eta0) > .2 ) continue; // !!! +vvp
179 
180  // assign Pt from MB1 & vtx
181  unsigned int stat = DTChamberId((**iter).geographicalId()).station();
182  if(stat > 2) continue;
183 
184  double thispt = thePtExtractor->pT_extract(*iter, *iter)[0];
185  float ptmax = 2000.;
186  if(thispt > ptmax) thispt = ptmax;
187  if(thispt < -ptmax) thispt = -ptmax;
188 
189  if( stat==1 ) {
190  pt[0] = thispt;
191  }
192  // assign Pt from MB2 & vtx
193  if( stat==2 ) {
194  pt[1] = thispt;
195  }
196  }
197 }
198 
199 
200 void MuonDTSeedFromRecHits::computePtWithoutVtx(double* pt, double* spt) const {
201  float eta0 = bestEta();
202 
203  for (MuonRecHitContainer::const_iterator iter=theRhits.begin();
204  iter!=theRhits.end(); iter++ ) {
205  //+vvp !:
206  float eta1= (*iter)->globalPosition().eta();
207  if ( fabs (eta1-eta0) > .2 ) continue; // !!! +vvp
208 
209  for (MuonRecHitContainer::const_iterator iter2=theRhits.begin();
210  iter2!=iter; iter2++ ) {
211  //+vvp !:
212  float eta2= (*iter2)->globalPosition().eta();
213  if ( fabs (eta2-eta0) > .2 ) continue; // !!! +vvp
214 
215  unsigned int stat1 = DTChamberId((*iter)->geographicalId()).station();
216  unsigned int stat2 = DTChamberId((*iter2)->geographicalId()).station();
217 
218  if ( stat1>stat2) {
219  int tmp = stat1;
220  stat1 = stat2;
221  stat2 = tmp;
222  }
223  unsigned int st = stat1*10+stat2;
224  double thispt = thePtExtractor->pT_extract(*iter, *iter2)[0];
225  switch (st) {
226  case 12 : {//MB1-MB2
227  pt[2] = thispt;
228  break;
229  }
230  case 13 : {//MB1-MB3
231  pt[3] = thispt;
232  break;
233  }
234  case 14 : {//MB1-MB4
235  pt[5] = thispt;
236  break;
237  }
238  case 23 : {//MB2-MB3
239  pt[4] = thispt;
240  break;
241  }
242  case 24 : {//MB2-MB4
243  pt[6] = thispt;
244  break;
245  }
246  case 34 : {//MB3-MB4
247  pt[7] = thispt;
248  break;
249  }
250  default: {
251  break;
252  }
253  }
254  }
255  }
256 }
257 
259  double* spt,
260  float& ptmean,
261  float& sptmean) const {
262 
263  const std::string metname = "Muon|RecoMuon|MuonDTSeedFromRecHits";
264 
265  int nTotal=8;
266  int igood=-1;
267  for (int i=0;i<=7;i++) {
268  if(pt[i]==0) {
269  spt[i]=0.;
270  nTotal--;
271  } else {
272  igood=i;
273  }
274  }
275 
276  if (nTotal==1) {
278  ptmean=pt[igood];
279  sptmean=1/sqrt(spt[igood]);
280  } else if (nTotal==0) {
281  // No estimate (e.g. only one rechit!)
282  ptmean=50;
283  sptmean=30;
284  } else {
286  // calculate pt with vertex
287  float ptvtx=0.0;
288  float sptvtx=0.0;
289  computeMean(pt, spt, 2, false, ptvtx, sptvtx);
290  LogTrace(metname) << " GSL: Pt w vtx :" << ptvtx << "+/-" <<
291  sptvtx << endl;
292 
293  // FIXME: temp hack
294  if(ptvtx != 0.) {
295  ptmean = ptvtx;
296  sptmean = sptvtx;
297  return;
298  //
299  }
300  // calculate pt w/o vertex
301  float ptMB=0.0;
302  float sptMB=0.0;
303  computeMean(pt+2, spt+2, 6, false, ptMB, sptMB);
304  LogTrace(metname) << " GSL: Pt w/o vtx :" << ptMB << "+/-" <<
305  sptMB << endl;
306 
307  // decide wheter the muon comes or not from vertex
308  float ptpool=0.0;
309  if((ptvtx+ptMB)!=0.0) ptpool=(ptvtx-ptMB)/(ptvtx+ptMB);
310  bool fromvtx=true;
311  if(fabs(ptpool)>0.2) fromvtx=false;
312  LogTrace(metname) << "From vtx? " <<fromvtx << " ptpool "<< ptpool << endl;
313 
314  // now choose the "right" pt => weighted mean
315  computeMean(pt, spt, 8, true, ptmean, sptmean);
316  LogTrace(metname) << " GSL Pt :" << ptmean << "+/-" << sptmean << endl;
317 
318  }
319 }
320 
321 
322 void MuonDTSeedFromRecHits::computeMean(const double* pt, const double * weights, int sz,
323  bool tossOutlyers, float& ptmean, float & sptmean) const
324 {
325  int n=0;
326  double ptTmp[8];
327  double wtTmp[8];
328  assert(sz<=8);
329 
330  for (int i=0; i<sz; ++i) {
331  ptTmp[i] = 0.;
332  wtTmp[i] = 0;
333  if (pt[i]!=0) {
334  ptTmp[n]=pt[i];
335  wtTmp[n]=weights[i];
336  ++n;
337  }
338  }
339  if(n != 0)
340  {
341  if (n==1) {
342  ptmean=ptTmp[0];
343  sptmean=1/sqrt(wtTmp[0]);
344  } else {
345  ptmean = gsl_stats_wmean(wtTmp, 1, ptTmp, 1, n);
346  sptmean = sqrt( gsl_stats_wvariance_m (wtTmp, 1, ptTmp, 1, n, ptmean) );
347  }
348 
349  if(tossOutlyers)
350  {
351  // Recompute mean with a cut at 3 sigma
352  for ( int nm =0; nm<8; nm++ ){
353  if ( ptTmp[nm]!=0 && fabs(ptTmp[nm]-ptmean)>3*(sptmean) ) {
354  wtTmp[nm]=0.;
355  }
356  }
357  ptmean = gsl_stats_wmean(wtTmp, 1, ptTmp, 1, n);
358  sptmean = sqrt( gsl_stats_wvariance_m (wtTmp, 1, ptTmp, 1, n, ptmean) );
359  }
360  }
361 
362 }
363 
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
ConstMuonRecHitPointer bestBarrelHit(const MuonRecHitContainer &barrelHits) const
void computePtWithVtx(double *pt, double *spt) const
void computeBestPt(double *pt, double *spt, float &ptmean, float &sptmean) const
const std::string metname
MuonTransientTrackingRecHit::MuonRecHitContainer theRhits
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
MuonTransientTrackingRecHit::ConstMuonRecHitPointer ConstMuonRecHitPointer
const MuonSeedPtExtractor * thePtExtractor
T sqrt(T t)
Definition: SSEVec.h:18
static const int npoints
void computeMean(const double *pt, const double *weights, int sz, bool tossOutlyers, float &ptmean, float &sptmean) const
#define LogTrace(id)
void computePtWithoutVtx(double *pt, double *spt) const
virtual TrajectorySeed seed() const
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
TrajectorySeed createSeed(float ptmean, float sptmean, MuonTransientTrackingRecHit::ConstMuonRecHitPointer last) const
virtual std::vector< double > pT_extract(MuonTransientTrackingRecHit::ConstMuonRecHitPointer firstHit, MuonTransientTrackingRecHit::ConstMuonRecHitPointer secondHit) const