BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MdcxTrackFinder.cxx
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// File and Version Information:
3// $Id: MdcxTrackFinder.cxx,v 1.51 2022/02/21 04:34:53 maqm Exp $
4//
5// Description:
6// Class MdcxTrackFinder
7//
8// Environment:
9// Software developed for the BaBar Detector at the SLAC B-Factory.
10//
11// Author List:
12// Steve Wagner Original Author
13// Zhang Yao(zhangyao@ihep.ac.cn)
14//
15// Copyright Information:
16// Copyright (C) 1997 BEPCII
17//
18// History:
19// Migration for BESIII MDC
20//
21//------------------------------------------------------------------------
22
23#include "GaudiKernel/IDataManagerSvc.h"
24
25//-----------------------
26// This Class's Header --
27//-----------------------
28#include "MdcxTrackFinder.h"
29
30//-------------
31// C Headers --
32//-------------
33#include <assert.h>
34#include <math.h>
35#include <time.h>
36
37//---------------
38// C++ Headers --
39//---------------
40#include <iostream>
41
42//-------------------------------
43// Collaborating Class Headers --
44//-------------------------------
45#include "EventModel/EventHeader.h"
46#include "GaudiKernel/MsgStream.h"
47#include "MdcGeom/MdcDetector.h"
48#include "MdcRawEvent/MdcDigi.h"
49#include "PatBField/BField.h"
50
51#include "CLHEP/Alist/AIterator.h"
52#include "EvTimeEvent/RecEsTime.h"
53#include "Identifier/Identifier.h"
54#include "Identifier/MdcID.h"
55#include "McTruth/McParticle.h"
56#include "McTruth/MdcMcHit.h"
57#include "MdcCalibFunSvc/IMdcCalibFunSvc.h"
58#include "MdcRecEvent/RecMdcHit.h"
59#include "MdcRecEvent/RecMdcTrack.h"
60#include "MdcRecoUtil/Pdt.h"
61#include "MdcTrkRecon/MdcTrack.h"
62#include "MdcxReco/MdcxAddHits.h"
63#include "MdcxReco/MdcxFindSegs.h"
64#include "MdcxReco/MdcxFindTracks.h"
65#include "MdcxReco/MdcxFittedHel.h"
66#include "MdcxReco/MdcxHel.h"
67#include "MdcxReco/MdcxHit.h"
68#include "MdcxReco/MdcxHits.h"
69#include "MdcxReco/MdcxMergeDups.h"
70#include "MdcxReco/MdcxSeg.h"
71#include "MdcxReco/Mdcxprobab.h"
72#include "RawDataProviderSvc/IRawDataProviderSvc.h"
73#include "RawDataProviderSvc/MdcRawDataProvider.h"
74#include "RawEvent/RawDataUtil.h"
75#include "ReconEvent/ReconEvent.h"
76#include "TrkBase/TrkErrCode.h"
77#include "TrkBase/TrkExchangePar.h"
78#include "TrkBase/TrkFit.h"
79#include "TrkBase/TrkFitStatus.h"
80#include "TrkBase/TrkHitList.h"
81#include "TrkBase/TrkRecoTrk.h"
82#include "TrkFitter/TrkHelixMaker.h"
83#include "TrkFitter/TrkLineMaker.h"
84// debug
85#include "GaudiKernel/INTupleSvc.h"
86#include "GaudiKernel/NTuple.h"
87#include "MdcGeom/Constants.h"
88#include "MdcGeom/MdcTrkReconCut.h"
89#include "MdcxReco/MdcxHistItem.h"
90#include "MdcxReco/MdcxSegPatterns.h"
91#include "TrigEvent/TrigData.h"
92#include "TrkBase/TrkHotList.h"
93
94#include "BesTimerSvc/BesTimer.h"
95#include "BesTimerSvc/IBesTimerSvc.h"
96
98using std::cout;
99using std::endl;
100
101extern double MdcTrkReconCut_helix_fit[43];
102//----------------
103// Constructors --
104//----------------
106MdcxTrackFinder::MdcxTrackFinder( const std::string& name, ISvcLocator* pSvcLocator )
107 : Algorithm( name, pSvcLocator ), m_mdcCalibFunSvc( 0 ) {
108 // input
109 declareProperty( "pdtFile", m_pdtFile = "pdt.table" );
110 // debug control
111 declareProperty( "debug", m_debug = 0 );
112 declareProperty( "hist", m_hist = 0 );
113 declareProperty( "mcHist", m_mcHist = false );
114 // cuts and control
115 declareProperty( "cresol", m_cresol = 0.013 );
116
117 declareProperty( "getDigiFlag", m_getDigiFlag = 0 );
118 declareProperty( "maxMdcDigi", m_maxMdcDigi = 0 );
119 declareProperty( "keepBadTdc", m_keepBadTdc = 0 );
120 declareProperty( "dropHot", m_dropHot = 0 );
121 declareProperty( "keepUnmatch", m_keepUnmatch = 0 );
122 declareProperty( "salvageTrk", m_salvageTrk = false );
123 declareProperty( "dropMultiHotInLayer", m_dropMultiHotInLayer = false );
124 declareProperty( "dropTrkPt", m_dropTrkPt = -999. );
125 declareProperty( "d0Cut", m_d0Cut = 999. );
126 declareProperty( "z0Cut", m_z0Cut = 999. );
127
128 declareProperty( "minMdcDigi", m_minMdcDigi = 0 );
129 declareProperty( "countPropTime", m_countPropTime = true );
130 declareProperty( "addHitCut", m_addHitCut = 5. );
131 declareProperty( "dropHitsSigma", m_dropHitsSigma );
132 declareProperty( "helixFitCut", m_helixFitCut );
133 declareProperty( "minTrkProb", m_minTrkProb = 0.01 );
134 declareProperty( "csmax4", m_csmax4 = 50. );
135 declareProperty( "csmax3", m_csmax3 = 1. );
136 declareProperty( "helixFitSigma", m_helixFitSigma = 5. );
137 declareProperty( "maxRcsInAddSeg", m_maxRcsInAddSeg = 50. );
138 declareProperty( "nSigAddHitTrk", m_nSigAddHitTrk = 5. );
139 declareProperty( "maxProca", m_maxProca = 0.6 );
140 declareProperty( "doSag", m_doSag = false );
141 declareProperty( "lineFit", m_lineFit = false );
142 // declareProperty("cosmicFit", m_cosmicFit= false);
143}
144
145//--------------
146// Destructor --
147//--------------
149 if ( m_bfield ) delete m_bfield;
150}
151
153 // Get Mdc Detector Geometry
154 m_gm = MdcDetector::instance( m_doSag );
155 if ( NULL == m_gm ) return StatusCode::FAILURE;
157
158 return StatusCode::SUCCESS;
159}
160//--------------
161// Operations --
162//--------------
164 MsgStream log( msgSvc(), name() );
165 log << MSG::INFO << "in initialize()" << endmsg;
166
167 t_nTkTot = 0;
168 for ( int i = 0; i < 20; i++ ) t_nTkNum[i] = 0;
169
170 // m_flags.readPar(m_paramFile);
171#ifdef MDCXTIMEDEBUG
172 StatusCode tsc = service( "BesTimerSvc", m_timersvc );
173 if ( tsc.isFailure() )
174 {
175 log << MSG::WARNING << name() << ": Unable to locate BesTimer Service" << endmsg;
176 return StatusCode::FAILURE;
177 }
178 m_timer[0] = m_timersvc->addItem( "Execution" );
179 m_timer[0]->propName( "Execution" );
180 m_timer[1] = m_timersvc->addItem( "findSeg" );
181 m_timer[1]->propName( "findSeg" );
182 m_timer[2] = m_timersvc->addItem( "findTrack" );
183 m_timer[2]->propName( "findTrack" );
184 m_timer[3] = m_timersvc->addItem( "fitting" );
185 m_timer[3]->propName( "fitting" );
186#endif
187
188 if ( m_helixFitCut.size() == 43 )
189 {
190 for ( int i = 0; i < 43; i++ )
191 {
192 // MdcTrkReconCut_helix_fit[i] = m_helixFitCut[i];
193 TrkHelixFitter::nSigmaCut[i] = m_helixFitCut[i];
194 }
195 }
196 MdcxParameters::debug = m_debug;
197 MdcxParameters::minTrkProb = m_minTrkProb;
198 MdcxParameters::csmax4 = m_csmax4;
199 MdcxParameters::csmax3 = m_csmax3;
200 MdcxParameters::helixFitSigma = m_helixFitSigma;
201 MdcxParameters::maxRcsInAddSeg = m_maxRcsInAddSeg;
202 MdcxParameters::nSigAddHitTrk = m_nSigAddHitTrk;
203 MdcxParameters::maxProca = m_maxProca;
204 TrkHelixFitter::m_debug = ( m_debug > 7 );
205 Pdt::readMCppTable( m_pdtFile );
206 MdcxFittedHel::debug = m_debug;
207
208 // Get MdcCalibFunSvc
209 StatusCode sc = service( "MdcCalibFunSvc", m_mdcCalibFunSvc );
210 if ( sc.isFailure() )
211 {
212 log << MSG::FATAL << "Could not load MdcCalibFunSvc!" << endmsg;
213 return StatusCode::FAILURE;
214 }
215 MdcxHit::setMdcCalibFunSvc( m_mdcCalibFunSvc );
216 MdcxHit::setCountPropTime( m_countPropTime );
217
218 // Get RawDataProviderSvc
219 sc = service( "RawDataProviderSvc", m_rawDataProviderSvc );
220 if ( sc.isFailure() )
221 {
222 log << MSG::FATAL << "Could not load RawDataProviderSvc!" << endmsg;
223 return StatusCode::FAILURE;
224 }
225
226 // Initailize magnetic filed
227 sc = service( "MagneticFieldSvc", m_pIMF );
228 if ( sc != StatusCode::SUCCESS )
229 { log << MSG::ERROR << "Unable to open Magnetic field service" << endmsg; }
230 m_bfield = new BField( m_pIMF );
231 log << MSG::INFO << "field z = " << m_bfield->bFieldNominal() << endmsg;
232 m_context = new TrkContextEv( m_bfield );
233
234 if ( m_hist ) { bookNTuple(); }
235 if ( m_dropHitsSigma.size() == 43 )
236 {
237 for ( int ii = 0; ii < 43; ii++ )
238 { MdcxParameters::dropHitsSigma[ii] = m_dropHitsSigma[ii]; }
239 }
240
241 return StatusCode::SUCCESS;
242}
243
245 if ( !m_beginRun )
246 {
247 StatusCode sc = beginRun();
248 if ( sc.isFailure() )
249 {
250 error() << "beginRun failed" << endmsg;
251 return StatusCode::FAILURE;
252 }
253 m_beginRun = true;
254 }
255
256 MsgStream log( msgSvc(), name() );
257 log << MSG::INFO << "in execute()" << endmsg;
258 StatusCode sc;
259
260 b_saveEvent = false;
261 setFilterPassed( b_saveEvent );
262
263#ifdef MDCXTIMEDEBUG
264 m_timer[0]->start();
265 m_timer[1]->start();
266#endif
267
268 nTk = 0;
269 t_nTdsTk = 0;
270 t_nDigi = 0;
271 t_nSeg = 0; // yzhang for fill
272 //------------------------------------
273 // Get event No.
274 //------------------------------------
275 SmartDataPtr<Event::EventHeader> evtHead( eventSvc(), "/Event/EventHeader" );
276 if ( !evtHead )
277 {
278 log << MSG::FATAL << "Could not retrieve event header" << endmsg;
279 return StatusCode::FAILURE;
280 }
281 m_eventNo = evtHead->eventNumber();
282 if ( m_debug > 0 )
283 std::cout << "x evt: " << evtHead->runNumber() << " " << m_eventNo << std::endl;
284 long t_evtNo = m_eventNo;
285 g_eventNo = m_eventNo;
286 // if (t_evtNo % 1000 == 0) std::cout << "x evt: " << t_evtNo << std::endl;
287 IDataManagerSvc* dataManSvc;
288 DataObject* aTrackCol;
289 DataObject* aHitCol;
290 if ( !m_salvageTrk )
291 {
292 SmartIF<IDataManagerSvc> dataManSvc( eventSvc() );
293 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
294 if ( aTrackCol )
295 {
296 dataManSvc->clearSubTree( "/Event/Recon/RecMdcTrackCol" );
297 eventSvc()->unregisterObject( "/Event/Recon/RecMdcTrackCol" );
298 }
299 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aHitCol );
300 if ( aHitCol )
301 {
302 dataManSvc->clearSubTree( "/Event/Recon/RecMdcHitCol" );
303 eventSvc()->unregisterObject( "/Event/Recon/RecMdcHitCol" );
304 }
305 }
306
307 //------------------------------------
308 // Initialize track collection in TDS
309 //------------------------------------
310 DataObject* aReconEvent;
311 eventSvc()->findObject( "/Event/Recon", aReconEvent );
312 if ( aReconEvent == NULL )
313 {
314 aReconEvent = new ReconEvent();
315 sc = eventSvc()->registerObject( "/Event/Recon", aReconEvent );
316 if ( sc != StatusCode::SUCCESS )
317 {
318 log << MSG::FATAL << "Could not register ReconEvent" << endmsg;
319 return StatusCode::FAILURE;
320 }
321 }
322 RecMdcTrackCol* trackList;
323 eventSvc()->findObject( "/Event/Recon/RecMdcTrackCol", aTrackCol );
324 if ( aTrackCol ) { trackList = dynamic_cast<RecMdcTrackCol*>( aTrackCol ); }
325 else
326 {
327 trackList = new RecMdcTrackCol;
328 sc = eventSvc()->registerObject( EventModel::Recon::RecMdcTrackCol, trackList );
329 if ( !sc.isSuccess() )
330 {
331 log << MSG::FATAL << " Could not register RecMdcTrack collection" << endmsg;
332 return StatusCode::FAILURE;
333 }
334 }
335 RecMdcHitCol* hitList;
336 eventSvc()->findObject( "/Event/Recon/RecMdcHitCol", aHitCol );
337 if ( aHitCol ) { hitList = dynamic_cast<RecMdcHitCol*>( aHitCol ); }
338 else
339 {
340 hitList = new RecMdcHitCol;
341 sc = eventSvc()->registerObject( EventModel::Recon::RecMdcHitCol, hitList );
342 if ( !sc.isSuccess() )
343 {
344 log << MSG::FATAL << " Could not register RecMdcHit collection" << endmsg;
345 return StatusCode::FAILURE;
346 }
347 }
348
349 //------------------------------------
350 // Initialize hit collection in TDS
351 //------------------------------------
352 DataObject* pnode = 0;
353 sc = eventSvc()->retrieveObject( "/Event/Hit", pnode );
354 if ( !sc.isSuccess() )
355 {
356 pnode = new DataObject;
357 sc = eventSvc()->registerObject( "/Event/Hit", pnode );
358 if ( !sc.isSuccess() )
359 {
360 log << MSG::FATAL << " Could not register /Event/Hit branch " << endmsg;
361 return StatusCode::FAILURE;
362 }
363 }
364 SmartDataPtr<MdcHitCol> m_hitCol( eventSvc(), "/Event/Hit/MdcHitCol" );
365 if ( !m_hitCol )
366 {
367 m_hitCol = new MdcHitCol;
368 sc = eventSvc()->registerObject( "/Event/Hit/MdcHitCol", m_hitCol );
369 if ( !sc.isSuccess() )
370 {
371 log << MSG::FATAL << " Could not register hit collection" << endmsg;
372 return StatusCode::FAILURE;
373 }
374 }
375
376 //------------------------------------
377 // Get bunch time t0 (ns) and timing
378 //------------------------------------
379 m_bunchT0 = -999.;
380 SmartDataPtr<RecEsTimeCol> aevtimeCol( eventSvc(), "/Event/Recon/RecEsTimeCol" );
381 if ( !aevtimeCol || aevtimeCol->size() == 0 )
382 {
383 log << MSG::WARNING << "evt " << m_eventNo << " Could not find RecEsTimeCol" << endmsg;
384 return StatusCode::SUCCESS;
385 }
386
387 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
388 for ( ; iter_evt != aevtimeCol->end(); iter_evt++ )
389 {
390 m_bunchT0 = ( *iter_evt )->getTest();
391 m_t0Stat = ( *iter_evt )->getStat();
392 if ( m_debug > 1 )
393 std::cout << name() << " " << t_evtNo << " t0 " << m_bunchT0 << " t0Stat " << m_t0Stat
394 << std::endl;
395 if ( ( m_t0Stat == 0 ) || ( m_bunchT0 < 0. ) || ( m_bunchT0 > 9999.0 ) )
396 {
397 log << MSG::WARNING << "Skip evt:" << m_eventNo << " by t0 = " << m_bunchT0 << endmsg;
398 // return StatusCode::SUCCESS;
399 }
400 }
401 if ( m_debug > 1 )
402 std::cout << name() << " evt " << t_evtNo << " t0 " << m_bunchT0 << " t0Stat "
403 << m_t0Stat << std::endl;
404 int trigtiming = -10;
405 SmartDataPtr<TrigData> trigData( eventSvc(), "/Event/Trig/TrigData" );
406 if ( trigData )
407 {
408 log << MSG::INFO << "Trigger conditions 0--43:" << endmsg;
409 for ( int i = 0; i < 48; i++ )
410 {
411 log << MSG::INFO << trigData->getTrigCondName( i ) << " ---- "
412 << trigData->getTrigCondition( i ) << endmsg;
413 }
414 for ( int i = 0; i < 16; i++ )
415 log << MSG::INFO << "Trigger channel " << i << ": " << trigData->getTrigChannel( i )
416 << endmsg;
417 m_timing = trigData->getTimingType();
418 // cout<<"-----------------trigger timing type-----------------------: "<<trigtiming<<endl;
419 log << MSG::INFO << "Tigger Timing type: " << trigtiming << endmsg;
420 }
421
422 //------------------------------------
423 // Initialize MdcxHits
424 //------------------------------------
425 m_mdcxHits.reset();
426 uint32_t getDigiFlag = 0;
427 getDigiFlag += m_maxMdcDigi;
428 if ( m_dropHot || m_salvageTrk ) getDigiFlag |= MdcRawDataProvider::b_dropHot;
429 if ( m_keepBadTdc ) getDigiFlag |= MdcRawDataProvider::b_keepBadTdc;
430 if ( m_keepUnmatch ) getDigiFlag |= MdcRawDataProvider::b_keepUnmatch;
431 mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec( getDigiFlag );
432 t_nDigi = mdcDigiVec.size();
433
434 // fill Mc truth
435 // if(m_hist) fillMcTruth();
436
437 // skip event by hit numbe
438 if ( t_nDigi < m_minMdcDigi )
439 {
440 if ( 0 == t_nDigi ) { log << MSG::WARNING << " No hits in MdcDigiVec" << endmsg; }
441 log << MSG::WARNING << " Skip this event for MdcDigiVec.size() < " << m_minMdcDigi
442 << endmsg;
443 return StatusCode::SUCCESS;
444 }
445 m_mdcxHits.create( mdcDigiVec, m_bunchT0, m_cresol );
446 const HepAList<MdcxHit>& dchitlist = m_mdcxHits.GetMdcxHitList();
447
448 if ( m_debug > 2 ) m_mdcxHits.print( std::cout, 6796 );
449
450 //--------------------------------------------
451 // Make segments (MdcxSeg's) out of MdcxHit's
452 //--------------------------------------------
453 MdcxFindSegs dcsegs( dchitlist, m_debug );
454 const HepAList<MdcxSeg>& seglist = dcsegs.GetMdcxSeglist();
455 if ( m_debug > 1 ) { dumpMdcxSegs( seglist ); }
456 t_nSeg = seglist.length();
457 // if(m_hist){ fillMdcxSegs(seglist);}
458
459#ifdef MDCXTIMEDEBUG
460 m_timer[1]->stop();
461 m_timer[2]->start();
462#endif
463 //--------------------------------------------
464 // Make tracks (MdcxFittedHel's) out of MdcxSeg's
465 //--------------------------------------------
466 MdcxFindTracks dctrks( seglist, m_debug );
468 if ( m_debug > 1 ) dumpTrackList( firsttrkl );
469
470#ifdef MDCXTIMEDEBUG
471 m_timer[2]->stop();
472 m_timer[3]->start();
473#endif
474 // if(m_hist){ fillTrkl(firsttrkl);}
475
476 // if(m_debug>1){
477 // std::cout << "dchitlist after find tracks before MergeDups, nhits=" <<
478 // dchitlist.length() << std::endl; for (int ii = 0; ii < dchitlist.length(); ii++) {
479 // dchitlist[ii]->print(std::cout, ii);
480 // }
481 // std::cout<<std::endl;
482 // }
483 MdcxMergeDups dcmergeem( firsttrkl, m_debug );
485
486 // if (m_debug > 1 ){
487 // cout << "MdcxTrackFinder: after MergeDups, have "
488 // << trkl.length() << " track(s). nhits=" << dchitlist.length() << endl;
489 // for (int ii = 0; ii < dchitlist.length(); ii++) {
490 // dchitlist[ii]->print(std::cout, ii);
491 // }
492 // std::cout<<std::endl;
493 // }
494
495 //---------------------------------------------------------
496 // Put my tracks into official fitter and store to TDS
497 //----------------------------------------------------------
498
499 sc = FitMdcxTrack( trkl, dchitlist, m_hitCol, trackList, hitList );
500 if ( !sc.isSuccess() ) { return StatusCode::SUCCESS; }
501 t_nTdsTk = trackList->size();
502
503 t_nTkTot += trackList->size();
504 if ( t_nTdsTk < 20 ) t_nTkNum[t_nTdsTk]++;
505
506#ifdef MDCXTIMEDEBUG
507 m_timer[0]->stop();
508 m_timer[3]->stop();
509#endif
510
511 if ( m_hist ) fillEvent();
512 if ( m_debug > 0 )
513 {
514 DataObject* pNode;
515 eventSvc()->retrieveObject( "/Event/Recon/RecMdcTrackCol", pNode );
516 RecMdcTrackCol* tmpTrackCol = dynamic_cast<RecMdcTrackCol*>( pNode );
517 eventSvc()->retrieveObject( "/Event/Recon/RecMdcHitCol", pNode );
518 int nTdsTk = 0;
519 if ( tmpTrackCol ) nTdsTk = tmpTrackCol->size();
520
521 // if (t_evtNo % 1000 == 0) {
522 std::cout << "MdcxTrackFinder: evtNo " << m_eventNo << " t0=" << m_bunchT0 << " Found "
523 << trkl.length() << " keep " << t_nTdsTk << " finialy keep " << nTdsTk;
524
525 int ndelete = 0;
526 trkl.length() - trackList->size();
527 if ( ndelete > 0 ) std::cout << " delete " << ndelete;
528 std::cout << " track(s)" << endl;
529 //}
530
531 if ( m_debug > 1 ) dumpTdsTrack( tmpTrackCol );
532 if ( m_debug > 1 ) dumpTrack( tmpTrackCol );
533 // dumpTdsHits(tmpHitCol);
534 }
535 if ( ( trackList->size() != 4 ) ) b_saveEvent = true;
536 setFilterPassed( b_saveEvent );
537
538 return StatusCode::SUCCESS;
539}
540
542 MsgStream log( msgSvc(), name() );
543 log << MSG::INFO << "in finalize()" << endmsg;
544
545 std::cout << " --after " << name() << " keep " << t_nTkTot << " tracks " << std::endl;
546 for ( int i = 0; i < 20; i++ )
547 {
548 if ( t_nTkNum[i] > 0 ) std::cout << " nTk=" << i << " " << t_nTkNum[i] << std::endl;
549 }
550
551 // tot evtNo, trkNum
552 return StatusCode::SUCCESS;
553}
554
555void MdcxTrackFinder::MdcxHitsToHots( MdcxHel& mdcxHelix, const HepAList<MdcxHit>& mdcxHits,
556 TrkHitList* m_trkHitList, MdcHitCol* mdcHitCol ) {
557
558 if ( 0 == mdcxHits.length() ) return;
559
560 int ihits = 0;
561 while ( mdcxHits[ihits] )
562 {
563 int ambig = 0; //=mdcxHelix.Doca_Samb();//yzhang delete 2011-10-13
564 const MdcHit* newhit = mdcxHits[ihits]->getMdcHit();
565 if ( 0 == newhit )
566 {
567 const MdcDigi* theDigi = mdcxHits[ihits]->getDigi();
568 int layer = MdcID::layer( mdcxHits[ihits]->getDigi()->identify() );
569 int wire = MdcID::wire( mdcxHits[ihits]->getDigi()->identify() );
570 m_digiMap[layer][wire] = mdcxHits[ihits]->getDigi();
571 MdcHit* thehit = new MdcHit( theDigi, m_gm );
572 thehit->setCalibSvc( m_mdcCalibFunSvc );
573 thehit->setCountPropTime( m_countPropTime );
574 // thehit->setCosmicFit(m_cosmicFit);
575
576 mdcHitCol->push_back( thehit );
577 newhit = thehit;
578 }
579 MdcRecoHitOnTrack temp( *newhit, ambig, m_bunchT0 ); // m_bunchT0 nano second here
580 MdcHitOnTrack* newhot = &temp;
581 // double fltLen = mdcxHelix.Doca_FLen();
582 // std::cout<<" fltLen-- "<<fltLen<<" "<<std::endl;
583 // newhot->setFltLen(fltLen);
584 // newhot->print(std::cout);
585 // std::cout<< __FILE__ << " ambig " << ambig << " append "<<std::endl;
586
587 // Store MdcxHits to TrkHitList
588 m_trkHitList->appendHot( newhot ); // yzhang TEMP FIXME
589 newhot->setUsability( true ); // yzhang add 2011-10-12 TEMP
590 newhot->setActivity( true ); // yzhang add 2011-10-12 TEMP
591
592 ihits++;
593 }
594}
595
596StatusCode MdcxTrackFinder::FitMdcxTrack( HepAList<MdcxFittedHel>& trkl,
597 const HepAList<MdcxHit>& dchitlist,
598 MdcHitCol* m_hitCol, RecMdcTrackCol* trackList,
599 RecMdcHitCol* hitList ) {
600 StatusCode sc;
601 MsgStream log( msgSvc(), name() );
602
603 //--Add Hit to MdcxFittedHel
604 // if(m_debug>1){
605 // std::cout << "dchitlist before addHits nhits=" << dchitlist.length() << std::endl;
606 // for (int ii = 0; ii < dchitlist.length(); ii++) {
607 // dchitlist[ii]->print(std::cout, ii);
608 // }
609 // std::cout<<std::endl;
610 //}
611 MdcxAddHits dcaddem( trkl, dchitlist, m_addHitCut );
612 // if (m_debug > 1){
613 // cout << "MdcxTrackFinder: after AddHits, have "
614 // << trkl.length() << " track(s). nhits=" << dchitlist.length() << endl;
615 // for (int ii = 0; ii < dchitlist.length(); ii++) {
616 // dchitlist[ii]->print(std::cout, ii);
617 // }
618 // std::cout<<std::endl;
619 // }
620
621 TrkLineMaker linefactory;
622 TrkHelixMaker helixfactory;
623
624 int tkLen = trkl.length(); // FIXME
625 for ( int kk = 0; kk < tkLen; kk++ )
626 {
627 const HepAList<MdcxHit>& xhits = trkl[kk]->XHitList();
628 if ( m_debug > 2 )
629 {
630 std::cout << __FILE__ << " FitMdcxTrack " << kk << std::endl;
631 for ( int i = 0; i < xhits.length(); i++ ) { xhits[i]->print( std::cout ); }
632 std::cout << std::endl;
633 }
634
635 if ( m_debug > 2 ) std::cout << " before add hits nhits=" << xhits.length() << std::endl;
636 HepAList<MdcxHit> xass = dcaddem.GetAssociates( kk );
637 if ( m_debug > 2 ) { std::cout << " after,add " << xass.length() << " hits" << std::endl; }
638
639 MdcxFittedHel mdcxHelix = *trkl[kk];
640 double thechisq = mdcxHelix.Chisq();
641 TrkExchangePar tt( -mdcxHelix.D0(), mdcxHelix.Phi0(), mdcxHelix.Omega(), -mdcxHelix.Z0(),
642 -mdcxHelix.Tanl() );
643 TrkRecoTrk* aTrack;
644 int nparm;
645
646 if ( m_lineFit )
647 {
648 /// m_bunchT0 in "ns" here, but "second" in TrkLineMaker&TrkHelixMaker
649 aTrack = linefactory.makeTrack( tt, thechisq, *m_context, m_bunchT0 * 1.e-9 );
650 nparm = 4;
651 linefactory.setFlipAndDrop( *aTrack, true, true );
652 }
653 else
654 {
655 aTrack = helixfactory.makeTrack( tt, thechisq, *m_context, m_bunchT0 * 1.e-9 );
656 nparm = 5;
657 helixfactory.setFlipAndDrop( *aTrack, true, true );
658 }
659
660 TrkHitList* m_trkHitList = aTrack->hits();
661 if ( 0 == m_trkHitList )
662 {
663 delete aTrack;
664 aTrack = NULL;
665 continue;
666 }
667
668 MdcxHitsToHots( mdcxHelix, xhits, m_trkHitList, m_hitCol );
669 // std::cout<<"xhits---------------------"<<std::endl;//debug
670 // m_trkHitList->hotList().printAll(cout);//debug
671 MdcxHitsToHots( mdcxHelix, xass, m_trkHitList, m_hitCol );
672 // std::cout<<"xass----------------------"<<std::endl;//debug
673 // m_trkHitList->hotList().printAll(cout);//debug
674 // std::cout<<"size "<<m_trkHitList->hotList().nHit()<<std::endl;
675 // int beforDrop = m_trkHitList->hotList().nHit();
676 if ( m_dropMultiHotInLayer ) dropMultiHotInLayer( m_trkHitList ); // yzhang debug FIXME
677 // int afterDrop = m_trkHitList->hotList().nHit();
678 // std::cout<<"drop "<<beforDrop-afterDrop<<" keep:"<<afterDrop<<::endl;
679 if ( m_debug > 1 ) { std::cout << "== put to official fitter " << std::endl; }
680 TrkErrCode err = m_trkHitList->fit();
681
682 if ( m_debug > 1 )
683 {
684 std::cout << "== after official fitter " << std::endl;
685 aTrack->printAll( std::cout );
686 }
687
688 const TrkFit* theFit = aTrack->fitResult();
689 float rcs = 10000.0;
690
691 if ( theFit )
692 {
693 int ndof = theFit->nActive() - nparm;
694 if ( ndof > 0 ) rcs = theFit->chisq() / float( ndof );
695 if ( m_debug > 1 )
696 {
697 if ( 4 == nparm ) cout << " TrkLineMaker";
698 else cout << " TrkHelixMaker";
699 cout << " trkNo. " << kk << " success " << err.success() << " rcs " << rcs << " chi2 "
700 << theFit->chisq() << " nactive " << theFit->nActive() << endl;
701 }
702 }
703
704 if ( ( 1 == err.success() ) && ( rcs < 20.0 ) )
705 {
706 if ( m_debug > 1 ) std::cout << "== fit success " << std::endl; // yzhang debug
707 if ( 4 == nparm ) { linefactory.setFlipAndDrop( *aTrack, false, false ); }
708 else { helixfactory.setFlipAndDrop( *aTrack, false, false ); }
709 //-------------Stick the found tracks into the list in RecMdcTrackCol--------
710 if ( m_debug > 1 ) { cout << "MdcxTrackFinder: accept a track " << endl; }
711 // update history
712 aTrack->status()->addHistory( err, name().c_str() ); // yzhang FIXME
713 store( aTrack, trackList, hitList ); // aTrack have been deleted
714 }
715 else if ( ( 2 == err.success() ) && ( rcs < 150.0 ) )
716 { //////// zoujh
717 if ( m_debug > 1 )
718 std::cout << "== fit success = 2, refit now" << std::endl; // yzhang debug
719 int nrefit = 0;
720 while ( nrefit++ < 5 )
721 {
722 if ( m_debug > 1 ) std::cout << "refit time " << nrefit << std::endl;
723 err = m_trkHitList->fit();
724 if ( err.success() == 1 ) break;
725 }
726 if ( err.success() == 1 )
727 {
728 if ( 4 == nparm ) { linefactory.setFlipAndDrop( *aTrack, false, false ); }
729 else { helixfactory.setFlipAndDrop( *aTrack, false, false ); }
730 //-------------Stick the found tracks into the list in RecMdcTrackCol--------
731 // if (m_debug>1) { cout << "MdcxTrackFinder: accept a track and store to TDS" << endl;
732 // } update history
733 aTrack->status()->addHistory( err, name().c_str() ); // yzhang FIXME
734 store( aTrack, trackList, hitList ); // aTrack have been deleted
735 } //////////////////////////zoujh
736 }
737 else
738 {
739 if ( m_debug > 1 )
740 {
741 std::cout << "== fit faild " << std::endl; // yzhang debug
742 err.print( cout );
743 cout << endl;
744 }
745 delete aTrack;
746 aTrack = NULL;
747 //---------------------------------------
748 // Fit no good; try a better input helix
749 //---------------------------------------
750 if ( m_debug > 1 )
751 std::cout << "== Fit no good; try a better input helix" << std::endl; // yzhang debug
752 mdcxHelix.Grow( *trkl[kk], xass );
753 mdcxHelix.VaryRes();
754 mdcxHelix.SetChiDofBail( 1500 ); // yzhang add 2009-11-03
755 int fail = mdcxHelix.ReFit();
756 if ( m_debug > 1 ) std::cout << __FILE__ << " refit fail:" << fail << std::endl;
757 if ( !mdcxHelix.Fail() )
758 {
759 const HepAList<MdcxHit>& bxhits = mdcxHelix.XHitList();
760 thechisq = mdcxHelix.Chisq();
761 TrkExchangePar tb( mdcxHelix.D0(), mdcxHelix.Phi0(), mdcxHelix.Omega(), mdcxHelix.Z0(),
762 mdcxHelix.Tanl() );
763 TrkRecoTrk* bTrack;
764 if ( 4 == nparm )
765 {
766 bTrack = linefactory.makeTrack( tb, thechisq, *m_context, m_bunchT0 * 1.e-9 );
767 linefactory.setFlipAndDrop( *bTrack, false, false );
768 }
769 else
770 {
771 bTrack = helixfactory.makeTrack( tb, thechisq, *m_context, m_bunchT0 * 1.e-9 );
772 helixfactory.setFlipAndDrop( *bTrack, false, false );
773 }
774 TrkHitList* bhits = bTrack->hits();
775 if ( 0 == bhits )
776 {
777 delete bTrack;
778 bTrack = NULL;
779 continue;
780 }
781
782 MdcxHitsToHots( mdcxHelix, bxhits, bhits, m_hitCol );
783 TrkErrCode berr = bhits->fit();
784 const TrkFit* bFit = bTrack->fitResult();
785 rcs = 10000.0;
786 if ( bFit )
787 {
788 int ndof = bFit->nActive() - nparm;
789 if ( ndof > 0 ) rcs = bFit->chisq() / float( ndof );
790 if ( m_debug > 1 )
791 {
792 if ( 4 == nparm ) cout << " TrkLineMaker";
793 else cout << " TrkHelixMaker";
794 cout << " success trkNo. " << kk << " status " << berr.success() << " rcs " << rcs
795 << " chi2 " << bFit->chisq() << " nactive " << bFit->nActive() << endl;
796 }
797 }
798 if ( ( 1 == berr.success() ) && ( rcs < 50.0 ) )
799 {
800 // update history
801 bTrack->status()->addHistory( berr, name().c_str() ); // yzhang FIXME
802 if ( m_debug > 1 )
803 {
804 cout << "MdcxTrackFinder: accept b track and store to TDS" << endl;
805 bTrack->printAll( cout );
806 }
807 store( bTrack, trackList, hitList ); // bTrack have been deleted
808 }
809 else
810 {
811 if ( m_debug > 1 )
812 {
813 cout << " fit failed " << endl;
814 berr.print( cout );
815 cout << endl;
816 }
817 if ( bTrack )
818 {
819 delete bTrack;
820 bTrack = NULL;
821 }
822 }
823 }
824 else
825 {
826 // cout<< " grow and refit failed "<<endl;
827 }
828 }
829 }
830 if ( m_debug > 1 ) dumpTdsTrack( trackList );
831 return StatusCode::SUCCESS;
832
833} // end of FitMdcxTrack
834
835void MdcxTrackFinder::store( TrkRecoTrk* aTrack, RecMdcTrackCol* trackList,
836 RecMdcHitCol* hitList ) {
837 assert( aTrack );
838 nTk++;
839 int trackId = trackList->size();
840 TrkExchangePar helix = aTrack->fitResult()->helix( 0. );
841 if ( m_dropTrkPt > 0. && ( aTrack->fitResult()->pt() < m_dropTrkPt ) )
842 {
843 if ( m_debug > 1 )
844 std::cout << "MdcxTrackFinder delete track by pt " << aTrack->fitResult()->pt()
845 << "<ptCut " << m_dropTrkPt << std::endl;
846 return;
847 }
848
849 if ( ( ( fabs( helix.d0() ) > m_d0Cut ) || ( fabs( helix.z0() ) > m_z0Cut ) ) )
850 {
851 if ( m_debug > 1 )
852 std::cout << name() << " delete track by d0 " << helix.d0() << ">d0Cut " << m_d0Cut
853 << " or z0 " << helix.z0() << " >z0Cut " << m_z0Cut << std::endl;
854 return;
855 }
856
857 if ( m_hist ) fillTrack( aTrack );
858 MdcTrack mdcTrack( aTrack ); // aTrack have been deleted in ~MdcTrack()
859 // tkStat: 0,PatRec 1,MdcxReco 2,Tsf 3,CurlFinder -1,Combined cosmic
860 int tkStat = 1;
861 int nHitbefore = hitList->size();
862
863 mdcTrack.storeTrack( trackId, trackList, hitList, tkStat );
864 int nHitAfter = hitList->size();
865 if ( nHitAfter - nHitbefore < 10 ) setFilterPassed( true );
866}
867
868void MdcxTrackFinder::dumpTrack( RecMdcTrackCol* trackList ) {
869 RecMdcTrackCol::iterator i_tk = trackList->begin();
870 for ( ; i_tk != trackList->end(); i_tk++ ) { printTrack( *( i_tk ) ); }
871} // dumpTrack
872
873void MdcxTrackFinder::printTrack( RecMdcTrack* tk ) {
874 // yzhang debug
875 std::cout << " MdcTrack Id:" << tk->trackId() << " q:" << tk->charge() << std::endl;
876 std::cout << "dr Fi0 Cpa Dz Tanl Chi2 Ndf nSt FiTerm poca" << std::endl;
877 std::cout << "(" << setw( 5 ) << tk->helix( 0 ) << "," << setw( 5 ) << tk->helix( 1 ) << ","
878 << setw( 5 ) << tk->helix( 2 ) << "," << setw( 5 ) << tk->helix( 3 ) << ","
879 << setw( 5 ) << tk->helix( 4 ) << ")" << setw( 5 ) << tk->chi2() << setw( 4 )
880 << tk->ndof() << setw( 4 ) << tk->getNhits() << setw( 4 ) << tk->nster()
881 << setw( 5 ) << tk->getFiTerm() << tk->poca() << std::endl;
882 std::cout << " ErrMat " << tk->err() << std::endl;
883
884 std::cout << "hitId tkId (l,w) fltLen lr dt ddl tdc " //<<chi2Add
885 << "doca entr z tprop stat " << std::endl;
886
887 HitRefVec hl = tk->getVecHits();
888 HitRefVec::iterator it = hl.begin();
889 for ( ; it != hl.end(); ++it )
890 {
891 RecMdcHit* h = *it;
892 int layer = MdcID::layer( h->getMdcId() );
893 double _vprop = ( layer < 8 ) ? Constants::vpropInner : Constants::vpropOuter;
894 const MdcLayer* _layerPtr = m_gm->Layer( layer );
895 double _zlen = _layerPtr->zLength();
896 double z = h->getZhit();
897 double tprop;
898 if ( 0 == layer % 2 )
899 {
900 tprop = ( 0.5 * _zlen + z ) / _vprop; // odd
901 }
902 else
903 {
904 tprop = ( 0.5 * _zlen - z ) / _vprop; // even
905 }
906 // build the sense wires
907 // const MdcSWire* wire =
908 // m_gm->Wire(MdcID::layer(h->getMdcId()),MdcID::wire(h->getMdcId())); double z =
909 // wire->zForw(); while(z<wire->zRear()){ HepPoint3D pos; Hep3Vector dir;
910 // if(!(wire->getTraj()==NULL)){
911 // wire->getTraj()->getInfo(z,pos,dir);
912 //}
913 // std::cout<<"("<< wire->layer()->layNum()<<","<<wire->cell()<<" "<<wire->Id()<<")";
914 // std::cout<<" z, sag:"<<z
915 //<<", "<<wire->getTraj()->deltaY(z-wire->zForw())<<std::endl;
916 ////<<" pos:"<<pos <<" dir:"<<dir<<std::endl;
917 // z+=1.;
918 // }
919 std::cout << setw( 3 ) << h->getId() << setw( 2 ) << h->getTrkId() << "("
920 << MdcID::layer( h->getMdcId() ) << "," << MdcID::wire( h->getMdcId() ) << ")"
921 << setw( 10 ) << h->getFltLen() << setw( 2 ) << h->getFlagLR() << setw( 10 )
922 << h->getDriftT() << setw( 12 ) << h->getDriftDistLeft()
923 << // setw(8) << h->getErrDriftDistRight() <<
924 setw( 8 ) << h->getTdc() << // setw(10) << h->getChisqAdd() <<
925 setw( 10 ) << h->getDoca() << setw( 10 ) << h->getEntra() << setw( 10 ) << h->getZhit()
926 << setw( 10 ) << tprop << setw( 2 ) << h->getStat() << std::endl;
927 }
928} // print track
929
930void MdcxTrackFinder::bookNTuple() {
931 MsgStream log( msgSvc(), name() );
932 StatusCode sc;
933 if ( !m_hist ) return;
934
935 g_poison = histoSvc()->book( "poison", "poison", 43, 0, 42, 288, 0, 288 );
936 g_csmax4 = histoSvc()->book( "csmax4", "csmax4", 100, 0, 100 );
937 g_csmax3 = histoSvc()->book( "csmax3", "csmax3", 50000, 0, 500000 );
938 g_omegag = histoSvc()->book( "omegag", "omegag", 1000, 0., 1. );
939 g_dPhiAU = histoSvc()->book( "dPhiAU", "dPhiAU", 1000, 0., 3.5 );
940 g_dPhiAU_0 = histoSvc()->book( "dPhiAU_0", "dPhiAU_0", 1000, 0., 3.5 );
941 g_dPhiAU_1 = histoSvc()->book( "dPhiAU_1", "dPhiAU_1", 1000, 0., 3.5 );
942 g_dPhiAU_5 = histoSvc()->book( "dPhiAU_5", "dPhiAU_5", 1000, 0., 3.5 );
943 g_dPhiAU_7 = histoSvc()->book( "dPhiAU_7", "dPhiAU_7", 1000, 0., 3.5 );
944 g_dPhiAV = histoSvc()->book( "dPhiAV", "dPhiAV", 1000, 0., 3.5 );
945 g_addSegPhi = histoSvc()->book( "addSegPhi", "addSegPhi", 1000, 0., 3.5 );
946 g_dPhiAV_0 = histoSvc()->book( "dPhiAV_0", "dPhiAV_0", 1000, 0., 3.5 );
947 g_dPhiAV_1 = histoSvc()->book( "dPhiAV_1", "dPhiAV_1", 1000, 0., 3.5 );
948 g_dPhiAV_6 = histoSvc()->book( "dPhiAV_6", "dPhiAV_6", 1000, 0., 3.5 );
949 g_dPhiAV_8 = histoSvc()->book( "dPhiAV_8", "dPhiAV_8", 1000, 0., 3.5 );
950 g_trkllmk = histoSvc()->book( "trkllmk", "trkllmk", 43, 0., 42 );
951 g_trklgood = histoSvc()->book( "trklgood", "trklgood", 43, 0., 42 );
952 g_trklcircle = histoSvc()->book( "trklcircle", "trklcircle", 43, 0., 42 );
953 g_trklhelix = histoSvc()->book( "trklhelix", "trklhelix", 43, 0., 42 );
954 g_trkldrop1 = histoSvc()->book( "trkldrop1", "trkldrop1", 43, 0., 42 );
955 g_trkldrop2 = histoSvc()->book( "trkldrop2", "trkldrop2", 43, 0., 42 );
956 g_trklappend1 = histoSvc()->book( "trklappend1", "trklappend1", 43, 0., 42 );
957 g_trklappend2 = histoSvc()->book( "trklappend2", "trklappend2", 43, 0., 42 );
958 g_trklappend3 = histoSvc()->book( "trklappend3", "trklappend3", 43, 0., 42 );
959 // g_fitOmega= histoSvc()->book( "fitOmega", "fitOmega",200,0.,100.);
960 g_trklfirstProb = histoSvc()->book( "trklfirstProb", "trklfirstProb", 200, 0., 2. );
961 g_trkltemp = histoSvc()->book( "trkltemp", "trkltemp", 200, -3.5, 3.5 );
962
963 g_trklproca = histoSvc()->book( "trklproca", "trklproca", 100, 0., 5. );
964 g_trkle = histoSvc()->book( "trkle", "trkle", 200, 0., 0.025 );
965 g_trkld = histoSvc()->book( "trkld", "trkld", 200, -1.2, 1.2 );
966 g_trklel = histoSvc()->book( "trklel", "trklel", 200, 0., 0.025, 43, 0, 43 );
967 g_trkldl = histoSvc()->book( "trkldl", "trkldl", 200, -1.2, 1.2, 43, 0, 43 );
968 g_trkldoca = histoSvc()->book( "trkldoca", "trkldoca", 200, -1.2, 1.2 );
969 g_trkllayer = histoSvc()->book( "trkllayer", "trkllayer", 43, 0, 43 );
971 histoSvc()->book( "dropHitsSigma", "dropHitsSigma", 43, 0, 43, 100, 0, 11 );
972 g_addHitCut = histoSvc()->book( "addHitCut", "addHitCut", 100, 0, 10 );
973 g_addHitCut2d = histoSvc()->book( "addHitCut2d", "addHitCut2d", 43, 0, 43, 100, 0, 10 );
974 // g_addSegPhiDiff = histoSvc()->book( "addSegPhiDiff", "addSegPhiDiff",100,-6.28,6.28);
975
976 NTuplePtr nt1( ntupleSvc(), "MdcxReco/rec" );
977 if ( nt1 ) { m_xtuple1 = nt1; }
978 else
979 {
980 m_xtuple1 = ntupleSvc()->book( "MdcxReco/rec", CLID_ColumnWiseTuple,
981 "MdcxReco reconsturction results" );
982 if ( m_xtuple1 )
983 {
984 sc = m_xtuple1->addItem( "t0", m_xt0 );
985 sc = m_xtuple1->addItem( "timing", m_xtiming );
986 sc = m_xtuple1->addItem( "t0Stat", m_xt0Stat );
987 sc = m_xtuple1->addItem( "t0Truth", m_xt0Truth );
988
989 sc = m_xtuple1->addItem( "nSlay", m_xnSlay );
990 sc = m_xtuple1->addItem( "p", m_xp );
991 sc = m_xtuple1->addItem( "pt", m_xpt );
992 sc = m_xtuple1->addItem( "pz", m_xpz );
993 sc = m_xtuple1->addItem( "d0", m_xd0 );
994 sc = m_xtuple1->addItem( "phi0", m_xphi0 );
995 sc = m_xtuple1->addItem( "cpa", m_xcpa );
996 sc = m_xtuple1->addItem( "z0", m_xz0 );
997 sc = m_xtuple1->addItem( "tanl", m_xtanl );
998 sc = m_xtuple1->addItem( "q", m_xq );
999 sc = m_xtuple1->addItem( "pocax", m_xpocax );
1000 sc = m_xtuple1->addItem( "pocay", m_xpocay );
1001 sc = m_xtuple1->addItem( "pocaz", m_xpocaz );
1002
1003 sc = m_xtuple1->addItem( "evtNo", m_xevtNo );
1004 sc = m_xtuple1->addItem( "nSt", m_xnSt );
1005 sc = m_xtuple1->addItem( "nAct", m_xnAct );
1006 sc = m_xtuple1->addItem( "nDof", m_xnDof );
1007 sc = m_xtuple1->addItem( "chi2", m_xchi2 );
1008 sc = m_xtuple1->addItem( "tkId", m_xtkId );
1009 sc = m_xtuple1->addItem( "nHit", m_xnHit, 0, 7000 ); // # of hit/rec track
1010 sc = m_xtuple1->addIndexedItem( "resid", m_xnHit, m_xresid );
1011 sc = m_xtuple1->addIndexedItem( "sigma", m_xnHit, m_xsigma );
1012 sc = m_xtuple1->addIndexedItem( "driftD", m_xnHit, m_xdriftD );
1013 sc = m_xtuple1->addIndexedItem( "driftT", m_xnHit, m_xdriftT );
1014 sc = m_xtuple1->addIndexedItem( "doca", m_xnHit, m_xdoca );
1015 sc = m_xtuple1->addIndexedItem( "entra", m_xnHit, m_xentra );
1016 sc = m_xtuple1->addIndexedItem( "ambig", m_xnHit, m_xambig );
1017 sc = m_xtuple1->addIndexedItem( "fltLen", m_xnHit, m_xfltLen );
1018 sc = m_xtuple1->addIndexedItem( "tof", m_xnHit, m_xtof );
1019 sc = m_xtuple1->addIndexedItem( "act", m_xnHit, m_xact );
1020 sc = m_xtuple1->addIndexedItem( "tdc", m_xnHit, m_xtdc );
1021 sc = m_xtuple1->addIndexedItem( "adc", m_xnHit, m_xadc );
1022 sc = m_xtuple1->addIndexedItem( "layer", m_xnHit, m_xlayer );
1023 sc = m_xtuple1->addIndexedItem( "wire", m_xnHit, m_xwire );
1024 sc = m_xtuple1->addIndexedItem( "x", m_xnHit, m_xx );
1025 sc = m_xtuple1->addIndexedItem( "y", m_xnHit, m_xy );
1026 sc = m_xtuple1->addIndexedItem( "z", m_xnHit, m_xz );
1027 }
1028 else
1029 { // did not manage to book the N tuple....
1030 log << MSG::ERROR << " Cannot book N-tuple: MdcxReco/rec" << endmsg;
1031 // return;
1032 }
1033 } // end book of nt1
1034 NTuplePtr nt4( ntupleSvc(), "MdcxReco/evt" );
1035 if ( nt4 ) { m_xtupleEvt = nt4; }
1036 else
1037 {
1038 m_xtupleEvt =
1039 ntupleSvc()->book( "MdcxReco/evt", CLID_ColumnWiseTuple, "MdcxReco event data" );
1040 if ( m_xtupleEvt )
1041 {
1042 sc = m_xtupleEvt->addItem( "evtNo", m_xt4EvtNo );
1043 sc = m_xtupleEvt->addItem( "nRecTk", m_xt4nRecTk );
1044 sc = m_xtupleEvt->addItem( "nTdsTk", m_xt4nTdsTk );
1045 sc = m_xtupleEvt->addItem( "t0", m_xt4t0 );
1046 sc = m_xtupleEvt->addItem( "t0Stat", m_xt4t0Stat );
1047 sc = m_xtupleEvt->addItem( "t0Truth", m_xt4t0Truth );
1048 sc = m_xtupleEvt->addItem( "time", m_xt4time );
1049 sc = m_xtupleEvt->addItem( "timeSeg", m_xt4timeSeg );
1050 sc = m_xtupleEvt->addItem( "timeTrack", m_xt4timeTrack );
1051 sc = m_xtupleEvt->addItem( "timeFit", m_xt4timeFit );
1052 sc = m_xtupleEvt->addItem( "nSeg", m_xt4nSeg );
1053 sc = m_xtupleEvt->addItem( "nDigi", m_xt4nDigi, 0, 7000 ); // # of hit/mc track
1054 sc = m_xtupleEvt->addIndexedItem( "layer", m_xt4nDigi, m_xt4Layer );
1055 sc = m_xtupleEvt->addIndexedItem( "rt", m_xt4nDigi, m_xt4Time );
1056 sc = m_xtupleEvt->addIndexedItem( "rc", m_xt4nDigi, m_xt4Charge );
1057 // sc = m_xtupleEvt->addIndexedItem ("rawHit", m_xt4nDigi, m_xt4rawHit);
1058 // sc = m_xtupleEvt->addIndexedItem ("recHit", m_xt4nDigi, m_xt4recHit);
1059 }
1060 else
1061 { // did not manage to book the N tuple....
1062 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/evt" << endmsg;
1063 // return;
1064 }
1065 } // end of book nt4
1066
1067 // book tuple of segment
1068 NTuplePtr ntSeg( ntupleSvc(), "MdcxReco/seg" );
1069 if ( ntSeg ) { m_xtupleSeg = ntSeg; }
1070 else
1071 {
1072 m_xtupleSeg = ntupleSvc()->book( "MdcxReco/seg", CLID_ColumnWiseTuple,
1073 "MdcxTrackFinder segment data" );
1074 if ( m_xtupleSeg )
1075 {
1076 sc = m_xtupleSeg->addItem( "sl", m_xtsSl );
1077 sc = m_xtupleSeg->addItem( "d0", m_xtsD0 );
1078 sc = m_xtupleSeg->addItem( "omega", m_xtsOmega );
1079 sc = m_xtupleSeg->addItem( "phi0", m_xtsPhi0 );
1080 sc = m_xtupleSeg->addItem( "d0sl", m_xtsD0_sl_approx );
1081 sc = m_xtupleSeg->addItem( "phi0sl", m_xtsPhi0_sl_approx );
1082 sc = m_xtupleSeg->addItem( "xbbrrf", m_xtsXline_bbrrf );
1083 sc = m_xtupleSeg->addItem( "ybbrrf", m_xtsYline_bbrrf );
1084 sc = m_xtupleSeg->addItem( "xslope", m_xtsXline_slope );
1085 sc = m_xtupleSeg->addItem( "yslope", m_xtsYline_slope );
1086 sc = m_xtupleSeg->addItem( "pat", m_xtsPat );
1087 sc = m_xtupleSeg->addItem( "chisq", m_xtsChisq );
1088 sc = m_xtupleSeg->addItem( "nDigi", m_xtsNDigi, 0, 20 );
1089 sc = m_xtupleSeg->addIndexedItem( "layer", m_xtsNDigi, m_xtsLayer );
1090 sc = m_xtupleSeg->addIndexedItem( "wire", m_xtsNDigi, m_xtsWire );
1091 sc = m_xtupleSeg->addIndexedItem( "inSeg", m_xtsNDigi, m_xtsInSeg );
1092 }
1093 else
1094 {
1095 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/evt" << endmsg;
1096 // return;
1097 }
1098 }
1099 NTuplePtr nt5( ntupleSvc(), "MdcxReco/trkl" );
1100 if ( nt5 ) { m_xtupleTrkl = nt5; }
1101 else
1102 {
1103 m_xtupleTrkl =
1104 ntupleSvc()->book( "MdcxReco/trkl", CLID_RowWiseTuple, "MdcxReco track info" );
1105 if ( m_xtupleTrkl )
1106 {
1107 sc = m_xtupleTrkl->addItem( "layer", m_xt5Layer );
1108 sc = m_xtupleTrkl->addItem( "wire", m_xt5Wire );
1109 }
1110 else
1111 {
1112 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/trkl" << endmsg;
1113 // return;
1114 }
1115 }
1116
1117 NTuplePtr ntCsmcSew( ntupleSvc(), "MdcxReco/csmc" );
1118 if ( ntCsmcSew ) { m_xtupleCsmcSew = ntCsmcSew; }
1119 else
1120 {
1121 m_xtupleCsmcSew = ntupleSvc()->book( "MdcxReco/csmc", CLID_ColumnWiseTuple,
1122 "MdcxReco reconsturction results" );
1123 if ( m_xtupleCsmcSew )
1124 {
1125 sc = m_xtupleCsmcSew->addItem( "dD0", m_csmcD0 );
1126 sc = m_xtupleCsmcSew->addItem( "dPhi0", m_csmcPhi0 );
1127 sc = m_xtupleCsmcSew->addItem( "dZ0", m_csmcZ0 );
1128 sc = m_xtupleCsmcSew->addItem( "dOmega", m_csmcOmega );
1129 sc = m_xtupleCsmcSew->addItem( "dPt", m_csmcPt );
1130 sc = m_xtupleCsmcSew->addItem( "dTanl", m_csmcTanl );
1131 }
1132 else
1133 {
1134 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/csmc" << endmsg;
1135 // return;
1136 }
1137 }
1138 NTuplePtr ntSegAdd1( ntupleSvc(), "MdcxReco/addSeg1" );
1139 if ( ntSegAdd1 ) { m_xtupleAddSeg1 = ntSegAdd1; }
1140 else
1141 {
1143 ntupleSvc()->book( "MdcxReco/addSeg1", CLID_ColumnWiseTuple, "MdcxReco event data" );
1144 if ( m_xtupleAddSeg1 )
1145 {
1146 sc = m_xtupleAddSeg1->addItem( "same", m_addSegSame );
1147 sc = m_xtupleAddSeg1->addItem( "seedSl", m_addSegSeedSl );
1148 sc = m_xtupleAddSeg1->addItem( "seedPhi", m_addSegSeedPhi );
1149 sc = m_xtupleAddSeg1->addItem( "seedPhiLay", m_addSegSeedPhiLay );
1150 sc = m_xtupleAddSeg1->addItem( "seedLen", m_addSegSeedLen );
1151 sc = m_xtupleAddSeg1->addItem( "seedD0", m_addSegSeedD0 );
1152 sc = m_xtupleAddSeg1->addItem( "seedPhi0", m_addSegSeedPhi0 );
1153 sc = m_xtupleAddSeg1->addItem( "addSl", m_addSegAddSl );
1154 sc = m_xtupleAddSeg1->addItem( "addPhi", m_addSegAddPhi );
1155 sc = m_xtupleAddSeg1->addItem( "addPhiLay", m_addSegAddPhiLay );
1156 sc = m_xtupleAddSeg1->addItem( "addLen", m_addSegAddLen );
1157 sc = m_xtupleAddSeg1->addItem( "addD0", m_addSegAddD0 );
1158 sc = m_xtupleAddSeg1->addItem( "addPhi0", m_addSegAddPhi0 );
1159 }
1160 else
1161 {
1162 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/addSeg1" << endmsg;
1163 // return;
1164 }
1165 }
1166
1167 NTuplePtr ntSegComb( ntupleSvc(), "MdcxReco/segComb" );
1168 if ( ntSegComb ) { m_xtupleSegComb = ntSegComb; }
1169 else
1170 {
1172 ntupleSvc()->book( "MdcxReco/segComb", CLID_ColumnWiseTuple, "MdcxReco event data" );
1173 if ( m_xtupleSegComb )
1174 {
1175 sc = m_xtupleSegComb->addItem( "evtNo", m_segCombEvtNo );
1176 sc = m_xtupleSegComb->addItem( "omega", m_segCombOmega );
1177 sc = m_xtupleSegComb->addItem( "sameAU", m_segCombSameAU );
1178 sc = m_xtupleSegComb->addItem( "sameUV", m_segCombSameUV );
1179 sc = m_xtupleSegComb->addItem( "dlenAU", m_segCombDLenAU );
1180 sc = m_xtupleSegComb->addItem( "dlenUV", m_segCombDLenUV );
1181 sc = m_xtupleSegComb->addItem( "slA", m_segCombSlA );
1182 sc = m_xtupleSegComb->addItem( "slU", m_segCombSlU );
1183 sc = m_xtupleSegComb->addItem( "slV", m_segCombSlV );
1184 sc = m_xtupleSegComb->addItem( "phiA", m_segCombPhiA );
1185 sc = m_xtupleSegComb->addItem( "phiU", m_segCombPhiU );
1186 sc = m_xtupleSegComb->addItem( "phiV", m_segCombPhiV );
1187 }
1188 else
1189 {
1190 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/segComb" << endmsg;
1191 // return;
1192 }
1193 }
1194
1195 NTuplePtr ntDropHits( ntupleSvc(), "MdcxReco/dropHits" );
1196 if ( ntDropHits ) { m_xtupleDropHits = ntDropHits; }
1197 else
1198 {
1200 ntupleSvc()->book( "MdcxReco/dropHits", CLID_ColumnWiseTuple, "MdcxReco event data" );
1201 if ( m_xtupleDropHits )
1202 {
1203 sc = m_xtupleDropHits->addItem( "evtNo", m_segDropHitsEvtNo );
1204 sc = m_xtupleDropHits->addItem( "layer", m_segDropHitsLayer );
1205 sc = m_xtupleDropHits->addItem( "wire", m_segDropHitsWire );
1206 sc = m_xtupleDropHits->addItem( "pull", m_segDropHitsPull );
1207 sc = m_xtupleDropHits->addItem( "doca", m_segDropHitsDoca );
1208 sc = m_xtupleDropHits->addItem( "sigma", m_segDropHitsSigma );
1209 sc = m_xtupleDropHits->addItem( "drift", m_segDropHitsDrift );
1210 sc = m_xtupleDropHits->addItem( "mcTkId", m_segDropHitsMcTkId );
1211 }
1212 else
1213 {
1214 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/dropHits" << endmsg;
1215 // return;
1216 }
1217 }
1218 NTuplePtr ntAddSeg2( ntupleSvc(), "MdcxReco/addSeg2" );
1219 if ( ntAddSeg2 ) { m_xtupleAddSeg2 = ntAddSeg2; }
1220 else
1221 {
1223 ntupleSvc()->book( "MdcxReco/addSeg2", CLID_ColumnWiseTuple, "MdcxReco event data" );
1224 if ( m_xtupleAddSeg2 )
1225 {
1226 sc = m_xtupleAddSeg2->addItem( "evtNo", m_addSegEvtNo );
1227 sc = m_xtupleAddSeg2->addItem( "slayer", m_addSegSlayer );
1228 sc = m_xtupleAddSeg2->addItem( "poca", m_addSegPoca );
1229 sc = m_xtupleAddSeg2->addItem( "len", m_addSegLen );
1230 }
1231 else
1232 {
1233 log << MSG::ERROR << "Cannot book N-tuple: MdcxReco/addSeg2" << endmsg;
1234 // return;
1235 }
1236 }
1237 //--------------end of book ntuple------------------
1238}
1239
1240void MdcxTrackFinder::fillEvent() {
1241 //-----------get raw digi-----------------------
1242 if ( m_xtupleEvt == NULL ) return;
1243#ifdef MDCXTIMEDEBUG
1244 m_xt4time = m_timer[0]->elapsed();
1245 m_xt4timeSeg = m_timer[1]->elapsed();
1246 m_xt4timeTrack = m_timer[2]->elapsed();
1247 m_xt4timeFit = m_timer[3]->elapsed();
1248#endif
1249 m_xt4EvtNo = m_eventNo;
1250 m_xt4t0 = m_bunchT0;
1251 m_xt4t0Stat = m_t0Stat;
1252 m_xt4t0Truth = m_t0Truth;
1253 m_xt4nRecTk = nTk;
1254 m_xt4nTdsTk = t_nTdsTk;
1255 m_xt4nDigi = t_nDigi;
1256 m_xt4nSeg = t_nSeg;
1257 int iDigi = 0;
1258 MdcDigiCol::iterator iter = mdcDigiVec.begin();
1259 for ( ; iDigi < t_nDigi; iter++ )
1260 {
1261 int l = MdcID::layer( ( *iter )->identify() );
1262 m_xt4Layer[iDigi] = l;
1263 // int w = MdcID::wire((*iter)->identify());
1264 m_xt4Time[iDigi] = RawDataUtil::MdcTime( ( *iter )->getTimeChannel() );
1265 m_xt4Charge[iDigi] = RawDataUtil::MdcCharge( ( *iter )->getChargeChannel() );
1266 // m_xt4rawHit[l]++;
1267 iDigi++;
1268 } // end for iter
1269 m_xtupleEvt->write();
1270}
1271
1272void MdcxTrackFinder::fillTrack( TrkRecoTrk* atrack ) {
1273
1274 if ( !m_xtuple1 ) return;
1275 //-----------get MC truth data-------------------
1276 m_xevtNo = m_eventNo;
1277 int recHitMap[43][288] = { 0 };
1278 // int nTk = (*m_tracks).nTrack();
1279 // for (int itrack = 0; itrack < nTk; itrack++) {
1280 if ( atrack == NULL ) return;
1281
1282 const TrkFit* fitResult = atrack->fitResult();
1283 if ( fitResult == 0 ) return; // check the fit worked
1284
1285 // for fill ntuples
1286 int nSt = 0; // int nSeg=0;
1287 int seg[11] = { 0 };
1288 int segme;
1289 //-----------hit list-------------
1290 HitRefVec hitRefVec;
1291 const TrkHitList* hitlist = atrack->hits();
1292
1293 TrkHitList::hot_iterator hot = hitlist->begin();
1294 int layerCount[43] = { 0 };
1295 int i = 0;
1296 for ( ; hot != hitlist->end(); hot++ )
1297 {
1298
1299 const MdcRecoHitOnTrack* recoHot;
1300 recoHot = dynamic_cast<const MdcRecoHitOnTrack*>( &( *hot ) );
1301 int layer = recoHot->mdcHit()->layernumber();
1302 int wire = recoHot->mdcHit()->wirenumber();
1303 m_xlayer[i] = layer;
1304 // m_xt4recHit[layer]++;//fill rec hit for hit eff
1305 m_xwire[i] = wire;
1306 layerCount[layer]++;
1307 recHitMap[layer][wire]++;
1308 m_xambig[i] = recoHot->wireAmbig(); // wire ambig
1309 // fltLen
1310 double fltLen = recoHot->fltLen();
1311 m_xfltLen[i] = fltLen;
1312 double tof = recoHot->getParentRep()->arrivalTime( fltLen );
1313 // position
1314 HepPoint3D pos;
1315 Hep3Vector dir;
1316 recoHot->getParentRep()->traj().getInfo( fltLen, pos, dir );
1317 m_xx[i] = pos.x();
1318 m_xy[i] = pos.y();
1319 m_xz[i] = pos.z();
1320 m_xdriftT[i] = recoHot->mdcHit()->driftTime( tof, pos.z() );
1321 m_xtof[i] = tof;
1322 m_xdriftD[i] = recoHot->drift();
1323 m_xsigma[i] = recoHot->hitRms();
1324 m_xtdc[i] = recoHot->rawTime();
1325 m_xadc[i] = recoHot->mdcHit()->charge();
1326 m_xdoca[i] = recoHot->dcaToWire(); // sign w.r.t. dirft() FIXME
1327 m_xentra[i] = recoHot->entranceAngle();
1328 // m_xentraHit[i] = recoHot->entranceAngleHit();
1329 m_xact[i] = recoHot->isActive();
1330 // resid
1331 double res = 999., rese = 999.;
1332 if ( recoHot->resid( res, rese, false ) ) {}
1333 else {}
1334 m_xresid[i] = res;
1335 // for n seg
1336 segme = 0;
1337 if ( layer > 0 ) { segme = ( layer - 1 ) / 4; }
1338 seg[segme]++;
1339 if ( recoHot->layer()->view() ) { ++nSt; }
1340 i++;
1341 } // end fill hit
1342
1343 int nSlay = 0;
1344 for ( int i = 0; i < 11; i++ )
1345 {
1346 if ( seg[i] > 0 ) nSlay++;
1347 }
1348 m_xnSlay = nSlay;
1349
1350 //------------fill track result-------------
1351 // m_xtkId = itrack;
1352 // track parameters at closest approach to beamline
1353 double fltLenPoca = 0.0;
1354 TrkExchangePar helix = fitResult->helix( fltLenPoca );
1355 m_xphi0 = helix.phi0();
1356 m_xtanl = helix.tanDip();
1357 m_xz0 = helix.z0();
1358 m_xd0 = helix.d0();
1359 if ( fabs( m_xz0 ) > 20 || fabs( m_xd0 ) > 2 )
1360 {
1361 // b_saveEvent = true;
1362 if ( m_debug > 1 )
1363 std::cout << "evt:" << m_eventNo << " BigVtx:"
1364 << " d0 " << helix.d0() << " z0 " << helix.z0() << std::endl;
1365 }
1366 m_xpt = fitResult->pt();
1367 if ( m_xpt > 0.00001 ) { m_xcpa = fitResult->charge() / fitResult->pt(); }
1368 // momenta and position
1369 CLHEP::Hep3Vector p1 = fitResult->momentum( fltLenPoca );
1370 double px, py, pz, pxy;
1371 pxy = fitResult->pt();
1372 px = p1.x();
1373 py = p1.y();
1374 pz = p1.z();
1375 m_xp = p1.mag();
1376 m_xpz = pz;
1377 HepPoint3D poca = fitResult->position( fltLenPoca );
1378 m_xpocax = poca.x();
1379 m_xpocay = poca.y();
1380 m_xpocaz = poca.z();
1381
1382 m_xq = fitResult->charge();
1383 m_xnAct = fitResult->nActive();
1384 m_xnHit = hitlist->nHit();
1385 m_xnDof = fitResult->nDof();
1386 m_xnSt = nSt;
1387 m_xchi2 = fitResult->chisq();
1388 // for (int l=0;l<43;l++) m_xlayerCount[l] = layerCount[l];
1389 m_xt0 = m_bunchT0;
1390 m_xtiming = m_timing;
1391 m_xt0Stat = m_t0Stat;
1392 m_xt0Truth = m_t0Truth;
1393 m_xtuple1->write();
1394 //}//end of loop rec trk list
1395
1396} // end of
1397
1398void MdcxTrackFinder::dumpMdcxSegs( const HepAList<MdcxSeg>& segList ) const {
1399 cout << name() << " found " << segList.length() << " segs :" << endl;
1400 for ( int i = 0; i < segList.length(); i++ )
1401 {
1402 std::cout << i << " ";
1403 segList[i]->printSeg();
1404 }
1405}
1406
1407void MdcxTrackFinder::fillMdcxSegs( const HepAList<MdcxSeg>& segList ) const {
1408 if ( !m_xtupleSeg ) return;
1409
1410 int cellMax[43] = { 40, 44, 48, 56, 64, 72, 80, 80, 76, 76, 88,
1411 88, 100, 100, 112, 112, 128, 128, 140, 140, 160, 160,
1412 160, 160, 176, 176, 176, 176, 208, 208, 208, 208, 240,
1413 240, 240, 240, 256, 256, 256, 256, 288, 288, 288 };
1414 // Fill hits of every layer after segment finding
1415 int hitInSegList[43][288];
1416 for ( int ii = 0; ii < 43; ii++ )
1417 {
1418 for ( int jj = 0; jj < cellMax[ii]; jj++ ) { hitInSegList[ii][jj] = 0; }
1419 }
1420 for ( int i = 0; i < segList.length(); i++ )
1421 {
1422 MdcxSeg* aSeg = segList[i];
1423 for ( int ihit = 0; ihit < aSeg->Nhits(); ihit++ )
1424 {
1425 const MdcxHit* hit = aSeg->XHitList()[ihit];
1426 int layer = hit->Layer();
1427 int wire = hit->WireNo();
1428 hitInSegList[layer][wire]++;
1429 }
1430 }
1431 for ( int i = 0; i < segList.length(); i++ )
1432 {
1433 MdcxSeg* aSeg = segList[i];
1434 if ( aSeg == NULL ) continue;
1435 m_xtsSl = aSeg->SuperLayer();
1436 m_xtsD0 = aSeg->D0();
1437 m_xtsOmega = aSeg->Omega();
1438 m_xtsPhi0 = aSeg->Phi0();
1441 m_xtsXline_bbrrf = aSeg->Xline_bbrrf();
1442 m_xtsYline_bbrrf = aSeg->Yline_bbrrf();
1443 m_xtsXline_slope = aSeg->Xline_slope();
1444 m_xtsYline_slope = aSeg->Yline_slope();
1445 int patIndex = -1;
1446 for ( int ii = 0; ii < 14; ii++ )
1447 {
1448 if ( aSeg->Pat() == (int)MdcxSegPatterns::patt4[ii] )
1449 {
1450 patIndex = ii;
1451 break;
1452 }
1453 }
1454 for ( int ii = 0; ii < 20; ii++ )
1455 {
1456 if ( aSeg->Pat() == (int)MdcxSegPatterns::patt3[ii] )
1457 {
1458 patIndex = ii + 15;
1459 break;
1460 }
1461 }
1462 m_xtsPat = patIndex;
1463 m_xtsChisq = aSeg->Chisq();
1464 m_xtsNDigi = aSeg->Nhits();
1465 for ( int ihit = 0; ihit < aSeg->Nhits(); ihit++ )
1466 {
1467 const MdcxHit* hit = aSeg->XHitList()[ihit];
1468 int layer = hit->Layer();
1469 int wire = hit->WireNo();
1470 m_xtsLayer[ihit] = layer;
1471 m_xtsWire[ihit] = wire;
1472 m_xtsInSeg[ihit] = hitInSegList[layer][wire];
1473 // std::cout<< "hitInSegList "<<hitInSegList[layer][wire] << std::endl;//yzhang debug
1474 }
1475 m_xtupleSeg->write();
1476 }
1477
1478} // end of fillMdcxSegs
1479
1480void MdcxTrackFinder::dumpTrackList( const HepAList<MdcxFittedHel>& trackList ) const {
1481 std::cout << "dump track list " << std::endl;
1482 for ( int i = 0; i < trackList.length(); i++ )
1483 {
1484 std::cout << "track " << i << std::endl;
1485 for ( int ihit = 0; ihit < trackList[i]->Nhits(); ihit++ )
1486 {
1487 const MdcxHit* hit = trackList[i]->XHitList()[ihit];
1488 int layer = hit->Layer();
1489 int wire = hit->WireNo();
1490 std::cout << " (" << layer << "," << wire << ") ";
1491 }
1492 std::cout << std::endl;
1493 }
1494} // end of dumpTrackList
1495
1496void MdcxTrackFinder::fillTrkl( const HepAList<MdcxFittedHel>& firsttrkl ) const {
1497 if ( !m_xtupleTrkl ) return;
1498 int nDigi = 0;
1499 int iDigi = 0;
1500 for ( int i = 0; i < firsttrkl.length(); i++ ) { nDigi += firsttrkl[i]->Nhits(); }
1501 for ( int i = 0; i < firsttrkl.length(); i++ )
1502 {
1503 for ( int ihit = 0; ihit < firsttrkl[i]->Nhits(); ihit++ )
1504 {
1505 const MdcxHit* hit = firsttrkl[i]->XHitList()[ihit];
1506 int layer = hit->Layer();
1507 int wire = hit->WireNo();
1508 m_xt5Layer = layer;
1509 m_xt5Wire = wire;
1510 m_xtupleTrkl->write();
1511 iDigi++;
1512 }
1513 }
1514} // end of fillTrkl
1515
1516void MdcxTrackFinder::fillMcTruth() {
1517 MsgStream log( msgSvc(), name() );
1518 StatusCode sc;
1519 // Initialize
1520 for ( int ii = 0; ii < 43; ii++ )
1521 {
1522 for ( int jj = 0; jj < 288; jj++ ) { haveDigi[ii][jj] = -2; }
1523 }
1524 int nDigi = mdcDigiVec.size();
1525 for ( int iDigi = 0; iDigi < nDigi; iDigi++ )
1526 {
1527 int l = MdcID::layer( ( mdcDigiVec[iDigi] )->identify() );
1528 int w = MdcID::wire( ( mdcDigiVec[iDigi] )->identify() );
1529 // haveDigi[l][w]=(mdcDigiVec[iDigi])->getTrackIndex();
1530 haveDigi[l][w] = 1;
1531 }
1532
1533 if ( m_mcHist )
1534 {
1535 //------------------get event start time truth-----------
1536 m_t0Truth = -10.;
1537 SmartDataPtr<Event::McParticleCol> mcParticleCol( eventSvc(), "/Event/MC/McParticleCol" );
1538 if ( !mcParticleCol ) { log << MSG::INFO << "Could not retrieve McParticelCol" << endmsg; }
1539 else
1540 {
1541 Event::McParticleCol::iterator iter_mc = mcParticleCol->begin();
1542 for ( ; iter_mc != mcParticleCol->end(); iter_mc++ )
1543 {
1544 if ( ( *iter_mc )->primaryParticle() )
1545 {
1546 m_t0Truth = ( *iter_mc )->initialPosition().t();
1547 // px = (*iter_mc)->initialFourMomentum().x()/1000.;//GeV
1548 // py = (*iter_mc)->initialFourMomentum().y()/1000.;//GeV
1549 // pz = (*iter_mc)->initialFourMomentum().z()/1000.;//GeV
1550 }
1551 }
1552 }
1553 }
1554 //------------------Retrieve MC truth MdcMcHit------------
1555 /*
1556 SmartDataPtr<Event::MdcMcHitCol> mcMdcMcHitCol(eventSvc(),"/Event/MC/MdcMcHitCol");
1557 if (!mcMdcMcHitCol) {
1558 log << MSG::WARNING << "Could not find MdcMcHit" << endmsg;
1559 }else{
1560 Event::MdcMcHitCol::iterator iter_mchit = mcMdcMcHitCol->begin();
1561 for (;iter_mchit != mcMdcMcHitCol->end(); iter_mchit++ ) {
1562 const Identifier id= (*iter_mchit)->identify();
1563 int layer = MdcID::layer(id);
1564 int wire = MdcID::wire(id);
1565 mcDrift[layer][wire] = (*iter_mchit)->getDriftDistance(); //drift in MC.
1566 mcLR[layer][wire] = (*iter_mchit)->getPositionFlag();
1567 mcX[layer][wire] = (*iter_mchit)->getPositionX();
1568 mcY[layer][wire] = (*iter_mchit)->getPositionY();
1569 mcZ[layer][wire] = (*iter_mchit)->getPositionZ();
1570 if (mcLR[layer][wire] == 0) mcLR[layer][wire] = -1;
1571 }
1572 }
1573 */
1574}
1575
1576void MdcxTrackFinder::dropMultiHotInLayer( TrkHitList* trkHitList ) {
1577 double tdr[43];
1578 double tdr_wire[43];
1579 for ( int i = 0; i < 43; i++ ) { tdr[i] = 9999.; }
1580
1581 // make flag
1582 TrkHotList::hot_iterator hotIter = trkHitList->hotList().begin();
1583 while ( hotIter != trkHitList->hotList().end() )
1584 {
1585 MdcHitOnTrack* hot = const_cast<MdcHitOnTrack*>( &( *hotIter->mdcHitOnTrack() ) );
1586
1587 // driftTime(tof,z)
1588 double dt = hot->mdcHit()->driftTime( 0., 0. );
1589 int layer = hot->mdcHit()->layernumber();
1590 int wire = hot->mdcHit()->wirenumber();
1591
1592 // std::cout<<__FILE__<<" "<<dt<< std::endl;
1593 if ( dt < tdr[layer] )
1594 {
1595 tdr[layer] = dt;
1596 tdr_wire[layer] = wire;
1597 }
1598 hotIter++;
1599 }
1600
1601 // std::cout<<" tdr wire ";
1602 // for(int i=0;i<43;i++){
1603 // std::cout<<i<<","<<tdr_wire[i]<<" tdr="<<tdr[i]<<"\n";
1604 // }
1605 // inactive multi hit
1606 hotIter = trkHitList->hotList().begin();
1607 while ( hotIter != trkHitList->hotList().end() )
1608 {
1609 int layer = hotIter->mdcHitOnTrack()->mdcHit()->layernumber();
1610 int wire = hotIter->mdcHitOnTrack()->mdcHit()->wirenumber();
1611 // double dt = hotIter->mdcHitOnTrack()->mdcHit()->driftTime(0.,0.)-m_bunchT0;
1612
1613 if ( ( tdr[layer] < 9998. ) && ( tdr_wire[layer] != wire ) )
1614 {
1615 MdcHitOnTrack* hot = const_cast<MdcHitOnTrack*>( &( *hotIter->mdcHitOnTrack() ) );
1616 hot->setActivity( false );
1617 trkHitList->removeHit( hotIter->mdcHitOnTrack()->mdcHit() );
1618 // std::cout<<__FILE__<<" inactive "<< layer<<" "<<wire<<" dt "<<dt << std::endl;
1619 }
1620 else { hotIter++; }
1621 }
1622}
1623void MdcxTrackFinder::dumpTdsTrack( RecMdcTrackCol* trackList ) {
1624 std::cout << "tksize = " << trackList->size() << std::endl; // yzhang debug
1625 RecMdcTrackCol::iterator it = trackList->begin();
1626 for ( ; it != trackList->end(); it++ )
1627 {
1628 RecMdcTrack* tk = *it;
1629 std::cout << "//====RecMdcTrack " << tk->trackId() << "====:" << std::endl;
1630 cout << " d0 " << tk->helix( 0 ) << " phi0 " << tk->helix( 1 ) << " cpa " << tk->helix( 2 )
1631 << " z0 " << tk->helix( 3 ) << " tanl " << tk->helix( 4 ) << endl;
1632 std::cout << " q " << tk->charge() << " theta " << tk->theta() << " phi " << tk->phi()
1633 << " x0 " << tk->x() << " y0 " << tk->y() << " z0 " << tk->z() << " r0 "
1634 << tk->r() << endl;
1635 std::cout << " p " << tk->p() << " pt " << tk->pxy() << " px " << tk->px() << " py "
1636 << tk->py() << " pz " << tk->pz() << endl;
1637 std::cout << " tkStat " << tk->stat() << " chi2 " << tk->chi2() << " ndof " << tk->ndof()
1638 << " nhit " << tk->getNhits() << " nst " << tk->nster() << endl;
1639
1640 int nhits = tk->getVecHits().size();
1641 std::cout << nhits << " Hits: " << std::endl;
1642 for ( int ii = 0; ii < nhits; ii++ )
1643 {
1644 Identifier id( tk->getVecHits()[ii]->getMdcId() );
1645 int layer = MdcID::layer( id );
1646 int wire = MdcID::wire( id );
1647 cout << "(" << layer << "," << wire << "," << tk->getVecHits()[ii]->getStat()
1648 << ",lr:" << tk->getVecHits()[ii]->getFlagLR() << ") ";
1649 } // end of hit list
1650 std::cout << " " << std::endl;
1651 } // end of tk list
1652 std::cout << " " << std::endl;
1653
1654} // end of dumpTdsTrack
1655
1656void MdcxTrackFinder::dumpTdsHits( RecMdcHitCol* hitList ) {
1657 std::cout << __FILE__ << " " << __LINE__ << " All hits in TDS, nhit=" << hitList->size()
1658 << std::endl;
1659 RecMdcHitCol::iterator it = hitList->begin();
1660 for ( ; it != hitList->end(); it++ )
1661 {
1662 RecMdcHit* h = ( *it );
1663 Identifier id( h->getMdcId() );
1664 int layer = MdcID::layer( id );
1665 int wire = MdcID::wire( id );
1666 cout << "(" << layer << "," << wire << ") lr:" << h->getFlagLR()
1667 << " stat:" << h->getStat() << " tk:" << h->getTrkId() << " doca:" << setw( 10 )
1668 << h->getDoca() << std::endl;
1669 } // end of hit list
1670}
double p1[4]
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
double w
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
int recHitMap[43][288]
NTuple::Array< double > m_xfltLen
AIDA::IHistogram1D * g_dPhiAV
NTuple::Item< double > m_addSegAddPhiLay
NTuple::Array< double > m_xwire
NTuple::Item< double > m_xtsXline_bbrrf
NTuple::Item< double > m_xt0Stat
NTuple::Array< double > m_xdriftT
AIDA::IHistogram1D * g_trkldrop1
NTuple::Array< double > m_xdriftD
NTuple::Item< double > m_xpocax
NTuple::Item< double > m_xtsChisq
NTuple::Item< long > m_xnHit
AIDA::IHistogram1D * g_dPhiAU_1
NTuple::Item< double > m_xtsYline_slope
NTuple::Item< long > m_xt5Layer
NTuple::Item< double > m_xtsYline_bbrrf
NTuple::Item< double > m_xq
AIDA::IHistogram1D * g_csmax3
AIDA::IHistogram1D * g_trklappend2
NTuple::Item< double > m_addSegSeedPhi0
NTuple::Array< double > m_xambig
NTuple::Item< double > m_xtiming
NTuple::Item< double > m_segCombDLenUV
AIDA::IHistogram1D * g_trklappend1
AIDA::IHistogram1D * g_dPhiAV_0
int g_eventNo
Definition FTFinder.cxx:61
NTuple::Item< long > m_addSegSlayer
AIDA::IHistogram2D * g_poison
NTuple::Item< double > m_xchi2
NTuple::Array< double > m_xresid
NTuple::Item< long > m_addSegSame
NTuple::Item< double > m_xpocaz
AIDA::IHistogram1D * g_trklproca
NTuple::Item< long > m_segDropHitsWire
NTuple::Item< long > m_xtsNDigi
NTuple::Item< double > m_addSegSeedSl
NTuple::Tuple * m_xtupleTrkl
NTuple::Item< double > m_xnAct
NTuple::Array< double > m_xtof
NTuple::Tuple * m_xtupleAddSeg1
NTuple::Item< double > m_addSegAddLen
AIDA::IHistogram1D * g_addSegPhi
AIDA::IHistogram1D * g_dPhiAV_1
NTuple::Item< long > m_xtsSl
NTuple::Item< double > m_xt4nTdsTk
NTuple::Item< double > m_addSegLen
AIDA::IHistogram1D * g_trkle
NTuple::Item< long > m_xtsPat
AIDA::IHistogram1D * g_dPhiAU_5
NTuple::Item< double > m_xp
AIDA::IHistogram1D * g_trkld
NTuple::Array< long > m_xtsWire
NTuple::Item< double > m_xt0
AIDA::IHistogram1D * g_trkltemp
NTuple::Item< double > m_segDropHitsDoca
NTuple::Item< long > m_xt4nSeg
NTuple::Item< double > m_xtsPhi0_sl_approx
AIDA::IHistogram1D * g_csmax4
NTuple::Item< double > m_csmcTanl
NTuple::Item< double > m_segDropHitsSigma
AIDA::IHistogram2D * g_trklel
NTuple::Item< double > m_xtsD0
NTuple::Item< double > m_addSegSeedPhiLay
NTuple::Array< double > m_xact
NTuple::Item< double > m_csmcOmega
NTuple::Item< double > m_xpz
NTuple::Item< double > m_addSegSeedLen
NTuple::Item< double > m_xnSt
NTuple::Array< long > m_xtsInSeg
NTuple::Item< double > m_segCombSlV
NTuple::Item< long > m_segDropHitsLayer
NTuple::Item< double > m_addSegSeedD0
AIDA::IHistogram1D * g_dPhiAU_7
NTuple::Tuple * m_xtuple1
AIDA::IHistogram2D * g_dropHitsSigma
NTuple::Item< double > m_xtsPhi0
AIDA::IHistogram1D * g_trklappend3
NTuple::Item< double > m_xt4t0
AIDA::IHistogram1D * g_trklhelix
NTuple::Item< double > m_xt4timeFit
NTuple::Item< double > m_xt4t0Truth
NTuple::Item< double > m_segDropHitsMcTkId
NTuple::Array< double > m_xdoca
AIDA::IHistogram1D * g_trkllmk
NTuple::Item< double > m_xevtNo
AIDA::IHistogram1D * g_addHitCut
AIDA::IHistogram2D * g_trkldl
NTuple::Item< long > m_xt4t0Stat
NTuple::Item< double > m_xt4nRecTk
NTuple::Item< double > m_segCombPhiA
NTuple::Item< long > m_xt4EvtNo
AIDA::IHistogram1D * g_dPhiAU_0
NTuple::Item< double > m_segCombSlA
NTuple::Item< double > m_xt4timeTrack
NTuple::Array< double > m_xsigma
NTuple::Item< double > m_xt4time
NTuple::Item< double > m_segCombDLenAU
AIDA::IHistogram2D * g_addHitCut2d
NTuple::Item< long > m_xt5Wire
AIDA::IHistogram1D * g_trklgood
AIDA::IHistogram1D * g_trkllayer
NTuple::Item< double > m_xphi0
NTuple::Item< double > m_segCombSlU
NTuple::Item< long > m_segCombEvtNo
NTuple::Item< double > m_segCombPhiU
NTuple::Item< double > m_csmcPhi0
NTuple::Array< double > m_xadc
NTuple::Array< double > m_xt4Time
AIDA::IHistogram1D * g_dPhiAU
NTuple::Item< double > m_segCombSameUV
NTuple::Item< double > m_addSegAddPhi
NTuple::Item< double > m_xt4timeSeg
NTuple::Item< double > m_addSegSeedPhi
NTuple::Array< double > m_xx
NTuple::Item< double > m_xz0
NTuple::Item< double > m_csmcPt
NTuple::Item< long > m_xnSlay
AIDA::IHistogram1D * g_trkldrop2
NTuple::Array< double > m_xtdc
NTuple::Item< double > m_segCombPhiV
NTuple::Item< double > m_xtanl
NTuple::Item< double > m_addSegAddPhi0
NTuple::Item< double > m_xt0Truth
AIDA::IHistogram1D * g_dPhiAV_8
NTuple::Tuple * m_xtupleSegComb
NTuple::Item< double > m_addSegAddSl
NTuple::Item< double > m_segCombOmega
NTuple::Array< long > m_xt4Layer
NTuple::Item< double > m_xtsD0_sl_approx
NTuple::Item< double > m_xtkId
NTuple::Item< double > m_addSegAddD0
NTuple::Item< long > m_segDropHitsEvtNo
NTuple::Item< double > m_segCombSameAU
NTuple::Tuple * m_xtupleEvt
NTuple::Item< double > m_xpt
NTuple::Item< double > m_xpocay
NTuple::Item< double > m_segDropHitsPull
NTuple::Item< double > m_xcpa
NTuple::Item< double > m_csmcD0
AIDA::IHistogram1D * g_trklfirstProb
NTuple::Tuple * m_xtupleAddSeg2
AIDA::IHistogram1D * g_omegag
NTuple::Array< long > m_xtsLayer
AIDA::IHistogram1D * g_trkldoca
NTuple::Array< double > m_xentra
NTuple::Item< double > m_xnDof
NTuple::Array< double > m_xlayer
NTuple::Array< double > m_xy
NTuple::Array< double > m_xz
NTuple::Item< double > m_xtsOmega
NTuple::Item< double > m_xd0
NTuple::Item< long > m_addSegEvtNo
NTuple::Item< double > m_segDropHitsDrift
NTuple::Item< long > m_xt4nDigi
AIDA::IHistogram1D * g_dPhiAV_6
NTuple::Tuple * m_xtupleDropHits
NTuple::Item< double > m_csmcZ0
NTuple::Tuple * m_xtupleSeg
NTuple::Item< double > m_addSegPoca
NTuple::Tuple * m_xtupleCsmcSew
AIDA::IHistogram1D * g_trklcircle
NTuple::Item< double > m_xtsXline_slope
NTuple::Array< double > m_xt4Charge
TGraph2DErrors * dt
Definition McCor.cxx:41
INTupleSvc * ntupleSvc()
IHistogramSvc * histoSvc()
IMessageSvc * msgSvc()
const HepSymMatrix err() const
const HepVector helix() const
......
static MdcDetector * instance()
virtual const MdcHit * mdcHit() const
int wireAmbig() const
double rawTime() const
double dcaToWire() const
double entranceAngle() const
const MdcLayer * layer() const
double driftTime(double tof, double z) const
Definition MdcHit.cxx:142
void setCalibSvc(const IMdcCalibFunSvc *calibSvc)
Definition MdcHit.cxx:136
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
Definition MdcID.cxx:47
static int wire(const Identifier &id)
Definition MdcID.cxx:52
const MdcHit * mdcHit() const
int SuperLayer(int hitno=0) const
int Fail(float Probmin=0.0) const
MdcxFittedHel & Grow(const MdcxFittedHel &, const HepAList< MdcxHit > &)
static void setMdcCalibFunSvc(const IMdcCalibFunSvc *calibSvc)
Definition MdcxHit.cxx:58
static void setMdcDetector(const MdcDetector *gm)
Definition MdcxHit.cxx:64
static void setCountPropTime(bool countPropTime)
Definition MdcxHit.cxx:62
MdcxTrackFinder(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode finalize()
StatusCode beginRun()
StatusCode initialize()
static void readMCppTable(std::string filenm)
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
virtual void getInfo(double fltLen, HepPoint3D &pos, Hep3Vector &direction) const =0
virtual Hep3Vector momentum(double fltL=0.) const =0
virtual double pt(double fltL=0.) const =0
virtual double chisq() const =0
virtual int charge() const =0
virtual int nDof() const =0
virtual const TrkDifTraj & traj() const =0
virtual HepPoint3D position(double fltL) const =0
void print(std::ostream &ostr) const
virtual void addHistory(const TrkErrCode &status, const char *modulename)
virtual int nActive() const =0
virtual TrkExchangePar helix(double fltL) const =0
TrkErrCode fit()
TrkHitOnTrk * appendHot(const TrkHitOnTrk *theHot)
const TrkHotList & hotList() const
bool removeHit(const TrkFundHit *theHit)
void setActivity(bool turnOn)
void setUsability(int usability)
double resid(bool exclude=false) const
virtual const MdcHitOnTrack * mdcHitOnTrack() const
TrkHitOnTrkIter< TrkHotList::const_iterator_traits > hot_iterator
const TrkFit * fitResult() const
virtual void printAll(std::ostream &) const
const TrkFitStatus * status() const
virtual double arrivalTime(double fltL) const
Definition TrkRep.cxx:158
bool setFlipAndDrop(TrkRecoTrk &, bool allowFlips, bool allowDrops) const
TrkRecoTrk * makeTrack(const TrkExchangePar &helix, const double chi2, const TrkContext &, double trackT0) const
char * c_str(Index i)