File indexing completed on 2024-04-06 12:11:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #include "Fireworks/Core/interface/FWInvMassDialog.h"
0017 #include "Fireworks/Core/interface/FWSelectionManager.h"
0018 #include "Fireworks/Core/interface/FWEventItem.h"
0019
0020 #include "DataFormats/Candidate/interface/Candidate.h"
0021 #include "DataFormats/TrackReco/interface/TrackBase.h"
0022 #include "DataFormats/Math/interface/deltaR.h"
0023
0024 #include "TClass.h"
0025 #include "TMath.h"
0026
0027 #include "TGTextView.h"
0028 #include "TGButton.h"
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042 FWInvMassDialog::FWInvMassDialog(FWSelectionManager *sm)
0043 : TGMainFrame(gClient->GetRoot(), 470, 240), m_selectionMgr(sm), m_text(nullptr), m_button(nullptr) {
0044 SetWindowName("Invariant Mass Dialog");
0045 SetCleanup(kDeepCleanup);
0046
0047 m_text = new TGTextView(this);
0048 AddFrame(m_text, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY, 1, 1, 1, 1));
0049
0050 m_button = new TGTextButton(this, "Calculate");
0051 AddFrame(m_button, new TGLayoutHints(kLHintsNormal | kLHintsExpandX, 1, 1, 1, 1));
0052
0053 m_button->Connect("Clicked()", "FWInvMassDialog", this, "Calculate()");
0054
0055 Layout();
0056 MapSubwindows();
0057 }
0058
0059
0060
0061
0062
0063
0064 FWInvMassDialog::~FWInvMassDialog() {}
0065
0066 void FWInvMassDialog::CloseWindow() { UnmapWindow(); }
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 void FWInvMassDialog::beginUpdate() {
0085 m_text->Clear();
0086 m_firstLine = true;
0087 }
0088
0089 void FWInvMassDialog::addLine(const TString &line) {
0090 TGText *txt = m_text->GetText();
0091
0092 if (m_firstLine) {
0093 txt->InsText(TGLongPosition(0, 0), line);
0094 m_firstLine = false;
0095 } else {
0096 txt->InsText(TGLongPosition(0, txt->RowCount()), line);
0097 }
0098 }
0099
0100 void FWInvMassDialog::endUpdate() { m_text->Update(); }
0101
0102 void FWInvMassDialog::Calculate() {
0103 const std::set<FWModelId> &sted = m_selectionMgr->selected();
0104
0105 beginUpdate();
0106
0107 addLine(TString::Format(" %d items in selection", (int)sted.size()));
0108 addLine("");
0109 addLine("--------------------------------------------------+--------------");
0110 addLine(" px py pz pT | Collection");
0111 addLine("--------------------------------------------------+--------------");
0112
0113 TClass *rc_class = TClass::GetClass(typeid(reco::Candidate));
0114 TClass *rtb_class = TClass::GetClass(typeid(reco::TrackBase));
0115
0116 math::XYZVector sum;
0117 double sum_len = 0;
0118 double sum_len_xy = 0;
0119
0120 math::XYZVector first, second;
0121 int n = 0;
0122
0123 for (std::set<FWModelId>::const_iterator i = sted.begin(); i != sted.end(); ++i, ++n) {
0124 TString line;
0125
0126 TClass *model_class = const_cast<TClass *>(i->item()->modelType());
0127 void *model_data = const_cast<void *>(i->item()->modelData(i->index()));
0128
0129 math::XYZVector v;
0130 bool ok_p = false;
0131
0132 reco::Candidate *rc = reinterpret_cast<reco::Candidate *>(model_class->DynamicCast(rc_class, model_data));
0133
0134 if (rc != nullptr) {
0135 ok_p = true;
0136 v.SetXYZ(rc->px(), rc->py(), rc->pz());
0137 } else {
0138 reco::TrackBase *rtb = reinterpret_cast<reco::TrackBase *>(model_class->DynamicCast(rtb_class, model_data));
0139
0140 if (rtb != nullptr) {
0141 ok_p = true;
0142 v.SetXYZ(rtb->px(), rtb->py(), rtb->pz());
0143 }
0144 }
0145
0146 if (ok_p) {
0147 sum += v;
0148 sum_len += TMath::Sqrt(v.mag2());
0149 sum_len_xy += TMath::Sqrt(v.perp2());
0150
0151 line = TString::Format(" %+10.3f %+10.3f %+10.3f %10.3f", v.x(), v.y(), v.z(), TMath::Sqrt(v.perp2()));
0152
0153 } else {
0154 line = TString::Format(" -------- not a Candidate or TrackBase --------");
0155 }
0156 line += TString::Format(" | %s[%d]", i->item()->name().c_str(), i->index());
0157
0158 addLine(line);
0159
0160 if (n == 0)
0161 first = v;
0162 else if (n == 1)
0163 second = v;
0164 }
0165
0166 addLine("--------------------------------------------------+--------------");
0167 addLine(TString::Format(
0168 " %+10.3f %+10.3f %+10.3f %10.3f | Sum", sum.x(), sum.y(), sum.z(), TMath::Sqrt(sum.perp2())));
0169 addLine("");
0170 addLine(TString::Format("m = %10.3f", TMath::Sqrt(TMath::Max(0.0, sum_len * sum_len - sum.mag2()))));
0171 addLine(TString::Format("mT = %10.3f", TMath::Sqrt(TMath::Max(0.0, sum_len_xy * sum_len_xy - sum.perp2()))));
0172 addLine(TString::Format("HT = %10.3f", sum_len_xy));
0173
0174 if (n == 2) {
0175 addLine(TString::Format("deltaPhi = %+6.4f", deltaPhi(first.Phi(), second.Phi())));
0176 addLine(TString::Format("deltaEta = %+6.4f", first.Eta() - second.Eta()));
0177 addLine(TString::Format("deltaR = % 6.4f", deltaR(first.Eta(), first.Phi(), second.Eta(), second.Phi())));
0178 }
0179
0180 endUpdate();
0181 }
0182
0183
0184
0185
0186
0187
0188
0189