10#include "GaudiKernel/MsgStream.h"
11#include "GaudiKernel/AlgFactory.h"
12#include "GaudiKernel/ISvcLocator.h"
13#include "GaudiKernel/SmartDataPtr.h"
14#include "GaudiKernel/IDataProviderSvc.h"
15#include "GaudiKernel/IDataManagerSvc.h"
16#include "GaudiKernel/PropertyMgr.h"
30#include "GaudiKernel/IPartPropSvc.h"
49 Algorithm(name, pSvcLocator)
52 declareProperty(
"FittingMethod", m_fittingMethod = 2);
53 declareProperty(
"ConfigFile", m_configFile =
"MucConfig.xml");
54 declareProperty(
"McCosmic", m_mccosmic = 0);
55 declareProperty(
"OnlySeedFit", m_onlyseedfit = 0);
56 declareProperty(
"NtOutput", m_NtOutput = 0);
57 declareProperty(
"MaxHitsRec", m_maxHitsRec = 200);
58 declareProperty(
"United", m_united = 0);
59 declareProperty(
"SeedType", m_seedtype = 0);
60 declareProperty(
"MsOutput", m_MsOutput =
false);
66 MsgStream log(
msgSvc(), name());
67 log << MSG::INFO <<
"in initialize()" << endreq;
71 for(
int i = 0; i < 20; i++) m_NHitsLost.push_back(0);
72 for(
int i = 0; i < 10; i++) m_NHitsLostInGap.push_back(0);
79 StatusCode sc = service(
"MucGeomSvc", mucGeomSvc);
80 if (sc == StatusCode::SUCCESS) {
86 return StatusCode::FAILURE;
89 aMucRecHitContainer = 0;
94 if ( nt1 ) { m_tuple = nt1;}
97 m_tuple =
ntupleSvc()->book (
"FILE401/T", CLID_RowWiseTuple,
"MucTrkRecon N-Tuple");
99 sc = m_tuple->addItem (
"part", m_part);
100 sc = m_tuple->addItem (
"seg", m_seg);
101 sc = m_tuple->addItem (
"gap", m_gap);
102 sc = m_tuple->addItem (
"strip", m_strip);
103 sc = m_tuple->addItem (
"diff", m_diff);
104 sc = m_tuple->addItem (
"dist", m_dist);
105 sc = m_tuple->addItem (
"run", m_run);
106 sc = m_tuple->addItem (
"event", m_event);
107 sc = m_tuple->addItem (
"ngap", m_ngapwithhits);
108 sc = m_tuple->addItem (
"nhit", m_nhit);
109 sc = m_tuple->addItem (
"maxhit", m_maxhit);
110 sc = m_tuple->addItem (
"multihit",m_multihit);
111 sc = m_tuple->addItem (
"angleCosmic",m_angle_cosmic);
112 sc = m_tuple->addItem (
"angleUpdown",m_angle_updown);
113 sc = m_tuple->addItem (
"px",m_px);
114 sc = m_tuple->addItem (
"py",m_py);
115 sc = m_tuple->addItem (
"pz",m_pz);
116 sc = m_tuple->addItem (
"theta",m_theta);
117 sc = m_tuple->addItem (
"phi",m_phi);
118 sc = m_tuple->addItem (
"theta_pipe",m_theta_pipe);
119 sc = m_tuple->addItem (
"phi_pipe",m_phi_pipe);
120 sc = m_tuple->addItem (
"pxmc",m_px_mc);
121 sc = m_tuple->addItem (
"pymc",m_py_mc);
122 sc = m_tuple->addItem (
"pzmc",m_pz_mc);
123 sc = m_tuple->addItem (
"thetamc",m_theta_mc);
124 sc = m_tuple->addItem (
"phimc",m_phi_mc);
125 sc = m_tuple->addItem (
"thetamc_pipe",m_theta_mc_pipe);
126 sc = m_tuple->addItem (
"phimc_pipe",m_phi_mc_pipe);
127 sc = m_tuple->addItem (
"emcUp",m_emcUp);
128 sc = m_tuple->addItem (
"emcDown",m_emcDown);
129 sc = m_tuple->addItem (
"mucUp",m_mucUp);
130 sc = m_tuple->addItem (
"mucDown",m_mucDown);
131 sc = m_tuple->addItem (
"projx",m_projx);
132 sc = m_tuple->addItem (
"projz",m_projz);
136 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple) << endmsg;
142 return StatusCode::SUCCESS;
148 MsgStream log(
msgSvc(), name());
149 log << MSG::INFO <<
"in execute()" << endreq;
154 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
156 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
157 return( StatusCode::FAILURE);
159 log << MSG::INFO <<
"Run: " << eventHeader->runNumber() <<
" Event: " << eventHeader->eventNumber() << endreq;
165 Hep3Vector cosmicMom;
167 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
168 if (!mcParticleCol) {
169 log << MSG::FATAL <<
"Could not find McParticle" << endreq;
170 return( StatusCode::FAILURE);
173 McParticleCol::iterator iter_mc = mcParticleCol->begin();
174 for (;iter_mc != mcParticleCol->end(); iter_mc++, digiId++) {
176 <<
" particleId = " << (*iter_mc)->particleProperty()
178 int pid = (*iter_mc)->particleProperty();
180 if(fabs(pid)!=13)
continue;
182 HepLorentzVector initialMomentum = (*iter_mc)->initialFourMomentum();
183 Hep3Vector startP(initialMomentum.px(), initialMomentum.py(), initialMomentum.pz());
184 Hep3Vector rotate(-initialMomentum.px(),initialMomentum.pz(),initialMomentum.py());
187 m_px_mc = initialMomentum.px();
188 m_py_mc = initialMomentum.py();
189 m_pz_mc = initialMomentum.pz();
191 m_theta_mc = rotate.theta();
192 m_phi_mc = rotate.phi();
194 m_theta_mc_pipe = startP.theta();
195 m_phi_mc_pipe = startP.phi();
261 SmartDataPtr<MucDigiCol> mucDigiCol(eventSvc(),
"/Event/Digi/MucDigiCol");
263 log << MSG::FATAL <<
"Could not find MUC digi" << endreq;
264 return( StatusCode::FAILURE);
267 MucDigiCol::iterator iter4 = mucDigiCol->begin();
269 for (;iter4 != mucDigiCol->end(); iter4++, digiId++) {
271 log << MSG::INFO <<
"MUC digis:: " << digiId << endreq;
272 if( digiId == 0)
return( StatusCode::SUCCESS );
282 if (!aMucRecHitContainer) {
285 aMucRecHitContainer->
Clear();
291 SmartIF<IDataManagerSvc> dataManSvc(eventSvc());
292 DataObject *mucRecHitCol;
293 eventSvc()->findObject(
"/Event/Recon/MucRecHitCol",mucRecHitCol);
294 if(mucRecHitCol != NULL) {
295 dataManSvc->clearSubTree(
"/Event/Recon/MucRecHitCol");
296 eventSvc()->unregisterObject(
"/Event/Recon/MucRecHitCol");
299 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon/MucRecHitCol", aMucRecHitContainer->
GetMucRecHitCol());
301 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
303 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
304 mucID = (*iterMuc)->identify();
312 aMucRecHitContainer->
AddHit(part, seg, gap, strip);
313 log << MSG::INFO <<
" digit" << mucDigiId <<
" : "
317 <<
" strip " << strip
321 DataObject *aReconEvent ;
322 eventSvc()->findObject(
"/Event/Recon",aReconEvent);
323 if(aReconEvent==NULL) {
326 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
327 if(sc!=StatusCode::SUCCESS) {
328 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
329 return( StatusCode::FAILURE);
332 StatusCode fr = eventSvc()->findObject(
"/Event/Recon",aReconEvent);
333 if(fr!=StatusCode::SUCCESS) {
334 log << MSG::WARNING <<
"Could not find register ReconEvent, will create it" <<endreq;
335 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
336 if(sc!=StatusCode::SUCCESS) {
337 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
338 return( StatusCode::FAILURE);
344 DataObject *mucTrackCol;
345 eventSvc()->findObject(
"/Event/Recon/RecMucTrackCol",mucTrackCol);
346 if(mucTrackCol != NULL) {
347 dataManSvc->clearSubTree(
"/Event/Recon/RecMucTrackCol");
348 eventSvc()->unregisterObject(
"/Event/Recon/RecMucTrackCol");
352 sc = eventSvc()->registerObject(
"/Event/Recon/RecMucTrackCol", aMucTrackCol);
353 aMucTrackCol->clear();
356 SmartDataPtr<RecMucTrackCol> findMucTrackCol(eventSvc(),
"/Event/Recon/RecMucTrackCol");
357 if (!findMucTrackCol) {
358 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endreq;
359 return( StatusCode::FAILURE);
361 aMucTrackCol->clear();
364 log << MSG::INFO <<
"MaxHitsRec : "<<m_maxHitsRec<< endreq;
365 if(digiId> m_maxHitsRec)
return StatusCode::SUCCESS;
372 else if(m_united == 1){
375 if (!aMucRecHitContainer) {
378 aMucRecHitContainer->
Clear();
380 SmartDataPtr<MucRecHitCol> aMucRecHitCol (eventSvc(),
"/Event/Recon/MucRecHitCol");
381 if(aMucRecHitCol == NULL) {
382 log << MSG::WARNING <<
"MucRecHitCol is NULL" << endreq;
387 SmartDataPtr<RecMucTrackCol> mucTrackCol (eventSvc(),
"/Event/Recon/RecMucTrackCol");
388 if(mucTrackCol == NULL) {
389 log << MSG::WARNING <<
"aMucTrackCol is NULL" << endreq;
392 log << MSG::INFO <<
"mucTrackCol size: "<<mucTrackCol->size()<<
" hitCol size: "<<aMucRecHitCol->size()<<endreq;
393 aMucTrackCol = mucTrackCol;
396 SmartDataPtr<RecExtTrackCol> aExtTrackCol(eventSvc(),
"/Event/Recon/RecExtTrackCol");
398 log << MSG::WARNING <<
"Can't find ExtTrackCol in TDS!" << endreq;
401 SmartDataPtr<RecMdcTrackCol> aMdcTrackCol(eventSvc(),
"/Event/Recon/RecMdcTrackCol");
403 log << MSG::WARNING <<
"Can't find MdcTrackCol in TDS!" << endreq;
406 if( aExtTrackCol && aMdcTrackCol ) trackId = aMdcTrackCol->size();
407 muctrackId = aMucTrackCol->size();
412 SmartDataPtr<RecEmcShowerCol> aShowerCol(eventSvc(),
"/Event/Recon/RecEmcShowerCol");
414 log << MSG::WARNING <<
"Could not find RecEmcShowerCol" << endreq;
418 RecEmcShowerCol::iterator iShowerCol;
419 for(iShowerCol=aShowerCol->begin();
420 iShowerCol!=aShowerCol->end();
428 if(((*iShowerCol)->position()).phi()>0&&((*iShowerCol)->position()).phi()<3.1415926) hasEmcUp++;
433 m_emcUp = hasEmcUp; m_emcDown = hasEmcDown;
458 log << MSG::INFO <<
"Muc 2D 3D Road Container created" << endreq;
468 int count0, count1, count, iGap0, iGap1;
473 for (
int iOrient = 0; iOrient < 2; iOrient++) {
476 for (
int iLoop = 0; iLoop < nLoops; iLoop++) {
485 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
488 iGap0 = 0; iGap1 = 0;
489 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
490 mucID = (*iterMuc)->identify();
496 if ( (part == 1 && gap % 2 == 0) || (part != 1 && gap % 2 == 1) ) orient = 1;
498 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 0){
502 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 1 && gap != iGap0 ){
508 if(m_MsOutput) cout <<
"Find seed gap in ( "<<iPart<<
" "<<iSeg<<
" ) gap0: "<<iGap0<<
" gap1: "<<iGap1<<endl;
516 if(iGap1 == iGap0)
continue;
519 for (
int iHit0 = 0; iHit0 < count0; iHit0++) {
521 pHit0 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap0, iHit0);
523 log << MSG::FATAL <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
524 <<
" seg " << iSeg <<
" gap " << iGap0 <<
" null pointer"
530 if(m_united == 1 && pHit0->
GetHitMode() != -1)
continue;
533 if(m_MsOutput) cout <<
"part " << iPart <<
" seg " << iSeg <<
" orient " << iOrient
534 <<
" gap0 " << iGap0 <<
" count0 " << count0
535 <<
" gap1 " << iGap1 <<
" count1 " << count1 << endl;
536 for (
int iHit1 = 0; iHit1 < count1; iHit1++) {
538 pHit1 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap1, iHit1);
540 log << MSG::ERROR <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
541 <<
" seg " << iSeg <<
" gap " << iGap1 <<
" null pointer"
546 if(m_united == 1 && pHit1->GetHitMode() != -1)
continue;
552 log << MSG::FATAL <<
"MucRecRoadFinder-E20 " <<
"failed to create 2D road!" << endreq;
557 if (!pHit0->
GetGap()) log << MSG::ERROR <<
"pHit0->GetGap(), null pointer" << endreq;
566 pHit1->SetHitSeed(
true);
569 if(m_MsOutput) cout <<
"pHit0 attached, " << road2D->
GetTotalHits()
570 <<
", hitId= "<<pHit0->
Part()<<
" "<<pHit0->
Seg()<<
" "<<pHit0->
Gap()<<
" "<<pHit0->
Strip()<<endl;
573 if (pHit1->GetGap()->Orient() == iOrient) {
579 if(m_MsOutput) cout <<
"pHit1 attached, " << road2D->
GetTotalHits()
580 <<
", hitId= "<<pHit1->Part()<<
" "<<pHit1->Seg()<<
" "<<pHit1->Gap()<<
" "<<pHit1->Strip()<<endl;
582 if(m_MsOutput) cout <<
"Hit cout " << road2D->
GetTotalHits() <<
", slope " << road2D->
GetSlope() << endl;
589 for (
int i = 0; i < length; i++) {
592 float dXmin = kInfinity;
604 for (
int iHit = 0; iHit < count; iHit++) {
605 pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
607 log << MSG::FATAL <<
"MucRecRoadFinder-E20 null cluster pointer pHit" << endreq;
613 if(m_united == 1 && pHit->
GetHitMode() != -1)
continue;
617 if(m_MsOutput) cout<<
"dX = "<<dX<<
" Win = "<<Win<<
", hit: "<<pHit->
Part()<<
" "<<pHit->
Seg()<<
" "<<pHit->
Gap()<<
" "<<pHit->
Strip()<<endl;
622 if(iGap == iGap0 || iGap == iGap1) {
631 if(m_onlyseedfit == 0)road2D->
AttachHit(pHit);
633 if(iGap == iGap0 || iGap == iGap1) road2D->
AttachHit(pHit);
650 bool lastGapOK =
false;
661 bool firedGapsOK =
false;
670 bool duplicateRoad =
false;
671 int maxSharedHits = 0, sharedHits = 0;
673 for (
int index = 0; index < (int)p2DRoad0C->size(); index++) {
674 sharedHits =(*p2DRoad0C)[index]->GetNSharedHits(road2D);
676 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
679 for (
int index = 0; index < (int)p2DRoad1C->size(); index++) {
680 sharedHits = (*p2DRoad1C)[index]->GetNSharedHits(road2D);
682 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
687 duplicateRoad =
true;
688 log<<MSG::INFO <<
" maxSharedHits " << maxSharedHits <<
" > " <<
kMinSharedHits2D << endreq;
697 if (lastGapOK && firedGapsOK && !duplicateRoad) {
699 log<<MSG::INFO <<
"Add a road0" << endreq;
700 p2DRoad0C->add(road2D);
703 log<<MSG::INFO <<
"Add a road1" << endreq;
704 p2DRoad1C->add(road2D);
710 vector<MucRecHit*> road2DHits = road2D->
GetHits();
711 for(
int i=0; i< road2DHits.size(); i++)
714 if(ihit->
Gap() == iGap0 || ihit->
Gap() == iGap1){
730 int print2DRoadInfo = 0;
731 if (print2DRoadInfo == 1) {
733 cout <<
"In 2DRoad container : " << endl
734 <<
" Num of 2DRoad0 = " << p2DRoad0C->size() << endl
737 for (
int iRoad = 0; iRoad < (int)p2DRoad0C->size(); iRoad++) {
740 cout <<
" " << iRoad <<
"th 2DRoad0 :" << endl
741 <<
" Part = " << road->
GetPart() << endl
742 <<
" Seg = " << road->
GetSeg() << endl
743 <<
" Orient = " << road->
GetOrient() << endl
744 <<
" LastGap = " << road->
GetLastGap() << endl
747 <<
" Slope = " << road->
GetSlope() << endl
753 cout <<
" Num of 2DRoad1 = " << p2DRoad1C->size() << endl
756 for (
int iRoad = 0; iRoad < (int)p2DRoad1C->size(); iRoad++) {
759 cout <<
" " << iRoad <<
"th 2DRoad1 :" << endl
760 <<
" Part = " << road->
GetPart() << endl
761 <<
" Seg = " << road->
GetSeg() << endl
762 <<
" Orient = " << road->
GetOrient() << endl
763 <<
" LastGap = " << road->
GetLastGap() << endl
766 <<
" Slope = " << road->
GetSlope() << endl
775 for (
int iRoad0 = 0; iRoad0 < (int)p2DRoad0C->size(); iRoad0++) {
777 for (
int iRoad1 = 0; iRoad1 < (int)p2DRoad1C->size(); iRoad1++){
781 if ( !(road0 &&road1) ) {
782 cout <<
"Null pointer to road0 or road1: "
783 <<
"road0 = " << road0
784 <<
"road1 = " << road1
808 bool lastGapDeltaOK =
false;
810 lastGapDeltaOK =
true;
816 bool totalHitsDeltaOK =
false;
818 totalHitsDeltaOK =
true;
824 bool chiSquareCutOK =
false;
829 chiSquareCutOK =
true;
832 cout <<
"xChiSquare = " << xChiSquare
833 <<
"yChiSquare = " << yChiSquare
837 bool minLastGapOK =
false;
842 log<<MSG::INFO <<
" minLastGap = " << road3D->
GetLastGap() << endreq;
845 bool duplicateRoad =
false;
846 int maxSharedHits = 0, sharedHits = 0;
847 for (
int i = 0; i < (int)p3DRoadC->size(); i++){
848 sharedHits =(*p3DRoadC)[i]->GetNSharedHits(road3D);
849 if ( maxSharedHits < sharedHits) maxSharedHits = sharedHits;
855 duplicateRoad =
true;
856 log<<MSG::INFO <<
" MaxShareHits = " << maxSharedHits << endreq;
859 if ( lastGapDeltaOK &&
864 float vx, vy, x0, y0;
865 float slope1 = 100, slope0 = 100;
882 log<<MSG::INFO <<
"Add a 3D Road ... " << endreq;
884 float startx = 0.0, starty = 0.0, startz = 0.0;
885 float sigmax = 0.0, sigmay = 0.0, sigmaz = 0.0;
886 road3D->
ProjectWithSigma(0, startx, starty, startz, sigmax, sigmay, sigmaz);
892 float sign = vy/fabs(vy);
893 float signx = vx/fabs(vx);
902 else if(road3D->
GetSeg()<2){
918 else if(road3D->
GetPart() == 0){
925 else if(road3D->
GetPart() == 2){
938 Hep3Vector mom(vx, vy, vz);
945 startx /= 10; starty /= 10; startz /= 10;
946 startx -= vx/mom.mag(); starty -= vy/mom.mag(); startz -= vz/mom.mag();
952 aTrack->
SetMucPos(startx, starty, startz);
961 aTrack->
setId(muctrackId);
966 aMucTrackCol->add(aTrack);
968 p3DRoadC->add(road3D);
972 vector<MucRecHit*> attachedHits = aTrack->
GetHits();
974 vector<float> distanceHits = aTrack->
getDistHits();
976 for(
int i=0; i< expectedHits.size(); i++)
982 vector<int> multiHit;
983 for(
int i=0; i< attachedHits.size(); i++)
989 for(
int k=0; k < attachedHits.size(); k++){
994 multiHit.push_back(hitnum);
999 for(
int i=0; i< expectedHits.size(); i++)
1007 for(
int j=0; j< attachedHits.size(); j++){
1012 if((jhit->
Part()==ihit->
Part())&&(jhit->
Seg()==ihit->
Seg())&&(jhit->
Gap()==ihit->
Gap())&&attachedHits.size()==distanceHits.size())
1019 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1020 m_strip = jhit->
Strip();
1022 m_dist = distanceHits[j];
1025 m_angle_cosmic = -999;
1026 m_angle_updown = -999;
1033 m_multihit = multiHit[j];
1034 m_run = eventHeader->runNumber();
1035 m_event = eventHeader->eventNumber();
1048 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1049 m_strip = ihit->
Strip();
1052 m_angle_updown = -999;
1053 m_angle_cosmic = -999;
1058 m_run = eventHeader->runNumber();
1059 m_event = eventHeader->eventNumber();
1116 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1117 aaTrack = (*aMucTrackCol)[iTrack];
1122 double px,py,pz,p,theta,phi;
1131 m_angle_updown = -999;
1133 if(m_angle_cosmic>1.57) m_angle_cosmic = 3.14159265 - m_angle_cosmic;
1134 m_run = eventHeader->runNumber();
1135 m_event = eventHeader->eventNumber();
1137 Hep3Vector rotate(-px,pz,py);
1138 theta = rotate.theta();
1141 m_px = px; m_py = py; m_pz = pz;
1142 m_theta = theta; m_phi = phi;
1149 Hep3Vector mucPos = aaTrack->
getMucPos();
1150 double posx, posy, posz;
1151 posx = mucPos.x(); posy = mucPos.y(); posz = mucPos.z();
1153 m_projx = -999; m_projz = -999;
1155 m_projx = posx - px/py*posy;
1156 m_projz = posz - pz/py*posy;
1163 m_mucUp = hasMucUp; m_mucDown = hasMucDown;
1168 if(aMucTrackCol->size()>=2 && forCosmic == 1){
1169 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1170 log << MSG::DEBUG <<
"iTrack " << iTrack <<
" / " <<(int)aMucTrackCol->size()<<endreq;
1171 aaTrack = (*aMucTrackCol)[iTrack];
1172 if(aaTrack->
trackId()>=0)
continue;
1175 for(
int jTrack = iTrack+1; jTrack < (int)aMucTrackCol->size(); jTrack++){
1176 bbTrack = (*aMucTrackCol)[jTrack];
1182 if(fabs(mom_a.angle(mom_b) - 3.1415926)<0.2)
1193 m_angle_cosmic = cosmicMom.angle(mom_a);
1194 if(cosmicMom.angle(mom_a)>1.57) m_angle_cosmic = 3.14159265 - cosmicMom.angle(mom_a);
1196 m_angle_updown = fabs(mom_a.angle(mom_b) - 3.1415926);
1197 m_px = -999; m_py = -999; m_pz = -999; m_theta = -999; m_phi = -999; m_theta_pipe = -999; m_phi_pipe = -999;
1198 m_px_mc = -999; m_py_mc = -999; m_pz_mc = -999; m_theta_mc = -999; m_phi_mc = -999;
1199 m_theta_mc_pipe = -999; m_phi_mc_pipe = -999;
1210 if( p3DRoadC->size() !=0 ) {
1211 log<<MSG::INFO <<
"In 3DRoad container : "
1212 <<
" Num of 3DRoad = " << p3DRoadC->size() <<endreq;
1214 int print2DRoadInfo = 0;
1215 if (print2DRoadInfo == 1) {
1216 for (
int iRoad = 0; iRoad < (int)p3DRoadC->size(); iRoad++) {
1218 cout << endl <<
" " << iRoad <<
"th 3DRoad :" << endl
1219 <<
" Part = " << road->
GetPart() << endl
1220 <<
" Seg = " << road->
GetSeg() << endl
1228 <<
" SlopeZX = " << road->
GetSlopeZX() << endl
1230 <<
" SlopeZY = " << road->
GetSlopeZY() << endl
1232 <<
" Hits Info : " << endl;
1241 for(
int i = 0 ; i < p3DRoadC->size(); i++)
1242 delete (*p3DRoadC)[i];
1243 for(
int i = 0 ; i < p2DRoad0C->size(); i++)
1244 delete (*p2DRoad0C)[i];
1245 for(
int i = 0 ; i < p2DRoad1C->size(); i++)
1246 delete (*p2DRoad1C)[i];
1254 return StatusCode::SUCCESS;
1260 MsgStream log(
msgSvc(), name());
1261 log << MSG::INFO <<
"in finalize()" << endreq;
1267 return StatusCode::SUCCESS;
1273 MsgStream log(
msgSvc(), name());
1282 int firstHitFound[2] = { 0, 0};
1283 int firstHitGap[2] = {-1, -1};
1290 float xInsct, yInsct, zInsct;
1291 aTrack->
Project(iPart, iGap, xInsct, yInsct, zInsct, seg);
1292 if(m_MsOutput) cout<<
"part "<<iPart<<
" gap "<<iGap<<
" x "<<xInsct<<
" y "<<yInsct<<
" z "<<zInsct<<
" seg "<<seg<<endl;
1302 for(
int iDeltaSeg = 0; iDeltaSeg <
kNSegSearch; iDeltaSeg++) {
1309 for (
int iHit = 0; iHit < aMucRecHitContainer->
GetGapHitCount(iPart, iSeg, iGap); iHit++) {
1310 log << MSG::DEBUG <<
"iSeg " << iSeg <<
" iHit " << iHit << endreq;
1311 MucRecHit* pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
1315 log << MSG::WARNING <<
"MucRecTrkExt: null pointer to pHit" << endreq;
1325 log << MSG::DEBUG <<
"distance = " << setw(8) << dX <<
" size " << setw(4) << window << endreq;
1357 if (firstHitGap[orient] == -1) firstHitGap[orient] = iGap;
1358 firstHitFound[orient] = 1;
1364 log << MSG::DEBUG <<
" part " << iPart <<
" seg " << iSeg <<
" gap " << iGap
1365 <<
" strip " << setw(2) << pHit->
Strip() <<
" attatched" << endreq;
1366 log << MSG::DEBUG <<
"current total hits " << aTrack->
GetTotalHits() << endreq;
1369 m_NHitsLostInGap[iGap]++;
1379 if(m_onlyseedfit == 0) {
1381 if (firstHitFound[orient] && firstHitGap[orient] != iGap) aTrack->
CorrectDir();
1392 log << MSG::INFO <<
"Fit track done! trackIndex: " << aTrack->
trackId() <<
", mucId: " << aTrack->
id() <<
", RecMode: " << aTrack->
GetRecMode() << endreq;
ObjectVector< MucRec2DRoad > MucRec2DRoadContainer
ObjectVector< MucRec3DRoad > MucRec3DRoadContainer
ObjectVector< MucRecHit > MucRecHitCol
const int kMaxDeltaLastGap
const int kMinSharedHits2D
const int kDeltaSeg[kNSegSearch]
const int kMaxDeltaTotalHits
const float kWindowSize[3][9]
const int kSearchOrder[kNSeedLoops][3][2][5]
const int kMaxSkippedGaps
const int kSearchLength[kNSeedLoops][3][2]
ObjectVector< RecMucTrack > RecMucTrackCol
int maxHitsInLayer() const
MucGeoGap * GetGap(const int part, const int seg, const int gap) const
Get a pointer to the gap identified by (part,seg,gap).
static MucGeoGeneral * Instance()
Get a pointer to the single instance of MucGeoGeneral.
static int barrel_ec(const Identifier &id)
Values of different levels.
static int layer(const Identifier &id)
static int channel(const Identifier &id)
static int segment(const Identifier &id)
static value_type getPartNum()
static value_type getSegNum(int part)
static value_type getGapNum(int part)
int GetNGapsWithHits() const
How many gaps provide hits attached to this road?
int GetTotalHits() const
How many hits in all does this road contain?
float GetReducedChiSquare() const
Chi-square parameter (per degree of freedom) of the trajectory fit.
float GetIntercept() const
Intercept of trajectory.
void AttachHit(MucRecHit *hit)
Attach the given hit to this road.
int GetLastGap() const
Which gap is the last one with hits attached to this road?
void AttachHitNoFit(MucRecHit *hit)
Attach the given hit to this road, but not fit this road.
float GetSlope() const
Slope of trajectory.
void SetMaxNSkippedGaps(const int &nGaps)
int GetPart() const
In which part was this road found?
float GetHitDistance(const MucRecHit *hit)
Distance to a hit.
int GetDegreesOfFreedom() const
How many degrees of freedom in the trajectory fit?
vector< MucRecHit * > GetHits() const
int GetSeg() const
In which segment was this road found?
int GetOrient() const
In which orientation was this road found?
float GetSlopeZX() const
Get Z-X dimension slope.
float GetSlopeZY() const
Get Z-Y dimension slope.
void TransformPhiRToXY(const float &vk, const float &vr, const float &k0, const float &r0, float &vx, float &vy, float &x0, float &y0) const
Where does the trajectory of this road intersect the reference plane?
int GetLastGapDelta() const
Difference between the last gap in the two 1-D roads.
int GetPart() const
In which part was this road found?
int GetLastGap() const
Which gap is the last one with hits attached to this road?
int GetTotalHitsDelta() const
Difference between the number of hits in the two 1-D roads.
int GetTotalHits() const
How many hits in all does this road contain?
float GetInterceptZY() const
Get Z-Y dimension intercept.
void SetSimpleFitParams(const float &m_SlopeZX, const float &m_InterceptZX, const float &m_SlopeZY, const float &m_InterceptZY)
set the fit parameters : slope and intercept for XZ and YZ.
int GetSeg() const
In which segment was this road found?
int GetDegreesOfFreedom() const
How many degrees of freedom in the trajectory fit?
void ProjectWithSigma(const int &gap, float &x, float &y, float &z, float &sigmaX, float &sigmaY, float &sigmaZ)
Where does the trajectory of this road intersect a specific gap?
float GetInterceptZX() const
Get Z-X dimension intercept.
int GetNGapsWithHits() const
How many gaps provide hits attached to this road?
float GetReducedChiSquare() const
Chi-square parameter (per degree of freedom) of the trajectory fit.
int GetMaxHitsPerGap() const
How many hits were attached in the gap with the most attached hits?
void Clear()
Remove all hit objects from the container, and destroy them.
MucRecHit * GetHit(const MucRecHitID hitID)
Get a MucRecHit object by hit identifier.
void AddHit(const Identifier id)
MucRecHitCol * GetMucRecHitCol()
Get MucRecHitCol pointer.
void SetMucRecHitCol(MucRecHitCol *p)
int GetGapHitCount(const MucRecHitID gapID)
How many hits are there in this gap?
void SetHitSeed(int seed)
MucGeoGap * GetGap() const
Get geometry data for the gap containing this hit.
int Part() const
Get Part.
int Strip() const
Get Strip.
void SetHitMode(int recmode)
MucRecRoadFinder(const std::string &name, ISvcLocator *pSvcLocator)
void TrackFinding(RecMucTrack *aTrack)
int GetTotalHits() const
How many hits in all does this track contain?
void LineFit(int fittingMethod)
Line fit with hits on a seg with max hits.
void CorrectPos()
Correct current position of this trajectory.
void CorrectDir()
Correct direction of this trajectory.
void ComputeTrackInfo(int fittingmethod)
Get corresponding monte carlo track pointer.
Hep3Vector getMucPos() const
start position of this track in Muc.
void AttachInsct(Hep3Vector insct)
Attach the intersection to this trajectory.
void SetExtMucPos(const float x, const float y, const float z)
set start position of ext track in Muc. (compute from MdcPos MdcMomentum or get from ExtTrack)
void SetCurrentDir(const float x, const float y, const float z)
set current direction of the trajectory.
float GetHitDistance(const MucRecHit *hit)
Calculate the distance of the hit to the intersection in read direction.
void setTrackId(const int trackId)
set the index for this track.
Hep3Vector GetCurrentDir() const
Current direction.
Hep3Vector CalculateInsct(const int part, const int seg, const int gap)
Calculate intersection from all hits attached on this gap.
void Project(const int &part, const int &gap, float &x, float &y, float &z, int &seg)
Where does the trajectory of this track intersect a specific gap?
void SetMucMomentum(const float px, const float py, const float pz)
set start moment of the track in Muc.
Hep3Vector GetCurrentInsct() const
Current intersection.
void SetExtMucMomentum(const float px, const float py, const float pz)
set start moment of ext track in Muc.
vector< MucRecHit * > GetHits() const
Get all hits on this track.
void AttachHit(MucRecHit *hit)
set corresponding monte carlo track pointer.
Hep3Vector GetCurrentPos() const
Current position.
void SetCurrentInsct(const float x, const float y, const float z)
set current intersection of the trajectory with strip plane.
Hep3Vector getMucMomentum() const
Start momentum of this track in Muc.
void SetCurrentPos(const float x, const float y, const float z)
set current position of the trajectory.
vector< MucRecHit * > GetExpectedHits() const
void SetRecMode(int recmode)
void SetMucPos(const float x, const float y, const float z)
set start position of the track in Muc. (after line fit and correction)
vector< float > getDistHits() const