1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| // -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/IdentifiedFinalState.hh"
#include "Rivet/Projections/ChargedFinalState.hh"
#include "Rivet/Projections/MissingMomentum.hh"
#include "Rivet/Projections/FinalState.hh"
namespace Rivet {
/// Muon charge asymmetry in W events at 7 TeV in ATLAS
class ATLAS_2011_S9002537 : public Analysis {
public:
RIVET_DEFAULT_ANALYSIS_CTOR(ATLAS_2011_S9002537);
void init() {
IdentifiedFinalState Muons(Cuts::abseta < 2.4 && Cuts::pT > 20*GeV);
Muons.acceptIdPair(PID::MUON);
declare(Muons, "muons");
ChargedFinalState CFS(Cuts::abseta < 2.8);
declare(CFS, "tracks");
MissingMomentum missmom(FinalState(Cuts::abseta < 5));
declare(missmom, "MissingMomentum");
/// @todo Will need to register TMP histograms for future histogramming
book(_tmp_h_plus, "TMP/plus", refData(1,1,1));
book(_tmp_h_minus, "TMP/minus", refData(1,1,1));
book(_h_asym, 1, 1, 1);
}
void analyze(const Event& event) {
const IdentifiedFinalState& muons = apply<IdentifiedFinalState>(event, "muons");
if (muons.size() < 1) vetoEvent;
const ChargedFinalState& tracks = apply<ChargedFinalState>(event, "tracks");
Particles selected_muons;
for (Particle muon : muons.particles()) {
FourMomentum testmom = muon.momentum();
double ptmu(testmom.pT()), ptsum(-ptmu), ratio(0.);
for (Particle track : tracks.particles()) {
const FourMomentum& trackmom = track.momentum();
if (deltaR(testmom, trackmom) < 0.4) {
ptsum += trackmom.pT();
ratio = ptsum/ptmu;
if (ratio > 0.2) break;
}
}
if (ratio < 0.2) selected_muons.push_back(muon);
}
if (selected_muons.size() < 1) vetoEvent;
const FourMomentum muonmom = selected_muons[0].momentum();
const MissingMomentum& missmom = apply<MissingMomentum>(event, "MissingMomentum");
FourMomentum missvec = -missmom.visibleMomentum();
if (fabs(missvec.Et()) < 25*GeV) vetoEvent;
double MTW = sqrt( 2 * missvec.pT() * muonmom.pT() * (1 - cos( deltaPhi(missvec.phi(), muonmom.phi()) )) );
if (MTW < 40*GeV) vetoEvent;
Histo1DPtr & htmp = (selected_muons[0].pid() > 0) ? _tmp_h_minus : _tmp_h_plus;
htmp->fill(muonmom.eta());
}
/// Normalise histograms etc., after the run
void finalize() {
assert(_tmp_h_plus->numBins() == _tmp_h_minus->numBins());
for (size_t i = 0; i < _tmp_h_plus->numBins(); ++i) {
const double num = _tmp_h_plus->bin(i).sumW() - _tmp_h_minus->bin(i).sumW();
const double denom = _tmp_h_plus->bin(i).sumW() + _tmp_h_minus->bin(i).sumW();
const double relerr = _tmp_h_plus->bin(i).relErr() + _tmp_h_minus->bin(i).relErr();
const double asym = (num != 0 && denom != 0) ? num / denom : 0;
const double asym_err = (num != 0 && denom != 0) ? asym*relerr : 0;
_h_asym->addPoint(_tmp_h_plus->bin(i).xMid(), asym, _tmp_h_plus->bin(i).xWidth()/2.0, asym_err);
}
}
private:
Scatter2DPtr _h_asym;
/// @todo Will need to register TMP histograms for future histogramming
Histo1DPtr _tmp_h_plus, _tmp_h_minus;
};
RIVET_DECLARE_ALIASED_PLUGIN(ATLAS_2011_S9002537, ATLAS_2011_I892704);
}
|