BOSS 7.0.1
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcTrackListBase.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcTrackListBase.cxx,v 1.65 2011/09/26 01:06:37 zhangy Exp $
4//
5// Environment:
6// Software developed for the BaBar Detector at the SLAC B-Factory.
7//
8// Author(s):
9// Steve Schaffner
10// Zhang Yao([email protected]) Migrate to BESIII
11//
12//--------------------------------------------------------------------------
13#include <math.h>
14#include <iostream>
15#include <vector>
16#include "MdcGeom/Constants.h"
17#include "MdcGeom/BesAngle.h"
18#include "MdcData/MdcHit.h"
19#include "MdcData/MdcHitOnTrack.h"
20#include "MdcGeom/MdcDetector.h"
21#include "MdcTrkRecon/MdcTrackListBase.h"
22#include "MdcTrkRecon/MdcMap.h"
23#include "MdcTrkRecon/MdcTrack.h"
24#include "TrkBase/TrkErrCode.h"
25#include "TrkBase/TrkRecoTrk.h"
26#include "TrkBase/TrkFit.h"
27#include "TrkBase/TrkFitStatus.h"
28#include "TrkBase/TrkHitList.h"
29#include "TrkBase/TrkExchangePar.h"
30#include "MdcRecoUtil/Pdt.h"
31#include "MdcGeom/BesAngle.h"
32#include "MdcData/MdcRecoHitOnTrack.h"
33#include "MdcRawEvent/MdcDigi.h"
34#include "CLHEP/Matrix/SymMatrix.h"
35#include "CLHEP/Vector/ThreeVector.h"
36#include "TrkFitter/TrkContextEv.h"
37#include "TrkBase/TrkRep.h"
38#include "Identifier/MdcID.h"
39#include "Identifier/Identifier.h"
40#include "AIDA/IHistogram1D.h"
41#include "AIDA/IHistogram2D.h"
42#include "CLHEP/Geometry/Point3D.h"
43#include "CLHEP/Geometry/Vector3D.h"
44#include "TrkBase/TrkDifTraj.h"
45//
46#ifndef ENABLE_BACKWARDS_COMPATIBILITY
47// backwards compatibility will be enabled ONLY in CLHEP 1.9
49#endif
50
51#ifndef ENABLE_BACKWARDS_COMPATIBILITY
52// backwards compatibility will be enabled ONLY in CLHEP 1.9
54#endif
55
56double MdcTrackListBase::m_d0Cut = -999.;
57double MdcTrackListBase::m_z0Cut = -999.;
58double MdcTrackListBase::m_ptCut = -999.;
59
60#include "GaudiKernel/NTuple.h"
61
62//*************************************************************************
64 //*************************************************************************
65 tkParam = tkPar;
66 return;
67}
68
69//------------------------------------------------------------------------
71//------------------------------------------------------------------------
72
73// ***********************************************************************
74void
76 // ***********************************************************************
77 int trackId = 0;
78 for (int itrack = 0; itrack < nTrack(); itrack++) {
79 MdcTrack* track = (*this)[itrack];
80 //tkStat: 0,PatRec 1,MdcxReco 2,Tsf 3,CurlFinder
81 int tkStat = 0;
82 track->storeTrack(trackId, trackList, hitList, tkStat);
83 ++trackId;
84 }
85 HepAListDeleteAll(*this); // Discard the husks
86 removeAll();
87 return;
88}
89
90//*************************************************************************
91void
93 //*************************************************************************
94 std::cout<< "nTrack "<<nTrack() << std::endl;//yzhang debug
95 for (int itrack = 0; itrack < nTrack(); itrack++) {
96 MdcTrack *atrack = (*this)[itrack];
97 if (atrack == NULL) continue;
98 atrack->track().printAll(cout);
99 }
100}
101
102//*************************************************************************
103int
105 //*************************************************************************
106 // Look at all hits used in two or more tracks. Assign hits to the track
107 // that gives the lower residual. If, however, many hits are shared by
108 // a pair of tracks, assign them all to one or the other.
109 // Refit any tracks that have had hits dropped.
110 // The implementation is very clumsy, since the arrays were originally
111 // indexed by id # => there is an unneeded layer of indexing.
112
113 // return # of tracks deleted
114
115 if (8 == tkParam.lPrint){
116 std::cout << "=======Print before arbitrateHits=======" << std::endl;
117 }
118
119 int nDeleted = 0;
120 std::vector<MdcTrack*> trksToKill;
121 trksToKill.reserve(4);
122
123 MdcMap<long,long> idMap;
124
125 //usedInTrackNum records how many shared hits track has with each other track
126 int* usedInTrackNum = new int [nTrack()];
127 // to navigate from track id # to track pointer:
128 MdcTrack** trkXRef = new MdcTrack* [nTrack()];
129 //refitTrack flags track id #s of tracks to be refit
130 int *refitTrack = new int [nTrack()];
131 for (int i = 0; i < nTrack(); i++) {
132 refitTrack[i] = 0;
133 }
134
135 // Fill xref table
136 int itrack;
137 for (itrack = 0; itrack < nTrack(); itrack++) {
138 MdcTrack *atrack = (*this)[itrack];
139 if (atrack == 0) continue; // I don't think it can be, but . . .
140 idMap.put(atrack->track().id(), itrack);
141 trkXRef[itrack] = atrack;
142 }
143 // Loop through the tracks
144 for (itrack = 0; itrack < nTrack(); itrack++) {
145
146 if (8 == tkParam.lPrint) std::cout<<"arbitrate track No."<<itrack<< std::endl;
147 MdcTrack *atrack = (*this)[itrack];
148 if (atrack == 0) continue;
149 TrkRecoTrk& aRecoTrk = atrack->track();
150 int lRefit = 0;
151 int trackOld = -1;
152 const TrkFit* tkFit = aRecoTrk.fitResult();
153 assert (tkFit != 0);
154 TrkHitList* hitList = aRecoTrk.hits();
155 assert (hitList != 0);
156restart:
157 for (int ii = 0; ii < nTrack(); ii++) usedInTrackNum[ii] = 0;
158
159 // Loop through hits on track, counting # used in other tracks
160 int nPrev = 0;
161 int nHitDeleted = 0;
162 int maxGapLength = 0;//yzhang 2011-07-29 # of max continuous no hits layer for a track, Gap defined as missing layer >=2
163 int nGapGE2= 0;//yzhang 2011-07-29 # of no hits gap for a track
164 int nGapGE3= 0;//yzhang 2011-07-29 # of no hits gap for a track
165 int nHitInLayer[43];//yzhang 2010-09-20 for bad tracking testing
166 int nDeleteInLayer[43];//yzhang 2010-09-20
167 for(int i=0;i<43;i++){
168 nHitInLayer[i]=0;
169 nDeleteInLayer[i]=0;
170 }
171 if(8 == tkParam.lPrint) std::cout<< "--arbitrate--"<<std::endl;
172 for (TrkHitList::hot_iterator ihit(hitList->begin()); ihit != hitList->end(); ++ihit){
173 int nUsed = ihit->hit()->nUsedHits();
174 if (8 == tkParam.lPrint){
175 std::cout<<"nUsed="<<nUsed<<":";
176 ihit->hit()->printAll(std::cout);
177 }
178 if (8 == tkParam.lPrint) {
179 double deltaChi = -999;
180 ihit->getFitStuff(deltaChi);
181 std::cout<< "deltaChi="<<deltaChi<<std::endl;
182 }
183 int layer = ihit->layerNumber();
184 nHitInLayer[layer]++;
185
186 if (!ihit->isActive()) {
187 //-----------------------------------
188 //yzhang delete not ACT hit 2010-05-14
189 //-----------------------------------
190 if(tkParam.lRemoveInActive ) {//2010-05-16
191 nDeleteInLayer[layer]++;
192 if (8 == tkParam.lPrint) {
193 std::cout<< "=remove above inactive "<<std::endl;
194 }
195 TrkFundHit* hit = const_cast<TrkFundHit*> (ihit->hit());
196 hitList->removeHit(hit);
197 if(ihit == hitList->end()) break;
198 --ihit;//be careful of the iterator, yzhang
199 }
200 continue; // active hits only yzhang 2009-11-03 delete
201 }
202 if (nUsed > 1) {
203 bool wasUsed = false;
204 std::pair<TrkFundHit::hot_iterator,TrkFundHit::hot_iterator> q =
205 ihit->hit()->getUsedHits();
206 for (TrkFundHit::hot_iterator i = q.first; i != q.second; ++i) {
207 if ( !i->isActive() ) continue; //yzhang 2009-11-03 delete
208 TrkRecoTrk * recoTrk=i->parentTrack();
209 int id = recoTrk->id();
210 if (id == aRecoTrk.id()) continue; //skip same track
211 long index = 0;
212 idMap.get(id, index);
213 assert(index >= 0);
214 usedInTrackNum[index]++;
215 if (8 == tkParam.lPrint){
216 std::cout<<" track "<<itrack<<"&" <<index
217 << " shared hits "<<usedInTrackNum[index]<<":";
218 ihit->printAll(std::cout);
219 }
220 wasUsed = true;
221 }
222 if (wasUsed) nPrev++;
223 }// end nUsed > 1
224 } // end loop over hits
225
226 int testGap = 0;
227 //std::cout<< __FILE__ << " " << itrack<< " "<<std::endl;
228 for (int i=0;i<43;i++){
229 //std::cout<< __FILE__ << " " << i<< " nHitInLayer "<<nHitInLayer[i]<<" nDeleteInLayer "<<nDeleteInLayer[i]<<std::endl;
230 if (8 == tkParam.lPrint) {
231 std::cout<<i<<" nHitInLayer "<<nHitInLayer[i]
232 <<" nDeleteInLayer "<<nDeleteInLayer[i]<<std::endl;
233 }
234 //1.only hit in layer deleted; 2.no hits in layer; 3.got hits in layer;
235 if(nHitInLayer[i]>0 && (nHitInLayer[i]-nDeleteInLayer[i])==0) {
236 //only hit in layer i has been deleted
237 nHitDeleted++;
238 if (8 == tkParam.lPrint) {
239 cout << "rec hits have been deleted in this layer"<<std::endl;
240 }
241 testGap++;
242 //std::cout<< __FILE__ << " " << __LINE__ << " testGap3 "<<testGap<<std::endl;
243 }else if(nHitInLayer[i]==0){
244 //no hits in this layer i
245 testGap++;
246 //std::cout<< __FILE__ << " " << __LINE__ << " testGap3 "<<testGap<<std::endl;
247 }else{
248 //std::cout<< __FILE__ << " " << __LINE__ << " testGap3 "<<testGap<<std::endl;
249 //got hit in layer i
250 if(testGap>=2){
251 nGapGE2++;
252 if(testGap>=3){ nGapGE3++; }
253 if(testGap>maxGapLength) maxGapLength=testGap;
254 //std::cout<< __FILE__ << " " << __LINE__ << " maxGapLength "<<maxGapLength<<std::endl;
255 }
256 testGap=0;
257 }//end for layer 43
258 }
259
260 bool toBeDeleted = false;
261
262 if(tkParam.lPrint>1) std::cout<< "arbitrateHits tkNo:"<<itrack<<" nGapGE2= "<<nGapGE2 << " nGapGE3= "<<nGapGE3 << " maxGapLength= "<<maxGapLength<<std::endl;
263 //yzhang add nHitDeleted cut 2010-09-13
264 // remove track if # not Active
265 if (nHitDeleted >= tkParam.nHitDeleted) {
266 if (tkParam.lPrint>1) {
267 cout << "arbitrateHits: nHitDeleted "<<nHitDeleted<<" >= "<<tkParam.nHitDeleted
268 <<" Killing tkNo " << itrack << endl;
269 }
270 toBeDeleted = true;
271 }
272
273 //yzhang add nGap cut 2011-07-29
274 // remove track with gaps and big gap
275 if (nGapGE2 >= tkParam.nGapGE2) {
276 if (tkParam.lPrint>1) {
277 cout << "arbitrateHits: nGapGE2 "<<nGapGE2<<" >= "<<tkParam.nGapGE2 <<" Killing tkNo " << itrack << endl;
278 }
279 toBeDeleted = true;
280 }
281 if (nGapGE3 >= tkParam.nGapGE3) {
282 if (tkParam.lPrint>1) {
283 cout << "arbitrateHits: nGapGE3 "<<nGapGE3<<" >= "<<tkParam.nGapGE3 <<" Killing tkNo " << itrack << endl;
284 }
285 toBeDeleted = true;
286 }
287 if (maxGapLength >= tkParam.maxGapLength) {
288 if (tkParam.lPrint>1) {
289 cout << "arbitrateHits: maxGapLength "<<maxGapLength<<" >= "<<tkParam.maxGapLength<<" Killing tkNo " << itrack << endl;
290 }
291 toBeDeleted = true;
292 }
293
294 if(toBeDeleted){
295 nDeleted++;
296 delete &(atrack->track()); // Delete the RecoTrk inside atrack
297 atrack->setTrack(0);
298 trksToKill.push_back(atrack);
299 continue;
300 }
301
302 //*******
303 // How many hits are shared with a single track?
304 int nMost = 0;
305 int trackMost = 0;
306 for (int ii = 0; ii < nTrack(); ii++) {
307 if (8 == tkParam.lPrint){
308 std::cout<<"tk:"<<itrack<<"&"<<ii
309 <<" shared "<<usedInTrackNum[ii]<<" hits "<< std::endl;
310 }
311 if (usedInTrackNum[ii] > nMost) {
312 nMost = usedInTrackNum[ii];
313 trackMost = ii; //index of track w/ most hits in common w/ current trk
314 }
315 }
316
317 // A little precaution against infinite loops:
318 if (trackMost == trackOld) {
319 std::cout << "ErrMsg(error) MdcTrackListBase:"
320 << "Something ghastly happened in MdcTrackListBase::arbitrateHits"
321 << std::endl;
322 return 0;
323 }
324 trackOld = trackMost;
325
326
327 //******
328 // Decide whether to handle hits individually or in group
329 double groupDiff = 0.0; // relative quality of grouped hits for the two
330 // tracks; > 0. => current track worse
331 int nFound = 0; // # of grouped hits located so far
332 TrkHitOnTrk **theseHits = 0; // grouped hits as seen in current track
333 TrkHitOnTrk **thoseHits = 0; // grouped hits as seen in the other track
334 int lGroupHits = 0;
335
336 if (nMost >= tkParam.nOverlap) {
337 if (8 == tkParam.lPrint){
338 std::cout<<"track "<<trackMost<<" shared "<<nMost<<" hits > Cut nOverlap "
339 <<tkParam.nOverlap<<", group hits!"<<std::endl;
340 }
341 lGroupHits = 1;
342 theseHits = new TrkHitOnTrk*[nMost];
343 thoseHits = new TrkHitOnTrk*[nMost];
344 }
345
346 //*********
347 // Go back through hits on this track, looking up the overlap of each
348 // if grouping hits, only deal with hits shared with trackMost on this pass
349 // otherwise, deal with all shared hits as encountered
350 if(8 == tkParam.lPrint) std::cout<<"Go back through hits, looking up overlap hits"<< std::endl;
351 if (nMost > 0) {
352 if (8 == tkParam.lPrint) std::cout<<" nHits= "<< hitList->nHit()<< std::endl;
353 for (TrkHitList::hot_iterator ihit(hitList->begin()); ihit != hitList->end(); ++ihit) {
354 int nUsed = ihit->hit()->nUsedHits();
355
356 if (8 == tkParam.lPrint){
357 std::cout<< "--hit go back, nUsed="<<nUsed<<":";
358 ihit->hit()->printAll(std::cout);
359 }
360
361 // only shared hits
362 if (nUsed < 2) { continue; }
363
364 // active hits only
365 if (!ihit->isActive()) {
366 if (8 == tkParam.lPrint){ std::cout<<"act=0 continue"<<std::endl; }
367 continue;
368 }
369
370 //*** look at all overlaps for this hit
371 std::pair<TrkFundHit::hot_iterator,TrkFundHit::hot_iterator> q = ihit->hit()->getUsedHits();
372 while (q.first!=q.second) { // nUsed > 0
373 int dropThisHit = 0;
374 TrkHitOnTrk *otherHot = const_cast<TrkHitOnTrk*>((--q.second).get());
375 TrkRecoTrk *otherTrack = otherHot->parentTrack();
376
377 if (!otherHot->isActive()) continue;
378
379 // Again, skip "overlap" of track with itself
380 if ( &aRecoTrk == otherTrack) continue;
381 int otherId = otherTrack->id();
382 long otherIndex = -1;
383 idMap.get(otherId, otherIndex); assert(otherIndex >= 0);
384
385 // if grouping hits, only look at hits shared with trackMost
386 if (lGroupHits && otherIndex != trackMost) continue;
387
388 if (lGroupHits) {
389 if (8 == tkParam.lPrint) {
390 std::cout<<"group hits "<< std::endl;
391 }
392 // Calculate contribution of group to each chisq/dof
393 // groupDiff += fabs(ihit->resid(0)) -
394 // fabs(otherHot->resid(0));
395 // Hack to handle tracks with 5 active hits:
396 int aDof = tkFit->nActive() - 5;
397 assert (otherTrack->fitResult() != 0);
398 int otherDof = otherTrack->fitResult()->nActive() - 5;
399 if (aDof <= 0) {groupDiff = 999;}
400 else if (otherDof <= 0) {groupDiff = -999;}
401 else {
402 groupDiff += ihit->resid(0) * ihit->resid(0) * ihit->weight() /
403 aDof -
404 otherHot->resid(0) * otherHot->resid(0) * otherHot->weight() /
405 otherDof;
406 }
407 theseHits[nFound] = const_cast<TrkHitOnTrk*>(ihit.get());
408 thoseHits[nFound] = otherHot;
409 nFound++;
410 dropThisHit = 1;
411 } else { // handle hits individually
412
413 if (8 == tkParam.lPrint) {
414 std::cout<<"handle hits individually"<< std::endl;
415 }
416 nFound++;
417 if (fabs(ihit->resid(0)) > fabs(otherHot->resid(0)) ) {
418 // turn off (inactivate) hit on this track
419 lRefit = 1;
420 // ihit->hit()->setUnusedHit(ihit.get());
421 //Should I be setting inactive, or deleting the hit???????
422 const_cast<TrkHitOnTrk*>(ihit.get())->setActivity(0);
423 dropThisHit = 1;
424 if (8 == tkParam.lPrint) {
425 std::cout<<"dorp hit ";
426 const_cast<TrkHitOnTrk*>(ihit.get())->print(std::cout);
427 }
428 break; // found other hit, so quit loop
429 } else {
430 // inactivate hit on other track
431 refitTrack[otherIndex] = 1;
432 // otherHot->hit()->setUnusedHit(otherHot);
433 otherHot->setActivity(0);
434 if (8 == tkParam.lPrint) {
435 std::cout<<"inactive hit on other track";
436 const_cast<TrkHitOnTrk*>(ihit.get())->print(std::cout);
437 }
438 break; // found other hit, so quit loop
439 }
440 } // end grouped/individual treatment
441
442 if (dropThisHit == 1) break; // don't look for other matches since
443 // this hit is now turned off
444 } // end loop over nUsed
445
446 // Quit if we've found all of the shared hits on this track
447 if (lGroupHits && nFound == nMost || nFound == nPrev) {
448 if (8 == tkParam.lPrint) {
449 std::cout<<"we've found all of the shared hits on this track,Quit"<<std::endl;
450 }
451 break;
452 }
453
454 } // end loop over hits
455
456 // Decide which track grouped hits belong with and inactivate accordingly
457 if (lGroupHits) {
458 if (8 == tkParam.lPrint) {
459 cout << "nGroup: " << nMost << " groupDiff: " << groupDiff << endl;
460 cout << "Track: " << aRecoTrk.id() << " nHit: "
461 << hitList->nHit() << " nActive: "
462 << tkFit->nActive() << " chisq/dof: " <<
463 tkFit->chisq()/(tkFit->nActive() - 5) << endl;
464 TrkRecoTrk& othTrack = trkXRef[trackMost]->track();
465 cout << "Track: "<< othTrack.id() << " nHit: " <<
466 othTrack.hits()->nHit() << " nActive: " <<
467 othTrack.fitResult()->nActive() << " chisq/dof: " <<
468 othTrack.fitResult()->chisq() /
469 (othTrack.fitResult()->nActive() - 5) << endl;
470 }
471
472 if (groupDiff > 0.0) {
473 // inactivate hits on this track
474 lRefit = 1;
475 for (int ii = 0; ii < nMost; ii++) {
476 TrkHitOnTrk *alink = theseHits[ii];
477 TrkFundHit* hit = const_cast<TrkFundHit*> (alink->hit());
478 hitList->removeHit(hit);//yzhang 2011-02-12
479 //alink->setActivity(0);
480 }
481 if (8 == tkParam.lPrint) std::cout<<"inactive hits on this track, No."<<aRecoTrk.id()<< std::endl;
482 } else {
483 // inactivate hits on other track
484 refitTrack[trackMost] = 1;
485 for (int ii = 0; ii < nMost; ii++) {
486 TrkHitOnTrk *alink = thoseHits[ii];
487 TrkFundHit* hit = const_cast<TrkFundHit*> (alink->hit());
488 hitList->removeHit(hit);//yzhang 2011-02-12
489 //alink->setActivity(0);
490 }
491 if (8 == tkParam.lPrint) std::cout<<"inactive hits on other track "<< std::endl;
492 }
493 delete [] theseHits;
494 delete [] thoseHits;
495
496 } // end if lGroupHits
497
498 } // end if nMost > 0
499
500 //*********
501 // Refit this track, if any hits have been dropped
502 TrkErrCode fitResult;
503 long index = -1;
504 idMap.get(aRecoTrk.id(), index); assert (index >= 0);
505
506 if (lRefit || refitTrack[index] == 1) {
507 if (8 == tkParam.lPrint) {
508 std::cout<<"after group ,refit track"<<aRecoTrk.id()<< std::endl;
509 }
510 fitResult = hitList->fit();
511 aRecoTrk.status()->addHistory(
512 TrkErrCode(fitResult.success()?TrkErrCode::succeed:TrkErrCode::fail,14,"Arbitrated"), "MdcTrkRecon");
513 if (fitResult.failure() && (8 == tkParam.lPrint )) {
514 fitResult.print(std::cerr);
515 }
516
517
518 double chisqperDOF;
519 bool badFit = true;
520 if (fitResult.success()) {
521 badFit = false;
522 int nDOF = tkFit->nActive() - 5;
523 if (nDOF > 5){
524 chisqperDOF = tkFit->chisq() / nDOF;
525 }else{
526 chisqperDOF = tkFit->chisq();
527 }
528
529 if (chisqperDOF > tkParam.maxChisq) badFit = true;
530 if (tkFit->nActive() < tkParam.minHits) badFit = true;
531 double tem2 = (float) hitList->nHit() - tkFit->nActive();
532 if (tkParam.lUseQualCuts) {
533 if (tem2 >= tkParam.maxNmissTrack) badFit = true;
534 if (tem2 /float(hitList->nHit()) > tkParam.maxNmissNorm){
535 badFit = true;
536 }
537 }
538 if(8== tkParam.lPrint) std::cout<<"fit quality:"<<
539 " chisqperDof "<<chisqperDOF<<"?>"<<tkParam.maxChisq<<
540 " nActive "<<tkFit->nActive()<<"?<"<<tkParam.minHits<<
541 " nHit "<<hitList->nHit()<<" nhit-act "<<tem2<<"?>= nMiss "<<tkParam.maxNmissTrack<<
542 " hit-act/nhit "<<tem2/float(hitList->nHit())<<"?> MissNorm "<<tkParam.maxNmissNorm
543 << std::endl;
544
545
546 }
547 if (8 == tkParam.lPrint) {
548 cout << "Refitting track " << aRecoTrk.id() << " success = "
549 << fitResult.success() << "\n";
550 }
551 // If the track no longer passes cuts, delete it
552 if (fitResult.failure() || badFit ) {
553 nDeleted++;
554 // Don't change the track list while we're iterating through it!
555 // remove(atrack);
556 //int id = aRecoTrk.id();
557 if (8 == tkParam.lPrint) {
558 cout << "fitResult.failure? "<<fitResult.failure()
559 <<" badFit? "<<badFit <<" Killing tkNo " << itrack << endl;
560 }
561 delete &(atrack->track()); // Delete the RecoTrk inside atrack
562 atrack->setTrack(0);
563 trksToKill.push_back(atrack);
564 continue;
565 }
566 } // end if lRefit
567
568 if (lGroupHits) goto restart;
569
570 } // end loop over tracks
571 if (8 == tkParam.lPrint) std::cout<<"end of loop over tracks"<< std::endl;
572
573 // Remove dead track husks
574 for (int itk = 0; itk < (int)trksToKill.size(); itk++) {
575 remove(trksToKill[itk]);
576 if (8 == tkParam.lPrint) std::cout<<"remode dead track No."<<itk<< std::endl;
577 }
578 if (8 == tkParam.lPrint) std::cout<<"---end of arbitrateHits"<< std::endl;
579
580 delete [] usedInTrackNum;
581 delete [] refitTrack;
582 delete [] trkXRef;
583 return nDeleted;
584}
585
586//**************************************************************************
587void
589 //**************************************************************************
590 tkParam = tkPar;
591}
592
593//--------------------------------------------------------------------
594void
596 //--------------------------------------------------------------------
597 if (atrack != 0) {
599 delete atrack;
600 }
601}
602
603//**************************************************************************
604void
605MdcTrackListBase::transferTrack() {
606 //**************************************************************************
607
608}
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition: KKsem.h:33
HepGeom::Point3D< double > HepPoint3D
HepGeom::Vector3D< double > HepVector3D
bool get(const K &theKey, V &theAnswer) const
void put(const K &, const V &)
void newParams(const MdcTrackParams &tkPar)
MdcTrackListBase(const MdcTrackParams &tkPar)
virtual ~MdcTrackListBase()
void store(RecMdcTrackCol *, RecMdcHitCol *)
void remove(MdcTrack *atrack)
void storeTrack(int trackId, RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat)
Definition: MdcTrack.cxx:143
virtual double chisq() const =0
void print(std::ostream &ostr) const
virtual void addHistory(const TrkErrCode &status, const char *modulename)
virtual int nActive() const =0
TrkErrCode fit()
Definition: TrkHitList.cxx:59
bool removeHit(const TrkFundHit *theHit)
Definition: TrkHitList.cxx:69
void setActivity(bool turnOn)
Definition: TrkHitOnTrk.cxx:96
double resid(bool exclude=false) const
double weight() const
TrkRecoTrk * parentTrack() const
const TrkId & id() const
Definition: TrkRecoTrk.cxx:134
const TrkFit * fitResult() const
Definition: TrkRecoTrk.cxx:387
virtual void printAll(std::ostream &) const
const TrkFitStatus * status() const
Definition: TrkRecoTrk.cxx:400