9 #include "TLorentzVector.h"
10 #include <UTIL/LCRelationNavigator.h>
11 #include <IMPL/ReconstructedParticleImpl.h>
18 Int_t nMCP = colMCP->getNumberOfElements();
20 for (Int_t i=0;i<nMCP;i++) {
21 MCParticle *mcp =
dynamic_cast<MCParticle*
>(colMCP->getElementAt(i));
30 MCParticle *
getMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL) {
36 MCParticle *
getMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL, Double_t &weight) {
41 MCParticle *
getMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL, Double_t &weight, Int_t &nMCTL) {
43 MCParticle *mcLinkedParticle = NULL;
45 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
46 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(recPart);
47 FloatVec vecWgtMCTL = navMCTL->getRelatedToWeights(recPart);
49 nMCTL = vecMCTL.size();
50 for (Int_t i=0;i<nMCTL;i++) {
51 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[i]);
52 if (vecWgtMCTL[i] > weight) {
53 weight = vecWgtMCTL[i];
54 mcLinkedParticle = mcPart;
58 return mcLinkedParticle;
61 Int_t
getLinkedMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL, Double_t &weight, Int_t &nMCTL) {
65 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
66 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(recPart);
67 FloatVec vecWgtMCTL = navMCTL->getRelatedToWeights(recPart);
68 Double_t mcEnergyMax = -1.0;
70 nMCTL = vecMCTL.size();
71 for (Int_t i=0;i<nMCTL;i++) {
72 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[i]);
73 Double_t mcEnergy = mcPart->getEnergy();
74 if (mcEnergy > mcEnergyMax) {
75 mcEnergyMax = mcEnergy;
77 weight = vecWgtMCTL[i];
88 Int_t nParents = mcPart->getParents().size();
89 while (nParents > 0) {
91 MCParticle *mother = mcPart->getParents()[0];
93 nParents = mother->getParents().size();
95 Int_t pdg = mcPart->getPDG();
97 if (abs(pdg) == 24 || abs(pdg) == 23 || abs(pdg) == 25)
break;
100 if (abs(pdg) == 25)
break;
103 Int_t originalPDG = mcPart->getPDG();
110 Int_t nParents = mcPart->getParents().size();
112 Double_t charge = mcPart->getCharge();
113 while (nParents > 0) {
114 MCParticle *mother = mcPart->getParents()[0];
116 for (Int_t i=0;i<nParents;i++) {
117 MCParticle *temp = mcPart->getParents()[i];
118 if (TMath::Abs(temp->getCharge() - charge) < 0.1) {
125 nParents = mother->getParents().size();
126 Int_t pdg = mcPart->getPDG();
127 if (abs(pdg) == 13 || abs(pdg) == 11 || abs(pdg) == 15) {
128 if (mcPart->getParents().size() > 0) {
129 MCParticle *mmother = mcPart->getParents()[0];
130 Int_t mpdg = mmother->getPDG();
131 if (abs(mpdg) == 11) {
137 else if (abs(pdg) == 24 || abs(pdg) == 23 || pdg == 25 || pdg == 21 || abs(pdg) == 15) {
140 else if (abs(pdg) <= 6 && abs(pdg) >= 1) {
146 Int_t originalPDG = mcPart->getPDG();
152 Int_t nParents = mcPart->getParents().size();
154 if (mcPart->isOverlay())
return -22;
155 MCParticle *previous = mcPart;
156 while (nParents > 0 && serial > 11) {
157 Double_t charge = previous->getCharge();
158 MCParticle *mother = mcPart->getParents()[0];
160 for (Int_t i=0;i<nParents;i++) {
161 MCParticle *temp = mcPart->getParents()[i];
162 if (TMath::Abs(temp->getCharge() - charge) < 0.1) {
170 if (mcPart->isOverlay())
break;
171 nParents = mcPart->getParents().size();
174 if (mcPart->isOverlay())
return -22;
175 Int_t originalPDG = mcPart->getPDG();
182 Int_t nParents = mcPart->getParents().size();
183 while (nParents > 0) {
185 MCParticle *mother = mcPart->getParents()[0];
187 nParents = mother->getParents().size();
189 Int_t pdg = mcPart->getPDG();
191 if (abs(pdg) == 24 || abs(pdg) == 23 || abs(pdg) == 25)
break;
194 if (abs(pdg) == 25)
break;
198 return originalSerial;
201 Int_t
getOriginalSerial(ReconstructedParticle *recPart, LCCollection *colMCTL, LCCollection *colMCP, Bool_t iHiggs) {
204 Int_t originalSerial = -1;
205 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
206 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(recPart);
207 if (vecMCTL.size() > 0) {
208 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
211 return originalSerial;
217 Int_t nParents = mcPart->getParents().size();
218 while (nParents > 0) {
220 MCParticle *mother = mcPart->getParents()[0];
222 nParents = mother->getParents().size();
224 Int_t pdg = mcPart->getPDG();
225 if (abs(pdg) == 25) {
226 if (mcPart->getParents().size() > 0) {
227 MCParticle *mmother = mcPart->getParents()[0];
228 Int_t mpdg = mmother->getPDG();
229 if (mpdg == 11)
break;
234 return originalSerial;
239 Int_t iLeptonType = 0;
240 Double_t fElectronCut1 = 0.5;
241 Double_t fElectronCut2 = 1.3;
242 Double_t fElectronCut3 = 0.9;
243 Double_t fMuonCut1 = 0.3;
245 Double_t fMuonCut3 = 1.2;
246 Double_t fPhotonCut1 = 0.7;
247 Double_t fPhotonCut2 = 1.3;
248 Double_t fPhotonCut3 = 0.9;
251 Double_t charge = recPart->getCharge();
252 Double_t ecalEnergy = 0;
253 Double_t hcalEnergy = 0;
254 Double_t yokeEnergy = 0;
255 Double_t totalCalEnergy = 0;
257 std::vector<lcio::Cluster*> clusters = recPart->getClusters();
258 for (std::vector<lcio::Cluster*>::const_iterator iCluster=clusters.begin();iCluster!=clusters.end();++iCluster) {
259 ecalEnergy += (*iCluster)->getSubdetectorEnergies()[0];
260 hcalEnergy += (*iCluster)->getSubdetectorEnergies()[1];
261 yokeEnergy += (*iCluster)->getSubdetectorEnergies()[2];
262 ecalEnergy += (*iCluster)->getSubdetectorEnergies()[3];
263 hcalEnergy += (*iCluster)->getSubdetectorEnergies()[4];
267 totalCalEnergy = ecalEnergy + hcalEnergy;
268 TVector3 momentum = TVector3(recPart->getMomentum());
269 Double_t momentumMagnitude = momentum.Mag();
270 Double_t fEpsilon = 1.E-10;
271 if (totalCalEnergy/momentumMagnitude > fElectronCut1 && totalCalEnergy/momentumMagnitude < fElectronCut2 &&
272 ecalEnergy/(totalCalEnergy + fEpsilon) > fElectronCut3 && TMath::Abs(charge) > 0.5) {
275 else if (totalCalEnergy/momentumMagnitude > fPhotonCut1 && totalCalEnergy/momentumMagnitude < fPhotonCut2 &&
276 ecalEnergy/(totalCalEnergy + fEpsilon) > fPhotonCut3 && TMath::Abs(charge) < 0.5) {
281 else if (TMath::Abs(charge) > 0.5 && totalCalEnergy/momentumMagnitude < fMuonCut1 &&
282 yokeEnergy > fMuonCut3) {
289 Bool_t
getFSRTag(ReconstructedParticle *motherPart, ReconstructedParticle *recPart, Double_t fCosFSRCut) {
291 Bool_t isFSR = kFALSE;
293 TVector3 momentumMother = TVector3(motherPart->getMomentum());
294 TVector3 momentum = TVector3(recPart->getMomentum());
295 Double_t cosFSR = momentum.Dot(momentumMother)/momentum.Mag()/momentumMother.Mag();
300 if (cosFSR > fCosFSRCut && (iTypeMother == 11 || iTypeMother == 13)) {
308 Bool_t
getSplitTag(ReconstructedParticle *motherPart, ReconstructedParticle *recPart) {
311 Bool_t isSplit = kFALSE;
314 Double_t trackMom=0.;
315 Double_t clusterMom=0.;
316 Double_t sigmaMom=999.;
317 Double_t chiMom=999.;
320 const EVENT::ClusterVec ci = motherPart->getClusters();
321 const EVENT::TrackVec ti = motherPart->getTracks();
322 trackMom = motherPart->getEnergy();
323 if(ti.size()==1)sigpMom = trackMom*sqrt(ti[0]->getCovMatrix()[5])/TMath::Abs(ti[0]->getOmega());
325 clusterMom = ci[0]->getEnergy();
326 sigmaMom = 0.18*sqrt(clusterMom);
327 chiMom = (trackMom-clusterMom)/TMath::Sqrt(sigmaMom*sigmaMom+sigpMom*sigpMom);
328 vecMom = TVector3(ci[0]->getPosition()[0],ci[0]->getPosition()[1],ci[0]->getPosition()[2]);
333 const EVENT::ClusterVec c = recPart->getClusters();
335 TVector3 vecg(c[0]->getPosition()[0],c[0]->getPosition()[1],c[0]->getPosition()[2]);
336 TVector3 v = vecg.Cross(vecMom);
337 float magg = vecg.Mag();
338 if(magg>0) dr = v.Mag()/magg;
342 Double_t eg = recPart->getEnergy();
343 float chiNew = (trackMom-clusterMom-eg)/sigmaMom;
344 if(dr<20.0) isSplit =
true;
346 if(dr<30.0 && chiMom>4.0 && TMath::Abs(chiNew)<chiMom) isSplit =
true;
347 if(dr<40.0 && chiMom>5.0 && TMath::Abs(chiNew)<chiMom) isSplit =
true;
348 if(dr<50.0 && chiMom>7.0 && TMath::Abs(chiNew)<chiMom) isSplit =
true;
350 if(TMath::Abs(chiMom)<2.0 && chiNew*chiNew>chiMom*chiMom+5.0) isSplit =
false;
352 if(dr<10.0) isSplit =
true;
355 Double_t costheta =
getCosTheta(motherPart,recPart);
356 if (costheta<0.99995 && eg/trackMom < 0.03) isSplit =
true;
361 Double_t
getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone) {
363 Int_t nPFOs = colPFO->getNumberOfElements();
364 Double_t coneEnergy = 0.;
365 TVector3 momentum0 = TVector3(recPart->getMomentum());
366 for (Int_t i=0;i<nPFOs;i++) {
367 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
368 if (pfo != recPart) {
369 TVector3 momentum = TVector3(pfo->getMomentum());
370 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
371 if (cosTheta > cosCone) {
372 coneEnergy += pfo->getEnergy();
379 void getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone, Bool_t woFSR, Double_t coneEnergy[3], Double_t pFSR[4]) {
382 TLorentzVector lortzFSR = TLorentzVector(0, 0, 0, 0);
383 Int_t nPFOs = colPFO->getNumberOfElements();
384 TVector3 momentum0 = TVector3(recPart->getMomentum());
385 for (Int_t i=0;i<nPFOs;i++) {
386 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
387 if (pfo == recPart)
continue;
388 Double_t energy = pfo->getEnergy();
389 TVector3 momentum = TVector3(pfo->getMomentum());
393 lortzFSR += TLorentzVector(momentum,energy);
397 Double_t charge = pfo->getCharge();
398 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
399 if (cosTheta > cosCone) {
400 coneEnergy[0] += energy;
401 if (TMath::Abs(charge) < 0.5) {
402 coneEnergy[1] += energy;
405 coneEnergy[2] += energy;
409 pFSR[0] = lortzFSR.Px();
410 pFSR[1] = lortzFSR.Py();
411 pFSR[2] = lortzFSR.Pz();
412 pFSR[3] = lortzFSR.E();
417 void getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone, Bool_t woFSR, Double_t coneEnergy[3], Double_t pFSR[4],
418 Double_t cosCone2, Double_t pCone2[4], Int_t &nConePhoton ) {
422 TLorentzVector lortzFSR = TLorentzVector(0, 0, 0, 0);
423 TLorentzVector lortzCon = TLorentzVector(0, 0, 0, 0);
424 Int_t nPFOs = colPFO->getNumberOfElements();
425 TVector3 momentum0 = TVector3(recPart->getMomentum());
427 for (Int_t i=0;i<nPFOs;i++) {
428 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
429 if (pfo == recPart)
continue;
430 Double_t energy = pfo->getEnergy();
431 TVector3 momentum = TVector3(pfo->getMomentum());
435 lortzFSR += TLorentzVector(momentum,energy);
437 if (iType == 22) nConePhoton++;
441 Double_t charge = pfo->getCharge();
442 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
443 if (cosTheta > cosCone) {
444 coneEnergy[0] += energy;
445 if (TMath::Abs(charge) < 0.5) {
446 coneEnergy[1] += energy;
449 coneEnergy[2] += energy;
452 if (iType == 22) nConePhoton++;
454 if (cosTheta > cosCone2) {
455 lortzCon += TLorentzVector(momentum,energy);
458 pFSR[0] = lortzFSR.Px();
459 pFSR[1] = lortzFSR.Py();
460 pFSR[2] = lortzFSR.Pz();
461 pFSR[3] = lortzFSR.E();
462 pCone2[0] = lortzCon.Px();
463 pCone2[1] = lortzCon.Py();
464 pCone2[2] = lortzCon.Pz();
465 pCone2[3] = lortzCon.E();
469 TLorentzVector
getFSRMomentum(ReconstructedParticle *recPart, LCCollection *colPFO) {
471 TLorentzVector lortzFSR = TLorentzVector(0.,0.,0.,0.);
472 Int_t nPFOs = colPFO->getNumberOfElements();
473 TVector3 momentum0 = TVector3(recPart->getMomentum());
474 for (Int_t i=0;i<nPFOs;i++) {
475 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
476 if (pfo == recPart)
continue;
478 if (! isFSR)
continue;
479 Double_t energy = pfo->getEnergy();
480 TVector3 momentum = TVector3(pfo->getMomentum());
481 lortzFSR += TLorentzVector(momentum,energy);
487 Double_t
getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone, Int_t mode) {
489 Int_t nPFOs = colPFO->getNumberOfElements();
490 Double_t coneEnergy = 0.,coneEnergyC = 0.,coneEnergyN = 0.;
491 TVector3 momentum0 = TVector3(recPart->getMomentum());
492 for (Int_t i=0;i<nPFOs;i++) {
493 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
494 if (pfo != recPart) {
495 TVector3 momentum = TVector3(pfo->getMomentum());
496 Int_t iCharge = pfo->getCharge();
497 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
498 if (cosTheta > cosCone) {
499 coneEnergy += pfo->getEnergy();
501 coneEnergyN += pfo->getEnergy();
504 coneEnergyC += pfo->getEnergy();
512 else if (mode == 1) {
515 else if (mode == 2) {
523 Double_t
getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone,
524 std::vector<lcio::ReconstructedParticle*> &conePFOs) {
526 Int_t nPFOs = colPFO->getNumberOfElements();
527 Double_t coneEnergy = 0.;
528 TVector3 momentum0 = TVector3(recPart->getMomentum());
529 for (Int_t i=0;i<nPFOs;i++) {
530 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
531 if (pfo != recPart) {
532 TVector3 momentum = TVector3(pfo->getMomentum());
533 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
534 if (cosTheta > cosCone) {
535 coneEnergy += pfo->getEnergy();
536 conePFOs.push_back(pfo);
543 void getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone,
544 Double_t coneEnergy[3], Double_t cosCone2, Double_t pCone2[4]){
547 TLorentzVector lortzCon = TLorentzVector(0, 0, 0, 0);
548 Int_t nPFOs = colPFO->getNumberOfElements();
549 TVector3 momentum0 = TVector3(recPart->getMomentum());
550 for (Int_t i=0;i<nPFOs;i++) {
551 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
552 if (pfo == recPart)
continue;
553 Double_t energy = pfo->getEnergy();
554 TVector3 momentum = TVector3(pfo->getMomentum());
555 Double_t charge = pfo->getCharge();
556 Double_t cosTheta = momentum0.Dot(momentum)/momentum0.Mag()/momentum.Mag();
557 if (cosTheta > cosCone) {
558 coneEnergy[0] += energy;
559 if (TMath::Abs(charge) < 0.5) {
560 coneEnergy[1] += energy;
563 coneEnergy[2] += energy;
566 if (cosTheta > cosCone2) {
567 lortzCon += TLorentzVector(momentum,energy);
570 pCone2[0] = lortzCon.Px();
571 pCone2[1] = lortzCon.Py();
572 pCone2[2] = lortzCon.Pz();
573 pCone2[3] = lortzCon.E();
577 Double_t
getInvariantMass(ReconstructedParticle *recPart1, ReconstructedParticle *recPart2) {
579 TVector3 momentum1 = TVector3(recPart1->getMomentum());
580 TVector3 momentum2 = TVector3(recPart2->getMomentum());
581 Double_t energy1 = recPart1->getEnergy();
582 Double_t energy2 = recPart2->getEnergy();
583 Double_t invariantMass = 0.;
584 Double_t invariantMass2 = (energy1+energy2)*(energy1+energy2)-(momentum1+momentum2).Mag2();
585 if (invariantMass2 > 0.) {
586 invariantMass = sqrt(invariantMass2);
589 invariantMass = -sqrt(TMath::Abs(invariantMass2));
591 return invariantMass;
594 Double_t
getInvariantMass(ReconstructedParticle *recPart1, ReconstructedParticle *recPart2, ReconstructedParticle *recPart3) {
596 TVector3 momentum1 = TVector3(recPart1->getMomentum());
597 TVector3 momentum2 = TVector3(recPart2->getMomentum());
598 TVector3 momentum3 = TVector3(recPart3->getMomentum());
599 Double_t energy1 = recPart1->getEnergy();
600 Double_t energy2 = recPart2->getEnergy();
601 Double_t energy3 = recPart3->getEnergy();
602 Double_t invariantMass = 0.;
603 Double_t invariantMass2 = (energy1+energy2+energy3)*(energy1+energy2+energy3)-(momentum1+momentum2+momentum3).Mag2();
604 if (invariantMass2 > 0.) {
605 invariantMass = sqrt(invariantMass2);
608 invariantMass = -sqrt(TMath::Abs(invariantMass2));
610 return invariantMass;
613 Int_t
isSelectedByFastJet( ReconstructedParticle *pfo, LCCollection *colFastJet, Double_t &ratioEPartEJet, Double_t &ratioPTMJet ) {
616 Int_t nJets = colFastJet->getNumberOfElements();
618 for (Int_t i=0;i<nJets;i++) {
619 ReconstructedParticle *jet =
dynamic_cast<ReconstructedParticle*
>(colFastJet->getElementAt(i));
620 std::vector<lcio::ReconstructedParticle*> partVec = jet->getParticles();
621 for (std::vector<lcio::ReconstructedParticle*>::const_iterator iPart=partVec.begin();iPart!=partVec.end();++iPart) {
622 if ((*iPart) == pfo) {
630 ReconstructedParticle *theJet =
dynamic_cast<ReconstructedParticle*
>(colFastJet->getElementAt(iJet));
632 Double_t ePart = pfo->getEnergy();
633 TVector3 pPart = pfo->getMomentum();
634 Double_t eJet = theJet->getEnergy();
635 TVector3 pJet = theJet->getMomentum();
637 Double_t mJet = eJet*eJet > pJet.Mag2() ? TMath::Sqrt(eJet*eJet-pJet.Mag2()) : TMath::Sqrt(-eJet*eJet+pJet.Mag2());
638 ratioEPartEJet = ePart/eJet;
639 ratioPTMJet = pPart.Pt(pJet)/mJet;
645 void doPhotonRecovery(ReconstructedParticle *
electron, LCCollection *colPFO, ReconstructedParticleImpl *recoElectron, Double_t fCosFSRCut) {
647 TLorentzVector lortzElectron = TLorentzVector(electron->getMomentum(),electron->getEnergy());
648 Int_t nPFOs = colPFO->getNumberOfElements();
649 for (Int_t i=0;i<nPFOs;i++) {
650 ReconstructedParticle *recPart =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
651 if (recPart == electron)
continue;
652 Bool_t isFSR =
getFSRTag(electron,recPart,fCosFSRCut);
653 if (! isFSR)
continue;
654 recoElectron->addParticle(recPart);
656 if (isSplit)
continue;
657 lortzElectron += TLorentzVector(recPart->getMomentum(),recPart->getEnergy());
659 Double_t energy = lortzElectron.E();
660 Double_t mass = lortzElectron.M();
661 Double_t momentum[3] = {lortzElectron.Px(),lortzElectron.Py(),lortzElectron.Pz()};
662 Double_t charge = electron->getCharge();
663 recoElectron->setMomentum(momentum);
664 recoElectron->setEnergy(energy);
665 recoElectron->setMass(mass);
666 recoElectron->setCharge(charge);
667 recoElectron->setType(94);
671 void doPhotonRecovery(ReconstructedParticle *
electron, LCCollection *colPFO, ReconstructedParticleImpl *recoElectron, Double_t fCosFSRCut,
672 Int_t lepType, std::vector<lcio::ReconstructedParticle*> &photons) {
674 TLorentzVector lortzElectron = TLorentzVector(electron->getMomentum(),electron->getEnergy());
675 recoElectron->addParticle(electron);
676 Int_t nPFOs = colPFO->getNumberOfElements();
677 for (Int_t i=0;i<nPFOs;i++) {
678 ReconstructedParticle *recPart =
dynamic_cast<ReconstructedParticle*
>(colPFO->getElementAt(i));
679 if (recPart == electron)
continue;
681 Bool_t isFSR =
getFSRTag(electron,recPart,fCosFSRCut);
682 if (! isFSR)
continue;
683 photons.push_back(recPart);
684 recoElectron->addParticle(recPart);
688 if (isSplit)
continue;
690 else if (lepType == 13) {
692 lortzElectron += TLorentzVector(recPart->getMomentum(),recPart->getEnergy());
694 Double_t energy = lortzElectron.E();
695 Double_t mass = lortzElectron.M();
696 Double_t momentum[3] = {lortzElectron.Px(),lortzElectron.Py(),lortzElectron.Pz()};
697 Double_t charge = electron->getCharge();
698 recoElectron->setMomentum(momentum);
699 recoElectron->setEnergy(energy);
700 recoElectron->setMass(mass);
701 recoElectron->setCharge(charge);
702 recoElectron->setType(94);
706 Bool_t
isFoundInVector(ReconstructedParticle *pfo, std::vector<lcio::ReconstructedParticle*> &pfos) {
707 for (std::vector<lcio::ReconstructedParticle*>::const_iterator ipfo=pfos.begin();ipfo!=pfos.end();++ipfo) {
708 if ((*ipfo) == pfo) {
715 Double_t
jetFunction( TLorentzVector lortz,
float beta,
float power) {
718 Double_t energy = lortz.E();
719 Double_t momentum = lortz.P();
725 return TMath::Power(energy,power)*(1.-beta+beta*momentum*momentum/energy/energy);
730 Double_t
jetFunction( TLorentzVector lortz,
float virtual_scale) {
733 Double_t energy = lortz.E();
734 Double_t mass = lortz.M();
740 return energy*(1. - mass/virtual_scale);
749 for (Int_t i=0;i<4;i++) {
750 energyComponents[i] = 0.;
753 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
755 Int_t np = jet->getParticles().size();
757 for (Int_t i=0;i<np;i++) {
758 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle *
>(jet->getParticles()[i]);
759 Double_t energy = pfo->getEnergy();
760 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(pfo);
762 if (vecMCTL.size() > 0) {
763 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
766 if (originalSerial == 8) {
767 energyComponents[0] += energy;
769 else if (originalSerial == 9) {
770 energyComponents[1] += energy;
772 else if (mcPart->isOverlay()) {
773 energyComponents[3] += energy;
776 energyComponents[2] += energy;
783 Double_t energyMax = -1.;
784 for (Int_t i=0;i<4;i++) {
785 if (energyComponents[i] > energyMax) {
786 energyMax = energyComponents[i];
797 Int_t iColor1, Int_t iColor2, Int_t iColor3) {
802 for (Int_t i=0;i<4;i++) {
803 energyComponents[i] = 0.;
806 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
808 Int_t np = jet->getParticles().size();
810 for (Int_t i=0;i<np;i++) {
811 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle *
>(jet->getParticles()[i]);
812 Double_t energy = pfo->getEnergy();
813 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(pfo);
815 if (vecMCTL.size() > 0) {
816 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
819 if (originalSerial == iColor1) {
820 energyComponents[0] += energy;
822 else if (originalSerial == iColor2 || originalSerial == iColor3) {
823 energyComponents[1] += energy;
825 else if (mcPart->isOverlay()) {
826 energyComponents[3] += energy;
829 energyComponents[2] += energy;
836 Double_t energyMax = -1.;
837 for (Int_t i=0;i<4;i++) {
838 if (energyComponents[i] > energyMax) {
839 energyMax = energyComponents[i];
853 TH1D *hmass =
dynamic_cast<TH1D *
>(file.Get(hist));
854 Int_t nbin = hmass->GetNbinsX();
855 Double_t ntot = hmass->GetEntries();
856 Double_t epsilon = 0.001;
858 for (Int_t j=0;j<nbin;j++) {
859 Double_t nj = hmass->GetBinContent(j+1);
860 Double_t tj = hmass->GetBinCenter(j+1);
861 Double_t delta = hmass->GetBinWidth(j+1);
862 Double_t hj = TMath::Power(4./3/ntot,1./5)*delta*TMath::Sqrt(ntot/(nj+epsilon));
863 Double_t density = 1.0*nj/ntot/TMath::Sqrt(2*3.1416)/hj*TMath::Exp(-(mass-tj)*(mass-tj)/2/hj/hj);
878 std::cerr <<
"No MC Collection Found!" << std::endl;
881 Int_t nMCP = colMC->getNumberOfElements();
883 std::cout << setw(6) <<
"Index" << setw(7) <<
"PDG" << setw(7) <<
"Mother" << setw(10) <<
"Charge" << setw(10) <<
"Mass"
884 << setw(11) <<
"Energy" << setw(18) <<
"NumberOfDaughters" << setw(16) <<
"NumberOfParents"
885 << setw(10) <<
"Original" << setw(8) <<
"Overlay" << setw(8) <<
"FromSim" << std::endl;
887 for (Int_t i=0;i<nMCP;i++) {
888 MCParticle *mcPart =
dynamic_cast<MCParticle*
>(colMC->getElementAt(i));
889 Int_t pdg = mcPart->getPDG();
890 Int_t nparents = mcPart->getParents().size();
893 MCParticle *mother = mcPart->getParents()[0];
894 motherpdg = mother->getPDG();
896 Double_t charge = mcPart->getCharge();
897 Double_t mass = mcPart->getMass();
898 Double_t energy = mcPart->getEnergy();
900 Int_t ndaughters = mcPart->getDaughters().size();
902 Int_t daughterpdg = 0;
903 if (ndaughters > 0) {
904 MCParticle *daughter = mcPart->getDaughters()[0];
905 daughterpdg = daughter->getPDG();
910 Int_t ioverlay = mcPart->isOverlay()? 1 : 0;
911 Int_t icreatedinsim = mcPart->isCreatedInSimulation()? 1 : 0;
912 std::cout << setw(6) << i << setw(7) << pdg << setw(7) << motherpdg << setw(10) << setprecision(3) << charge << setw(10) << mass
913 << setw(11) << energy << setw(18) << ndaughters << setw(16) << nparents
914 << setw(10) << originalPDG << setw(8) << ioverlay << setw(8) << icreatedinsim << std::endl;
918 Bool_t
isOverlay(ReconstructedParticle *pfo, LCCollection *colMCTL) {
920 Bool_t iOverlay =
false;
922 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
923 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(pfo);
924 if (vecMCTL.size() > 0) {
925 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
926 if (mcPart->isOverlay()) iOverlay =
true;
933 void dumpJetParticles(ReconstructedParticle *jet, LCCollection *colMC, LCCollection *colMCTL) {
936 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
938 TLorentzVector lortz = TLorentzVector(jet->getMomentum(),jet->getEnergy());
939 cerr <<
"----Particles of the Jet: (E,Px,Py,Pz) = (" << lortz.E() <<
"," << lortz.Px() <<
","
940 << lortz.Py() <<
"," << lortz.Pz() <<
")------" << endl;
942 Int_t np = jet->getParticles().size();
943 cerr << setw(6) <<
"Index" << setw(7) <<
"PDG" << setw(7) <<
"Mother" << setw(10) <<
"Charge" << setw(10) <<
"Mass"
944 << setw(11) <<
"Energy" << setw(18) <<
"NumberOfDaughters" << setw(16) <<
"NumberOfParents"
945 << setw(10) <<
"Original" << setw(8) <<
"Overlay" << setw(8) <<
"FromSim" << endl;
946 for (Int_t i=0;i<np;i++) {
947 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle *
>(jet->getParticles()[i]);
948 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(pfo);
949 if (vecMCTL.size() > 0) {
950 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
951 Int_t pdg = mcPart->getPDG();
952 Int_t nparents = mcPart->getParents().size();
955 MCParticle *mother = mcPart->getParents()[0];
956 motherpdg = mother->getPDG();
958 Double_t charge = mcPart->getCharge();
959 Double_t mass = mcPart->getMass();
960 Double_t energy = mcPart->getEnergy();
961 TVector3 pv = TVector3(mcPart->getMomentum());
962 Int_t ndaughters = mcPart->getDaughters().size();
964 Int_t daughterpdg = 0;
965 if (ndaughters > 0) {
966 MCParticle *daughter = mcPart->getDaughters()[0];
967 daughterpdg = daughter->getPDG();
971 Int_t ioverlay = mcPart->isOverlay()? 1 : 0;
972 Int_t icreatedinsim = mcPart->isCreatedInSimulation()? 1 : 0;
973 cerr << setw(6) << i << setw(7) << pdg << setw(7) << motherpdg << setw(10) << setprecision(3) << charge
974 << setw(10) << mass << setw(11) << energy << setw(18) << ndaughters << setw(16) << nparents
975 << setw(10) << originalPDG << setw(8) << ioverlay << setw(8) << icreatedinsim << endl;
982 Int_t
getVertexComponents(LCCollection *colMC, LCCollection *colMCTL, ReconstructedParticle *vertex, Double_t energyComponents[2], Int_t nparticles[2]) {
986 for (Int_t i=0;i<2;i++) {
987 energyComponents[i] = 0.;
991 LCRelationNavigator *navMCTL =
new LCRelationNavigator(colMCTL);
993 Int_t np = vertex->getParticles().size();
994 for (Int_t i=0;i<np;i++) {
995 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle *
>(vertex->getParticles()[i]);
996 Double_t energy = pfo->getEnergy();
997 LCObjectVec vecMCTL = navMCTL->getRelatedToObjects(pfo);
998 if (vecMCTL.size() > 0) {
999 MCParticle *mcPart =
dynamic_cast<MCParticle *
>(vecMCTL[0]);
1000 if (mcPart->isOverlay()) {
1001 energyComponents[1] += energy;
1005 energyComponents[0] += energy;
1012 if (energyComponents[0] > energyComponents[1]) {
1033 Double_t
getJetDistance( ReconstructedParticle *i, ReconstructedParticle *j, TString algorithm, Double_t R) {
1036 TLorentzVector lortz_i = TLorentzVector(i->getMomentum(),i->getEnergy());
1037 TLorentzVector lortz_j = TLorentzVector(j->getMomentum(),j->getEnergy());
1038 Double_t pt_i = lortz_i.Pt();
1039 Double_t pt_j = lortz_j.Pt();
1040 Double_t ptmin = pt_i < pt_j ? pt_i : pt_j;
1042 if (algorithm ==
"kt") {
1043 Double_t phi_i = lortz_i.Phi();
1044 Double_t phi_j = lortz_j.Phi();
1045 Double_t rapidity_i = lortz_i.Rapidity();
1046 Double_t rapidity_j = lortz_j.Rapidity();
1047 Double_t deltaR2 = (phi_i-phi_j)*(phi_i-phi_j)+(rapidity_i-rapidity_j)*(rapidity_i-rapidity_j);
1048 y = ptmin*ptmin*deltaR2/R/R;
1055 Int_t
isFromVertex( ReconstructedParticle *recPart, LCCollection *colVertex) {
1058 Int_t nVtx = colVertex->getNumberOfElements();
1059 for (Int_t i=0;i<nVtx;i++) {
1060 ReconstructedParticle *vertex =
dynamic_cast<ReconstructedParticle*
>(colVertex->getElementAt(i));
1061 Int_t np = vertex->getParticles().size();
1062 for (Int_t j=0;j<np;j++) {
1063 ReconstructedParticle *pfo =
dynamic_cast<ReconstructedParticle *
>(vertex->getParticles()[j]);
1064 if (pfo == recPart)
return 1;
1076 std::vector<Int_t> nHDecay;
1077 Int_t nHbb=0,nHWW=0,nWqq=0,nWlv=0,nHgg=0,nHZZ=0,nHcc=0;
1078 Int_t nHmumu=0,nHgamgam=0,nZvv=0,nZqq=0,nZee=0,nZmm=0,nHtautau=0;
1079 Int_t nMCP = colMC->getNumberOfElements();
1080 for (Int_t i=0;i<nMCP;i++) {
1081 MCParticle *mcPart =
dynamic_cast<MCParticle*
>(colMC->getElementAt(i));
1082 Int_t pdg = mcPart->getPDG();
1083 Int_t ndaughters = mcPart->getDaughters().size();
1084 Int_t daughterpdg = 0;
1085 if (ndaughters > 0) {
1086 MCParticle *daughter = mcPart->getDaughters()[0];
1087 daughterpdg = daughter->getPDG();
1089 Int_t nparents = mcPart->getParents().size();
1090 Int_t motherpdg = 0;
1092 MCParticle *mother = mcPart->getParents()[0];
1093 motherpdg = mother->getPDG();
1095 if (pdg == 25 && abs(daughterpdg) == 5) nHbb++;
1096 if (pdg == 25 && abs(daughterpdg) == 24)nHWW++;
1097 if (pdg == 25 && abs(daughterpdg) == 21) nHgg++;
1098 if (pdg == 25 && abs(daughterpdg) == 23) nHZZ++;
1099 if (pdg == 25 && abs(daughterpdg) == 4) nHcc++;
1100 if (pdg == 25 && abs(daughterpdg) == 13) nHmumu++;
1101 if (pdg == 25 && abs(daughterpdg) == 15) nHtautau++;
1102 if (pdg == 25 && abs(daughterpdg) == 22) nHgamgam++;
1103 if (abs(pdg) == 24 && abs(motherpdg) == 25 && abs(daughterpdg) > 10 && abs(daughterpdg) < 20) nWlv++;
1104 if (abs(pdg) == 24 && abs(motherpdg) == 25 && abs(daughterpdg) < 10 && abs(daughterpdg) > 0) nWqq++;
1105 if (abs(pdg) == 23 && abs(motherpdg) == 25 && (abs(daughterpdg) == 12 || abs(daughterpdg) == 14 || abs(daughterpdg) == 16)) nZvv++;
1106 if (abs(pdg) == 23 && abs(motherpdg) == 25 && abs(daughterpdg) < 10 && abs(daughterpdg) > 0) nZqq++;
1107 if (abs(pdg) == 23 && abs(motherpdg) == 25 && abs(daughterpdg) == 11) nZee++;
1108 if (abs(pdg) == 23 && abs(motherpdg) == 25 && abs(daughterpdg) == 13) nZmm++;
1111 nHDecay.push_back(nHbb);
1112 nHDecay.push_back(nHWW);
1113 nHDecay.push_back(nHgg);
1114 nHDecay.push_back(nHtautau);
1115 nHDecay.push_back(nHcc);
1116 nHDecay.push_back(nHZZ);
1117 nHDecay.push_back(nHgamgam);
1118 nHDecay.push_back(nHmumu);
1119 nHDecay.push_back(nWlv);
1120 nHDecay.push_back(nWqq);
1121 nHDecay.push_back(nZvv);
1122 nHDecay.push_back(nZqq);
1123 nHDecay.push_back(nZee);
1124 nHDecay.push_back(nZmm);
1133 std::vector<Int_t> nOvlEvents;
1134 Int_t nOvl=0,nBgam=0,nBelectron=0,nBpositron=0;
1135 Int_t nMCP = colMC->getNumberOfElements();
1136 for (Int_t i=0;i<nMCP;i++) {
1137 MCParticle *mcPart =
dynamic_cast<MCParticle*
>(colMC->getElementAt(i));
1138 Int_t pdg = mcPart->getPDG();
1140 Int_t ndaughters = mcPart->getDaughters().size();
1141 Int_t daughterpdg = 0;
1142 if (ndaughters > 0) {
1143 MCParticle *daughter = mcPart->getDaughters()[0];
1144 daughterpdg = daughter->getPDG();
1146 Int_t nparents = mcPart->getParents().size();
1147 Int_t motherpdg = 0;
1149 MCParticle *mother = mcPart->getParents()[0];
1150 motherpdg = mother->getPDG();
1153 Int_t ibeam = TMath::Abs(mcPart->getEnergy()-fEcm/2) < 0.1 ? 1 : 0;
1154 Int_t iovl = mcPart->isOverlay() ? 1 : 0;
1155 if (iovl == 1 && ibeam == 1 && pdg == 22) nBgam +=1;
1156 if (iovl == 1 && ibeam == 1 && pdg == 11) nBelectron +=1;
1157 if (iovl == 1 && ibeam == 1 && pdg == -11) nBpositron +=1;
1160 nOvl = (nBgam + nBelectron + nBpositron)/2;
1161 nOvlEvents.push_back(nOvl);
1162 nOvlEvents.push_back(nBgam);
1163 nOvlEvents.push_back(nBelectron);
1164 nOvlEvents.push_back(nBpositron);
1174 Int_t nMCP = colMC->getNumberOfElements();
1175 cerr << setw(6) <<
"Index" << setw(7) <<
"PDG" << setw(7) <<
"Mother" << setw(10) <<
"Charge" << setw(10) <<
"Mass" << setw(11) <<
"Energy" << setw(18) <<
"NumberOfDaughters" << setw(16) <<
"NumberOfParents" << setw(10) <<
"Original" << setw(8) <<
"Overlay" << setw(8) <<
"FromSim" << endl;
1176 for (Int_t i=0;i<nMCP;i++) {
1177 MCParticle *mcPart =
dynamic_cast<MCParticle*
>(colMC->getElementAt(i));
1178 Int_t pdg = mcPart->getPDG();
1179 Int_t nparents = mcPart->getParents().size();
1180 Int_t motherpdg = 0;
1182 MCParticle *mother = mcPart->getParents()[0];
1183 motherpdg = mother->getPDG();
1185 Double_t charge = mcPart->getCharge();
1186 Double_t mass = mcPart->getMass();
1187 Double_t energy = mcPart->getEnergy();
1188 TVector3 pv = TVector3(mcPart->getMomentum());
1189 Int_t ndaughters = mcPart->getDaughters().size();
1191 Int_t daughterpdg = 0;
1192 if (ndaughters > 0) {
1193 MCParticle *daughter = mcPart->getDaughters()[0];
1194 daughterpdg = daughter->getPDG();
1197 TLorentzVector lortz = TLorentzVector(pv,energy);
1199 Int_t ioverlay = mcPart->isOverlay()? 1 : 0;
1200 Int_t icreatedinsim = mcPart->isCreatedInSimulation()? 1 : 0;
1201 cerr << setw(6) << i << setw(7) << pdg << setw(7) << motherpdg << setw(10) << setprecision(3) << charge << setw(10) << mass << setw(11) << energy << setw(18) << ndaughters << setw(16) << nparents << setw(10) << originalPDG << setw(8) << ioverlay << setw(8) << icreatedinsim << endl;
1209 const Double_t fCrossAngle = 0.014;
1210 return TLorentzVector(fEcm*TMath::Sin(fCrossAngle/2),0.,0.,fEcm);
1213 const Double_t fCrossAngle = 0.014;
1214 if (isCrossingAngle) {
1215 return TLorentzVector(fEcm*TMath::Sin(fCrossAngle/2),0.,0.,fEcm);
1218 return TLorentzVector(0.,0.,0.,fEcm);
1225 TLorentzVector lortzRecoil = lortzEcm - lortzZ;
1226 return lortzRecoil.M();
1232 Double_t phi1 = lortz1.Phi();
1233 Double_t phi2 = lortz2.Phi();
1234 Double_t acop12 = TMath::Abs(phi1-phi2);
1235 return acop12 > TMath::Pi() ? TMath::Pi()*2. - acop12 : acop12;
1241 return TLorentzVector(pfo->getMomentum(),pfo->getEnergy());
1246 Double_t
getCosTheta(ReconstructedParticle *part1, ReconstructedParticle *part2) {
1247 TVector3 momentum1 = TVector3(part1->getMomentum());
1248 TVector3 momentum2 = TVector3(part2->getMomentum());
1249 Double_t cosTheta = momentum1.Dot(momentum2)/momentum1.Mag()/momentum2.Mag();
1256 TVector3 momentum1 = TVector3(part1.Vect());
1257 TVector3 momentum2 = TVector3(part2.Vect());
1258 Double_t cosTheta = momentum1.Dot(momentum2)/momentum1.Mag()/momentum2.Mag();
Int_t getLeptonID(ReconstructedParticle *recPart)
Bool_t getSplitTag(ReconstructedParticle *motherPart, ReconstructedParticle *recPart)
Int_t getOriginalPDGForIsoLep(MCParticle *mcPart, LCCollection *colMC)
void mcDebug(LCCollection *colMC)
Double_t getLikelihood(TString fname, TString hist, Double_t mass)
Int_t getOriginalSerialForZHH(MCParticle *mcPart, LCCollection *colMCP)
Double_t getCosTheta(ReconstructedParticle *part1, ReconstructedParticle *part2)
Double_t getJetDistance(ReconstructedParticle *i, ReconstructedParticle *j, TString algorithm, Double_t R)
Int_t isVertexFromOverlay(ReconstructedParticle *vertex, LCCollection *colMC, LCCollection *colMCTL)
Int_t calculateEnergyComponents(LCCollection *colMC, LCCollection *colMCTL, ReconstructedParticle *jet, Double_t energyComponents[4])
void dumpJetParticles(ReconstructedParticle *jet, LCCollection *colMC, LCCollection *colMCTL)
Double_t getConeEnergy(ReconstructedParticle *recPart, LCCollection *colPFO, Double_t cosCone)
TLorentzVector getFSRMomentum(ReconstructedParticle *recPart, LCCollection *colPFO)
Int_t getLinkedMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL, Double_t &weight, Int_t &nMCTL)
std::vector< Int_t > getNumberOfOverlayEvents(Double_t fEcm, LCCollection *colMC)
Double_t getRecoilMass(TLorentzVector lortzEcm, TLorentzVector lortzZ)
Double_t getAcoPlanarity(TLorentzVector lortz1, TLorentzVector lortz2)
void doPhotonRecovery(ReconstructedParticle *electron, LCCollection *colPFO, ReconstructedParticleImpl *recoElectron, Double_t fCosFSRCut=0.999)
Int_t getOriginalPDG(MCParticle *mcPart, Bool_t iHiggs=0)
Int_t isFromVertex(ReconstructedParticle *recPart, LCCollection *colVertex)
TLorentzVector getLorentzEcm(Double_t fEcm)
Int_t getMCSerial(MCParticle *mcPart, LCCollection *colMCP)
Double_t getInvariantMass(ReconstructedParticle *recPart1, ReconstructedParticle *recPart2)
TLorentzVector getLorentzVector(ReconstructedParticle *pfo)
MCParticle * getMCParticle(ReconstructedParticle *recPart, LCCollection *colMCTL)
Bool_t isOverlay(ReconstructedParticle *pfo, LCCollection *colMCTL)
Int_t getVertexComponents(LCCollection *colMC, LCCollection *colMCTL, ReconstructedParticle *vetex, Double_t energyComponents[2], Int_t nparticles[2])
std::vector< Int_t > getHiggsDecayModes(LCCollection *colMC)
Int_t getOriginalSerial(MCParticle *mcPart, LCCollection *colMCP, Bool_t iHiggs=0)
Bool_t getFSRTag(ReconstructedParticle *motherPart, ReconstructedParticle *recPart, Double_t fCosFSRCut=0.999)
Bool_t isFoundInVector(ReconstructedParticle *pfo, std::vector< lcio::ReconstructedParticle * > &pfos)
Double_t jetFunction(TLorentzVector lortz, float beta, float power)
Int_t isSelectedByFastJet(ReconstructedParticle *pfo, LCCollection *colFastJet, Double_t &ratioEPartEJet, Double_t &ratioPTMJet)
void listMCParticles(LCCollection *colMC)