4#include "GaudiKernel/Bootstrap.h"
5#include "GaudiKernel/IDataManagerSvc.h"
6#include "GaudiKernel/IDataProviderSvc.h"
7#include "GaudiKernel/IMessageSvc.h"
8#include "GaudiKernel/IPartPropSvc.h"
9#include "GaudiKernel/ISvcLocator.h"
10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/PropertyMgr.h"
12#include "GaudiKernel/SmartDataPtr.h"
13#include "GaudiKernel/SmartRef.h"
14#include "GaudiKernel/SmartRefVector.h"
15#include "GaudiKernel/StatusCode.h"
17#include "EvTimeEvent/RecEsTime.h"
18#include "EventModel/EventHeader.h"
19#include "Identifier/Identifier.h"
20#include "Identifier/MdcID.h"
21#include "MdcGeomSvc/IMdcGeomSvc.h"
22#include "MdcGeomSvc/MdcGeoLayer.h"
23#include "MdcGeomSvc/MdcGeoSuper.h"
24#include "MdcGeomSvc/MdcGeoWire.h"
25#include "MdcRawEvent/MdcDigi.h"
26#include "MdcRecEvent/RecMdcHit.h"
27#include "MdcRecEvent/RecMdcTrack.h"
28#include "RawDataProviderSvc/IRawDataProviderSvc.h"
29#include "RawEvent/RawDataUtil.h"
30#include "ReconEvent/ReconEvent.h"
31#include "TrigEvent/TrigData.h"
32#include "TrigEvent/TrigGTD.h"
33#include "TrigEvent/TrigGTDProvider.h"
34#include "TrigEvent/TrigMdc.h"
48# include "McTruth/McParticle.h"
50# include "AIDA/IAxis.h"
51# include "AIDA/IHistogram1D.h"
52# include "AIDA/IHistogram2D.h"
53# include "AIDA/IHistogram3D.h"
54# include "AIDA/IHistogramFactory.h"
67extern NTuple::Item<long>
g_ntrk;
78extern IHistogram1D*
g_nhit;
92 return ( x * x ) / ( param->_xtCoEff * param->_xtCoEff * l->
csize() );
96 float x = (
t > 0.0f ) ? (( param->_xtCoEff ))*sqrt(
t * l->
csize() ) : 0.0f;
97 if ( x > 0.47f * l->
csize() )
101 ( 1.0f - 0.0004f * 0.47f / ( ( param->_xtCoEff ) * ( param->_xtCoEff ) ) );
117 , _linkedSegments( 0 )
118 , _axialSegCollect( 0 )
126 StatusCode scmgn = Gaudi::svcLocator()->service(
"MagneticFieldSvc", m_pmgnIMF );
127 if ( scmgn != StatusCode::SUCCESS )
128 { std::cout <<
"Unable to open Magnetic field service" << std::endl; }
132 if ( !param->_doIt )
return;
135 IPartPropSvc* p_PartPropSvc;
136 StatusCode PartPropStatus = Gaudi::svcLocator()->service(
"PartPropSvc", p_PartPropSvc );
138 if ( !PartPropStatus.isSuccess() )
140 std::cerr <<
"Could not initialize Particle Properties Service" << std::endl;
143 m_particleTable = p_PartPropSvc->PDT();
146 Gaudi::svcLocator()->service(
"RawDataProviderSvc", m_rawDataProviderSvc );
149 std::cerr <<
"Could not load RawDataProviderSvc!" << m_rawDataProviderSvc << endmsg;
158 if ( !param->_doIt )
return;
163 StatusCode sc = Gaudi::svcLocator()->service(
"MdcGeomSvc", mdcGeomSvc );
165 if ( !sc.isSuccess() )
return;
171 if ( !param->_doIt )
return;
174 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
176 MsgStream log(
msgSvc,
"FTFinder" );
178 IDataProviderSvc* eventSvc;
179 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc ).ignore();
187 DataObject* aReconEvent;
188 eventSvc->findObject(
"/Event/Recon", aReconEvent ).ignore();
193 StatusCode sc = eventSvc->registerObject(
"/Event/Recon", recevt );
194 if ( sc != StatusCode::SUCCESS )
196 log << MSG::FATAL <<
"Could not register ReconEvent" << endmsg;
202 IDataManagerSvc* dataManSvc;
203 Gaudi::svcLocator()->service(
"EventDataSvc", dataManSvc ).ignore();
205 DataObject* aEsTimeEvent;
206 eventSvc->findObject(
"/Event/Recon/RecEsTimeCol", aEsTimeEvent ).ignore();
209 dataManSvc->clearSubTree(
"/Event/Recon/RecEsTimeCol" ).ignore();
210 eventSvc->unregisterObject(
"/Event/Recon/RecEsTimeCol" ).ignore();
215 est = eventSvc->registerObject(
"/Event/Recon/RecEsTimeCol", aRecEsTimeCol );
216 if ( est.isFailure() )
218 log << MSG::FATAL <<
"Could not register RecEsTimeCol" << endmsg;
221 log << MSG::DEBUG <<
"RecEsTimeCol registered successfully!" << endmsg;
231 for (
int i = 0; i < 11; i++ ) { m_geom->getSuperLayer( i )->mkSegmentList(); }
236 for (
int i = 0; i < 10; i++ ) { m_geom->getSuperLayer( i )->reduce_noise(
tEstime ); }
249 log << MSG::DEBUG <<
"number of 2D tracks: " << _tracks.size() << endmsg;
255 for (
auto it = _tracks.begin(); it != _tracks.end(); )
257 if ( !( *it )->r_phiFit() )
260 it = _tracks.erase( it );
261 int tmp_index = std::distance( _tracks.begin(), it );
262 log << MSG::DEBUG <<
"===========> deleted 2D track : " << tmp_index << endmsg;
273 aRecEsTimeCol->push_back( arecestime );
276 if ( !_tracks.size() )
285 int vtx_flag = VertexFit( 0 );
286 evtTiming = ( param->_evtTimeCorr ) ? CorrectEvtTiming() : 0;
291 if ( param->_hitscut == 1 )
293 for (
auto trk_i : _tracks ) { trk_i->r_phiReFit( _vx, _vy, vtx_flag ); }
298 if ( param->_hitscut == 2 )
300 for (
auto trk_i : _tracks )
302 for (
int j = 0; j < 2; j++ )
304 i_rPhiFit = trk_i->r_phi2Fit( _vx, _vy, vtx_flag );
307 trk_i->r_phi4Fit( _vx, _vy, vtx_flag );
319 log << MSG::DEBUG <<
"number of 3D tracks: " << _tracks.size() << endmsg;
325 for (
auto it = _tracks.begin(); it != _tracks.end(); )
328 int trk_index = std::distance( _tracks.begin(), it ) + 1;
331 log << MSG::DEBUG <<
"=======> 3D track: " << trk_index << endmsg;
335 if ( ( *it )->get_nhits() < 18 )
338 log << MSG::DEBUG <<
"================> deleted 3D track : " << trk_index << endmsg;
339 it = _tracks.erase( it );
344 if ( !_tracks.size() )
350 for (
auto trk_i : _tracks ) trk_i->s_zFit();
355 if ( param->_findEventVertex ) { VertexFit( 1 ); }
357 log << MSG::DEBUG <<
"final number of tracks: " << _tracks.size() << endmsg;
361 if ( param->_mkMdst ) makeMdst();
368 if ( param->_mkTds ) makeTds().ignore();
371int FTFinder::updateMdc() {
373 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
375 MsgStream log(
msgSvc,
"FTFinder" );
377 IDataProviderSvc* eventSvc;
378 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc ).ignore();
382 log << MSG::FATAL <<
"Could not find EventDataSvc" << endmsg;
388 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc,
"/Event/EventHeader" );
391 log << MSG::FATAL <<
"Could not find Event Header" << endmsg;
395 log << MSG::DEBUG <<
"MdcFastTrkAlg: retrieved event: " << eventHeader->eventNumber()
396 <<
" run: " << eventHeader->runNumber() << endmsg;
398 eventNo = eventHeader->eventNumber();
399 runNo = eventHeader->runNumber();
408 SmartDataPtr<McParticleCol> mcParticleCol( eventSvc,
"/Event/MC/McParticleCol" );
409 if ( !mcParticleCol ) { log << MSG::WARNING <<
"Could not find McParticle" << endmsg; }
412 McParticleCol::iterator iter_mc = mcParticleCol->begin();
418 for ( ; iter_mc != mcParticleCol->end(); iter_mc++, digiId++ )
420 log << MSG::DEBUG <<
"MDC digit No: " << digiId << endmsg;
421 log << MSG::DEBUG <<
" particleId = " << ( *iter_mc )->particleProperty() << endmsg;
422 int statusFlags = ( *iter_mc )->statusFlags();
423 int pid = ( *iter_mc )->particleProperty();
426 if ( m_particleTable->particle( pid ) )
427 { charge = (int)m_particleTable->particle( pid )->charge(); }
431 if ( m_particleTable->particle( -pid ) )
433 charge = (int)m_particleTable->particle( -pid )->charge();
437 else { log << MSG::WARNING <<
"wrong particle id, please check data" << endmsg; }
439 if ( charge == 0 ||
abs(
cos( ( *iter_mc )->initialFourMomentum().theta() ) ) > 0.93 )
442 g_theta0MC[ntrkMC] = ( *iter_mc )->initialFourMomentum().theta();
443 g_phi0MC[ntrkMC] = ( *iter_mc )->initialFourMomentum().phi();
444 g_pxMC[ntrkMC] = ( *iter_mc )->initialFourMomentum().px();
445 g_pyMC[ntrkMC] = ( *iter_mc )->initialFourMomentum().py();
446 g_pzMC[ntrkMC] = ( *iter_mc )->initialFourMomentum().pz();
457 SmartDataPtr<MdcDigiCol> mdcDigiVec( eventSvc,
"/Event/Digi/MdcDigiCol" );
460 log << MSG::FATAL <<
"Could not find MDC digi" << endmsg;
461 return ( StatusCode::FAILURE );
463 MdcDigiCol::iterator iter1 = mdcDigiVec->begin();
468 for ( ; iter1 != mdcDigiVec->end(); iter1++, digiId++ )
473 MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec();
474 MdcDigiVec::iterator iter1 = mdcDigiVec.begin();
479 for ( ; iter1 != mdcDigiVec.end(); iter1++, digiId++ )
483 mdcId = ( *iter1 )->identify();
488 log << MSG::DEBUG <<
"MDC digit No: " << digiId << endmsg;
492 <<
" layerId = " << layerId <<
" wireId = " << wireId << endmsg;
495 const int localwid = wireId;
496 const int wid = m_geom->layer2wireStart( layerId ) + localwid;
503 if ( wid < 0 || wid > 6795 )
505 std::cout <<
"FTFinder::updateMdc(): wid out of range: " << wid << std::endl;
509 FTWire*
w = m_geom->getWire( wid );
524 float time = tdc - sqrt(
w->x() *
w->x() +
w->y() *
w->y() ) / 30;
530 FTLayer* lyr =
w->layer();
537 FTSuperLayer* sup = m_geom->getSuperLayer( m_geom->layer2superLayer( lyr->
layerId() ) );
544void FTFinder::clear() {
547 for (
int i = 0; i < 11; i++ ) { m_geom->getSuperLayer( i )->clear(); }
553 _axialSegCollect.clear();
562void FTFinder::getTestime() {
564 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
566 MsgStream log(
msgSvc,
"FTFinder" );
568 IDataProviderSvc* eventSvc;
569 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc ).ignore();
571 float sumT = 0, estime = 0;
575 for (
auto& tEstimeVec :
tEstime )
577 for (
auto tEstime_i : tEstimeVec )
579 if ( tEstime_i != 0 )
596 int nbunch = ( (int)( estime -
tOffSet ) ) / _bunchtime;
597 if ( ( (
int)( estime -
tOffSet ) ) % (
int)_bunchtime > _bunchtime / 2 )
607 SmartDataPtr<TrigData> trigData( eventSvc,
"/Event/Trig/TrigData" );
610 trigtimming = trigData->getTimingType();
611 log << MSG::INFO <<
"Timing type: " << trigData->getTimingType() << endmsg;
614 if ( trigtimming == 1 )
tEstFlag = 117;
615 if ( trigtimming == 2 )
tEstFlag = 127;
616 if ( trigtimming == 3 )
tEstFlag = 137;
617 if ( trigtimming == 0 )
tEstFlag = 107;
626void FTFinder::mkTrackList() {
628 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
630 MsgStream log(
msgSvc,
"FTFinder" );
632 FTList<FTSegment*> inner_segments;
633 FTList<FTSegment*> outer_segments;
635 linkAxialSuperLayer234( inner_segments );
636 linkAxialSuperLayer910( outer_segments );
638 _axialSegCollect.insert( _axialSegCollect.end(), inner_segments.begin(),
639 inner_segments.end() );
640 _axialSegCollect.insert( _axialSegCollect.end(), outer_segments.begin(),
641 outer_segments.end() );
643 int innerN = inner_segments.size();
644 int outerN = outer_segments.size();
646 log << MSG::DEBUG << innerN <<
" segments in inner axial layers!" << endmsg;
647 log << MSG::DEBUG << outerN <<
" segments in outer axial layers!" << endmsg;
649 for (
auto inner : inner_segments )
651 if ( inner->track() )
continue;
652 FTTrack* track_cand =
nullptr;
660 track_cand = linkAxialSegments( inner,
nullptr );
661 if ( !track_cand )
continue;
662 _linkedSegments = FTList<FTSegment*>( 5 );
665 const FTList<FTSegment*>& segments = track_cand->
axial_segments();
667 for (
auto seg_i : segments ) { seg_i->track( track_cand ); }
669 _tracks.push_back( track_cand );
674 for (
auto outer : outer_segments )
676 if ( outer->track() )
678 if ( outer == outer_segments.back() )
680 if ( inner->track() )
continue;
681 track_cand = linkAxialSegments( inner,
nullptr );
682 if ( !track_cand )
continue;
683 _linkedSegments = FTList<FTSegment*>( 5 );
685 const FTList<FTSegment*>& segments = track_cand->
axial_segments();
687 for (
auto seg_i : segments ) { seg_i->track( track_cand ); }
688 _tracks.push_back( track_cand );
694 track_cand = linkAxialSegments( inner, outer );
698 if ( outer == outer_segments.back() )
700 if ( inner->track() )
continue;
701 track_cand = linkAxialSegments( inner,
nullptr );
703 if ( !track_cand )
continue;
706 _linkedSegments = FTList<FTSegment*>( 5 );
710 const FTList<FTSegment*>& segments = track_cand->
axial_segments();
713 if ( inner->track() )
715 FTTrack* trk_tmp = inner->track();
717 int nTrks = _tracks.size();
718 auto cache_it = _tracks.end();
720 for (
auto it = _tracks.begin(); it != _tracks.end(); it++ )
722 if ( *it == trk_tmp )
731 int n2 = segments2.size();
732 if ( segments.size() >= segments2.size() &&
736 for (
auto seg2_i : segments2 ) { seg2_i->track(
nullptr ); }
737 for (
auto seg_i : segments ) { seg_i->track( track_cand ); }
739 *cache_it = track_cand;
743 else {
delete track_cand; }
748 for (
auto seg_i : segments ) { seg_i->track( track_cand ); }
749 _tracks.push_back( track_cand );
757 for (
auto trk_i : _tracks )
759 const FTList<FTSegment*>& segments = trk_i->axial_segments();
760 log << MSG::DEBUG <<
" loop connected axial track: " << i << endmsg;
761 int l = segments.size();
762 for (
int j = 0; j < l; j++ ) { segments[j]->printout(); }
768FTTrack* FTFinder::linkAxialSegments( FTSegment* inner, FTSegment* outer ) {
770 _linkedSegments.clear();
776 _linkedSegments.push_back( inner );
778 if (
n >= 7 )
return (
new FTTrack( _linkedSegments, inner->
kappa(), chi2_kappa ) );
782 _linkedSegments.push_back( outer );
784 int n = _linkedSegments.size();
785 float SigmaK = outer->
kappa();
786 float SigmaRR = outer->
r();
788 float SigmaKRR = SigmaK * SigmaRR;
789 float SigmaKKRR = SigmaK * SigmaKRR;
791 FTSegment*
s = _linkedSegments[
n - 1];
792 FTSegment* innerSegment =
nullptr;
794 float SigmaK_cache, SigmaRR_cache, SigmaKRR_cache, SigmaKKRR_cache;
796 float Min_chi2 = param->_Min_chi2;
797 float inX =
s->incomingX();
798 float inY =
s->incomingY();
799 float in_r =
s->innerBoundHits().front()->layer()->r();
800 float incomingPhi =
s->incomingPhi();
802 FTSegment*
next = inner;
803 const FTWire* NextOuterBoundHit =
next->outerBoundHits().front();
805 float outX =
next->outgoingX();
806 float outY =
next->outgoingY();
809 float _trk_d = -2 * ( -1. / 2.99792458 / m_pmgnIMF->getReferField() ) /
s->kappa();
810 float _angle1 = asin( NextOuterBoundHit->
layer()->
r() / _trk_d );
811 float _angle2 = asin(
s->outerBoundHits().front()->layer()->r() / _trk_d );
812 float _ang_diff = _angle2 - _angle1;
813 float _diff =
s->outgoingPhi() -
next->outgoingPhi();
814 _diff = _diff - ( int( _diff /
M_PI ) ) * 2 *
M_PI;
815 float _require = _ang_diff - _diff;
818 if ( _require < -0.10 || _require > 0.11 )
return nullptr;
820 float SegK =
next->kappa();
821 float SegRR =
next->r();
823 const float out_r = NextOuterBoundHit->
layer()->
r();
825 float GapK = 2. * ( -1. / 2.99792458 / m_pmgnIMF->getReferField() ) *
826 ( inX * outY - inY * outX ) /
828 sqrt( ( inX - outX ) * ( inX - outX ) + ( inY - outY ) * ( inY - outY ) ) );
830 float GapRR = 0.5 * ( in_r + out_r );
832 float SigmaK_tmp = ( SigmaK + SegK + GapK );
833 float SigmaRR_tmp = SigmaRR + SegRR + GapRR;
834 float SigmaKRR_tmp = SigmaKRR + SegK * SegRR + GapK * GapRR;
835 float SigmaKKRR_tmp = SigmaKKRR + SegK * SegK * SegRR + GapK * GapK * GapRR;
836 float MuK_tmp = SigmaK_tmp / ( 2 *
n + 1 );
838 ( MuK_tmp * MuK_tmp * SigmaRR_tmp - 2. * MuK_tmp * SigmaKRR_tmp + SigmaKKRR_tmp ) /
840 if ( ( chi2 - chi2_kappa ) < Min_chi2 )
844 SigmaK_cache = SigmaK_tmp;
845 SigmaRR_cache = SigmaRR_tmp;
846 SigmaKRR_cache = SigmaKRR_tmp;
847 SigmaKKRR_cache = SigmaKKRR_tmp;
851 _linkedSegments.push_back( inner );
852 n = _linkedSegments.size();
853 SigmaK = SigmaK_cache;
854 SigmaRR = SigmaRR_cache;
855 SigmaKRR = SigmaKRR_cache;
856 SigmaKKRR = SigmaKKRR_cache;
857 chi2_kappa = Min_chi2;
859 if (
n > 1 )
return (
new FTTrack( _linkedSegments, SigmaK / ( 2 *
n - 1 ), chi2_kappa ) );
865void FTFinder::linkAxialSuperLayer234( FTList<FTSegment*>& inner_segments ) {
866 FTList<FTSegment*> _segments34;
867 FTList<FTSegment*>& SuperLayer3Segments = m_geom->getSuperLayer( 3 )->segments();
868 FTList<FTSegment*>& SuperLayer4Segments = m_geom->getSuperLayer( 4 )->segments();
870 linkAxialSegments_step( SuperLayer3Segments, SuperLayer4Segments, _segments34,
871 param->_D_phi2, param->_chi2_2 );
872 _segments34.insert( _segments34.end(), SuperLayer3Segments.begin(),
873 SuperLayer3Segments.end() );
874 SuperLayer3Segments.clear();
876 FTList<FTSegment*>& SuperLayer2Segments = m_geom->getSuperLayer( 2 )->segments();
877 linkAxialSegments_step( SuperLayer2Segments, _segments34, inner_segments, param->_D_phi1,
879 inner_segments.insert( inner_segments.end(), _segments34.begin(), _segments34.end() );
883 for (
auto inner_it = SuperLayer2Segments.begin(); inner_it != SuperLayer2Segments.end(); )
885 FTSegment* inner = *inner_it;
887 bool erased_inner =
false;
890 for (
auto outer_it = SuperLayer4Segments.begin(); outer_it != SuperLayer4Segments.end(); )
892 FTSegment* outer = *outer_it;
895 float D_phi = fabs( in_outerPhi - out_innerPhi );
896 if ( D_phi >
M_PI ) D_phi = 2 *
M_PI - D_phi;
900 if ( D_phi >
M_PI / 12.5 )
913 2. * ( -1. / 2.99792458 / m_pmgnIMF->getReferField() ) *
914 ( inY * outX - inX * outY ) /
916 sqrt( ( inX - outX ) * ( inX - outX ) + ( inY - outY ) * ( inY - outY ) ) );
918 float cache_in = ( ( outer->
kappa() + GapK ) / 3.0 - inner->
kappa() * 2.0 / 3.0 ) / in_r;
920 ( ( inner->
kappa() + GapK ) / 3.0 - outer->
kappa() * 2.0 / 3.0 ) / out_r;
921 float cache_gap = ( ( inner->
kappa() + outer->
kappa() ) / 3.0 - GapK * 2.0 / 3.0 ) *
922 2.0 / ( in_r + out_r );
923 float chi2_z = cache_in * cache_in + cache_out * cache_out + cache_gap * cache_gap;
925 if ( chi2_z > param->_D_phi1 )
934 inner_segments.push_back( inner );
936 inner_it = SuperLayer2Segments.
erase( inner_it );
940 outer_it = SuperLayer4Segments.
erase( outer_it );
944 if ( !erased_inner ) inner_it++;
947 inner_segments.insert( inner_segments.end(), SuperLayer2Segments.begin(),
948 SuperLayer2Segments.end() );
949 inner_segments.insert( inner_segments.end(), SuperLayer4Segments.begin(),
950 SuperLayer4Segments.end() );
953void FTFinder::linkAxialSuperLayer910( FTList<FTSegment*>& outer_segments ) {
954 FTList<FTSegment*>& SuperLayer9Segments = m_geom->getSuperLayer( 9 )->segments();
955 FTList<FTSegment*>& SuperLayer10Segments = m_geom->getSuperLayer( 10 )->segments();
956 linkAxialSegments_step( SuperLayer9Segments, SuperLayer10Segments, outer_segments,
957 param->_D_phi3, param->_chi2_3 );
959 outer_segments.insert( outer_segments.end(), SuperLayer9Segments.begin(),
960 SuperLayer9Segments.end() );
962 outer_segments.insert( outer_segments.end(), SuperLayer10Segments.begin(),
963 SuperLayer10Segments.end() );
966void FTFinder::linkAxialSegments_step( FTList<FTSegment*>& InnerSegments,
967 FTList<FTSegment*>& OuterSegments,
968 FTList<FTSegment*>& Connected,
float maxDphi,
971 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
972 MsgStream log(
msgSvc,
"FTFinder" );
974 for (
auto inner_it = InnerSegments.begin();
975 inner_it != InnerSegments.end(); )
978 FTSegment* inner = *inner_it;
980 const FTLayer* in_outerBound = inner->
outerBoundHits().front()->layer();
982 float min_Dphi =
M_PI / 2;
983 auto min_Dphi_outer_it = OuterSegments.end();
985 for (
auto outer_it = OuterSegments.begin(); outer_it != OuterSegments.end(); outer_it++ )
987 FTSegment* outer = *outer_it;
988 float D_phi = fabs( in_outerPhi - outer->
incomingPhi() );
989 if ( D_phi >
M_PI ) D_phi = 2 *
M_PI - D_phi;
991 if ( D_phi > min_Dphi )
continue;
1000 2. * ( -1. / 2.99792458 / m_pmgnIMF->getReferField() ) *
1001 ( inY * outX - inX * outY ) /
1003 sqrt( ( inX - outX ) * ( inX - outX ) + ( inY - outY ) * ( inY - outY ) ) );
1004 float cache_in = ( ( outer->
kappa() + allK ) / 3.0 - inner->
kappa() * 2 / 3.0 ) / in_r;
1005 float cache_out = ( ( inner->
kappa() + allK ) / 3.0 - outer->
kappa() * 2 / 3.0 ) / out_r;
1006 float cache_all = ( ( inner->
kappa() + outer->
kappa() ) / 3.0 - allK * 2 / 3.0 ) * 2.0 /
1008 float chi2_z = cache_in * cache_in + cache_out * cache_out + cache_all * cache_all;
1010 log << MSG::DEBUG <<
"D_phi: " << D_phi <<
" chi2_z: " << chi2_z
1011 <<
" maxChi2: " << maxChi2 << endmsg;
1013 if ( chi2_z > maxChi2 )
continue;
1015 min_Dphi_outer_it = outer_it;
1018 if ( min_Dphi_outer_it == OuterSegments.end() )
1024 log << MSG::DEBUG <<
"min_Dphi: " << min_Dphi << endmsg;
1026 FTSegment* outer = *min_Dphi_outer_it;
1028 const FTLayer* out_innerBound = outer->
innerBoundHits().front()->layer();
1030 int dLayerId = out_innerBound->
layerId() - in_outerBound->
layerId();
1032 if ( dLayerId == 1 && min_Dphi > maxDphi )
1037 if ( dLayerId == 2 && min_Dphi > maxDphi * 1.5 )
1042 if ( dLayerId == 3 && min_Dphi > maxDphi * 2.25 )
1047 if ( dLayerId != 1 && dLayerId != 2 && dLayerId != 3 )
1055 Connected.push_back( inner );
1056 inner_it = InnerSegments.
erase( inner_it );
1059 OuterSegments.
erase( min_Dphi_outer_it );
1061 log << MSG::DEBUG <<
"DONE!!" << endmsg;
1065void FTFinder::mkTrack3D() {
1067 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
1068 MsgStream log(
msgSvc,
"FTFinder" );
1070 FTList<FTSegment*> multi_trk_cand;
1072 for (
int i = 8; i >= 0; i-- )
1074 if ( i == 4 ) i -= 3;
1075 FTList<FTSegment*>& segments = m_geom->getSuperLayer( i )->segments();
1077 for (
auto s : segments )
1088 for (
auto tmp_trk : _tracks )
1091 log << MSG::DEBUG <<
"coupling to track: " << k << endmsg;
1093 if (
s->update3D( tmp_trk ) )
1105 case 1:
t->append_stereo_cache(
s );
break;
1106 default: multi_trk_cand.push_back(
s );
break;
1110 for (
auto t : _tracks )
t->updateSZ();
1114 for (
auto t : _tracks )
t->linkStereoSegments();
1115 for (
auto t : multi_trk_cand )
t->linkStereoSegments();
1118int FTFinder::VertexFit2D() {
1119 int nTrks = _tracks.size();
1134 for (
auto t : _tracks )
1136 const Lpav& la =
t->lpav();
1139 const float dr_i = a( 1 );
1140 if ( fabs( a( 1 ) ) > 1.5 )
continue;
1141 const float px_i = -
sin( a( 2 ) );
1142 const float py_i =
cos( a( 2 ) );
1144 float weight_i = la.
chisq() / ( la.
nc() * 0.02 );
1146 px.push_back( px_i );
1147 py.push_back( py_i );
1148 dx.push_back( dr_i * py_i );
1149 dy.push_back( -dr_i * px_i );
1150 weight.push_back(
exp( -weight_i * weight_i ) );
1153 if ( dx.size() < 2 )
1161 double S_weight = 0.;
1162 for (
int i = dx.size() - 1; i; i-- )
1164 const float px_i = px[i];
1165 const float py_i = py[i];
1166 const float dx_i = dx[i];
1167 const float dy_i = dy[i];
1168 const float weight_i =
weight[i];
1169 for (
int j = 0; j < i; j++ )
1171 const float px_j = px[j];
1172 const float py_j = py[j];
1174 const float ddx = dx[j] - dx_i;
1175 const float ddy = dx[j] - dy_i;
1177 const float tmp_par = px_i * py_j - px_j * py_i;
1178 const float par = ( py_j * ddx - px_j * ddy ) / tmp_par;
1180 double weight_ij = weight_i *
weight[j];
1181 S_weight += weight_i *
weight[j];
1182 if ( tmp_par == 0 || par < -0.5 || ( py_i * ddx - px_i * ddy ) / tmp_par < -0.5 ||
1183 fabs( ( px_i * px_j + py_i * py_j ) /
1184 sqrt( ( px_i * px_i + py_i * py_i ) * ( px_j * px_j + py_j * py_j ) ) ) >
1187 _vx += ( dx_i + 0.5 * ddx ) * weight_ij;
1188 _vy += ( dy_i + 0.5 * ddy ) * weight_ij;
1192 _vx += ( dx_i + par * px_i ) * weight_ij;
1193 _vy += ( dy_i + par * py_i ) * weight_ij;
1199 if ( S_weight == 0. )
1215int FTFinder::VertexFit(
int z_flag ) {
1220 if ( !z_flag ) {
return VertexFit2D(); }
1222 if ( _tracks.size() < 2 )
1236 FTList<float> pmag2;
1238 FTList<float> weight_z;
1239 FTList<float> sigma2_r;
1240 FTList<float> sigma2_z;
1242 for (
auto t : _tracks )
1244 const Lpav& la =
t->lpav();
1245 if ( la.
nc() <= 3 )
continue;
1246 const zav& za =
t->Zav();
1247 if ( za.
nc() > 2 && za.
b() > -900 )
1249 pmag2.push_back( 1 + za.
b() * za.
b() );
1250 pz.push_back( za.
a() );
1251 dz.push_back( za.
b() );
1252 sigma2_z.push_back( za.
chisq() / ( za.
nc() - 2 ) );
1253 weight_z.push_back(
exp( -( za.
chisq() / ( za.
nc() - 2 ) ) ) );
1259 const float dr_i = a( 1 );
1260 const float px_i = -std::sin( a( 2 ) );
1261 const float py_i = std::cos( a( 2 ) );
1263 px.push_back( px_i );
1264 py.push_back( py_i );
1265 dx.push_back( dr_i * py_i );
1266 dy.push_back( -dr_i * px_i );
1267 sigma2_r.push_back( std::sqrt( la.
chisq() ) / ( la.
nc() - 3 ) );
1271 if ( dx.size() < 2 )
1279 FTList<float> vtx_x;
1280 FTList<float> vtx_y;
1281 FTList<float> vtx_z;
1282 FTList<float> weight2;
1283 FTList<float> weight2_z;
1284 FTList<float> vtx_chi2;
1285 unsigned n_vtx( 0 );
1287 for (
int i = dx.size() - 1; i; i-- )
1289 for (
int j = 0; j < i; j++ )
1292 const float pij_x = py[i] * pz[j] - pz[i] * py[j];
1293 const float pij_y = pz[i] * px[j] - px[i] * pz[j];
1294 const float pij_z = px[i] * py[j] - py[i] * px[j];
1296 if ( pij_x == 0.0f && pij_y == 0.0f && pij_z == 0.0f )
continue;
1298 const float sr = sigma2_r[i] + sigma2_r[j];
1299 const float sz = sigma2_z[i] + sigma2_z[j];
1301 const float ddx = dx[i] - dx[j];
1302 const float ddy = dy[i] - dy[j];
1303 const float ddz = dz[i] - dz[j];
1305 const float pij_mag2 = pij_x * pij_x / ( sr * sz ) + pij_y * pij_y / ( sr * sz ) +
1306 pij_z * pij_z / ( sr * sr );
1308 const float d_i = ( pij_x * ( py[j] * ddz - pz[j] * ddy ) / ( sr * sz ) +
1309 pij_y * ( pz[j] * ddx - px[j] * ddz ) / ( sr * sz ) +
1310 pij_z * ( px[j] * ddy - py[j] * ddx ) / ( sr * sr ) ) /
1313 const float d_j = ( pij_x * ( py[i] * ddz - pz[i] * ddy ) / ( sr * sz ) +
1314 pij_y * ( pz[i] * ddx - px[i] * ddz ) / ( sr * sz ) +
1315 pij_z * ( px[i] * ddy - py[i] * ddx ) / ( sr * sr ) ) /
1318 const float vtx_x_i = dx[i] + px[i] * d_i;
1319 const float vtx_y_i = dy[i] + py[i] * d_i;
1320 const float vtx_z_i = dz[i] + pz[i] * d_i;
1322 const float vtx_x_j = dx[j] + px[j] * d_j;
1323 const float vtx_y_j = dy[j] + py[j] * d_j;
1324 const float vtx_z_j = dz[j] + pz[j] * d_j;
1327 vtx_x.push_back( (
weight[j] * vtx_x_i +
weight[i] * vtx_x_j ) / weight_ij );
1328 vtx_y.push_back( (
weight[j] * vtx_y_i +
weight[i] * vtx_y_j ) / weight_ij );
1329 vtx_z.push_back( ( weight_z[j] * vtx_z_i + weight_z[i] * vtx_z_j ) /
1330 ( weight_z[i] + weight_z[j] ) );
1332 weight2.push_back(
exp( -sr ) );
1333 weight2_z.push_back(
exp( -sz ) );
1334 vtx_chi2.push_back( ( ( vtx_x_i - vtx_x_j ) * ( vtx_x_i - vtx_x_j ) +
1335 ( vtx_y_i - vtx_y_j ) * ( vtx_y_i - vtx_y_j ) ) /
1337 ( vtx_z_i - vtx_z_j ) * ( vtx_z_i - vtx_z_j ) / sz );
1342 float S_weight( 0.0f );
1343 float S_weight_z( 0.0f );
1344 for (
int i = 0; i < vtx_chi2.size(); i++ )
1346 if ( vtx_chi2[i] > 10. )
continue;
1347 float w( std::exp( -vtx_chi2[i] ) );
1348 _vx += vtx_x[i] * weight2[i] *
w;
1349 _vy += vtx_y[i] * weight2[i] *
w;
1350 _vz += vtx_z[i] * weight2_z[i] *
w;
1351 S_weight += weight2[i] *
w;
1352 S_weight_z += weight2_z[i] *
w;
1356 if ( S_weight <= 0. )
1368 if ( !z_flag )
return rtn_flag;
1370 if ( S_weight_z <= 0. ) { _vz = -9999.; }
1379int FTFinder::findBestVertex() {
1380 if ( _tracks.size() < 2 )
1388 float min_dr = 9999.;
1390 for (
auto t : _tracks )
1392 HepVector a =
t->lpav().Hpar(
pivot );
1393 if ( fabs( a( 1 ) ) < fabs( min_dr ) )
1399 _vx = min_dr *
cos( phi0 );
1400 _vy = min_dr *
sin( phi0 );
1404int FTFinder::CorrectEvtTiming() {
1405 float weight_sum = 0.;
1407 for (
auto t : _tracks )
1413 const Lpav& la =
t->lpav();
1415 const FTList<FTSegment*>& axial_sgmnts =
t->axial_segments();
1417 for (
auto axial_seg : axial_sgmnts )
1419 FTList<FTWire*>& hits = axial_seg->wireHits();
1421 for (
auto h : hits )
1423 const float x = h->x();
1424 const float y = h->y();
1425 double d0 = fabs( la.
d( (
double)
x, (
double)y ) );
1426 if ( d0 >= 0.47f * h->layer()->csize() )
continue;
1429 float dt =
x2t( h->layer(), d0 ) - h->time();
1431 dtt_sum += (
dt *
dt );
1435 if ( !nHits )
continue;
1437 float weight_t =
exp( -( dtt_sum - ( dt_sum * dt_sum / nHits ) ) / ( nHits * 1600 ) );
1438 weight_sum += ( nHits * weight_t );
1439 dt_sum2 += ( dt_sum * weight_t );
1441 return int( dt_sum2 / weight_sum );
1445void FTFinder::makeMdst(
void ) {
1448 for (
auto t : _tracks )
1456 for (
auto seg : axialSegments )
1458 FTList<FTWire*>& wires = seg->wireHits();
1459 for (
auto w : wires ) {
g_ncell->fill(
w->getWireId() ); }
1462 for (
auto seg : stereoSegments )
1464 FTList<FTWire*>& wires = seg->wireHits();
1465 for (
auto w : wires ) {
g_ncell->fill(
w->getWireId() ); }
1469 if ( h.
tanl() < -9000. )
continue;
1476 g_px[Ntable - 1] = p.x();
1478 g_py[Ntable - 1] = p.y();
1480 g_pz[Ntable - 1] = p.z();
1481 g_p[Ntable - 1] = p.mag();
1482 g_phi[Ntable - 1] = atan2( m_py, m_px );
1484 g_dr[Ntable - 1] = h.
dr();
1487 g_pt[Ntable - 1] = 1 / fabs( h.
kappa() );
1488 g_dz[Ntable - 1] = h.
dz();
1491 g_vx[Ntable - 1] =
v( 0 );
1492 g_vy[Ntable - 1] =
v( 1 );
1493 g_vz[Ntable - 1] =
v( 2 );
1502StatusCode FTFinder::makeTds() {
1504 Gaudi::svcLocator()->service(
"MessageSvc",
msgSvc ).ignore();
1505 MsgStream log(
msgSvc,
"FTFinder" );
1507 IDataProviderSvc* eventSvc;
1508 Gaudi::svcLocator()->service(
"EventDataSvc", eventSvc ).ignore();
1512 log << MSG::FATAL <<
"makeTds:Could not find eventSvc" << endmsg;
1513 return StatusCode::FAILURE;
1521 log << MSG::DEBUG <<
"beginning to make RecMdcTrackCol" << endmsg;
1524 int trkid = 0, i = -1;
1525 for (
auto fttrk :
tracks() )
1529 RecMdcTrack* trk =
new RecMdcTrack;
1531 if ( fttrk->helix()->tanl() < -9000. )
1533 log << MSG::DEBUG <<
"deleted trackId = " << i + 1
1534 <<
" due to tanl = " << fttrk->helix()->tanl() << endmsg;
1541 HepVector m_a( 5, 0 );
1542 m_a = fttrk->helix()->a();
1544 HepSymMatrix m_ea = fttrk->helix()->Ea();
1545 float fiterm = fttrk->lpav().phi( 77.0 );
1546 float chi2lpav = fttrk->lpav().chisq();
1547 float chi2zav = fttrk->Zav().chisq();
1549 m_ea[0][0] = 0.0085;
1550 m_ea[1][1] = 0.000011;
1551 m_ea[2][2] = 0.0018;
1553 m_ea[4][4] = 0.00026;
1554 m_ea[1][0] = m_ea[0][1] = -0.00029;
1555 m_ea[2][0] = m_ea[0][2] = charge * 0.004;
1556 m_ea[2][1] = m_ea[1][2] = charge * 0.00012;
1557 m_ea[3][0] = m_ea[0][3] = -0.017;
1558 m_ea[3][1] = m_ea[1][3] = 0.0;
1559 m_ea[3][2] = m_ea[2][3] = 0.0;
1560 m_ea[4][0] = m_ea[0][4] = 0.0;
1561 m_ea[4][1] = m_ea[1][4] = 0.0;
1562 m_ea[4][2] = m_ea[2][4] = 0.0;
1563 m_ea[4][3] = m_ea[3][4] = -0.018;
1570 trk->
setChi2( chi2lpav + chi2zav );
1573 log << MSG::DEBUG <<
" trackId = " << i << endmsg;
1574 log << MSG::DEBUG <<
"fast-tracking kappa " << m_a[2] <<
" fast-tracking tanl "
1575 << m_a[4] << endmsg;
1576 log << MSG::DEBUG <<
"push_backed kappa " << trk->
helix( 2 ) <<
" push_backed tanl "
1577 << trk->
helix( 4 ) << endmsg;
1579 log << MSG::DEBUG <<
"beginning to make hitlist and RecMdcHitCol " << endmsg;
1587 const FTList<FTSegment*>& seglist_ax = fttrk->axial_segments();
1590 for (
auto seg_ax_i : seglist_ax )
1592 FTList<FTWire*>& hitlist_ax = seg_ax_i->wireHits();
1593 ntrackhits += hitlist_ax.size();
1595 for (
auto wire_ax : hitlist_ax )
1597 double dd = wire_ax->distance();
1599 double tdc = wire_ax->time();
1600 double chi2 = wire_ax->getChi2();
1601 const Identifier mdcid =
1602 MdcID::wire_id( wire_ax->layer()->layerId(), wire_ax->localId() );
1604 RecMdcHit* hit =
new RecMdcHit;
1605 hit->
setId( hitindex );
1614 log << MSG::DEBUG <<
"Hit DriftDistLeft " << hit->
getDriftDistLeft() << endmsg;
1615 log << MSG::DEBUG <<
"MDC Hit ADC " << hit->
getAdc() << endmsg;
1616 log << MSG::DEBUG <<
"Hit MDC Identifier " << hit->
getMdcId() << endmsg;
1617 log << MSG::DEBUG <<
"Hit Chisq " << hit->
getChisqAdd() << endmsg;
1620 hitcol->push_back( hit );
1621 SmartRef<RecMdcHit> refhit( hit );
1622 hitrefvec.push_back( refhit );
1627 const FTList<FTSegment*>& seglist_st = fttrk->stereo_segments();
1631 for (
auto seg_st_i : seglist_st )
1633 FTList<FTWire*>& hitlist_st = seg_st_i->wireHits();
1635 ntrackhits += hitlist_st.size();
1636 ntrackster += hitlist_st.size();
1638 for (
auto wire_st : hitlist_st )
1640 double dd = wire_st->distance();
1642 double tdc = wire_st->time();
1643 double chi2 = wire_st->getChi2();
1644 const Identifier mdcid =
1645 MdcID::wire_id( wire_st->layer()->layerId(), wire_st->localId() );
1647 RecMdcHit* hit =
new RecMdcHit;
1648 hit->
setId( hitindex );
1657 log << MSG::DEBUG <<
"Z Hit DriftDistLeft " << hit->
getDriftDistLeft() << endmsg;
1658 log << MSG::DEBUG <<
"Z MDC Hit ADC " << hit->
getAdc() << endmsg;
1659 log << MSG::DEBUG <<
"Z Hit MDC Identifier " << hit->
getMdcId() << endmsg;
1660 log << MSG::DEBUG <<
"Z Hit Chisq " << hit->
getChisqAdd() << endmsg;
1663 hitcol->push_back( hit );
1664 SmartRef<RecMdcHit> refhit( hit );
1665 hitrefvec.push_back( refhit );
1672 trkcol->push_back( trk );
1676 g_naxialhit->fill( ( ntrackhits - ntrackster ), 1.0 );
1678 g_nhit->fill( ntrackhits, 1.0 );
1682 IDataManagerSvc* dataManSvc =
dynamic_cast<IDataManagerSvc*
>( eventSvc );
1684 DataObject* aTrackCol;
1685 eventSvc->findObject(
"/Event/Recon/RecMdcTrackCol", aTrackCol ).ignore();
1688 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcTrackCol" ).ignore();
1689 eventSvc->unregisterObject(
"/Event/Recon/RecMdcTrackCol" ).ignore();
1692 DataObject* aRecHitCol;
1693 eventSvc->findObject(
"/Event/Recon/RecMdcHitCol", aRecHitCol ).ignore();
1696 dataManSvc->clearSubTree(
"/Event/Recon/RecMdcHitCol" ).ignore();
1697 eventSvc->unregisterObject(
"/Event/Recon/RecMdcHitCol" ).ignore();
1702 hitsc = eventSvc->registerObject(
"/Event/Recon/RecMdcHitCol", hitcol );
1703 if ( !hitsc.isSuccess() )
1705 log << MSG::FATAL <<
"Could not register RecMdcHitCol" << endmsg;
1710 log << MSG::DEBUG <<
"RecMdcHitCol registered successfully!" << endmsg;
1712 RecMdcTrackCol::iterator bef = trkcol->begin();
1713 for ( ; bef != trkcol->end(); bef++ )
1715 log << MSG::DEBUG <<
" registered kappa" << ( *bef )->helix( 2 ) <<
" registered tanl"
1716 << ( *bef )->helix( 4 ) << endmsg;
1722 trksc = eventSvc->registerObject(
"/Event/Recon/RecMdcTrackCol", trkcol );
1723 if ( !trksc.isSuccess() )
1725 log << MSG::FATAL <<
"Could not register RecMdcTrackCol" << endmsg;
1730 log << MSG::DEBUG <<
"RecMdcTrackCol registered successfully!" << endmsg;
1733 SmartDataPtr<RecMdcHitCol> newhitCol( eventSvc,
"/Event/Recon/RecMdcHitCol" );
1736 log << MSG::FATAL <<
"Could not find RecMdcHit" << endmsg;
1737 return ( StatusCode::FAILURE );
1740 log << MSG::DEBUG <<
"Begin to check RecMdcHitCol" << endmsg;
1742 RecMdcHitCol::iterator iter_hit = newhitCol->begin();
1743 for ( ; iter_hit != newhitCol->end(); iter_hit++ )
1745 log << MSG::DEBUG <<
"retrieved MDC Hit:"
1746 <<
" DDL " << ( *iter_hit )->getDriftDistLeft() <<
" DDR "
1747 << ( *iter_hit )->getDriftDistRight() <<
" ADC " << ( *iter_hit )->getAdc()
1752 SmartDataPtr<RecMdcTrackCol> newtrkCol( eventSvc,
"/Event/Recon/RecMdcTrackCol" );
1755 log << MSG::FATAL <<
"Could not find RecMdcTrackCol" << endmsg;
1756 return ( StatusCode::FAILURE );
1759 log << MSG::DEBUG <<
"Begin to check RecMdcTrackCol" << endmsg;
1760 RecMdcTrackCol::iterator iter_trk = newtrkCol->begin();
1761 for ( ; iter_trk != newtrkCol->end(); iter_trk++ )
1763 log << MSG::DEBUG <<
"retrieved MDC track:"
1764 <<
"Track Id: " << ( *iter_trk )->trackId() <<
" Pivot: " << ( *iter_trk )->poca()[0]
1765 <<
" " << ( *iter_trk )->poca()[1] <<
" " << ( *iter_trk )->poca()[2] << endmsg;
1767 log << MSG::DEBUG <<
"hitList of this track:" << endmsg;
1768 HitRefVec gothits = ( *iter_trk )->getVecHits();
1769 HitRefVec::iterator it_gothit = gothits.begin();
1770 for ( ; it_gothit != gothits.end(); it_gothit++ )
1772 log << MSG::DEBUG <<
"hits Id: " << ( *it_gothit )->getId() <<
" hits DDL&DDR "
1773 << ( *it_gothit )->getDriftDistLeft() <<
" hits MDC IDentifier "
1774 << ( *it_gothit )->getMdcId() << endmsg <<
" hits TDC " << ( *it_gothit )->getTdc()
1775 <<
" hits ADC " << ( *it_gothit )->getAdc() << endmsg;
1780 return StatusCode::SUCCESS;
1784 for (
auto t : _tracks )
delete t;
1785 for (
auto s : _linkedSegments )
delete s;
1787 if ( param->_doIt ) clear();
ObjectVector< RecEsTime > RecEsTimeCol
std::vector< MdcDigi * > MdcDigiVec
EvtComplex exp(const EvtComplex &c)
IHistogram1D * g_nstereohit
NTuple::Array< float > g_pz
NTuple::Array< float > g_theta
NTuple::Array< float > g_pxMC
NTuple::Array< float > g_pzMC
NTuple::Array< float > g_pyMC
NTuple::Array< float > g_dr
IHistogram2D * g_hitmap[20]
NTuple::Array< float > g_kappa
NTuple::Array< float > g_ptMC
NTuple::Item< float > g_estime
NTuple::Array< float > g_dz
NTuple::Array< float > g_tanl
NTuple::Item< long > g_ntrk
NTuple::Item< long > g_ntrkMC
NTuple::Array< float > g_phi0MC
NTuple::Array< float > g_py
NTuple::Array< float > g_px
NTuple::Array< float > g_pt
NTuple::Array< float > g_p
NTuple::Array< float > g_phi0
NTuple::Array< float > g_vx
IHistogram1D * g_naxialhit
NTuple::Array< float > g_vy
NTuple::Array< float > g_theta0MC
NTuple::Array< float > g_vz
NTuple::Array< float > g_phi
HepGeom::Point3D< double > HepPoint3D
double sin(const BesAngle a)
double cos(const BesAngle a)
ObjectVector< RecMdcHit > RecMdcHitCol
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
NTuple::Item< double > m_pz
*********Class see also m_nmax DOUBLE PRECISION m_MasPhot DOUBLE PRECISION m_phsu DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_r2 DOUBLE PRECISION m_WtMass INTEGER m_nmax INTEGER m_Nevgen INTEGER m_IsFSR INTEGER m_MarTot *COMMON c_KarFin $ !Output file $ !Event serial number $ !alpha QED at Thomson limit $ !minimum energy at CMS for remooval $ !infrared dimensionless $ !dummy photon IR regulator $ !crude photon multiplicity enhancement factor *EVENT $ !MC crude volume of PhhSpace *Sfactors $ !YFS formfactor IR part only $ !YFS formfactor non IR finite part $ !mass weight
**********Class see also m_nmax DOUBLE PRECISION m_amel DOUBLE PRECISION m_x2 DOUBLE PRECISION m_alfinv DOUBLE PRECISION m_Xenph INTEGER m_KeyWtm INTEGER m_idyfs DOUBLE PRECISION m_zini DOUBLE PRECISION m_q2 DOUBLE PRECISION m_Wt_KF DOUBLE PRECISION m_WtCut INTEGER m_KFfin *COMMON c_KarLud $ !Input CMS energy[GeV] $ !CMS energy after beam spread beam strahlung[GeV] $ !Beam energy spread[GeV] $ !z boost due to beam spread $ !electron beam mass *ff pair spectrum $ !minimum v
void setTrackId(const int trackId)
void setNster(const int ns)
void setError(double err[15])
void setHelix(double helix[5])
const HepVector helix() const
......
void setChi2(const double chi)
FTList< FTTrack * > & tracks()
returns track list
FTSuperLayer * superLayer(int id) const
returns superlayer
float t2x(const FTLayer *l, const float t) const
convert t to x
void event()
track finder core
void init()
initializer(creates geometry)
CLHEP::Hep3Vector vertex() const
returns event primary vertex
void begin_run()
begin run function(reads constants)
void setAlgorithmPointer(Algorithm *)
returns FTFinder pointer
int getWireId(FTWire *) const
returns wire ID for given FTWire object
float x2t(const FTLayer *l, const float x) const
convert x to t
FTFinder()
Constructors and destructor.
FTList< FTList< float > > tEstime
static FTGeom * instance()
const float r() const
returns r form origin
double csize() const
returns cell size
const int layerId() const
returns layer ID
std::vector< T >::iterator erase(typename std::vector< T >::iterator it)
float incomingPhi() const
returns phi of incoming position
FTList< FTWire * > & wireHits()
returns wire-hit FTList
float r() const
returns r from origin
float outgoingY() const
returns y of outgoing position
float kappa() const
returns kappa(axial)
float outgoingX() const
returns x of outgoing position
float incomingX() const
returns x of incoming position
const FTList< FTWire * > & innerBoundHits()
returns innerBoundHits
void update()
update information for axial segment
const FTList< FTWire * > & outerBoundHits()
returns outerBoundHits
float outgoingPhi() const
returns phi of outgoing position
float incomingY() const
returns y of incoming position
void connect_outer(const FTList< FTWire * > &, const FTList< FTWire * > &)
connect short segments
void appendHit(FTWire *)
append wireHit to the list of hits
const FTList< FTSegment * > & stereo_segments()
returns stereo_segments
void setFTFinder(FTFinder *)
float chi2_kappa_tmp() const
returns sigmaKappa at linking
const FTList< FTSegment * > & axial_segments()
returns axial segments
Helix * helix() const
returns helix parameters
FTLayer * layer() const
returns layer
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
double dr(void) const
returns an element of parameters.
const HepPoint3D & pivot(void) const
returns pivot position.
double d(double x, double y) const
HepVector Hpar(const HepPoint3D &pivot) const
static Identifier wire_id(int wireType, int layer, int wire)
For a single wire.
static int layer(const Identifier &id)
Values of different levels (failure returns 0).
static int wire(const Identifier &id)
static MdcParameter * instance()
static int MdcChargeChannel(double charge)
static double MdcTime(int timeChannel)
static double MdcCharge(int chargeChannel)
void setTest(double Test)
void setMdcId(Identifier mdcid)
const double getChisqAdd(void) const
void setDriftDistLeft(double ddl)
const double getAdc(void) const
const Identifier getMdcId(void) const
const double getDriftDistLeft(void) const
void setChisqAdd(double pChisq)
void setDriftDistRight(double ddr)
void setPivot(const HepPoint3D &pivot)
void setVecHits(HitRefVec vechits)
void setFiTerm(double fiterm)