BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcSegFinder.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcSegFinder.cxx,v 1.17 2012/10/18 08:35:38 zhangy Exp $
4//
5// Description:
6//
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Authors:
12// Steve Schaffner
13// Zhang Yao(zhangyao@ihep.ac.cn) Migration for BESIII
14// 2010-04-13
15// Zhang Yao(zhangyao@ihep.ac.cn) Keep best segment for 4-hit pattern
16//------------------------------------------------------------------------
17
18#include "MdcTrkRecon/MdcSegFinder.h"
19#include "MdcData/MdcHit.h"
20#include "MdcData/MdcHitMap.h"
21#include "MdcData/MdcHitUse.h"
22#include "MdcGeom/BesAngle.h"
23#include "MdcGeom/Constants.h"
24#include "MdcGeom/MdcDetector.h"
25#include "MdcGeom/MdcSuperLayer.h"
26#include "MdcTrkRecon/GmsList.h"
27#include "MdcTrkRecon/MdcLine.h"
28#include "MdcTrkRecon/MdcMap.h"
29#include "MdcTrkRecon/MdcSeg.h"
30#include "MdcTrkRecon/MdcSegList.h"
31#include "MdcTrkRecon/MdcSegUsage.h"
32#include "MdcTrkRecon/countBits.h"
33#include "MdcTrkRecon/mdcWrapAng.h"
34#include "MdcTrkRecon/mdcWrapWire.h"
35// yzhang hist cut
36#include "GaudiKernel/NTuple.h"
37#include <map>
38
39extern NTuple::Tuple* g_tupleFindSeg;
40extern NTuple::Item<double> g_findSegChi2;
41extern NTuple::Item<double> g_findSegIntercept;
42extern NTuple::Item<double> g_findSegSlope;
43extern NTuple::Item<double> g_findSegChi2Refit;
44extern NTuple::Item<double> g_findSegChi2Add;
45extern NTuple::Item<int> g_findSegPat;
46extern NTuple::Item<int> g_findSegNhit;
47extern NTuple::Item<int> g_findSegPat34;
48extern NTuple::Item<int> g_findSegSl;
49extern NTuple::Item<double> g_findSegMc;
50extern NTuple::Item<double> g_findSegAmbig;
51extern int haveDigiTk[43][288];
52extern int haveDigiAmbig[43][288];
53// zhangy hist cut
54
55using std::cout;
56using std::endl;
57
58//-------------------------------------------------------------------------
59MdcSegFinder::MdcSegFinder( int useAllAmbig ) : patternList( useAllAmbig ) {
60 //-------------------------------------------------------------------------
61}
62//-------------------------------------------------------------------------
65 const MdcHitMap* map, double bunchTime ) {
66 //-------------------------------------------------------------------------
67 // Forms all possible Segs of hits to act as candidate tracks
68 // Construct group of 8 hits; translate hit wires into bit-mapped word
69 // and look up valid patterns (if any) for this group.
70
71 _addHits = segs.segPar()->addHits;
72 int nSegs = 0;
73 int newSegs;
74 unsigned int groupWord;
75 MdcHit* groupHits[8];
76 int lPrevHit = 0; // flags that 2nd layer was hit in last group
77 // which layer/wire to look at for each hit in group
78 static const int layerWire[8][2] = { { 0, -1 }, { 0, 0 }, { 1, 0 }, { 2, -1 },
79 { 2, 0 }, { 3, -1 }, { 3, 0 }, { 3, 1 } };
80
81 // Loop through the superlayers
82 const MdcSuperLayer* slayer = gm->firstSlay();
83 while ( slayer != 0 )
84 {
85 const MdcLayer* layArray[4];
86 int wireIndex[4];
87
88 // layArray[0] = slayer->firstLayer();
89 // for (int i = 1; i < 4; i++) layArray[i] = gm->nextLayer(layArray[i-1]);
90 int nslay = slayer->nLayers();
91 for ( int i = 0; i < nslay; i++ ) layArray[i] = slayer->layer( i );
92 if ( nslay != 4 ) layArray[3] = 0;
93
94 // std::cout<<"-------------super layer----- "<<slayer->Id() << " nlayer
95 // "<<nslay<<std::endl;
96 // for (int i = 0; i < nslay; i++) std::cerr<<layArray[i]->Id()<<"
97 // "<<layArray[i]->nWires()<<"\n"; slayer = slayer->next();continue;
98
99 // Loop over cells (index refers to cells in 2nd layer of superlayer)
100 for ( int cellIndex = 0; cellIndex < layArray[1]->nWires(); cellIndex++ )
101 {
102 // yzhang change FIXME
103 double phi = layArray[1]->getWire( cellIndex )->phiE();
104 for ( int i = 0; i < 4; i++ )
105 {
106 wireIndex[i] = cellIndex;
107 if ( slayer->slayNum() > 4 ) continue; // nWires over No.4 slayer is uniform
108 if ( ( slayer->slayNum() > 9 ) && ( i == 3 ) ) break; // stop when get last layer
109 if ( i == 1 ) continue;
110 if ( i == 3 ) phi = layArray[2]->getWire( wireIndex[2] )->phiE();
111 BesAngle tmp( phi - layArray[i]->phiEPOffset() );
112 int wlow = (int)floor( layArray[i]->nWires() * tmp.rad() / twopi );
113 int wbig = (int)ceil( layArray[i]->nWires() * tmp.rad() / twopi );
114 if ( tmp == 0 )
115 {
116 wlow = -1;
117 wbig = 1;
118 }
119 if ( i != 3 ) { wireIndex[i] = wbig; }
120 else { wireIndex[i] = wlow; }
121 // zhangy change
122 wireIndex[i] = mdcWrapWire( wireIndex[i], layArray[i]->nWires() );
123 }
124 // Form group of 8 wires
125 groupWord = 0u;
126 unsigned bitWord = 1u;
127 int nGroup = 0;
128 for ( int ii = 0; ii < 8; ii++ )
129 {
130 groupHits[ii] = 0;
131 //-----------------------------
132 if ( layArray[layerWire[ii][0]] == 0 ) continue;
133 //-----------------------------
134 int laynum = layArray[layerWire[ii][0]]->layNum();
135 int wire = wireIndex[layerWire[ii][0]] + layerWire[ii][1];
136 wire = mdcWrapWire( wire, layArray[layerWire[ii][0]]->nWires() ); // handle wrap-around
137 MdcHit* thisHit = map->hitWire( laynum, wire );
138 if ( thisHit != 0 )
139 {
140 if ( !usedHits.get( thisHit )->deadHit() )
141 {
142 groupHits[ii] = thisHit;
143 groupWord |= bitWord;
144 nGroup++;
145 }
146 else
147 {
148 // cout << "Skipping hit " << endl;
149 }
150 }
151 // Quit if no hits in 1st 2 layers or 1 hit in 3 layers
152 if ( ( ii == 2 && nGroup < 1 ) || ( ii == 4 && nGroup < 2 ) ) break;
153 bitWord <<= 1;
154 }
155 if ( nGroup < 3 ) continue;
156
157 // int lastWire = mdcWrapWire(cellIndex - 1, layArray[1]->nWires());//2011-08-10
158 int lastWire = mdcWrapWire( cellIndex - 1, layArray[0]->nWires() );
159 if ( map->hitWire( layArray[1]->layNum(), lastWire ) != 0 ) lPrevHit = 1;
160 // if (layArray[1]->hitWire(lastWire) != 0) lPrevHit = 1;
161 else lPrevHit = 0;
162
163 // Try all allowed 4-hit patterns for this group (if any)
164 int nPatt = patternList.npatt4[groupWord];
165
166 if ( ( layArray[1]->layNum() == 5 ) && ( cellIndex == 46 ) )
167 {
168 for ( int i = 0; i < 4; i++ )
169 {
170 // std::cout<<__FILE__<<" "<<__LINE__<<"====("<<layArray[i]->layNum()<<","<<
171 // wireIndex[i]<<")" << std::endl;
172 }
173 // std::cout<<__FILE__<<" "<<__LINE__<< " groupWord:"<<groupWord<<" nPatt:"<<nPatt<<
174 // std::endl;
175 }
176
177 if ( nPatt > 0 )
178 {
179 newSegs = tryPatterns( groupHits, groupWord, 4, lPrevHit, nPatt,
180 patternList.allowedPatt4[groupWord], slayer, segs, usedHits,
181 map, bunchTime );
182 nSegs += newSegs;
183 }
184
185 // If unsuccessful, try 3-hit patterns ???? may want to try 2nd pass here
186 if ( !segs.segPar()->find3[slayer->index()] ) continue;
187 int nUnused = 0;
188 for ( int i = 0; i < 8; i++ )
189 {
190 if ( groupHits[i] != 0 )
191 {
192 if ( usedHits.get( groupHits[i] )->usedSeg() == 0 ) nUnused++;
193 }
194 }
195 if ( nUnused > 0 )
196 {
197 nPatt = patternList.npatt3[groupWord];
198 if ( nPatt > 0 )
199 {
200
201 newSegs = tryPatterns( groupHits, groupWord, 3, lPrevHit, nPatt,
202 patternList.allowedPatt3[groupWord], slayer, segs, usedHits,
203 map, bunchTime );
204 nSegs += newSegs;
205 }
206 }
207 } // cellIndex loop
208
209 slayer = slayer->next();
210 } // superlayer loop
211
212 if ( nSegs > 0 )
213 {
214 segs.massageSegs();
215 segs.resetSeed( gm );
216 }
217
218 nSegs = segs.count();
219
220 if ( 5 == segs.segPar()->lPrint ) { cout << "Number of Segs found: " << nSegs << "\n"; }
221
222 return nSegs;
223}
224
225//---------------------------------------------------------------------------
226int MdcSegFinder::tryPatterns( MdcHit* groupHits[8], unsigned groupWord, int nInPatt,
227 int lPrevHit, int npatt, int* allowedPat,
228 const MdcSuperLayer* slay, MdcSegList& segs,
230 const MdcHitMap* map, double t0 ) {
231 //---------------------------------------------------------------------------
232 int nSegs = 0;
233 int nbit = 8;
234
235 unsigned* patterns;
236 int** ambigPatt;
237 if ( nInPatt == 3 )
238 {
239 patterns = patternList.patt3;
240 ambigPatt = patternList.ambigPatt3;
241 }
242 else
243 {
244 patterns = patternList.patt4;
245 ambigPatt = patternList.ambigPatt4;
246 }
247
248 MdcSeg* trialSeg = new MdcSeg( t0 ); // start w/ 1 seg active
249
250 // Create temporary array of hit structures for fitting segment
251 MdcLine span( 12 );
252 int spanAmbig[12];
253 MdcHit* spanHits[12];
254 MdcHit* ahit;
255
256 // *** Loop over the allowed pattern for this group
257 for ( int iPatt = 0; iPatt < npatt; iPatt++ )
258 {
259 unsigned thisPat = patterns[allowedPat[iPatt]];
260 unsigned testWord = thisPat & groupWord;
261
262 if ( countbits( testWord ) < nInPatt ) continue;
263 if ( lPrevHit && nInPatt == 3 && ( thisPat == 051 || thisPat == 0111 ) ) continue;
264
265 // *** Load the hits into hit structure (radius only at this point)
266 // radius is rel. to avg. for superlayer; resolution is converted to delphi
267 unsigned bitadd = 1u;
268 int nhit = 0;
269 for ( int ibit = 0; ibit < nbit; ibit++ )
270 {
271 // Is this cell in the pattern?
272 if ( bitadd & thisPat )
273 {
274 const MdcLayer* layer = groupHits[ibit]->layer();
275 if ( layer == 0 ) cout << "huh?" << endl;
276 span.x[nhit] = layer->rMid() - slay->rad0();
277 spanHits[nhit] = groupHits[ibit];
278 nhit++;
279 if ( nhit == nInPatt ) break;
280 }
281 bitadd <<= 1;
282 }
283
284 // *** Loop through all ambiguity combinations; the loop counter also
285 // serves as a bit-mapped pattern of ambiguities
286 // Discard combo if all hits have been used w/ this ambig before
287
288 std::map<int, MdcSeg*> bestTrialSegs; // yzhang 2012-09-18
289
290 int namb = 1 << nInPatt;
291 // std::cout<< __FILE__ << " " << __LINE__ << " namb "<<namb<<" nInPatt
292 // "<<nInPatt<<std::endl;
293 for ( int iamb = 0; iamb < namb; iamb++ )
294 {
295
296 // Skip all but allowed ambiguity patterns
297 if ( ambigPatt[allowedPat[iPatt]][iamb] != 1 ) continue;
298
299 // Convert loop counter into physical ambiguity (0=> -1; 1=>+1)
300 int nUsed = 0;
301 int ihit;
302 for ( ihit = 0; ihit < nInPatt; ihit++ )
303 {
304 spanAmbig[ihit] = ( ( 1u << ihit ) & iamb ) ? 1 : -1;
305 nUsed += usedHits.get( spanHits[ihit] )->usedAmbig( spanAmbig[ihit] );
306 }
307 if ( nUsed >= nInPatt ) continue;
308
309 // ***Calculate phi for each hit, correcting approx. for angle of track
310 /* First calculate a correction factor for the drift distance (since
311 we're treating hits as being at radius of wire). This may slow
312 things down.*/
313 /* corr = 1/cos(theta), where theta = del(d)/del(r), taken over the
314 span. Use 1/cos = sqrt(1+tan**2) for calculating correction. */
315
316 double rIn = slay->firstLayer()->rMid();
317 double rOut = slay->lastLayer()->rMid();
318 double phiIn = mdcWrapAng( spanHits[nInPatt - 1]->phi(), spanHits[0]->phi() );
319 double dphidr =
320 ( ( spanHits[nInPatt - 1]->phi() +
321 spanAmbig[nhit - 1] *
322 spanHits[nInPatt - 1]->driftDist( t0, spanAmbig[nhit - 1] ) / rOut ) -
323 ( phiIn + spanAmbig[0] * spanHits[0]->driftDist( t0, spanAmbig[0] ) / rIn ) ) /
324 ( rOut - rIn ); // yzhang temp FIXME
325
326 double corr = sqrt( 1 + slay->rad0() * slay->rad0() * dphidr * dphidr );
327
328 if ( 5 == segs.segPar()->lPrint )
329 {
330 std::cout << __FILE__ << " " << __LINE__ << " corr" << corr << " phi_n "
331 << spanHits[nInPatt - 1]->phi() << " dd_n "
332 << spanAmbig[nhit - 1] *
333 spanHits[nInPatt - 1]->driftDist( t0, spanAmbig[nhit - 1] )
334 << " phiIn " << phiIn << " dd_in "
335 << spanAmbig[0] * spanHits[0]->driftDist( t0, spanAmbig[0] ) << std::endl;
336 }
337 // yzhang add fix phi accross -x axis
338 bool crossAxis = false;
339 double yOld = 0;
340 // zhangy add
341 double sigmaSum = 0.;
342 double driftSum = 0.;
343 double driftHit[12];
344 // Actual phi calc
345 for ( ihit = 0; ihit < nInPatt; ihit++ )
346 {
347 ahit = spanHits[ihit];
348 double rinv = 1. / ahit->layer()->rMid();
349 double drift = ahit->driftDist( t0, spanAmbig[ihit] );
350 span.y[ihit] =
351 ahit->phi() + spanAmbig[ihit] * drift * ( corr * rinv ); // yzhang temp FIXME
352
353 if ( 5 == segs.segPar()->lPrint )
354 {
355 std::cout << " in segment finding (" << ahit->layernumber() << ","
356 << ahit->wirenumber() << ")"
357 << " |driftDist| " << fabs( drift ) << " ambig " << spanAmbig[ihit]
358 << " corr " << corr << " rinv " << rinv << " sigma "
359 << ahit->sigma( drift, spanAmbig[ihit] ) << std::endl;
360 }
361 // span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]);
362 // yzhang 2010-05-20 , FIXME
363 span.sigma[ihit] = ahit->sigma( fabs( drift ), spanAmbig[ihit] ) * ( corr * rinv );
364
365 // yzhang add temp FIXME
366 sigmaSum += span.sigma[ihit];
367 driftSum += drift;
368 driftHit[ihit] = drift;
369 // zhangy add temp FIXME
370
371 // yzhang add fix phi accross -x axis,set flag
372 if ( ( span.y[ihit] != 0 ) && ( !crossAxis ) )
373 {
374 if ( ( yOld / span.y[ihit] ) < 0 ) crossAxis = true;
375 yOld = span.y[ihit];
376 }
377 // zhangy add
378 }
379
380 // yzhang add temp FIXME
381 // for (ihit = 0; ihit < nInPatt; ihit++) {
382 // span.sigma[ihit] = sigmaSum/nInPatt*
383 //( fabs(driftHit[ihit]-(driftSum/nInPatt))/(driftSum/nInPatt) );
384 // }
385 // zhangy add temp FIXME
386
387 //--yzhang add, fix phi accross -x axis , if cross +twopi
388 if ( crossAxis )
389 {
390 for ( int ihit = 0; ihit < nInPatt; ihit++ )
391 {
392 // Approx,for max phi of a cell is 2*pi/40, max cross 4 cell=0.628<0.7
393 if ( abs( span.y[ihit] ) < 0.7 ) break;
394 if ( span.y[ihit] < 0 ) span.y[ihit] += twopi;
395 }
396 }
397 // zhangy add
398
399 // Fit the segment
400 if ( 5 == segs.segPar()->lPrint )
401 std::cout << " first fit(" << nInPatt << ")" << std::endl;
402 span.fit( nInPatt );
403 BesAngle temp = span.intercept;
404 span.intercept = temp.posRad();
405 double t_segchi2 = span.chisq / ( nInPatt - 2 );
406
407 // yzhang test 2011-06-14
408 if ( 5 == segs.segPar()->lPrint )
409 {
410 for ( int ii = 0; ii < nInPatt; ii++ )
411 {
412 std::cout << __FILE__ << " " << __LINE__ << " " << ii << " span.x " << setw( 10 )
413 << span.x[ii] << " y " << setw( 10 ) << span.y[ii] << " sigma "
414 << setw( 10 ) << span.sigma[ii] << std::endl;
415 }
416 }
417 if ( g_tupleFindSeg != NULL )
418 {
419 g_findSegSlope = span.slope;
420 g_findSegIntercept = span.intercept;
421 g_findSegChi2 = t_segchi2;
422 }
423 // zhangy test
424
425 if ( 5 == segs.segPar()->lPrint )
426 {
427 std::cout << __FILE__ << " " << __LINE__ << " pattern " << thisPat << " nHit "
428 << nInPatt << " chi2/dof " << t_segchi2 << " chisq " << span.chisq
429 << " maxChisq=" << segs.segPar()->maxChisq << std::endl;
430 for ( int jj = 0; jj < nInPatt; jj++ )
431 {
432 std::cout << "resid[" << jj << "] " << span.resid[jj] << " sigma " << span.sigma[jj]
433 << " chisq add "
434 << span.resid[jj] * span.resid[jj] / ( span.sigma[jj] * span.sigma[jj] )
435 << std::endl; // yzhang debug
436 }
437 }
438 if ( span.chisq / ( nInPatt - 2 ) > segs.segPar()->maxChisq )
439 {
440 if ( 5 == segs.segPar()->lPrint )
441 {
442 std::cout << __FILE__ << " " << __LINE__ << "CUT! chi2/(N-2) "
443 << span.chisq / ( nInPatt - 2 ) << " > " << segs.segPar()->maxChisq
444 << std::endl;
445 for ( std::map<int, MdcSeg*>::iterator iter = bestTrialSegs.begin();
446 iter != bestTrialSegs.end(); iter++ )
447 { cout << " bestTrialSeg nHit=" << iter->first << endl; }
448 }
449 continue;
450 }
451
452 if ( span.slope > Constants::pi || span.slope < ( -1. ) * Constants::pi )
453 {
454 if ( 5 == segs.segPar()->lPrint )
455 std::cout << " CUT by span.|slope| " << span.slope << " > pi" << std::endl;
456 continue; // yzhang add 2012-08-07
457 }
458
459 int nInSeg = nInPatt;
460
461 // *** Pick up adjacent hits and refit
462 // Recalculate correction factor (optional)
463 if ( segs.segPar()->segRefit )
464 {
465 dphidr = span.slope;
466 corr = sqrt( 1 + slay->rad0() * slay->rad0() * dphidr * dphidr );
467 crossAxis = false;
468 for ( ihit = 0; ihit < nInSeg; ihit++ )
469 {
470 ahit = spanHits[ihit];
471 double rinv = 1. / ahit->layer()->rMid();
472 double drift = ahit->driftDist( t0, spanAmbig[ihit] );
473 span.y[ihit] =
474 ahit->phi() + spanAmbig[ihit] * drift * ( corr * rinv ); // yzhang temp FIXME
475 // yzhang add
476 // span.y[ihit] = ahit->phi();
477 // zhangy add
478
479 // yzhang 2010-05-20 , FIXME
480 // span.sigma[ihit] = ahit->sigma(fabs(drift), spanAmbig[ihit]);
481 span.sigma[ihit] = ahit->sigma( fabs( drift ), spanAmbig[ihit] ) * ( corr * rinv );
482 // yzhang add fix phi accross -x axis,set flag
483 if ( ( span.y[ihit] != 0 ) && ( !crossAxis ) )
484 {
485 if ( ( yOld / span.y[ihit] ) < 0 ) crossAxis = true;
486 yOld = span.y[ihit];
487 }
488 // zhangy add
489 }
490 // yzhang add, fix phi accross -x axis , if cross +twopi
491 if ( crossAxis )
492 {
493 for ( int ihit = 0; ihit < nInPatt; ihit++ )
494 {
495 // Approx,for max phi of a cell is 2*pi/40, max cross 4 cell=0.628<0.7
496 if ( abs( span.y[ihit] ) < 0.7 ) break;
497 if ( span.y[ihit] < 0 ) span.y[ihit] += twopi;
498 }
499 }
500 if ( 5 == segs.segPar()->lPrint )
501 std::cout << " second fit(" << nInSeg << ")" << std::endl;
502 // zhangy add
503 span.fit( nInSeg );
504 BesAngle temp = span.intercept;
505 span.intercept = temp.posRad();
506
507 if ( span.chisq / ( nInPatt - 2 ) > segs.segPar()->maxChisq )
508 {
509 if ( 5 == segs.segPar()->lPrint )
510 {
511 std::cout << __FILE__ << " " << __LINE__ << "CUT! chi2/(N-2) "
512 << span.chisq / ( nInPatt - 2 ) << " > " << segs.segPar()->maxChisq
513 << std::endl;
514 for ( std::map<int, MdcSeg*>::iterator iter = bestTrialSegs.begin();
515 iter != bestTrialSegs.end(); iter++ )
516 { cout << " bestTrialSeg nHit=" << iter->first << endl; }
517 }
518 continue;
519 }
520 }
521
522 if ( g_tupleFindSeg != NULL ) { g_findSegChi2Refit = span.chisq / ( nInSeg - 2 ); }
523
524 trialSeg->setValues( nInPatt, nInSeg, spanHits, &span, slay, spanAmbig );
525
526 if ( 5 == segs.segPar()->lPrint )
527 {
528 std::cout << " try: " << std::endl;
529 trialSeg->plotSegAll(); // yzhang temp 2012-09-18
530 std::cout << " " << std::endl;
531 }
532 if ( _addHits )
533 {
534 // Look for adjacent hits
535 nInSeg = trialSeg->addHits( &span, spanHits, map, corr );
536 }
537
538 if ( 5 == segs.segPar()->lPrint )
539 {
540 for ( std::map<int, MdcSeg*>::iterator iter = bestTrialSegs.begin();
541 iter != bestTrialSegs.end(); iter++ )
542 {
543 cout << " bestTrialSeg nHit=" << iter->first << " chi2 " << iter->second->chisq()
544 << endl;
545 }
546 std::cout << "trialSeg chisq " << trialSeg->chisq()
547 << std::endl; //<<" best chi2 " <<bestTrialSeg->chisq() << std::endl;
548 cout << "segment phi: " << trialSeg->phi() << " slope: " << trialSeg->slope()
549 << " nhit: " << trialSeg->nHit() << " chi2 " << trialSeg->chisq() << endl;
550 // cout << "layer, wire, ambig, used, drift: " << endl;
551 for ( int i = 0; i < trialSeg->nHit(); i++ )
552 {
553 int ambi = trialSeg->hit( i )->ambig();
554 const MdcHit* theHit = trialSeg->hit( i )->mdcHit();
555 theHit->print( cout );
556 cout << " ambig " << ambi;
557 }
558 cout << endl;
559 }
560 trialSeg->setPattern( iPatt );
561 trialSeg->markHits( usedHits );
562 if ( nInPatt == 4 ) trialSeg->setFull();
563
564 if ( g_tupleFindSeg != NULL )
565 {
566 double t_mcRadio = -1.;
567 double t_nAmbigRight = 0.;
568 int t_tkId = -1;
569 for ( int ii = 0; ii < trialSeg->nHit(); ii++ )
570 {
571 unsigned int l = trialSeg->hit( ii )->mdcHit()->layernumber();
572 unsigned int w = trialSeg->hit( ii )->mdcHit()->wirenumber();
573 if ( haveDigiTk[l][w] < 0 || haveDigiTk[l][w] > 100 ) continue;
574 if ( t_tkId == -1 ) { t_tkId = haveDigiTk[l][w]; }
575 else if ( haveDigiTk[l][w] != t_tkId )
576 {
577 t_mcRadio = -999; // hits in this seg not in same mc track
578 }
579
580 // test ambig right ratio
581 if ( haveDigiAmbig[l][w] == trialSeg->hit( ii )->ambig() ) t_nAmbigRight++;
582 }
583
584 double t_nSame = 0.;
585 for ( int ii = 0; ii < trialSeg->nHit(); ii++ )
586 {
587 unsigned int l = trialSeg->hit( ii )->mdcHit()->layernumber();
588 unsigned int w = trialSeg->hit( ii )->mdcHit()->wirenumber();
589 if ( haveDigiTk[l][w] == t_tkId ) { ++t_nSame; }
590 if ( t_mcRadio > -998. ) t_mcRadio = t_nSame / nInSeg;
591 }
592 g_findSegPat = iPatt;
593 if ( 3 == nInPatt ) g_findSegPat34 = 3;
594 else g_findSegPat34 = 4;
595 g_findSegSl = slay->slayNum();
596 g_findSegMc = t_mcRadio;
597 g_findSegAmbig = t_nAmbigRight / nInSeg;
598 g_findSegChi2Add = span.chisq / ( nInSeg - 2 );
599 g_findSegNhit = nInSeg;
600 g_tupleFindSeg->write();
601 }
602
603 //--keep only one segment for ambig
604 if ( 3 == nInPatt )
605 {
606 segs.append( trialSeg ); // Add to list of Segs
607 nSegs++;
608 }
609 else
610 {
611 // debug
612 // cout<<" before insert nBest="<<bestTrialSegs.size()<<endl;
613 // for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter !=
614 // bestTrialSegs.end(); iter++) {
615 // cout<<"after insert bestTrialSeg nHit="<<iter->first<<endl;
616 // iter->second->plotSeg();
617 // }
618 std::map<int, MdcSeg*>::iterator iter = bestTrialSegs.find( trialSeg->nHit() );
619 if ( iter == bestTrialSegs.end() )
620 {
621 bestTrialSegs.insert(
622 std::map<int, MdcSeg*>::value_type( trialSeg->nHit(), trialSeg ) );
623 if ( 5 == segs.segPar()->lPrint )
624 {
625 std::cout << " ----insert " << trialSeg->nHit() << std::endl;
626 trialSeg->plotSegAll();
627 std::cout << " \n " << std::endl;
628 }
629 }
630 else
631 {
632 if ( trialSeg->chisq() < iter->second->chisq() )
633 {
634 MdcSeg* tempSeg = iter->second;
635 delete tempSeg;
636 iter->second = trialSeg;
637 if ( 5 == segs.segPar()->lPrint )
638 {
639 std::cout << " ----update " << iter->first << std::endl;
640 trialSeg->plotSegAll();
641 std::cout << " \n " << std::endl;
642 }
643 }
644 else
645 {
646 if ( 5 == segs.segPar()->lPrint )
647 {
648 std::cout << "DROP TrialSeg " << std::endl;
649 trialSeg->plotSegAll();
650 std::cout << " \n " << std::endl;
651 }
652 delete trialSeg;
653 }
654 }
655 ////debug
656 // cout<<" after insert nBest="<<bestTrialSegs.size()<<endl;
657 // for(std::map<int,MdcSeg*>::iterator iter = bestTrialSegs.begin(); iter !=
658 // bestTrialSegs.end(); iter++) {
659 // cout<<"after insert bestTrialSeg nHit="<<iter->first<<endl;
660 // iter->second->plotSeg();
661 // }
662 // if((bestTrialSeg->nHit() == trialSeg->nHit()) && (bestTrialSeg->chisq() >
663 // trialSeg->chisq())){
664 // if(5 == segs.segPar()->lPrint) std::cout<< "KEEP trial as best. orignal
665 // bestTrialSeg "
666 // << bestTrialSeg->chisq()<<"/ndof "<<bestTrialSeg->nHit()-2<< ">
667 // trialSeg->chisq() "
668 // <<trialSeg->chisq()<<"/ndof "<<trialSeg->nHit()-2<<std::endl;
669 // delete bestTrialSeg;
670 // bestTrialSeg = trialSeg;
671 // }
672 }
673
674 //--mark best trialSeg
675 // std::cout<< __LINE__<<" best " <<bestTrialSeg->chisq()<< " trial " <<
676 // trialSeg->chisq() <<std::endl;
677
678 trialSeg = new MdcSeg( t0 );
679 } // end ambiguity loop
680
681 //--keep only one segment/Hit for ambig
682 for ( std::map<int, MdcSeg*>::iterator iter = bestTrialSegs.begin();
683 iter != bestTrialSegs.end(); iter++ )
684 {
685 segs.append( iter->second ); // Add to list of Segs
686 if ( 5 == segs.segPar()->lPrint )
687 {
688 std::cout << " append bestTrialSeg of nHit " << iter->first << std::endl;
689 iter->second->plotSeg();
690 std::cout << std::endl;
691 }
692 }
693
694 bestTrialSegs.clear(); // empty bestTrialSegs
695
696 nSegs++;
697
698 } // end pattern loop
699
700 delete trialSeg;
701 return nSegs;
702}
double w
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
NTuple::Item< double > g_findSegMc
NTuple::Tuple * g_tupleFindSeg
NTuple::Item< int > g_findSegPat34
NTuple::Item< double > g_findSegAmbig
NTuple::Item< int > g_findSegPat
int haveDigiTk[43][288]
NTuple::Item< double > g_findSegChi2Refit
int haveDigiAmbig[43][288]
NTuple::Item< double > g_findSegIntercept
NTuple::Item< double > g_findSegChi2
NTuple::Item< double > g_findSegChi2Add
NTuple::Item< double > g_findSegSlope
NTuple::Item< int > g_findSegSl
NTuple::Item< int > g_findSegNhit
double mdcWrapAng(double phi1, double phi2)
const MdcHit * mdcHit() const
Definition MdcHitUse.cxx:62
void print(std::ostream &o) const
double sigma(double, int, double, double, double) const
Definition MdcHit.cxx:183
double driftDist(double, int, double, double, double) const
Definition MdcHit.cxx:157
bool get(const K &theKey, V &theAnswer) const
MdcSegFinder(int useAllAmbig)
int createSegs(const MdcDetector *gm, MdcSegList &segs, const MdcMap< const MdcHit *, MdcSegUsage * > &usedHits, const MdcHitMap *map, double tbunch)
int count() const
void append(MdcSeg *aSeg)
void resetSeed(const MdcDetector *gm)
void setValues(int nInPatt, int nhit, MdcHit *hits[], MdcLine *span, const MdcSuperLayer *slay, int ambig[])
Definition MdcSeg.cxx:104
int nHit() const
Definition MdcSeg.cxx:372
int addHits(MdcLine *span, MdcHit *hits[], const MdcHitMap *, double corr)
void plotSegAll() const
Definition MdcSeg.cxx:157
void markHits(const MdcMap< const MdcHit *, MdcSegUsage * > &usedHits) const
Definition MdcSeg.cxx:146