4#include "GaudiKernel/MsgStream.h"
6#include "GaudiKernel/SmartDataPtr.h"
7#include "GaudiKernel/IPartPropSvc.h"
8#include "GaudiKernel/INTupleSvc.h"
11#include "HepPDT/ParticleDataTable.hh"
24 Algorithm(name, pSvcLocator)
26 myMdcCalibFunSvc=NULL;
30 declareProperty(
"Ntuple", myNtProd=0);
31 declareProperty(
"driftTimeUpLimit", myDriftTimeUpLimit = 400);
32 declareProperty(
"MdcHitChi2Cut", myMdcHitChi2Cut = 100);
33 declareProperty(
"ChiCut_circle", myChiCut_circle=5);
34 declareProperty(
"NmaxDeact_circle", myNmaxDeact_circle=1);
35 declareProperty(
"ChiCut_helix", myChiCut_helix=5);
36 declareProperty(
"NmaxDeact_helix", myNmaxDeact_helix=1);
37 declareProperty(
"Debug", myDebug=0);
38 declareProperty(
"Chi2CutDiverge", myChi2CutDiverge=99999999);
47 MsgStream log(
msgSvc(), name());
48 log << MSG::INFO <<
" DotsConnection initialize()" << endreq;
56 StatusCode sc = service (
"MdcGeomSvc", imdcGeomSvc);
57 myMdcGeomSvc =
dynamic_cast<MdcGeomSvc*
> (imdcGeomSvc);
59 return( StatusCode::FAILURE);
71 for(
int i=0; i<nLayer; i++)
74 myNWire[i]=aLayer->
NCell();
75 myRLayer[i]=aLayer->
Radius();
78 double nomShift = aLayer->
nomShift();
79 if(nomShift>0) myWireFlag[i]=1;
80 else if(nomShift<0) myWireFlag[i]=-1;
85 for(
int j=0; j<myNWire[i]; j++)
93 myWirePhi[i][j]=aWire->
Forward().phi();
94 int iInnerLayer = i-1;
96 for(
int k=0; k<myNWire[iInnerLayer]; k++)
99 if(k_last<0) k_last=myNWire[iInnerLayer]-1;
100 double dphi_last = dPhi(myWirePhi[iInnerLayer][k_last], myWirePhi[i][j]);
101 double dphi = dPhi(myWirePhi[iInnerLayer][k], myWirePhi[i][j]);
102 if(dphi_last<0&&dphi>0) {
103 myInnerWire[i][j][0]=k_last;
104 myInnerWire[i][j][1]=k;
112 for(
int i=0; i<nLayer; i++)
114 for(
int j=0; j<myNWire[i]; j++)
116 int iOuterLayer = i+1;
117 if(iOuterLayer<nLayer) {
118 for(
int k=0; k<myNWire[iOuterLayer]; k++)
121 if(k_last<0) k_last=myNWire[iOuterLayer]-1;
122 double dphi_last = dPhi(myWirePhi[iOuterLayer][k_last], myWirePhi[i][j]);
123 double dphi = dPhi(myWirePhi[iOuterLayer][k], myWirePhi[i][j]);
124 if(dphi_last<0&&dphi>0) {
125 myOuterWire[i][j][0]=k_last;
126 myOuterWire[i][j][1]=k;
141 sc = service (
"RawDataProviderSvc", irawDataProviderSvc);
143 if ( sc.isFailure() ){
144 log << MSG::FATAL << name()<<
" Could not load RawDataProviderSvc!" << endreq;
145 return StatusCode::FAILURE;
150 sc = service(
"MdcCalibFunSvc", imdcCalibSvc);
151 if ( sc.isSuccess() ){
155 cout<<
"DotsConnection::initialize(): can not get MdcCalibFunSvc"<<endl;
162 NTuplePtr nt_ptr(
ntupleSvc(),
"TestDotsHelixFitter/trkPar");
163 if( nt_ptr ) myNtHelixFitter = nt_ptr;
166 myNtHelixFitter =
ntupleSvc()->book(
"TestDotsHelixFitter/trkPar",CLID_ColumnWiseTuple,
"trkPar");
167 if( myNtHelixFitter ) {
168 myNtHelixFitter->addItem (
"run", myRUN);
169 myNtHelixFitter->addItem (
"evt", myEVT);
170 myNtHelixFitter->addItem (
"pid", myPID);
171 myNtHelixFitter->addItem (
"Npar", myNPar, 0,5);
172 myNtHelixFitter->addIndexedItem(
"HelixMC", myNPar, myArrayHelixMC);
173 myNtHelixFitter->addIndexedItem(
"HelixFitted", myNPar, myArrayHelixFitted);
174 myNtHelixFitter->addItem (
"NhitCircle", myNHitsCircle, 0,100);
175 myNtHelixFitter->addIndexedItem(
"LayerHitsCircle", myNHitsCircle, myLayerHitsCircle);
176 myNtHelixFitter->addIndexedItem(
"ChiHitsCircle", myNHitsCircle, myChiHitsCircle);
177 myNtHelixFitter->addItem (
"Nhit", myNHits, 0,100);
178 myNtHelixFitter->addIndexedItem(
"LayerHits", myNHits, myLayerHits);
179 myNtHelixFitter->addIndexedItem(
"ChiHits", myNHits, myChiHits);
180 myNtHelixFitter->addItem (
"NXhit", myNXHits, 0,100);
181 myNtHelixFitter->addItem (
"NVhit", myNVHits, 0,100);
182 myNtHelixFitter->addItem (
"NXCluster", myNXCluster, 0,100);
183 myNtHelixFitter->addItem (
"NVCluster", myNVCluster, 0,100);
184 myNtHelixFitter->addItem (
"TrkIdBest", myTrkIdBest);
185 myNtHelixFitter->addItem (
"NHitsBestTrk", myNHitsBestTrk);
186 myNtHelixFitter->addItem (
"NSameHitsBestTrk", myNSameHitsBestTrk);
200 return StatusCode::SUCCESS;
207 MsgStream log(
msgSvc(), name());
208 log << MSG::INFO <<
"DotsConnection execute()" << endreq;
218 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
220 log << MSG::WARNING <<
"Could not find Event Header" << endreq;
221 return StatusCode::FAILURE;
223 myRun = eventHeader->runNumber();
224 myEvt = eventHeader->eventNumber();
226 cout<<endl<<
"------------------------------ "<<endl;
228 cout<<
"run:"<<myRun<<
" , event: "<<myEvt<<endl;
238 getMcFinalChargedStates();
239 bool bookTrkCol = registerRecMdcTrack();
242 cout<<
"DotsConnection::execute(): failed to register RecMdcTrackCol!"<<endl;
243 return StatusCode::FAILURE;
245 associateDigisToMcParticles();
249 return StatusCode::SUCCESS;
257 MsgStream log(
msgSvc(), name());
258 log << MSG::INFO <<
"DotsConnection finalize()" << endreq;
260 return StatusCode::SUCCESS;
264double DotsConnection::dPhi(
double phi1,
double phi2)
278 double pos_x, pos_y, pos_z;
283 IPartPropSvc* p_PartPropSvc;
284 static const bool CREATEIFNOTTHERE(
true);
285 StatusCode PartPropStatus = service(
"PartPropSvc", p_PartPropSvc, CREATEIFNOTTHERE);
286 if (!PartPropStatus.isSuccess() || 0 == p_PartPropSvc) {
287 cout<<
" Could not initialize Particle Properties Service" << endl;
289 HepPDT::ParticleDataTable* p_particleTable = p_PartPropSvc->PDT();
292 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
294 McParticleCol::iterator iter_mc = mcParticleCol->begin();
295 for (;iter_mc != mcParticleCol->end(); iter_mc++ ) {
296 if(!(*iter_mc)->primaryParticle())
continue;
297 int pid = (*iter_mc)->particleProperty();
298 int pid_abs =
abs(pid);
299 if( p_particleTable->particle(pid) ){
300 name = p_particleTable->particle(pid)->name();
301 charge= p_particleTable->particle(pid)->charge();
302 }
else if( p_particleTable->particle(-pid) ){
303 name =
"anti " + p_particleTable->particle(-pid)->name();
304 charge = (-1.)*p_particleTable->particle(-pid)->charge();
306 pos_x = (*iter_mc)->initialPosition().x();
307 pos_y = (*iter_mc)->initialPosition().y();
308 pos_z = (*iter_mc)->initialPosition().z();
309 px = (*iter_mc)->initialFourMomentum().px();
310 py = (*iter_mc)->initialFourMomentum().py();
311 pz = (*iter_mc)->initialFourMomentum().pz();
312 if(pid_abs==11||pid_abs==13||pid_abs==211||pid_abs==321||pid_abs==2212)
break;
318 Hep3Vector p3Truth(px, py, pz);
321 helix_truth.pivot(
origin);
323 cout<<
"DotsConnection::getMCHelix() finds a valid MC particle "<<name<<
" at "<<posTruth<<
" with p3="<<p3Truth<<endl;
324 cout<<
"DotsConnection::getMCHelix() Helix = "<<helix_truth.a()<<endl;
330void DotsConnection::getMcFinalChargedStates()
337 double pos_x, pos_y, pos_z;
343 IPartPropSvc* p_PartPropSvc;
344 static const bool CREATEIFNOTTHERE(
true);
345 StatusCode PartPropStatus = service(
"PartPropSvc", p_PartPropSvc, CREATEIFNOTTHERE);
346 if (!PartPropStatus.isSuccess() || 0 == p_PartPropSvc) {
347 cout<<
" Could not initialize Particle Properties Service" << endl;
349 HepPDT::ParticleDataTable* p_particleTable = p_PartPropSvc->PDT();
352 SmartDataPtr<McParticleCol> mcParticleCol(eventSvc(),
"/Event/MC/McParticleCol");
354 McParticleCol::iterator iter_mc = mcParticleCol->begin();
355 if(myDebug) cout<<
"MC charged particles: "<<endl;
356 for (;iter_mc != mcParticleCol->end(); iter_mc++ )
358 int pdgid = (*iter_mc)->particleProperty();
359 if(myDebug) cout<<
"idx, pdg, from "<<(*iter_mc)->trackIndex()<<
", "<<pdgid<<
", "<<((*iter_mc)->mother()).trackIndex()<<endl;
360 if( !( (*iter_mc)->primaryParticle() || (*iter_mc)->decayFromGenerator() || (*iter_mc)->decayInFlight() ) )
continue;
361 int pid = (*iter_mc)->particleProperty();
362 int pid_abs =
abs(pid);
364 if(pid_abs==11||pid_abs==13||pid_abs==211||pid_abs==321||pid_abs==2212)
366 if( p_particleTable->particle(pid) )
368 name = p_particleTable->particle(pid)->name();
369 charge= p_particleTable->particle(pid)->charge();
371 else if( p_particleTable->particle(-pid) )
373 name =
"anti " + p_particleTable->particle(-pid)->name();
374 charge = (-1.)*p_particleTable->particle(-pid)->charge();
376 pos_x = (*iter_mc)->initialPosition().x();
377 pos_y = (*iter_mc)->initialPosition().y();
378 pos_z = (*iter_mc)->initialPosition().z();
379 px = (*iter_mc)->initialFourMomentum().px();
380 py = (*iter_mc)->initialFourMomentum().py();
381 pz = (*iter_mc)->initialFourMomentum().pz();
384 Hep3Vector p3Truth(px, py, pz);
386 helix_truth.pivot(
origin);
388 double dphi=helix_truth.IntersectCylinder(myRLayer[42]/10.);
389 if(dphi==0) dphi=
M_PI*charge;
391 double lenOuter = helix_truth.flightLength(posOuter);
392 double lenInner = helix_truth.flightLength(posTruth);
393 double lenInMdc = lenOuter-lenInner;
394 myVecTrkLenFirstHalf.push_back(lenInMdc);
396 int trkIdx = (*iter_mc)->trackIndex();
397 myVecMCTrkId.push_back(trkIdx);
398 myVecPDG.push_back(pid);
399 vector<double> helix;
400 helix.push_back(helix_truth.dr());
401 helix.push_back(helix_truth.phi0());
402 helix.push_back(helix_truth.kappa());
403 helix.push_back(helix_truth.dz());
404 helix.push_back(helix_truth.tanl());
405 myVecHelix.push_back(helix);
407 cout<<
" trk idx "<<trkIdx<<
", pdg code "<<pid
408 <<
", p3=("<<px<<
", "<<py<<
", "<<pz<<
")"
409 <<
", pos=("<<pos_x<<
","<<pos_y<<
","<<pos_z<<
")"
410 <<
", dphi="<<dphi<<
", lenOuter="<<lenOuter<<
", lenInner="<<lenInner
411 <<
", lenInMdc = "<<lenInMdc
420void DotsConnection::resetFCSVec()
422 myVecMCTrkId.clear();
424 myVecTrkLenFirstHalf.clear();
426 myVecCgemMcHit.clear();
427 myVecCgemXcluster.clear();
428 myVecCgemVcluster.clear();
431void DotsConnection::associateDigisToMcParticles()
434 double T0 = getEventStartTime();
437 SmartDataPtr<Event::CgemMcHitCol> cgemMcHitCol(eventSvc(),
"/Event/MC/CgemMcHitCol");
438 if(!cgemMcHitCol) cout<<
"DotsConnection::associateDigisToMcParticles() does not find CgemMcHitCol!"<<endl;
442 SmartDataPtr<RecCgemClusterCol> aCgemClusterCol(eventSvc(),
"/Event/Recon/RecCgemClusterCol");
443 if(!aCgemClusterCol) cout<<
"DotsConnection::associateDigisToMcParticles() does not find RecCgemClusterCol!"<<endl;
444 RecCgemClusterCol::iterator iter_cluster_begin=aCgemClusterCol->begin();
445 RecCgemClusterCol::iterator iter_cluster;
449 SmartDataPtr<Event::MdcMcHitCol> mdcMcHitCol(eventSvc(),
"/Event/MC/MdcMcHitCol");
450 if(!mdcMcHitCol) cout<<
"DotsConnection::associateDigisToMcParticles() does not find MdcMcHitCol!"<<endl;
452 cout<<
"MDC MC hits obtained, n="<<mdcMcHitCol->size()<<endl;
453 Event::MdcMcHitCol::iterator iter_mdcMcHit = mdcMcHitCol->begin();
454 for(; iter_mdcMcHit!=mdcMcHitCol->end(); iter_mdcMcHit++ )
456 string creatorProcess = (*iter_mdcMcHit)->getCreatorProcess();
457 int trkId = (*iter_mdcMcHit)->getTrackIndex();
458 int isSec = (*iter_mdcMcHit)->getIsSecondary();
459 double trkLen = (*iter_mdcMcHit)->getFlightLength();
460 double px=(*iter_mdcMcHit)->getMomentumX();
461 double py=(*iter_mdcMcHit)->getMomentumY();
462 double pz=(*iter_mdcMcHit)->getMomentumZ();
463 double posx=(*iter_mdcMcHit)->getPositionX();
464 double posy=(*iter_mdcMcHit)->getPositionY();
465 double posz=(*iter_mdcMcHit)->getPositionZ();
466 int pdgCode = (*iter_mdcMcHit)->getCurrentTrackPID();
467 int digiIdx = (*iter_mdcMcHit)->getDigiIdx();
471 Hep3Vector pos(posx,posy,0);
472 Hep3Vector p3(px,py,0);
473 double dotProd = pos*p3;
476 cout<<
" MDC MC hit from "<<creatorProcess
479 <<
", len="<<trkLen/10
480 <<
", p3=("<<px<<
", "<<py<<
", "<<pz<<
")"
481 <<
", pos=("<<posx<<
", "<<posy<<
", "<<posz<<
")"
482 <<
", layer "<<layer<<
" wire "<<wire
483 <<
", dotProd="<<dotProd
484 <<
", pdg code = "<<pdgCode
485 <<
", digi index = "<<digiIdx
490 uint32_t getDigiFlag = 0;
493 cout<<
"DotsConnection::associateDigisToMcParticles() get "<<mdcDigiVec.size()<<
" MDC digis from RawDataProviderSvc"<<endl;
495 clearMdcDigiPointer();
496 vector<MdcDigi*>::iterator iter_mdcDigi = mdcDigiVec.begin();
497 for(; iter_mdcDigi!=mdcDigiVec.end(); iter_mdcDigi++)
506 double tprop = myMdcCalibFunSvc->
getTprop(layer, 0);
507 double charge = (*iter_mdcDigi)->getChargeChannel();
508 double T0Walk = myMdcCalibFunSvc->
getT0(layer,wire) + myMdcCalibFunSvc->
getTimeWalk(layer, charge);
510 double driftT = rawTime - T0 - TOF - T0Walk - tprop;
511 if(driftT>myDriftTimeUpLimit)
continue;
513 myMdcDigiPointer[layer][wire]=*iter_mdcDigi;
518 int nMcTrk = myVecMCTrkId.size();
519 for(
int i=0; i<nMcTrk; i++)
522 int trkIdx = myVecMCTrkId[i];
523 double trkLenInMdc = myVecTrkLenFirstHalf[i];
525 cout<<
"MC particle "<<trkIdx<<
", pdg code "<<myVecPDG[i]<<endl;
528 int CgemCluster[3][2]={0,0,0,0,0,0};
529 myVecCgemXcluster.clear();
530 myVecCgemVcluster.clear();
531 myVecCgem1DCluster.clear();
532 for(
int l=0; l<3; l++)
534 for(
int m=0; m<2; m++)
536 myVecCgemXCluIdx[l][m].clear();
537 myVecCgemVCluIdx[l][m].clear();
540 Event::CgemMcHitCol::iterator iter_CgemMcHit = cgemMcHitCol->begin();
541 for(; iter_CgemMcHit!=cgemMcHitCol->end(); iter_CgemMcHit++ )
543 string creatorProcess = (*iter_CgemMcHit)->GetCreatorProcess();
545 cout<<
" CGEM MC hit from process "<<creatorProcess;
546 if(creatorProcess==
"Generator"||creatorProcess==
"Decay")
549 if((*iter_CgemMcHit)->GetTrackID()!=trkIdx)
continue;
551 if((*iter_CgemMcHit)->GetIsSecondary())
continue;
552 const vector<int> & vec_xCluster = (*iter_CgemMcHit)->GetXclusterIdxVec();
553 int nXCluster=vec_xCluster.size();
554 for(
int j=0; j<nXCluster; j++)
556 iter_cluster=iter_cluster_begin+vec_xCluster[j];
557 int clusterId = (*iter_cluster)->getclusterid();
558 int layer=(*iter_cluster)->getlayerid();
559 int sheet=(*iter_cluster)->getsheetid();
561 cout<<
" find one X-cluster on layer "<<layer;
562 if(CgemCluster[layer][0]==0)
564 myVecCgemXcluster.push_back(*iter_cluster);
565 myVecCgem1DCluster.push_back(*iter_cluster);
566 myVecCgemXCluIdx[layer][sheet].push_back(clusterId);
567 CgemCluster[layer][0]++;
569 cout<<
", associated. "<<endl;
573 const vector<int> & vec_vCluster = (*iter_CgemMcHit)->GetVclusterIdxVec();
574 int nVCluster=vec_vCluster.size();
575 for(
int j=0; j<nVCluster; j++)
577 iter_cluster=iter_cluster_begin+vec_vCluster[j];
578 int clusterId = (*iter_cluster)->getclusterid();
579 int layer=(*iter_cluster)->getlayerid();
580 int sheet=(*iter_cluster)->getsheetid();
582 cout<<
" find one V-cluster on layer "<<layer;
583 if(CgemCluster[layer][1]==0)
585 myVecCgemVcluster.push_back(*iter_cluster);
586 myVecCgem1DCluster.push_back(*iter_cluster);
587 myVecCgemVCluIdx[layer][sheet].push_back(clusterId);
588 CgemCluster[layer][1]++;
590 cout<<
", associated. "<<endl;
594 if(myDebug) cout<<endl;
597 myVecMdcDigi.clear();
598 int nMdcXHits(0), nMdcVHits(0);
618 Event::MdcMcHitCol::iterator
619 iter_mdcMcHit = mdcMcHitCol->begin();
621 for(; iter_mdcMcHit!=mdcMcHitCol->end(); iter_mdcMcHit++ )
623 int trkId = (*iter_mdcMcHit)->getTrackIndex();
624 if(trkId!=trkIdx)
continue;
625 if((*iter_mdcMcHit)->getDigiIdx()==-9999)
continue;
629 int isSec = (*iter_mdcMcHit)->getIsSecondary();
636 double trkLenMcHit = ((*iter_mdcMcHit)->getFlightLength())/10.;
637 if(trkLenMcHit>1.5*trkLenInMdc) {
641 double px=(*iter_mdcMcHit)->getMomentumX();
642 double py=(*iter_mdcMcHit)->getMomentumY();
643 double pz=(*iter_mdcMcHit)->getMomentumZ();
644 double posx=(*iter_mdcMcHit)->getPositionX();
645 double posy=(*iter_mdcMcHit)->getPositionY();
646 double posz=(*iter_mdcMcHit)->getPositionZ();
647 Hep3Vector pos(posx,posy,0);
648 Hep3Vector p3(px,py,0);
649 double dotProd = pos*p3;
658 const MdcDigi* aMdcDigiPt = myMdcDigiPointer[layer][wire];
661 myVecMdcDigi.push_back(aMdcDigiPt);
662 myMdcDigiPointer[layer][wire]=NULL;
664 cout<<
" MDC digi on layer "<<layer<<
" wire "<<wire<<
" associated"<<endl;
665 if(layer<8||(layer>19&&layer<36)) nMdcVHits++;
673 if((myVecCgemVcluster.size()+nMdcVHits)>=2&&(myVecCgemXcluster.size()+nMdcXHits+myVecCgemVcluster.size()+nMdcVHits)>5)
675 HepVector a_helix(5,0);
676 a_helix(1)=myVecHelix[i][0];
677 a_helix(2)=myVecHelix[i][1];
678 a_helix(3)=myVecHelix[i][2];
679 a_helix(4)=myVecHelix[i][3];
680 a_helix(5)=myVecHelix[i][4];
684 myDotsHelixFitter.
setDChits(myVecMdcDigi,T0);
696 if(myNtProd&1 && nIter==1) {
700 vector<const RecCgemCluster*>::iterator it_cluster=myVecCgem1DCluster.begin();
702 for(; it_cluster!=myVecCgem1DCluster.end(); it_cluster++, i_cluster++)
704 int flag=(*it_cluster)->getflag();
705 if(flag!=0)
continue;
706 int layer=(*it_cluster)->getlayerid();
708 if(myNHitsCircle<100)
710 myLayerHitsCircle[myNHitsCircle]=layer;
711 myChiHitsCircle[myNHitsCircle] =vecChiCgem[i_cluster];
717 vector<const MdcDigi*>::iterator it_digi=myVecMdcDigi.begin();
721 for(; it_digi!=myVecMdcDigi.end(); it_digi++, i_digi++)
726 if(myWireFlag[layer]!=0)
continue;
727 if(myNHitsCircle<100)
729 myLayerHitsCircle[myNHitsCircle]=layer;
730 myChiHitsCircle[myNHitsCircle] =vecChiMdc[i_digi];
737 if(myDotsHelixFitter.
deactiveHits(myChiCut_circle,myNmaxDeact_circle)==0)
break;
741 cout<<
"initial helix "<<ini_helix.a()<<endl;
742 cout<<
"fitFlag="<<fitFlag<<endl;
743 cout<<
"nIter="<<nIter<<endl;
744 cout<<
"fitted circle "<<myDotsHelixFitter.
getHelix()<<endl;
745 cout<<
"circle chi2="<<myDotsHelixFitter.
getChi2()<<endl<<endl;
753 if(fitFlag!=0)
break;
754 if(myDotsHelixFitter.
deactiveHits(myChiCut_helix,myNmaxDeact_helix)==0)
break;
758 if(fitFlag!=0)
break;
759 if(myDotsHelixFitter.
activeHits(myChiCut_helix)==0)
break;
763 cout<<
"fitFlag="<<fitFlag<<endl;
764 cout<<
"fitted helix "<<myDotsHelixFitter.
getHelix()<<endl;
765 cout<<
"helix chi2="<<myDotsHelixFitter.
getChi2()<<endl<<endl;
782 myNXCluster=myVecCgemXcluster.size();
783 myNVCluster=myVecCgemVcluster.size();
785 myArrayHelixMC[0]=myVecHelix[i][0];
787 myArrayHelixMC[1]=myVecHelix[i][1];
788 myArrayHelixMC[2]=myVecHelix[i][2];
789 myArrayHelixMC[3]=myVecHelix[i][3];
790 myArrayHelixMC[4]=myVecHelix[i][4];
793 myNSameHitsBestTrk=0;
803 vector<const RecCgemCluster*>::iterator it_cluster=myVecCgem1DCluster.begin();
805 for(; it_cluster!=myVecCgem1DCluster.end(); it_cluster++, i_cluster++)
807 int flag=(*it_cluster)->getflag();
808 int layer=(*it_cluster)->getlayerid();
809 if(flag==1) layer=-1*(layer+1);
812 myLayerHits[myNHits]=layer;
813 myChiHits[myNHits] =vecChiCgem[i_cluster];
819 vector<const MdcDigi*>::iterator it_digi=myVecMdcDigi.begin();
823 for(; it_digi!=myVecMdcDigi.end(); it_digi++, i_digi++)
825 if(vecIsActMdc[i_digi]==0)
continue;
830 myLayerHits[myNHits]=layer;
831 myChiHits[myNHits] =vecChiMdc[i_digi];
840 if(myNtProd&1) myNtHelixFitter->write();
847vector<const MdcDigi*> DotsConnection::getMdcDigiVec()
849 uint32_t getDigiFlag = 0;
858 cout<<
"DotsConnection::getMdcDigiVec() get "<<mdcDigiVec.size()<<
" MDC digis from RawDataProviderSvc"<<endl;
861 vector<const MdcDigi*> aMdcDigiVec;
862 vector<MdcDigi*>::iterator iter_mdcDigi = mdcDigiVec.begin();
863 for(; iter_mdcDigi!=mdcDigiVec.end(); iter_mdcDigi++) {
870 aMdcDigiVec.push_back(*iter_mdcDigi);
878double DotsConnection::getEventStartTime()
883 SmartDataPtr<RecEsTimeCol> evTimeCol(eventSvc(),
"/Event/Recon/RecEsTimeCol");
885 RecEsTimeCol::iterator iter_evt = evTimeCol->begin();
886 if(iter_evt != evTimeCol->end()){
888 T0 = (*iter_evt)->getTest();
891 else cout<<
"error: DotsConnection::getEventStartTime() failed to access event start time"<<endl;
896void DotsConnection::testDotsHelixFitterAllHits()
903 vector<const MdcDigi*> vecDigi = getMdcDigiVec();
906 double T0 = getEventStartTime();
914 vector<const MdcDigi*>::iterator iter_mdcDigi = vecDigi.begin();
915 map<double, const MdcDigi*> aMapDcDigi;
916 for(; iter_mdcDigi!=vecDigi.end(); iter_mdcDigi++)
918 aMapDcDigi[myDotsHelixFitter.
getFlightLength(*iter_mdcDigi)] = *iter_mdcDigi;
921 vector<const RecCgemCluster*> vecCgemCluster = getCgemClusterVec();
929 HepVector a = ini_helix.
a();
930 HepVector a_new = myDotsHelixFitter.
getHelix();
931 for(
int i=0; i<5; i++)
933 myArrayHelixMC[i]=a[i];
934 myArrayHelixFitted[i]=a_new[i];
936 myNtHelixFitter->write();
939vector<const RecCgemCluster*> DotsConnection::getCgemClusterVec(
int view)
941 vector<const RecCgemCluster*> aVecCgemCluster;
942 SmartDataPtr<RecCgemClusterCol> aCgemClusterCol(eventSvc(),
"/Event/Recon/RecCgemClusterCol");
945 RecCgemClusterCol::iterator iter_cluster=aCgemClusterCol->begin();
946 int nCluster = aCgemClusterCol->size();
959 for(; iter_cluster!=aCgemClusterCol->end(); iter_cluster++)
971 int flag = (*iter_cluster)->getflag();
974 if(flag==view) aVecCgemCluster.push_back(*iter_cluster);
977 if(flag==0||flag==1) aVecCgemCluster.push_back(*iter_cluster);
982 else cout<<
"DotsConnection::getCgemClusterVec() does not find RecCgemClusterCol!"<<endl;
983 return aVecCgemCluster;
986void DotsConnection::testDotsHelixFitterPartHits()
993 vector<const MdcDigi*> vecDigi = getMdcDigiVec();
996 double T0 = getEventStartTime();
998 myDotsHelixFitter.
setT0(T0);
1004 vector<const MdcDigi*>::iterator iter_mdcDigi = vecDigi.begin();
1005 map<double, const MdcDigi*> aMapDcDigi;
1006 for(; iter_mdcDigi!=vecDigi.end(); iter_mdcDigi++)
1008 aMapDcDigi[myDotsHelixFitter.
getFlightLength(*iter_mdcDigi)] = *iter_mdcDigi;
1013 vector<const MdcDigi*> smallVecDigi;
1014 map<double, const MdcDigi*>::iterator iter_digi = aMapDcDigi.begin();
1016 const MdcDigi* digiUdStudy=NULL;
1017 for(; iter_digi!=aMapDcDigi.end(); iter_digi++)
1019 const MdcDigi* aDigi = iter_digi->second;
1020 int layer = myDotsHelixFitter.
getLayer(aDigi);
1021 if(layer==layerUdStudy)
1026 if(layer>layerUdStudy&&nLayerCount>=0&&nLayerCount<layerUsed)
1028 smallVecDigi.push_back(aDigi);
1031 if(nLayerCount==layerUsed)
break;
1033 if( digiUdStudy!=NULL && nLayerCount==layerUsed )
1035 myDotsHelixFitter.
setDChits(smallVecDigi,T0);
1058void DotsConnection::clearMdcDigiPointer()
1060 for(
int i=0; i<43; i++)
1061 for(
int j=0; j<288; j++)
1062 myMdcDigiPointer[i][j]=NULL;
1065bool DotsConnection::registerRecMdcTrack()
1067 MsgStream log(
msgSvc(), name());
1069 IDataProviderSvc* eventSvc = NULL;
1070 service(
"EventDataSvc", eventSvc);
1072 log << MSG::INFO <<
"makeTds:event Svc has been found" << endreq;
1074 log << MSG::FATAL <<
"makeTds:Could not find eventSvc" << endreq;
1077 IDataManagerSvc *dataManSvc =
dynamic_cast<IDataManagerSvc*
>(eventSvc);;
1080 myRecMdcTrackCol = NULL;
1081 DataObject *aRecMdcTrackCol;
1082 eventSvc->findObject(
"/Event/Recon/RecMdcTrackCol",aRecMdcTrackCol);
1083 if(aRecMdcTrackCol != NULL)
1085 myRecMdcTrackCol =
dynamic_cast<RecMdcTrackCol*
> (aRecMdcTrackCol);
1091 sc = eventSvc->registerObject(
"/Event/Recon/RecMdcTrackCol", myRecMdcTrackCol);
1092 if(sc.isFailure()) {
1093 log << MSG::FATAL <<
" Could not register RecMdcTrack collection" <<endreq;
1096 log << MSG::INFO <<
"RecMdcTrackCol registered successfully!" <<endreq;
1099 DataObject *aRecMdcHitCol;
1100 eventSvc->findObject(
"/Event/Recon/RecMdcHitCol",aRecMdcHitCol);
1101 if(aRecMdcHitCol != NULL) {
1104 myRecMdcHitCol=
dynamic_cast<RecMdcHitCol*
> (aRecMdcHitCol);
1109 sc = eventSvc->registerObject(
"/Event/Recon/RecMdcHitCol", myRecMdcHitCol);
1110 if(sc.isFailure()) {
1111 log << MSG::FATAL <<
" Could not register RecMdcHit collection" <<endreq;
1114 log << MSG::INFO <<
"RecMdcHitCol registered successfully!" <<endreq;
1125bool DotsConnection::saveARecMdcTrack(
int iTrk)
1131 int trackId = myRecMdcTrackCol->size();
1135 HepVector aHelixVec = myDotsHelixFitter.
getHelix();
1136 helixPar[0]=aHelixVec[0];
1137 helixPar[1]=aHelixVec[1];
1138 helixPar[2]=aHelixVec[2];
1139 helixPar[3]=aHelixVec[3];
1140 helixPar[4]=aHelixVec[4];
1145 myArrayHelixFitted[0]=aHelixVec[0];
1146 myArrayHelixFitted[1]=aHelixVec[1];
1147 myArrayHelixFitted[2]=aHelixVec[2];
1148 myArrayHelixFitted[3]=aHelixVec[3];
1149 myArrayHelixFitted[4]=aHelixVec[4];
1152 int q = helixPar[2]>0? 1:-1;
1154 double pxy = aHelix.
pt();
1155 double px = aHelix.
momentum(0).x();
1156 double py = aHelix.
momentum(0).y();
1157 double pz = aHelix.
momentum(0).z();
1158 double p = aHelix.
momentum(0).mag();
1159 double theta = aHelix.
direction(0).theta();
1163 double r = poca.perp();
1164 HepSymMatrix Ea = aHelix.
Ea();
1166 double errorMat[15];
1168 for (
int ie = 0 ; ie < 5 ; ie ++){
1169 for (
int je = ie ; je < 5 ; je ++){
1170 errorMat[k] = Ea[ie][je];
1174 double chisq = myDotsHelixFitter.
getChi2();
1176 recMdcTrack->
setPxy(pxy);
1177 recMdcTrack->
setPx(px);
1178 recMdcTrack->
setPy(py);
1179 recMdcTrack->
setPz(pz);
1180 recMdcTrack->
setP(p);
1182 recMdcTrack->
setPhi(phi);
1184 recMdcTrack->
setX(poca.x());
1185 recMdcTrack->
setY(poca.y());
1186 recMdcTrack->
setZ(poca.z());
1187 recMdcTrack->
setR(sqrt(poca.x()*poca.x() + poca.y()*poca.y()));
1197 recMdcTrack->
setStat(myVecPDG[iTrk]);
1199 int maxLayerId = -1;
1200 int minLayerId = 43;
1202 double fltLen = -0.00001;
1203 int layerMaxFltLen=-1;
1207 map<int,int> clusterFitStat;
1208 SmartDataPtr<RecCgemClusterCol> aCgemClusterCol(eventSvc(),
"/Event/Recon/RecCgemClusterCol");
1209 if(!aCgemClusterCol) cout<<
"DotsConnection::saveARecMdcTrack() does not find RecCgemClusterCol!"<<endl;
1210 RecCgemClusterCol::iterator iter_cluster_begin=aCgemClusterCol->begin();
1211 RecCgemClusterCol::iterator iter_cluster=iter_cluster_begin;
1212 for(; iter_cluster!=aCgemClusterCol->end(); iter_cluster++)
1214 int flag = (*iter_cluster)->getflag();
1215 if(flag!=2)
continue;
1216 int layer=(*iter_cluster)->getlayerid();
1217 int sheet=(*iter_cluster)->getsheetid();
1218 int idXClu = (*iter_cluster)->getclusterflagb();
1220 vector<int>::iterator
iter=myVecCgemXCluIdx[layer][sheet].begin();
1221 for(;
iter!=myVecCgemXCluIdx[layer][sheet].end();
iter++)
1222 if((*
iter)==idXClu) matchX=
true;
1223 if(!matchX)
continue;
1224 int idVClu = (*iter_cluster)->getclusterflage();
1226 iter=myVecCgemVCluIdx[layer][sheet].begin();
1227 for(;
iter!=myVecCgemVCluIdx[layer][sheet].end();
iter++)
1228 if((*
iter)==idVClu) matchV=
true;
1233 clusterRefVec.push_back(recCgemCluster);
1234 clusterFitStat[clusterid] = 1;
1235 if(maxLayerId<layer)
1248 int nMdcHits=aRecMdcHitVec.size();
1250 vector<RecMdcHit>::iterator iter_recMdcHit = aRecMdcHitVec.begin();
1251 for(; iter_recMdcHit!=aRecMdcHitVec.end(); iter_recMdcHit++)
1253 if(iter_recMdcHit->getChisqAdd()>myMdcHitChi2Cut)
1257 recMdcHit->
setId(hitId);
1260 myRecMdcHitCol->push_back(recMdcHit);
1261 SmartRef<RecMdcHit> refHit(recMdcHit);
1262 hitRefVec.push_back(refHit);
1268 setMdcIdt.insert(layer*1000+wire);
1269 if(layer>maxLayerId)
1273 if(layer<minLayerId)
1277 if(fltLen<recMdcHit->getFltLen()) {
1279 layerMaxFltLen=layer;
1284 cout<<
"track "<<trackId<<
", "<<nMdcHitsKept<<
"/"<<nMdcHits<<
" hits kept"<<endl;
1287 if(maxLayerId>=0&&maxLayerId<3) {
1291 if(fltLen>0) fiTerm=-fltLen*
sin(theta)/aHelix.
radius();
1292 else cout<<
"fltLen<0!"<<endl;
1298 cout<<
"fiTerm, layer, fltLen, pos= "<<fiTerm<<
", "<<layerMaxFltLen<<
", "<<fltLen<<
", "<<posOut<<endl;
1302 std::sort(clusterRefVec.begin(),clusterRefVec.end(),
sortCluster);
1306 int n_CgemCluster(0), n_MdcHits(0), n_hits_tot(0);
1307 int n_sameCgemCluster(0), n_sameMdcHits(0), n_sameHit_tot(0);
1309 RecMdcTrackCol::iterator iter_bestTrk;
1310 RecMdcTrackCol::iterator iter_trk = myRecMdcTrackCol->begin();
1311 for(; iter_trk!=myRecMdcTrackCol->end(); iter_trk++)
1313 int stat =(*iter_trk)->stat();
1315 n_sameCgemCluster=0;
1317 n_CgemCluster=aClusterRefVec.size();
1318 ClusterRefVec::iterator itCluster=aClusterRefVec.begin();
1319 for(; itCluster!=aClusterRefVec.end(); itCluster++) {
1320 int clusterid = (*itCluster)->getclusterid();
1321 if(clusterFitStat.count(clusterid)) n_sameCgemCluster++;
1325 HitRefVec aHitRefVec = (*iter_trk)->getVecHits();
1326 n_MdcHits=aHitRefVec.size();
1327 HitRefVec::iterator it_hit = aHitRefVec.begin();
1328 for(; it_hit!=aHitRefVec.end(); it_hit++) {
1332 if(setMdcIdt.find(layid*1000+localwid)!=setMdcIdt.end()) n_sameMdcHits++;
1334 if((n_sameMdcHits+2*n_sameCgemCluster)>n_sameHit_tot) {
1335 n_sameHit_tot=n_sameMdcHits+2*n_sameCgemCluster;
1336 n_hits_tot=n_MdcHits+2*n_CgemCluster;
1337 iter_bestTrk=iter_trk;
1338 bestTrkId=(*iter_trk)->trackId();
1341 myTrkIdBest=bestTrkId;
1342 myNHitsBestTrk=n_hits_tot;
1343 myNSameHitsBestTrk=n_sameHit_tot;
1344 if(bestTrkId!=-1) (*iter_bestTrk)->setStat(400000*myVecPDG[iTrk]/
abs(myVecPDG[iTrk])+myVecPDG[iTrk]);
1347 myRecMdcTrackCol->push_back(recMdcTrack);
double sin(const BesAngle a)
bool sortCluster(const RecCgemCluster *clusterA, const RecCgemCluster *clusterB)
bool sortCluster(const RecCgemCluster *clusterA, const RecCgemCluster *clusterB)
double abs(const EvtComplex &c)
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
std::vector< MdcDigi * > MdcDigiVec
ObjectVector< RecMdcHit > RecMdcHitCol
SmartRefVector< RecCgemCluster > ClusterRefVec
ObjectVector< RecMdcTrack > RecMdcTrackCol
SmartRefVector< RecMdcHit > HitRefVec
DotsConnection(const std::string &name, ISvcLocator *pSvcLocator)
void setInitialHelix(KalmanFit::Helix aHelix)
void setChi2Diverge(double cut=1000000)
int deactiveHits(double chi_cut=10, int nMax=1)
int getLayer(const MdcDigi *aDcDigi)
void setDChits(vector< const MdcDigi * > aVecMdcDigi, double T0)
void setCgemClusters(vector< const RecCgemCluster * > aVecCgemCluster)
void useAxialHitsOnly(bool x=true)
double getRmidGapCgem(int i)
vector< double > getVecChiCgemCluster()
KalmanFit::Helix getClassHelix()
void fitCircleOnly(bool x=true)
vector< RecMdcHit > makeRecMdcHitVec(int sel=1)
vector< double > getVecChiMdcDigi()
vector< int > getVecMdcDigiIsAct()
int activeHits(double chi_cut=10)
void setPxy(const double pxy)
void setTrackId(const int trackId)
void setPy(const double py)
void setZ(const double z)
void setX(const double x)
void setError(double err[15])
void setTheta(const double theta)
void setStat(const int stat)
void setP(const double p)
void setHelix(double helix[5])
void setPoca(double poca[3])
void setR(const double r)
void setCharge(const int charge)
void setY(const double y)
void setChi2(const double chi)
void setPhi(const double phi)
void setPz(const double pz)
void setPx(const double px)
double flightLength(HepPoint3D &hit) const
Hep3Vector momentum(double dPhi=0.) const
returns momentum vector after rotating angle dPhi in phi direction.
const HepSymMatrix & Ea(void) const
returns error matrix.
HepPoint3D x(double dPhi=0.) const
returns position after rotating angle dPhi in phi direction.
double radius(void) const
returns radious of helix.
const HepVector & a(void) const
returns helix parameters.
const HepPoint3D & pivot(void) const
returns pivot position.
Hep3Vector direction(double dPhi=0.) const
returns direction vector after rotating angle dPhi in phi direction.
double getT0(int layid, int cellid) const
double getTprop(int lay, double z) const
double getTimeWalk(int layid, double Q) const
double Radius(void) const
double nomShift(void) const
HepPoint3D Forward(void) const
const MdcGeoWire *const Wire(unsigned id)
const int getSuperLayerSize()
const MdcGeoLayer *const Layer(unsigned id)
static int layer(const Identifier &id)
Values of different levels (failure returns 0)
static int wire(const Identifier &id)
MdcDigiVec & getMdcDigiVec(uint32_t control=0)
static double MdcTime(int timeChannel)
int getclusterid(void) const
int getlayerid(void) const
const Identifier getMdcId(void) const
const double getFltLen(void) const
void setVecClusters(ClusterRefVec vecclusters)
void setPivot(const HepPoint3D &pivot)
void setVecHits(HitRefVec vechits)
void setFiTerm(double fiterm)