Fork me on GitHub

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • modules/Calorimeter.cc

    r341014c r298734e  
    1717 */
    1818
     19
    1920/** \class Calorimeter
    2021 *
     
    3233#include "classes/DelphesFormula.h"
    3334
     35#include "ExRootAnalysis/ExRootResult.h"
     36#include "ExRootAnalysis/ExRootFilter.h"
    3437#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"
    3844#include "TDatabasePDG.h"
    39 #include "TFormula.h"
    4045#include "TLorentzVector.h"
    41 #include "TMath.h"
    42 #include "TObjArray.h"
    43 #include "TRandom3.h"
    44 #include "TString.h"
    4546
    4647#include <algorithm>
     48#include <stdexcept>
    4749#include <iostream>
    4850#include <sstream>
    49 #include <stdexcept>
    5051
    5152using namespace std;
     
    5758  fItParticleInputArray(0), fItTrackInputArray(0)
    5859{
    59 
     60 
    6061  fECalResolutionFormula = new DelphesFormula;
    6162  fHCalResolutionFormula = new DelphesFormula;
     
    6667  fHCalTowerTrackArray = new TObjArray;
    6768  fItHCalTowerTrackArray = fHCalTowerTrackArray->MakeIterator();
     69 
    6870}
    6971
     
    7274Calorimeter::~Calorimeter()
    7375{
    74 
     76 
    7577  if(fECalResolutionFormula) delete fECalResolutionFormula;
    7678  if(fHCalResolutionFormula) delete fHCalResolutionFormula;
     
    8183  if(fHCalTowerTrackArray) delete fHCalTowerTrackArray;
    8284  if(fItHCalTowerTrackArray) delete fItHCalTowerTrackArray;
     85 
    8386}
    8487
     
    9194  Double_t ecalFraction, hcalFraction;
    9295  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;
    9598
    9699  // read eta and phi bins
     
    100103  fEtaBins.clear();
    101104  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];
    105108    sizeEtaBins = paramEtaBins.GetSize();
    106     paramPhiBins = param[i * 2 + 1];
     109    paramPhiBins = param[i*2 + 1];
    107110    sizePhiBins = paramPhiBins.GetSize();
    108111
     
    121124  {
    122125    fEtaBins.push_back(itEtaBin->first);
    123     phiBins = new vector<double>(itEtaBin->second.size());
     126    phiBins = new vector< double >(itEtaBin->second.size());
    124127    fPhiBins.push_back(phiBins);
    125128    phiBins->clear();
     
    138141  fFractionMap[0] = make_pair(0.0, 1.0);
    139142
    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];
    143146
    144147    ecalFraction = paramFractions[0].GetDouble();
    145148    hcalFraction = paramFractions[1].GetDouble();
    146149
    147     fFractionMap[param[i * 2].GetInt()] = make_pair(ecalFraction, hcalFraction);
     150    fFractionMap[param[i*2].GetInt()] = make_pair(ecalFraction, hcalFraction);
    148151  }
    149152
    150153  // read min E value for timing measurement in ECAL
    151   fTimingEnergyMin = GetDouble("TimingEnergyMin", 4.);
     154  fTimingEnergyMin = GetDouble("TimingEnergyMin",4.);
    152155  // For timing
    153156  // So far this flag needs to be false
     
    189192void Calorimeter::Finish()
    190193{
    191   vector<vector<Double_t> *>::iterator itPhiBin;
     194  vector< vector< Double_t >* >::iterator itPhiBin;
    192195  if(fItParticleInputArray) delete fItParticleInputArray;
    193196  if(fItTrackInputArray) delete fItTrackInputArray;
     
    215218  TFractionMap::iterator itFractionMap;
    216219
    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;
    222225
    223226  DelphesFactory *factory = GetFactory();
     
    231234  fItParticleInputArray->Reset();
    232235  number = -1;
    233   while((particle = static_cast<Candidate *>(fItParticleInputArray->Next())))
     236  while((particle = static_cast<Candidate*>(fItParticleInputArray->Next())))
    234237  {
    235238    const TLorentzVector &particlePosition = particle->Position;
     
    277280  fItTrackInputArray->Reset();
    278281  number = -1;
    279   while((track = static_cast<Candidate *>(fItTrackInputArray->Next())))
     282  while((track = static_cast<Candidate*>(fItTrackInputArray->Next())))
    280283  {
    281284    const TLorentzVector &trackPosition = track->Position;
     
    328331    towerHit = (*itTowerHits);
    329332    flags = (towerHit >> 24) & 0x00000000000000FFLL;
    330     number = (towerHit)&0x0000000000FFFFFFLL;
     333    number = (towerHit) & 0x0000000000FFFFFFLL;
    331334    hitEtaPhi = towerHit >> 32;
    332335
     
    349352
    350353      // 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]);
    353356
    354357      fTowerEdges[0] = fEtaBins[etaBin - 1];
     
    362365      fECalTrackEnergy = 0.0;
    363366      fHCalTrackEnergy = 0.0;
    364 
     367     
    365368      fECalTrackSigma = 0.0;
    366369      fHCalTrackSigma = 0.0;
    367 
     370     
    368371      fTowerTrackHits = 0;
    369372      fTowerPhotonHits = 0;
     
    371374      fECalTowerTrackArray->Clear();
    372375      fHCalTowerTrackArray->Clear();
     376   
    373377    }
    374378
     
    378382      ++fTowerTrackHits;
    379383
    380       track = static_cast<Candidate *>(fTrackInputArray->At(number));
     384      track = static_cast<Candidate*>(fTrackInputArray->At(number));
    381385      momentum = track->Momentum;
    382386      position = track->Position;
     
    396400      {
    397401        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;
    405407        fECalTowerTrackArray->Add(track);
    406408      }
    407 
     409     
    408410      else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] > 1.0E-9)
    409411      {
    410412        fHCalTrackEnergy += hcalEnergy;
    411413        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;
    418418        fHCalTowerTrackArray->Add(track);
    419419      }
    420 
     420     
    421421      else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] < 1.0E-9)
    422422      {
     
    430430    if(flags & 2) ++fTowerPhotonHits;
    431431
    432     particle = static_cast<Candidate *>(fParticleInputArray->At(number));
     432    particle = static_cast<Candidate*>(fParticleInputArray->At(number));
    433433    momentum = particle->Momentum;
    434434    position = particle->Position;
     
    443443    if(ecalEnergy > fTimingEnergyMin && fTower)
    444444    {
    445       if(abs(particle->PID) != 11 || !fElectronsFromTrack)
     445      if (abs(particle->PID) != 11 || !fElectronsFromTrack)
    446446      {
    447447        fTower->ECalEnergyTimePairs.push_back(make_pair<Float_t, Float_t>(ecalEnergy, particle->Position.T()));
     
    464464  Double_t ecalEnergy, hcalEnergy;
    465465  Double_t ecalNeutralEnergy, hcalNeutralEnergy;
    466 
     466 
    467467  Double_t ecalSigma, hcalSigma;
    468468  Double_t ecalNeutralSigma, hcalNeutralSigma;
    469469
    470470  Double_t weightTrack, weightCalo, bestEnergyEstimate, rescaleFactor;
    471 
     471 
    472472  TLorentzVector momentum;
    473473  TFractionMap::iterator itFractionMap;
     
    486486  hcalSigma = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, hcalEnergy);
    487487
    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;
    490490
    491491  energy = ecalEnergy + hcalEnergy;
     
    519519  if(sumWeight > 0.0)
    520520  {
    521     fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime / sumWeight);
     521    fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime/sumWeight);
    522522  }
    523523  else
     
    525525    fTower->Position.SetPtEtaPhiE(1.0, eta, phi, 999999.9);
    526526  }
     527
    527528
    528529  fTower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
     
    544545    fTowerOutputArray->Add(fTower);
    545546  }
    546 
     547 
    547548  // fill energy flow candidates
    548549  fECalTrackSigma = TMath::Sqrt(fECalTrackSigma);
     
    550551
    551552  //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 eflowtrack
     553  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
    559560  if(ecalNeutralEnergy > fECalEnergyMin && ecalNeutralSigma > fECalEnergySignificanceMin)
    560561  {
    561562    // create new photon tower
    562     tower = static_cast<Candidate *>(fTower->Clone());
    563     pt = ecalNeutralEnergy / TMath::CosH(eta);
    564 
     563    tower = static_cast<Candidate*>(fTower->Clone());
     564    pt =  ecalNeutralEnergy / TMath::CosH(eta);
     565   
    565566    tower->Momentum.SetPtEtaPhiE(pt, eta, phi, ecalNeutralEnergy);
    566567    tower->Eem = ecalNeutralEnergy;
    567568    tower->Ehad = 0.0;
    568569    tower->PID = 22;
    569 
     570   
    570571    fEFlowPhotonOutputArray->Add(tower);
    571 
     572   
    572573    //clone tracks
    573574    fItECalTowerTrackArray->Reset();
    574     while((track = static_cast<Candidate *>(fItECalTowerTrackArray->Next())))
     575    while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next())))
    575576    {
    576577      mother = track;
    577       track = static_cast<Candidate *>(track->Clone());
     578      track = static_cast<Candidate*>(track->Clone());
    578579      track->AddCandidate(mother);
    579580
    580581      fEFlowTrackOutputArray->Add(track);
    581582    }
    582   }
    583 
     583 
     584  }
     585 
    584586  // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the calorimeter and tracking
    585587  else if(fECalTrackEnergy > 0.0)
    586588  {
    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;
    592594
    593595    //rescale tracks
    594596    fItECalTowerTrackArray->Reset();
    595     while((track = static_cast<Candidate *>(fItECalTowerTrackArray->Next())))
    596     {
     597    while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next())))
     598    { 
    597599      mother = track;
    598       track = static_cast<Candidate *>(track->Clone());
     600      track = static_cast<Candidate*>(track->Clone());
    599601      track->AddCandidate(mother);
    600602
     
    604606    }
    605607  }
     608
    606609
    607610  // if hcal neutral excess is significant, simply create neutral EflowNeutralHadron tower and clone each track into eflowtrack
     
    609612  {
    610613    // create new photon tower
    611     tower = static_cast<Candidate *>(fTower->Clone());
    612     pt = hcalNeutralEnergy / TMath::CosH(eta);
    613 
     614    tower = static_cast<Candidate*>(fTower->Clone());
     615    pt =  hcalNeutralEnergy / TMath::CosH(eta);
     616   
    614617    tower->Momentum.SetPtEtaPhiE(pt, eta, phi, hcalNeutralEnergy);
    615618    tower->Ehad = hcalNeutralEnergy;
    616619    tower->Eem = 0.0;
    617 
     620   
    618621    fEFlowNeutralHadronOutputArray->Add(tower);
    619 
     622   
    620623    //clone tracks
    621624    fItHCalTowerTrackArray->Reset();
    622     while((track = static_cast<Candidate *>(fItHCalTowerTrackArray->Next())))
     625    while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next())))
    623626    {
    624627      mother = track;
    625       track = static_cast<Candidate *>(track->Clone());
     628      track = static_cast<Candidate*>(track->Clone());
    626629      track->AddCandidate(mother);
    627630
    628631      fEFlowTrackOutputArray->Add(track);
    629632    }
    630   }
    631 
     633 
     634  }
     635 
    632636  // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the calorimeter and tracking
    633637  else if(fHCalTrackEnergy > 0.0)
    634638  {
    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);
    639643    rescaleFactor = bestEnergyEstimate / fHCalTrackEnergy;
    640644
    641645    //rescale tracks
    642646    fItHCalTowerTrackArray->Reset();
    643     while((track = static_cast<Candidate *>(fItHCalTowerTrackArray->Next())))
    644     {
     647    while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next())))
     648    { 
    645649      mother = track;
    646       track = static_cast<Candidate *>(track->Clone());
     650      track = static_cast<Candidate*>(track->Clone());
    647651      track->AddCandidate(mother);
    648652
     
    652656    }
    653657  }
     658 
     659 
    654660}
    655661
     
    662668  if(mean > 0.0)
    663669  {
    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));
    668674  }
    669675  else
Note: See TracChangeset for help on using the changeset viewer.