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"
52 Algorithm(name, pSvcLocator)
55 declareProperty(
"FittingMethod", m_fittingMethod = 2);
56 declareProperty(
"ConfigFile", m_configFile =
"MucConfig.xml");
57 declareProperty(
"McCosmic", m_mccosmic = 0);
58 declareProperty(
"OnlySeedFit", m_onlyseedfit = 0);
59 declareProperty(
"NtOutput", m_NtOutput = 0);
60 declareProperty(
"MaxHitsRec", m_maxHitsRec = 200);
61 declareProperty(
"United", m_united = 0);
62 declareProperty(
"SeedType", m_seedtype = 0);
63 declareProperty(
"MsOutput", m_MsOutput =
false);
64 declareProperty(
"FilterFile", m_filter_filename);
70 MsgStream log(
msgSvc(), name());
71 log << MSG::INFO <<
"in initialize()" << endreq;
75 for(
int i = 0; i < 20; i++) m_NHitsLost.push_back(0);
76 for(
int i = 0; i < 10; i++) m_NHitsLostInGap.push_back(0);
83 StatusCode sc = service(
"MucGeomSvc", mucGeomSvc);
84 if (sc == StatusCode::SUCCESS) {
90 return StatusCode::FAILURE;
93 aMucRecHitContainer = 0;
98 if ( nt1 ) { m_tuple = nt1;}
101 m_tuple =
ntupleSvc()->book (
"FILE401/T", CLID_RowWiseTuple,
"MucTrkRecon N-Tuple");
103 sc = m_tuple->addItem (
"part", m_part);
104 sc = m_tuple->addItem (
"seg", m_seg);
105 sc = m_tuple->addItem (
"gap", m_gap);
106 sc = m_tuple->addItem (
"strip", m_strip);
107 sc = m_tuple->addItem (
"diff", m_diff);
108 sc = m_tuple->addItem (
"dist", m_dist);
109 sc = m_tuple->addItem (
"run", m_run);
110 sc = m_tuple->addItem (
"event", m_event);
111 sc = m_tuple->addItem (
"ngap", m_ngapwithhits);
112 sc = m_tuple->addItem (
"nhit", m_nhit);
113 sc = m_tuple->addItem (
"maxhit", m_maxhit);
114 sc = m_tuple->addItem (
"multihit",m_multihit);
115 sc = m_tuple->addItem (
"angleCosmic",m_angle_cosmic);
116 sc = m_tuple->addItem (
"angleUpdown",m_angle_updown);
117 sc = m_tuple->addItem (
"px",m_px);
118 sc = m_tuple->addItem (
"py",m_py);
119 sc = m_tuple->addItem (
"pz",m_pz);
120 sc = m_tuple->addItem (
"theta",m_theta);
121 sc = m_tuple->addItem (
"phi",m_phi);
122 sc = m_tuple->addItem (
"theta_pipe",m_theta_pipe);
123 sc = m_tuple->addItem (
"phi_pipe",m_phi_pipe);
124 sc = m_tuple->addItem (
"pxmc",m_px_mc);
125 sc = m_tuple->addItem (
"pymc",m_py_mc);
126 sc = m_tuple->addItem (
"pzmc",m_pz_mc);
127 sc = m_tuple->addItem (
"thetamc",m_theta_mc);
128 sc = m_tuple->addItem (
"phimc",m_phi_mc);
129 sc = m_tuple->addItem (
"thetamc_pipe",m_theta_mc_pipe);
130 sc = m_tuple->addItem (
"phimc_pipe",m_phi_mc_pipe);
131 sc = m_tuple->addItem (
"emcUp",m_emcUp);
132 sc = m_tuple->addItem (
"emcDown",m_emcDown);
133 sc = m_tuple->addItem (
"mucUp",m_mucUp);
134 sc = m_tuple->addItem (
"mucDown",m_mucDown);
135 sc = m_tuple->addItem (
"projx",m_projx);
136 sc = m_tuple->addItem (
"projz",m_projz);
140 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple) << endmsg;
147 if ( m_filter_filename ==
"") {
148 m_filter_filename =getenv(
"MUCRECALGROOT");
149 m_filter_filename +=
"/share/filter.txt";
152 if (m_filter_filename.size()) {
153 std::ifstream infile(m_filter_filename.c_str());
155 while (!infile.eof()) {
156 FilterEvent filterevt;
157 infile >> filterevt.bossver >> filterevt.runid >> filterevt.eventid;
158 if ((!infile.good()) || (infile.eof())) {
162 m_filter_event.push_back(filterevt);
169 return StatusCode::SUCCESS;
175 MsgStream log(
msgSvc(), name());
176 log << MSG::INFO <<
"in execute()" << endreq;
181 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
183 log << MSG::FATAL <<
"Could not find Event Header" << endreq;
184 return( StatusCode::FAILURE);
186 log << MSG::INFO <<
"Run: " << eventHeader->runNumber() <<
" Event: " << eventHeader->eventNumber() << endreq;
188event = eventHeader->eventNumber();
189run = eventHeader->runNumber();
192 string release = getenv(
"BES_RELEASE");
196 for (std::vector<FilterEvent>::iterator it = m_filter_event.begin();
197 it != m_filter_event.end(); ++it) {
198 const FilterEvent& fe = (*it);
199 if (
release == fe.bossver && run == fe.runid && event == fe.eventid) {
200 cout <<
"SKIP: " << fe.bossver <<
" "
202 << fe.eventid << std::endl;
203 return StatusCode::SUCCESS;
211 Hep3Vector cosmicMom;
213 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
214 if (!mcParticleCol) {
215 log << MSG::FATAL <<
"Could not find McParticle" << endreq;
216 return( StatusCode::FAILURE);
219 McParticleCol::iterator iter_mc = mcParticleCol->begin();
220 for (;iter_mc != mcParticleCol->end(); iter_mc++, digiId++) {
222 <<
" particleId = " << (*iter_mc)->particleProperty()
224 int pid = (*iter_mc)->particleProperty();
226 if(fabs(pid)!=13)
continue;
228 HepLorentzVector initialMomentum = (*iter_mc)->initialFourMomentum();
229 Hep3Vector startP(initialMomentum.px(), initialMomentum.py(), initialMomentum.pz());
230 Hep3Vector rotate(-initialMomentum.px(),initialMomentum.pz(),initialMomentum.py());
233 m_px_mc = initialMomentum.px();
234 m_py_mc = initialMomentum.py();
235 m_pz_mc = initialMomentum.pz();
237 m_theta_mc = rotate.theta();
238 m_phi_mc = rotate.phi();
240 m_theta_mc_pipe = startP.theta();
241 m_phi_mc_pipe = startP.phi();
307 SmartDataPtr<MucDigiCol> mucDigiCol(eventSvc(),
"/Event/Digi/MucDigiCol");
309 log << MSG::FATAL <<
"Could not find MUC digi" << endreq;
310 return( StatusCode::FAILURE);
313 MucDigiCol::iterator iter4 = mucDigiCol->begin();
315 for (;iter4 != mucDigiCol->end(); iter4++, digiId++) {
317 log << MSG::INFO <<
"MUC digis:: " << digiId << endreq;
318 if( digiId == 0)
return( StatusCode::SUCCESS );
328 if (!aMucRecHitContainer) {
331 aMucRecHitContainer->
Clear();
337 SmartIF<IDataManagerSvc> dataManSvc(eventSvc());
338 DataObject *mucRecHitCol;
339 eventSvc()->findObject(
"/Event/Recon/MucRecHitCol",mucRecHitCol);
340 if(mucRecHitCol !=
NULL) {
341 dataManSvc->clearSubTree(
"/Event/Recon/MucRecHitCol");
342 eventSvc()->unregisterObject(
"/Event/Recon/MucRecHitCol");
345 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon/MucRecHitCol", aMucRecHitContainer->
GetMucRecHitCol());
347 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
349 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
350 mucID = (*iterMuc)->identify();
358 aMucRecHitContainer->
AddHit(part, seg, gap, strip);
359 log << MSG::INFO <<
" digit" << mucDigiId <<
" : "
363 <<
" strip " << strip
367 DataObject *aReconEvent ;
368 eventSvc()->findObject(
"/Event/Recon",aReconEvent);
369 if(aReconEvent==
NULL) {
372 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
373 if(sc!=StatusCode::SUCCESS) {
374 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
375 return( StatusCode::FAILURE);
378 StatusCode fr = eventSvc()->findObject(
"/Event/Recon",aReconEvent);
379 if(fr!=StatusCode::SUCCESS) {
380 log << MSG::WARNING <<
"Could not find register ReconEvent, will create it" <<endreq;
381 StatusCode sc = eventSvc()->registerObject(
"/Event/Recon",aReconEvent);
382 if(sc!=StatusCode::SUCCESS) {
383 log << MSG::FATAL <<
"Could not register ReconEvent" <<endreq;
384 return( StatusCode::FAILURE);
390 DataObject *mucTrackCol;
391 eventSvc()->findObject(
"/Event/Recon/RecMucTrackCol",mucTrackCol);
392 if(mucTrackCol !=
NULL) {
393 dataManSvc->clearSubTree(
"/Event/Recon/RecMucTrackCol");
394 eventSvc()->unregisterObject(
"/Event/Recon/RecMucTrackCol");
398 sc = eventSvc()->registerObject(
"/Event/Recon/RecMucTrackCol", aMucTrackCol);
399 aMucTrackCol->clear();
402 SmartDataPtr<RecMucTrackCol> findMucTrackCol(eventSvc(),
"/Event/Recon/RecMucTrackCol");
403 if (!findMucTrackCol) {
404 log << MSG::FATAL <<
"Could not find RecMucTrackCol" << endreq;
405 return( StatusCode::FAILURE);
407 aMucTrackCol->clear();
410 log << MSG::INFO <<
"MaxHitsRec : "<<m_maxHitsRec<< endreq;
411 if(digiId> m_maxHitsRec)
return StatusCode::SUCCESS;
418 else if(m_united == 1){
421 if (!aMucRecHitContainer) {
424 aMucRecHitContainer->
Clear();
426 SmartDataPtr<MucRecHitCol> aMucRecHitCol (eventSvc(),
"/Event/Recon/MucRecHitCol");
427 if(aMucRecHitCol ==
NULL) {
428 log << MSG::WARNING <<
"MucRecHitCol is NULL" << endreq;
433 SmartDataPtr<RecMucTrackCol> mucTrackCol (eventSvc(),
"/Event/Recon/RecMucTrackCol");
434 if(mucTrackCol ==
NULL) {
435 log << MSG::WARNING <<
"aMucTrackCol is NULL" << endreq;
438 log << MSG::INFO <<
"mucTrackCol size: "<<mucTrackCol->size()<<
" hitCol size: "<<aMucRecHitCol->size()<<endreq;
439 aMucTrackCol = mucTrackCol;
442 SmartDataPtr<RecExtTrackCol> aExtTrackCol(eventSvc(),
"/Event/Recon/RecExtTrackCol");
444 log << MSG::WARNING <<
"Can't find ExtTrackCol in TDS!" << endreq;
447 SmartDataPtr<RecMdcTrackCol> aMdcTrackCol(eventSvc(),
"/Event/Recon/RecMdcTrackCol");
449 log << MSG::WARNING <<
"Can't find MdcTrackCol in TDS!" << endreq;
452 if( aExtTrackCol && aMdcTrackCol ) trackId = aMdcTrackCol->size();
453 muctrackId = aMucTrackCol->size();
458 SmartDataPtr<RecEmcShowerCol> aShowerCol(eventSvc(),
"/Event/Recon/RecEmcShowerCol");
460 log << MSG::WARNING <<
"Could not find RecEmcShowerCol" << endreq;
464 RecEmcShowerCol::iterator iShowerCol;
465 for(iShowerCol=aShowerCol->begin();
466 iShowerCol!=aShowerCol->end();
474 if(((*iShowerCol)->position()).phi()>0&&((*iShowerCol)->position()).phi()<3.1415926) hasEmcUp++;
479 m_emcUp = hasEmcUp; m_emcDown = hasEmcDown;
504 log << MSG::INFO <<
"Muc 2D 3D Road Container created" << endreq;
514 int count0, count1,
count, iGap0, iGap1;
519 for (
int iOrient = 0; iOrient < 2; iOrient++) {
522 for (
int iLoop = 0; iLoop < nLoops; iLoop++) {
531 MucDigiCol::iterator iterMuc = mucDigiCol->begin();
534 iGap0 = 0; iGap1 = 0;
535 for (;iterMuc != mucDigiCol->end(); iterMuc++, mucDigiId++) {
536 mucID = (*iterMuc)->identify();
542 if ( (part == 1 && gap % 2 == 0) || (part != 1 && gap % 2 == 1) ) orient = 1;
544 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 0){
548 if(part == iPart && seg == iSeg && orient == iOrient && setgap0 == 1 && gap != iGap0 ){
554 if(m_MsOutput) cout <<
"Find seed gap in ( "<<iPart<<
" "<<iSeg<<
" ) gap0: "<<iGap0<<
" gap1: "<<iGap1<<endl;
562 if(iGap1 == iGap0)
continue;
565 for (
int iHit0 = 0; iHit0 < count0; iHit0++) {
567 pHit0 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap0, iHit0);
569 log << MSG::FATAL <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
570 <<
" seg " << iSeg <<
" gap " << iGap0 <<
" null pointer"
576 if(m_united == 1 && pHit0->
GetHitMode() != -1)
continue;
579 if(m_MsOutput) cout <<
"part " << iPart <<
" seg " << iSeg <<
" orient " << iOrient
580 <<
" gap0 " << iGap0 <<
" count0 " << count0
581 <<
" gap1 " << iGap1 <<
" count1 " << count1 << endl;
582 for (
int iHit1 = 0; iHit1 < count1; iHit1++) {
584 pHit1 = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap1, iHit1);
586 log << MSG::ERROR <<
"MucRecRoadFinder-E10 " <<
" part " << iPart
587 <<
" seg " << iSeg <<
" gap " << iGap1 <<
" null pointer"
592 if(m_united == 1 && pHit1->GetHitMode() != -1)
continue;
598 log << MSG::FATAL <<
"MucRecRoadFinder-E20 " <<
"failed to create 2D road!" << endreq;
603 if (!pHit0->
GetGap()) log << MSG::ERROR <<
"pHit0->GetGap(), null pointer" << endreq;
612 pHit1->SetHitSeed(
true);
615 if(m_MsOutput) cout <<
"pHit0 attached, " << road2D->
GetTotalHits()
616 <<
", hitId= "<<pHit0->
Part()<<
" "<<pHit0->
Seg()<<
" "<<pHit0->
Gap()<<
" "<<pHit0->
Strip()<<endl;
619 if (pHit1->GetGap()->Orient() == iOrient) {
625 if(m_MsOutput) cout <<
"pHit1 attached, " << road2D->
GetTotalHits()
626 <<
", hitId= "<<pHit1->Part()<<
" "<<pHit1->Seg()<<
" "<<pHit1->Gap()<<
" "<<pHit1->Strip()<<endl;
628 if(m_MsOutput) cout <<
"Hit cout " << road2D->
GetTotalHits() <<
", slope " << road2D->
GetSlope() << endl;
635 for (
int i = 0; i < length; i++) {
638 float dXmin = kInfinity;
650 for (
int iHit = 0; iHit <
count; iHit++) {
651 pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
653 log << MSG::FATAL <<
"MucRecRoadFinder-E20 null cluster pointer pHit" << endreq;
659 if(m_united == 1 && pHit->
GetHitMode() != -1)
continue;
663 if(m_MsOutput) cout<<
"dX = "<<dX<<
" Win = "<<Win<<
", hit: "<<pHit->
Part()<<
" "<<pHit->
Seg()<<
" "<<pHit->
Gap()<<
" "<<pHit->
Strip()<<endl;
668 if(iGap == iGap0 || iGap == iGap1) {
677 if(m_onlyseedfit == 0)road2D->
AttachHit(pHit);
679 if(iGap == iGap0 || iGap == iGap1) road2D->
AttachHit(pHit);
696 bool lastGapOK =
false;
707 bool firedGapsOK =
false;
716 bool duplicateRoad =
false;
717 int maxSharedHits = 0, sharedHits = 0;
719 for (
int index = 0; index < (int)p2DRoad0C->size(); index++) {
720 sharedHits =(*p2DRoad0C)[index]->GetNSharedHits(road2D);
722 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
725 for (
int index = 0; index < (int)p2DRoad1C->size(); index++) {
726 sharedHits = (*p2DRoad1C)[index]->GetNSharedHits(road2D);
728 if (maxSharedHits < sharedHits) maxSharedHits = sharedHits;
733 duplicateRoad =
true;
734 log<<MSG::INFO <<
" maxSharedHits " << maxSharedHits <<
" > " <<
kMinSharedHits2D << endreq;
743 if (lastGapOK && firedGapsOK && !duplicateRoad) {
745 log<<MSG::INFO <<
"Add a road0" << endreq;
746 p2DRoad0C->add(road2D);
749 log<<MSG::INFO <<
"Add a road1" << endreq;
750 p2DRoad1C->add(road2D);
756 vector<MucRecHit*> road2DHits = road2D->
GetHits();
757 for(
int i=0; i< road2DHits.size(); i++)
760 if(ihit->
Gap() == iGap0 || ihit->
Gap() == iGap1){
776 int print2DRoadInfo = 0;
777 if (print2DRoadInfo == 1) {
779 cout <<
"In 2DRoad container : " << endl
780 <<
" Num of 2DRoad0 = " << p2DRoad0C->size() << endl
783 for (
int iRoad = 0; iRoad < (int)p2DRoad0C->size(); iRoad++) {
786 cout <<
" " << iRoad <<
"th 2DRoad0 :" << endl
787 <<
" Part = " << road->
GetPart() << endl
788 <<
" Seg = " << road->
GetSeg() << endl
789 <<
" Orient = " << road->
GetOrient() << endl
790 <<
" LastGap = " << road->
GetLastGap() << endl
793 <<
" Slope = " << road->
GetSlope() << endl
799 cout <<
" Num of 2DRoad1 = " << p2DRoad1C->size() << endl
802 for (
int iRoad = 0; iRoad < (int)p2DRoad1C->size(); iRoad++) {
805 cout <<
" " << iRoad <<
"th 2DRoad1 :" << endl
806 <<
" Part = " << road->
GetPart() << endl
807 <<
" Seg = " << road->
GetSeg() << endl
808 <<
" Orient = " << road->
GetOrient() << endl
809 <<
" LastGap = " << road->
GetLastGap() << endl
812 <<
" Slope = " << road->
GetSlope() << endl
821 for (
int iRoad0 = 0; iRoad0 < (int)p2DRoad0C->size(); iRoad0++) {
823 for (
int iRoad1 = 0; iRoad1 < (int)p2DRoad1C->size(); iRoad1++){
827 if ( !(road0 &&road1) ) {
828 cout <<
"Null pointer to road0 or road1: "
829 <<
"road0 = " << road0
830 <<
"road1 = " << road1
854 bool lastGapDeltaOK =
false;
856 lastGapDeltaOK =
true;
862 bool totalHitsDeltaOK =
false;
864 totalHitsDeltaOK =
true;
870 bool chiSquareCutOK =
false;
875 chiSquareCutOK =
true;
878 cout <<
"xChiSquare = " << xChiSquare
879 <<
"yChiSquare = " << yChiSquare
883 bool minLastGapOK =
false;
888 log<<MSG::INFO <<
" minLastGap = " << road3D->
GetLastGap() << endreq;
891 bool duplicateRoad =
false;
892 int maxSharedHits = 0, sharedHits = 0;
893 for (
int i = 0; i < (int)p3DRoadC->size(); i++){
894 sharedHits =(*p3DRoadC)[i]->GetNSharedHits(road3D);
895 if ( maxSharedHits < sharedHits) maxSharedHits = sharedHits;
901 duplicateRoad =
true;
902 log<<MSG::INFO <<
" MaxShareHits = " << maxSharedHits << endreq;
905 if ( lastGapDeltaOK &&
910 float vx, vy, x0, y0;
911 float slope1 = 100, slope0 = 100;
928 log<<MSG::INFO <<
"Add a 3D Road ... " << endreq;
930 float startx = 0.0, starty = 0.0, startz = 0.0;
931 float sigmax = 0.0, sigmay = 0.0, sigmaz = 0.0;
932 road3D->
ProjectWithSigma(0, startx, starty, startz, sigmax, sigmay, sigmaz);
938 float sign = vy/fabs(vy);
939 float signx = vx/fabs(vx);
948 else if(road3D->
GetSeg()<2){
964 else if(road3D->
GetPart() == 0){
971 else if(road3D->
GetPart() == 2){
984 Hep3Vector mom(vx, vy, vz);
991 startx /= 10; starty /= 10; startz /= 10;
992 startx -= vx/mom.mag(); starty -= vy/mom.mag(); startz -= vz/mom.mag();
998 aTrack->
SetMucPos(startx, starty, startz);
1007 aTrack->
setId(muctrackId);
1012 aMucTrackCol->add(aTrack);
1014 p3DRoadC->add(road3D);
1018 vector<MucRecHit*> attachedHits = aTrack->
GetHits();
1020 vector<float> distanceHits = aTrack->
getDistHits();
1022 for(
int i=0; i< expectedHits.size(); i++)
1028 vector<int> multiHit;
1029 for(
int i=0; i< attachedHits.size(); i++)
1035 for(
int k=0; k < attachedHits.size(); k++){
1040 multiHit.push_back(hitnum);
1045 for(
int i=0; i< expectedHits.size(); i++)
1053 for(
int j=0; j< attachedHits.size(); j++){
1058 if((jhit->
Part()==ihit->
Part())&&(jhit->
Seg()==ihit->
Seg())&&(jhit->
Gap()==ihit->
Gap())&&attachedHits.size()==distanceHits.size())
1065 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1066 m_strip = jhit->
Strip();
1068 m_dist = distanceHits[j];
1071 m_angle_cosmic = -999;
1072 m_angle_updown = -999;
1079 m_multihit = multiHit[j];
1080 m_run = eventHeader->runNumber();
1081 m_event = eventHeader->eventNumber();
1094 m_part = ihit->
Part(); m_seg = ihit->
Seg(); m_gap = ihit->
Gap();
1095 m_strip = ihit->
Strip();
1098 m_angle_updown = -999;
1099 m_angle_cosmic = -999;
1104 m_run = eventHeader->runNumber();
1105 m_event = eventHeader->eventNumber();
1162 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1163 aaTrack = (*aMucTrackCol)[iTrack];
1168 double px,py,pz,p,theta,phi;
1177 m_angle_updown = -999;
1179 if(m_angle_cosmic>1.57) m_angle_cosmic = 3.14159265 - m_angle_cosmic;
1180 m_run = eventHeader->runNumber();
1181 m_event = eventHeader->eventNumber();
1183 Hep3Vector rotate(-px,pz,py);
1184 theta = rotate.theta();
1187 m_px = px; m_py = py; m_pz = pz;
1188 m_theta = theta; m_phi = phi;
1195 Hep3Vector mucPos = aaTrack->
getMucPos();
1196 double posx, posy, posz;
1197 posx = mucPos.x(); posy = mucPos.y(); posz = mucPos.z();
1199 m_projx = -999; m_projz = -999;
1201 m_projx = posx - px/py*posy;
1202 m_projz = posz - pz/py*posy;
1209 m_mucUp = hasMucUp; m_mucDown = hasMucDown;
1214 if(aMucTrackCol->size()>=2 && forCosmic == 1){
1215 for(
int iTrack = 0; iTrack < (int)aMucTrackCol->size(); iTrack++) {
1216 log << MSG::DEBUG <<
"iTrack " << iTrack <<
" / " <<(int)aMucTrackCol->size()<<endreq;
1217 aaTrack = (*aMucTrackCol)[iTrack];
1218 if(aaTrack->
trackId()>=0)
continue;
1221 for(
int jTrack = iTrack+1; jTrack < (int)aMucTrackCol->size(); jTrack++){
1222 bbTrack = (*aMucTrackCol)[jTrack];
1228 if(fabs(mom_a.angle(mom_b) - 3.1415926)<0.2)
1239 m_angle_cosmic = cosmicMom.angle(mom_a);
1240 if(cosmicMom.angle(mom_a)>1.57) m_angle_cosmic = 3.14159265 - cosmicMom.angle(mom_a);
1242 m_angle_updown = fabs(mom_a.angle(mom_b) - 3.1415926);
1243 m_px = -999; m_py = -999; m_pz = -999; m_theta = -999; m_phi = -999; m_theta_pipe = -999; m_phi_pipe = -999;
1244 m_px_mc = -999; m_py_mc = -999; m_pz_mc = -999; m_theta_mc = -999; m_phi_mc = -999;
1245 m_theta_mc_pipe = -999; m_phi_mc_pipe = -999;
1256 if( p3DRoadC->size() !=0 ) {
1257 log<<MSG::INFO <<
"In 3DRoad container : "
1258 <<
" Num of 3DRoad = " << p3DRoadC->size() <<endreq;
1260 int print2DRoadInfo = 0;
1261 if (print2DRoadInfo == 1) {
1262 for (
int iRoad = 0; iRoad < (int)p3DRoadC->size(); iRoad++) {
1264 cout << endl <<
" " << iRoad <<
"th 3DRoad :" << endl
1265 <<
" Part = " << road->
GetPart() << endl
1266 <<
" Seg = " << road->
GetSeg() << endl
1274 <<
" SlopeZX = " << road->
GetSlopeZX() << endl
1276 <<
" SlopeZY = " << road->
GetSlopeZY() << endl
1278 <<
" Hits Info : " << endl;
1287 for(
int i = 0 ; i < p3DRoadC->size(); i++)
1288 delete (*p3DRoadC)[i];
1289 for(
int i = 0 ; i < p2DRoad0C->size(); i++)
1290 delete (*p2DRoad0C)[i];
1291 for(
int i = 0 ; i < p2DRoad1C->size(); i++)
1292 delete (*p2DRoad1C)[i];
1300 return StatusCode::SUCCESS;
1306 MsgStream log(
msgSvc(), name());
1307 log << MSG::INFO <<
"in finalize()" << endreq;
1313 return StatusCode::SUCCESS;
1319 MsgStream log(
msgSvc(), name());
1328 int firstHitFound[2] = { 0, 0};
1329 int firstHitGap[2] = {-1, -1};
1336 float xInsct, yInsct, zInsct;
1337 aTrack->
Project(iPart, iGap, xInsct, yInsct, zInsct, seg);
1338 if(m_MsOutput) cout<<
"part "<<iPart<<
" gap "<<iGap<<
" x "<<xInsct<<
" y "<<yInsct<<
" z "<<zInsct<<
" seg "<<seg<<endl;
1348 for(
int iDeltaSeg = 0; iDeltaSeg <
kNSegSearch; iDeltaSeg++) {
1355 for (
int iHit = 0; iHit < aMucRecHitContainer->
GetGapHitCount(iPart, iSeg, iGap); iHit++) {
1356 log << MSG::DEBUG <<
"iSeg " << iSeg <<
" iHit " << iHit << endreq;
1357 MucRecHit* pHit = aMucRecHitContainer->
GetHit(iPart, iSeg, iGap, iHit);
1361 log << MSG::WARNING <<
"MucRecTrkExt: null pointer to pHit" << endreq;
1371 log << MSG::DEBUG <<
"distance = " << setw(8) << dX <<
" size " << setw(4) << window << endreq;
1403 if (firstHitGap[orient] == -1) firstHitGap[orient] = iGap;
1404 firstHitFound[orient] = 1;
1410 log << MSG::DEBUG <<
" part " << iPart <<
" seg " << iSeg <<
" gap " << iGap
1411 <<
" strip " << setw(2) << pHit->
Strip() <<
" attatched" << endreq;
1412 log << MSG::DEBUG <<
"current total hits " << aTrack->
GetTotalHits() << endreq;
1415 m_NHitsLostInGap[iGap]++;
1425 if(m_onlyseedfit == 0) {
1427 if (firstHitFound[orient] && firstHitGap[orient] != iGap) aTrack->
CorrectDir();
1438 log << MSG::INFO <<
"Fit track done! trackIndex: " << aTrack->
trackId() <<
", mucId: " << aTrack->
id() <<
", RecMode: " << aTrack->
GetRecMode() << endreq;
DOUBLE_PRECISION count[3]
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)
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