Fork me on GitHub

source: git/modules/PdgCodeFilter.cc@ 7aea88d

ImprovedOutputFile Timing dual_readout llp
Last change on this file since 7aea88d was fa42514, checked in by Chase Shimmin <cshimmin@…>, 9 years ago

Add Invert and Status options to PdgCodeFilter

It is sometimes useful to output the truth record of a single
(non-stable) particle species, for example when considering an
exotic heavy resonance. Presently the only way to do so is to
output the entire Delphes/allParticles array, which is inefficient.

This patch adds the option InvertPdg to PdgCodeFilter, which causes
the PdgCodes specified to be *added* to the output array, rather
than removed. It also adds the options RequireStatus and Status,
for additional filtering based on the MC record status. If
RequireStatus is true, than only particles matching Status are
added to the output array.

This patch should be backwards compatible with existing usages of
PdgCodeFilter.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 * Delphes: a framework for fast simulation of a generic collider experiment
3 * Copyright (C) 2012-2014 Universite catholique de Louvain (UCL), Belgium
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/** \class PdgCodeFilter
20 *
21 * Removes particles with specific PDG codes
22 *
23 * \author M. Selvaggi
24 *
25 */
26
27#include "modules/PdgCodeFilter.h"
28
29#include "classes/DelphesClasses.h"
30#include "classes/DelphesFactory.h"
31#include "classes/DelphesFormula.h"
32
33#include "ExRootAnalysis/ExRootResult.h"
34#include "ExRootAnalysis/ExRootFilter.h"
35#include "ExRootAnalysis/ExRootClassifier.h"
36
37#include "TMath.h"
38#include "TString.h"
39#include "TFormula.h"
40#include "TRandom3.h"
41#include "TObjArray.h"
42#include "TDatabasePDG.h"
43#include "TLorentzVector.h"
44
45#include <algorithm>
46#include <stdexcept>
47#include <iostream>
48#include <sstream>
49
50using namespace std;
51
52//------------------------------------------------------------------------------
53
54PdgCodeFilter::PdgCodeFilter() :
55 fItInputArray(0)
56{
57}
58
59//------------------------------------------------------------------------------
60
61PdgCodeFilter::~PdgCodeFilter()
62{
63}
64
65//------------------------------------------------------------------------------
66
67void PdgCodeFilter::Init()
68{
69
70 ExRootConfParam param;
71 Size_t i, size;
72
73 // PT threshold
74 fPTMin = GetDouble("PTMin", 0.0);
75
76 fInvertPdg = GetBool("InvertPdg", false);
77
78 fRequireStatus = GetBool("RequireStatus", false);
79 fStatus = GetInt("Status", 1);
80
81 // import input array
82 fInputArray = ImportArray(GetString("InputArray", "Delphes/allParticles"));
83 fItInputArray = fInputArray->MakeIterator();
84
85 param = GetParam("PdgCode");
86 size = param.GetSize();
87
88 // read PdgCodes to be filtered out from the data card
89
90 fPdgCodes.clear();
91 for(i = 0; i < size; ++i)
92 {
93 fPdgCodes.push_back(param[i].GetInt());
94 }
95
96 // create output array
97 fOutputArray = ExportArray(GetString("OutputArray", "filteredParticles"));
98}
99
100//------------------------------------------------------------------------------
101
102void PdgCodeFilter::Finish()
103{
104 if(fItInputArray) delete fItInputArray;
105}
106
107//------------------------------------------------------------------------------
108
109void PdgCodeFilter::Process()
110{
111 Candidate *candidate;
112 Int_t pdgCode;
113 Bool_t pass;
114 Double_t pt;
115
116 const Bool_t requireStatus = fRequireStatus;
117 const Bool_t invertPdg = fInvertPdg;
118 const int reqStatus = fStatus;
119
120 fItInputArray->Reset();
121 while((candidate = static_cast<Candidate*>(fItInputArray->Next())))
122 {
123 pdgCode = candidate->PID;
124 const TLorentzVector &candidateMomentum = candidate->Momentum;
125 pt = candidateMomentum.Pt();
126
127 if(pt < fPTMin) continue;
128 if(requireStatus && (candidate->Status != reqStatus)) continue;
129
130 pass = kTRUE;
131 if(find(fPdgCodes.begin(), fPdgCodes.end(), pdgCode) != fPdgCodes.end()) pass = kFALSE;
132
133 if (invertPdg) pass = !pass;
134 if(pass) fOutputArray->Add(candidate);
135 }
136}
137
Note: See TracBrowser for help on using the repository browser.