Changes in modules/Calorimeter.cc [341014c:298734e] in git
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
modules/Calorimeter.cc
r341014c r298734e 17 17 */ 18 18 19 19 20 /** \class Calorimeter 20 21 * … … 32 33 #include "classes/DelphesFormula.h" 33 34 35 #include "ExRootAnalysis/ExRootResult.h" 36 #include "ExRootAnalysis/ExRootFilter.h" 34 37 #include "ExRootAnalysis/ExRootClassifier.h" 35 #include "ExRootAnalysis/ExRootFilter.h" 36 #include "ExRootAnalysis/ExRootResult.h" 37 38 39 #include "TMath.h" 40 #include "TString.h" 41 #include "TFormula.h" 42 #include "TRandom3.h" 43 #include "TObjArray.h" 38 44 #include "TDatabasePDG.h" 39 #include "TFormula.h"40 45 #include "TLorentzVector.h" 41 #include "TMath.h"42 #include "TObjArray.h"43 #include "TRandom3.h"44 #include "TString.h"45 46 46 47 #include <algorithm> 48 #include <stdexcept> 47 49 #include <iostream> 48 50 #include <sstream> 49 #include <stdexcept>50 51 51 52 using namespace std; … … 57 58 fItParticleInputArray(0), fItTrackInputArray(0) 58 59 { 59 60 60 61 fECalResolutionFormula = new DelphesFormula; 61 62 fHCalResolutionFormula = new DelphesFormula; … … 66 67 fHCalTowerTrackArray = new TObjArray; 67 68 fItHCalTowerTrackArray = fHCalTowerTrackArray->MakeIterator(); 69 68 70 } 69 71 … … 72 74 Calorimeter::~Calorimeter() 73 75 { 74 76 75 77 if(fECalResolutionFormula) delete fECalResolutionFormula; 76 78 if(fHCalResolutionFormula) delete fHCalResolutionFormula; … … 81 83 if(fHCalTowerTrackArray) delete fHCalTowerTrackArray; 82 84 if(fItHCalTowerTrackArray) delete fItHCalTowerTrackArray; 85 83 86 } 84 87 … … 91 94 Double_t ecalFraction, hcalFraction; 92 95 TBinMap::iterator itEtaBin; 93 set< Double_t>::iterator itPhiBin;94 vector< Double_t> *phiBins;96 set< Double_t >::iterator itPhiBin; 97 vector< Double_t > *phiBins; 95 98 96 99 // read eta and phi bins … … 100 103 fEtaBins.clear(); 101 104 fPhiBins.clear(); 102 for(i = 0; i < size /2; ++i)103 { 104 paramEtaBins = param[i *2];105 for(i = 0; i < size/2; ++i) 106 { 107 paramEtaBins = param[i*2]; 105 108 sizeEtaBins = paramEtaBins.GetSize(); 106 paramPhiBins = param[i *2 + 1];109 paramPhiBins = param[i*2 + 1]; 107 110 sizePhiBins = paramPhiBins.GetSize(); 108 111 … … 121 124 { 122 125 fEtaBins.push_back(itEtaBin->first); 123 phiBins = new vector< double>(itEtaBin->second.size());126 phiBins = new vector< double >(itEtaBin->second.size()); 124 127 fPhiBins.push_back(phiBins); 125 128 phiBins->clear(); … … 138 141 fFractionMap[0] = make_pair(0.0, 1.0); 139 142 140 for(i = 0; i < size /2; ++i)141 { 142 paramFractions = param[i *2 + 1];143 for(i = 0; i < size/2; ++i) 144 { 145 paramFractions = param[i*2 + 1]; 143 146 144 147 ecalFraction = paramFractions[0].GetDouble(); 145 148 hcalFraction = paramFractions[1].GetDouble(); 146 149 147 fFractionMap[param[i *2].GetInt()] = make_pair(ecalFraction, hcalFraction);150 fFractionMap[param[i*2].GetInt()] = make_pair(ecalFraction, hcalFraction); 148 151 } 149 152 150 153 // read min E value for timing measurement in ECAL 151 fTimingEnergyMin = GetDouble("TimingEnergyMin", 154 fTimingEnergyMin = GetDouble("TimingEnergyMin",4.); 152 155 // For timing 153 156 // So far this flag needs to be false … … 189 192 void Calorimeter::Finish() 190 193 { 191 vector< vector<Double_t> *>::iterator itPhiBin;194 vector< vector< Double_t >* >::iterator itPhiBin; 192 195 if(fItParticleInputArray) delete fItParticleInputArray; 193 196 if(fItTrackInputArray) delete fItTrackInputArray; … … 215 218 TFractionMap::iterator itFractionMap; 216 219 217 vector< Double_t>::iterator itEtaBin;218 vector< Double_t>::iterator itPhiBin;219 vector< Double_t> *phiBins;220 221 vector< Long64_t>::iterator itTowerHits;220 vector< Double_t >::iterator itEtaBin; 221 vector< Double_t >::iterator itPhiBin; 222 vector< Double_t > *phiBins; 223 224 vector< Long64_t >::iterator itTowerHits; 222 225 223 226 DelphesFactory *factory = GetFactory(); … … 231 234 fItParticleInputArray->Reset(); 232 235 number = -1; 233 while((particle = static_cast<Candidate 236 while((particle = static_cast<Candidate*>(fItParticleInputArray->Next()))) 234 237 { 235 238 const TLorentzVector &particlePosition = particle->Position; … … 277 280 fItTrackInputArray->Reset(); 278 281 number = -1; 279 while((track = static_cast<Candidate 282 while((track = static_cast<Candidate*>(fItTrackInputArray->Next()))) 280 283 { 281 284 const TLorentzVector &trackPosition = track->Position; … … 328 331 towerHit = (*itTowerHits); 329 332 flags = (towerHit >> 24) & 0x00000000000000FFLL; 330 number = (towerHit) &0x0000000000FFFFFFLL;333 number = (towerHit) & 0x0000000000FFFFFFLL; 331 334 hitEtaPhi = towerHit >> 32; 332 335 … … 349 352 350 353 // calculate eta and phi of the tower's center 351 fTowerEta = 0.5 *(fEtaBins[etaBin - 1] + fEtaBins[etaBin]);352 fTowerPhi = 0.5 *((*phiBins)[phiBin - 1] + (*phiBins)[phiBin]);354 fTowerEta = 0.5*(fEtaBins[etaBin - 1] + fEtaBins[etaBin]); 355 fTowerPhi = 0.5*((*phiBins)[phiBin - 1] + (*phiBins)[phiBin]); 353 356 354 357 fTowerEdges[0] = fEtaBins[etaBin - 1]; … … 362 365 fECalTrackEnergy = 0.0; 363 366 fHCalTrackEnergy = 0.0; 364 367 365 368 fECalTrackSigma = 0.0; 366 369 fHCalTrackSigma = 0.0; 367 370 368 371 fTowerTrackHits = 0; 369 372 fTowerPhotonHits = 0; … … 371 374 fECalTowerTrackArray->Clear(); 372 375 fHCalTowerTrackArray->Clear(); 376 373 377 } 374 378 … … 378 382 ++fTowerTrackHits; 379 383 380 track = static_cast<Candidate 384 track = static_cast<Candidate*>(fTrackInputArray->At(number)); 381 385 momentum = track->Momentum; 382 386 position = track->Position; … … 396 400 { 397 401 fECalTrackEnergy += ecalEnergy; 398 ecalSigma = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E()); 399 if(ecalSigma / momentum.E() < track->TrackResolution) 400 energyGuess = ecalEnergy; 401 else 402 energyGuess = momentum.E(); 403 404 fECalTrackSigma += (track->TrackResolution) * energyGuess * (track->TrackResolution) * energyGuess; 402 ecalSigma = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E()); 403 if(ecalSigma/momentum.E() < track->TrackResolution) energyGuess = ecalEnergy; 404 else energyGuess = momentum.E(); 405 406 fECalTrackSigma += (track->TrackResolution)*energyGuess*(track->TrackResolution)*energyGuess; 405 407 fECalTowerTrackArray->Add(track); 406 408 } 407 409 408 410 else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] > 1.0E-9) 409 411 { 410 412 fHCalTrackEnergy += hcalEnergy; 411 413 hcalSigma = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E()); 412 if(hcalSigma / momentum.E() < track->TrackResolution) 413 energyGuess = hcalEnergy; 414 else 415 energyGuess = momentum.E(); 416 417 fHCalTrackSigma += (track->TrackResolution) * energyGuess * (track->TrackResolution) * energyGuess; 414 if(hcalSigma/momentum.E() < track->TrackResolution) energyGuess = hcalEnergy; 415 else energyGuess = momentum.E(); 416 417 fHCalTrackSigma += (track->TrackResolution)*energyGuess*(track->TrackResolution)*energyGuess; 418 418 fHCalTowerTrackArray->Add(track); 419 419 } 420 420 421 421 else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] < 1.0E-9) 422 422 { … … 430 430 if(flags & 2) ++fTowerPhotonHits; 431 431 432 particle = static_cast<Candidate 432 particle = static_cast<Candidate*>(fParticleInputArray->At(number)); 433 433 momentum = particle->Momentum; 434 434 position = particle->Position; … … 443 443 if(ecalEnergy > fTimingEnergyMin && fTower) 444 444 { 445 if (abs(particle->PID) != 11 || !fElectronsFromTrack)445 if (abs(particle->PID) != 11 || !fElectronsFromTrack) 446 446 { 447 447 fTower->ECalEnergyTimePairs.push_back(make_pair<Float_t, Float_t>(ecalEnergy, particle->Position.T())); … … 464 464 Double_t ecalEnergy, hcalEnergy; 465 465 Double_t ecalNeutralEnergy, hcalNeutralEnergy; 466 466 467 467 Double_t ecalSigma, hcalSigma; 468 468 Double_t ecalNeutralSigma, hcalNeutralSigma; 469 469 470 470 Double_t weightTrack, weightCalo, bestEnergyEstimate, rescaleFactor; 471 471 472 472 TLorentzVector momentum; 473 473 TFractionMap::iterator itFractionMap; … … 486 486 hcalSigma = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, hcalEnergy); 487 487 488 if(ecalEnergy < fECalEnergyMin || ecalEnergy < fECalEnergySignificanceMin *ecalSigma) ecalEnergy = 0.0;489 if(hcalEnergy < fHCalEnergyMin || hcalEnergy < fHCalEnergySignificanceMin *hcalSigma) hcalEnergy = 0.0;488 if(ecalEnergy < fECalEnergyMin || ecalEnergy < fECalEnergySignificanceMin*ecalSigma) ecalEnergy = 0.0; 489 if(hcalEnergy < fHCalEnergyMin || hcalEnergy < fHCalEnergySignificanceMin*hcalSigma) hcalEnergy = 0.0; 490 490 491 491 energy = ecalEnergy + hcalEnergy; … … 519 519 if(sumWeight > 0.0) 520 520 { 521 fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime /sumWeight);521 fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime/sumWeight); 522 522 } 523 523 else … … 525 525 fTower->Position.SetPtEtaPhiE(1.0, eta, phi, 999999.9); 526 526 } 527 527 528 528 529 fTower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy); … … 544 545 fTowerOutputArray->Add(fTower); 545 546 } 546 547 547 548 // fill energy flow candidates 548 549 fECalTrackSigma = TMath::Sqrt(fECalTrackSigma); … … 550 551 551 552 //compute neutral excesses 552 ecalNeutralEnergy = max( (ecalEnergy - fECalTrackEnergy), 0.0);553 hcalNeutralEnergy = max( (hcalEnergy - fHCalTrackEnergy), 0.0);554 555 ecalNeutralSigma = ecalNeutralEnergy / TMath::Sqrt(fECalTrackSigma * fECalTrackSigma + ecalSigma *ecalSigma);556 hcalNeutralSigma = hcalNeutralEnergy / TMath::Sqrt(fHCalTrackSigma * fHCalTrackSigma + hcalSigma *hcalSigma);557 558 // if ecal neutral excess is significant, simply create neutral EflowPhoton tower and clone each track into eflowtrack553 ecalNeutralEnergy = max( (ecalEnergy - fECalTrackEnergy) , 0.0); 554 hcalNeutralEnergy = max( (hcalEnergy - fHCalTrackEnergy) , 0.0); 555 556 ecalNeutralSigma = ecalNeutralEnergy / TMath::Sqrt(fECalTrackSigma*fECalTrackSigma + ecalSigma*ecalSigma); 557 hcalNeutralSigma = hcalNeutralEnergy / TMath::Sqrt(fHCalTrackSigma*fHCalTrackSigma + hcalSigma*hcalSigma); 558 559 // if ecal neutral excess is significant, simply create neutral EflowPhoton tower and clone each track into eflowtrack 559 560 if(ecalNeutralEnergy > fECalEnergyMin && ecalNeutralSigma > fECalEnergySignificanceMin) 560 561 { 561 562 // create new photon tower 562 tower = static_cast<Candidate 563 pt = ecalNeutralEnergy / TMath::CosH(eta);564 563 tower = static_cast<Candidate*>(fTower->Clone()); 564 pt = ecalNeutralEnergy / TMath::CosH(eta); 565 565 566 tower->Momentum.SetPtEtaPhiE(pt, eta, phi, ecalNeutralEnergy); 566 567 tower->Eem = ecalNeutralEnergy; 567 568 tower->Ehad = 0.0; 568 569 tower->PID = 22; 569 570 570 571 fEFlowPhotonOutputArray->Add(tower); 571 572 572 573 //clone tracks 573 574 fItECalTowerTrackArray->Reset(); 574 while((track = static_cast<Candidate 575 while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next()))) 575 576 { 576 577 mother = track; 577 track = static_cast<Candidate 578 track = static_cast<Candidate*>(track->Clone()); 578 579 track->AddCandidate(mother); 579 580 580 581 fEFlowTrackOutputArray->Add(track); 581 582 } 582 } 583 583 584 } 585 584 586 // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the calorimeter and tracking 585 587 else if(fECalTrackEnergy > 0.0) 586 588 { 587 weightTrack = (fECalTrackSigma > 0.0) ? 1 / (fECalTrackSigma *fECalTrackSigma) : 0.0;588 weightCalo = (ecalSigma > 0.0) ? 1 / (ecalSigma *ecalSigma) : 0.0;589 590 bestEnergyEstimate = (weightTrack * fECalTrackEnergy + weightCalo * ecalEnergy) / (weightTrack + weightCalo);591 rescaleFactor = bestEnergyEstimate /fECalTrackEnergy;589 weightTrack = (fECalTrackSigma > 0.0) ? 1 / (fECalTrackSigma*fECalTrackSigma) : 0.0; 590 weightCalo = (ecalSigma > 0.0) ? 1 / (ecalSigma*ecalSigma) : 0.0; 591 592 bestEnergyEstimate = (weightTrack*fECalTrackEnergy + weightCalo*ecalEnergy) / (weightTrack + weightCalo); 593 rescaleFactor = bestEnergyEstimate/fECalTrackEnergy; 592 594 593 595 //rescale tracks 594 596 fItECalTowerTrackArray->Reset(); 595 while((track = static_cast<Candidate 596 { 597 while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next()))) 598 { 597 599 mother = track; 598 track = static_cast<Candidate 600 track = static_cast<Candidate*>(track->Clone()); 599 601 track->AddCandidate(mother); 600 602 … … 604 606 } 605 607 } 608 606 609 607 610 // if hcal neutral excess is significant, simply create neutral EflowNeutralHadron tower and clone each track into eflowtrack … … 609 612 { 610 613 // create new photon tower 611 tower = static_cast<Candidate 612 pt = hcalNeutralEnergy / TMath::CosH(eta);613 614 tower = static_cast<Candidate*>(fTower->Clone()); 615 pt = hcalNeutralEnergy / TMath::CosH(eta); 616 614 617 tower->Momentum.SetPtEtaPhiE(pt, eta, phi, hcalNeutralEnergy); 615 618 tower->Ehad = hcalNeutralEnergy; 616 619 tower->Eem = 0.0; 617 620 618 621 fEFlowNeutralHadronOutputArray->Add(tower); 619 622 620 623 //clone tracks 621 624 fItHCalTowerTrackArray->Reset(); 622 while((track = static_cast<Candidate 625 while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next()))) 623 626 { 624 627 mother = track; 625 track = static_cast<Candidate 628 track = static_cast<Candidate*>(track->Clone()); 626 629 track->AddCandidate(mother); 627 630 628 631 fEFlowTrackOutputArray->Add(track); 629 632 } 630 } 631 633 634 } 635 632 636 // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the calorimeter and tracking 633 637 else if(fHCalTrackEnergy > 0.0) 634 638 { 635 weightTrack = (fHCalTrackSigma > 0.0) ? 1 / (fHCalTrackSigma *fHCalTrackSigma) : 0.0;636 weightCalo = (hcalSigma > 0.0) ? 1 / (hcalSigma *hcalSigma) : 0.0;637 638 bestEnergyEstimate = (weightTrack * fHCalTrackEnergy + weightCalo * hcalEnergy) / (weightTrack + weightCalo);639 weightTrack = (fHCalTrackSigma > 0.0) ? 1 / (fHCalTrackSigma*fHCalTrackSigma) : 0.0; 640 weightCalo = (hcalSigma > 0.0) ? 1 / (hcalSigma*hcalSigma) : 0.0; 641 642 bestEnergyEstimate = (weightTrack*fHCalTrackEnergy + weightCalo*hcalEnergy) / (weightTrack + weightCalo); 639 643 rescaleFactor = bestEnergyEstimate / fHCalTrackEnergy; 640 644 641 645 //rescale tracks 642 646 fItHCalTowerTrackArray->Reset(); 643 while((track = static_cast<Candidate 644 { 647 while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next()))) 648 { 645 649 mother = track; 646 track = static_cast<Candidate 650 track = static_cast<Candidate*>(track->Clone()); 647 651 track->AddCandidate(mother); 648 652 … … 652 656 } 653 657 } 658 659 654 660 } 655 661 … … 662 668 if(mean > 0.0) 663 669 { 664 b = TMath::Sqrt(TMath::Log((1.0 + (sigma * sigma) / (mean *mean))));665 a = TMath::Log(mean) - 0.5 * b *b;666 667 return TMath::Exp(a + b *gRandom->Gaus(0.0, 1.0));670 b = TMath::Sqrt(TMath::Log((1.0 + (sigma*sigma)/(mean*mean)))); 671 a = TMath::Log(mean) - 0.5*b*b; 672 673 return TMath::Exp(a + b*gRandom->Gaus(0.0, 1.0)); 668 674 } 669 675 else
Note:
See TracChangeset
for help on using the changeset viewer.