ATLAS Offline Software
AsymptMatrixTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 
8 #include <algorithm>
9 #include <numeric>
10 
11 using namespace FakeBkgTools;
12 using namespace CP;
13 
14 Client AsymptMatrixTool::clientForDB()
15 {
16  return Client::MATRIX_METHOD;
17 }
18 
19 AsymptMatrixTool::AsymptMatrixTool(const std::string& name) : BaseLinearFakeBkgTool(name)
20 {
21 }
22 
24 {
25 }
26 
28 {
30 }
31 
33 {
34  m_cachedWeights.clear();
35 
36  m_components.clear();
37  m_derivatives.clear();
38  for(auto& p : m_particles)
39  {
40  double e = p.real_efficiency.nominal, z = p.fake_efficiency.nominal;
41  double den = 1. / (e - z);
42  double delta = p.tight? 1. : 0.;
43  m_components.emplace_back(std::array<double,2>{den*(delta-z), den*(e-delta)});
44  m_derivatives.emplace_back(std::array<double,2>{den*den*(z-delta), den*den*(delta-z)});
45  m_derivatives.emplace_back(std::array<double,2>{den*den*(delta-e), den*den*(e-delta)});
46  }
47 
48  return incrementTotalYield();
49 }
50 
52 {
53  const uint64_t n = m_particles.size();
54  const uint64_t nc = (1 << n);
55 
58 
60  std::fill_n(w.begin(), nc, 0.);
61  for(uint64_t k=0;k<2*n;++k) std::fill_n(dproj_dt[k].begin(), nc, 0.);
62 
63  auto charges = fs.retrieveCharges(m_particles);
64  std::array<double, maxParticles()+1> effprod;
65  for(uint64_t i=0;i<nc;++i) // loop on tight/loose
66  {
67  FSBitset tights(i);
68  if(!fs.accept_selection(tights, charges)) continue;
69  for(uint64_t j=0;j<nc;++j) // loop on real/fake
70  {
71  FSBitset reals(j);
72  if(!fs.accept_process(n, reals, tights)) continue;
73  std::fill(effprod.begin(), effprod.begin()+n+1, 1.);
74  for(uint64_t k=0;k<n;++k)
75  {
76  double eff = reals[k]? m_particles[k].real_efficiency.nominal : m_particles[k].fake_efficiency.nominal;
77  double x = tights[k]? eff : 1.-eff;
78  effprod[0] *= x;
79  for(uint64_t l=1;l<n+1;++l)
80  {
81  if(l != k+1) effprod[l] *= x;
82  }
83  }
84  auto rev_j = nc-j-1;
85  w[rev_j] += effprod[0];
86  for(uint64_t k=0;k<n;++k) dproj_dt[2*k+!reals[k]][rev_j] += effprod[k+1];
87  }
88  }
89 
90 
91  std::array<std::array<double, maxCombinations()>, 2*maxParticles()> dlambdaprod_dt;
92  for(uint64_t k=0;k<2*n;++k) std::copy(w.begin(), w.begin()+nc, dlambdaprod_dt[k].begin());
93 
94  for(unsigned k=0;k<n;++k)
95  {
96  for(uint64_t j=0;j<nc;++j)
97  {
98  char index = (j>>k)&1;
99  double x = m_components[k][index];
100  w[j] *= x;
101  for(uint64_t u=0;u<n;++u)
102  {
103  dproj_dt[2*u][j] *= x;
104  dproj_dt[2*u+1][j] *= x;
105  if(u != k)
106  {
107  dlambdaprod_dt[2*u][j] *= x;
108  dlambdaprod_dt[2*u+1][j] *= x;
109  }
110  else
111  {
112  dlambdaprod_dt[2*u][j] *= m_derivatives[2*u][index];
113  dlambdaprod_dt[2*u+1][j] *= m_derivatives[2*u+1][index];
114  }
115  }
116  }
117  }
118  weight.nominal = std::accumulate(w.begin(), w.begin()+nc, 0.);
119  auto wu = dlambdaprod_dt.begin(), wv = dproj_dt.begin();
120  for(auto& p : m_particles)
121  {
122  double theta = std::accumulate(wu->begin(), wu->begin()+nc, 0.) + std::accumulate(wv->begin(), wv->begin()+nc, 0.);
123  ++wu;
124  ++wv;
125  for(auto& kv : p.real_efficiency.uncertainties)
126  {
127  auto& uncertainties = weight.uncertainties[kv.first];
128  uncertainties.up += theta * kv.second.up;
129  uncertainties.down += theta * kv.second.down;
130  }
131  theta = std::accumulate(wu->begin(), wu->begin()+nc, 0.) + std::accumulate(wv->begin(), wv->begin()+nc, 0.);
132  ++wu;
133  ++wv;
134  for(auto& kv : p.fake_efficiency.uncertainties)
135  {
136  auto& uncertainties = weight.uncertainties[kv.first];
137  uncertainties.up += theta * kv.second.up;
138  uncertainties.down += theta * kv.second.down;
139  }
140  }
141  return StatusCode::SUCCESS;
142 }
CP::BaseLinearFakeBkgTool::incrementTotalYield
StatusCode incrementTotalYield()
be sure to only call this once per event! (typically at the end of addEvent())
Definition: BaseLinearFakeBkgTool.cxx:104
CP::AsymptMatrixTool::m_components
std::vector< std::array< double, 2 > > m_components
Definition: AsymptMatrixTool.h:32
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
CP::AsymptMatrixTool::m_derivatives
std::vector< std::array< double, 2 > > m_derivatives
Definition: AsymptMatrixTool.h:33
index
Definition: index.py:1
accumulate
bool accumulate(AccumulateMap &map, std::vector< module_t > const &modules, FPGATrackSimMatrixAccumulator const &acc)
Accumulates an accumulator (e.g.
Definition: FPGATrackSimMatrixAccumulator.cxx:22
theta
Scalar theta() const
theta method
Definition: AmgMatrixBasePlugin.h:71
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
FakeBkgTools::Client
Client
Definition: FakeBkgInternals.h:141
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
CP::BaseLinearFakeBkgTool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: BaseLinearFakeBkgTool.cxx:41
FakeBkgTools::Client::MATRIX_METHOD
@ MATRIX_METHOD
x
#define x
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
lumiFormat.i
int i
Definition: lumiFormat.py:92
z
#define z
FakeBkgTools
Definition: BaseFakeBkgTool.h:21
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CP::AsymptMatrixTool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: AsymptMatrixTool.cxx:27
FakeBkgTools::maxCombinations
constexpr uint64_t maxCombinations()
Definition: FakeBkgInternals.h:94
xAOD::uint64_t
uint64_t
Definition: EventInfo_v1.cxx:123
CP::BaseLinearFakeBkgTool
Definition: BaseLinearFakeBkgTool.h:44
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
lumiFormat.array
array
Definition: lumiFormat.py:98
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
FakeBkgTools::maxParticles
constexpr uint8_t maxParticles()
Definition: FakeBkgInternals.h:93
FakeBkgInternals.h
FakeBkgTools::Weight
a structure to hold a weight together with a variable number of systematic uncertainties
Definition: FakeBkgInternals.h:62
CP::BaseFakeBkgTool::m_particles
std::vector< FakeBkgTools::ParticleData > m_particles
Definition: BaseFakeBkgTool.h:85
CP::AsymptMatrixTool::addEventCustom
virtual StatusCode addEventCustom() override
Definition: AsymptMatrixTool.cxx:32
FakeBkgTools::FinalState
Definition: FakeBkgInternals.h:98
DeMoScan.index
string index
Definition: DeMoScan.py:362
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
lumiFormat.fill
fill
Definition: lumiFormat.py:111
Herwig7_QED_EvtGen_ll.fs
dictionary fs
Definition: Herwig7_QED_EvtGen_ll.py:17
CP::AsymptMatrixTool::~AsymptMatrixTool
virtual ~AsymptMatrixTool()
Definition: AsymptMatrixTool.cxx:23
dqt_zlumi_alleff_HIST.eff
int eff
Definition: dqt_zlumi_alleff_HIST.py:113
CP::AsymptMatrixTool::getEventWeightCustom
virtual StatusCode getEventWeightCustom(FakeBkgTools::Weight &weight, const FakeBkgTools::FinalState &fs) override
Definition: AsymptMatrixTool.cxx:51
calibdata.copy
bool copy
Definition: calibdata.py:27
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
FakeBkgTools::FSBitset
std::bitset< maxCombinations()> FSBitset
Definition: FakeBkgInternals.h:95
CP::BaseLinearFakeBkgTool::m_cachedWeights
std::map< FakeBkgTools::FinalState, FakeBkgTools::Weight > m_cachedWeights
cached weight+uncertainties for a single event Each tool derived from this base class MUST clear the ...
Definition: BaseLinearFakeBkgTool.h:72
plotBeamSpotMon.nc
int nc
Definition: plotBeamSpotMon.py:83
fitman.k
k
Definition: fitman.py:528
AsymptMatrixTool.h