32 _analysisname(analysisname),
34 _hltProcessName(pset.getParameter<std::
string>(
"hltProcessName")),
35 _genParticleLabel(pset.getParameter<std::
string>(
"genParticleLabel")),
36 _trigResultsLabel(
"TriggerResults",
"", _hltProcessName),
37 _parametersEta(pset.getParameter<std::vector<double> >(
"parametersEta")),
38 _parametersPhi(pset.getParameter<std::vector<double> >(
"parametersPhi")),
39 _parametersTurnOn(pset.getParameter<std::vector<double> >(
"parametersTurnOn")),
41 _recMuonTrkSelector(0),
48 _recCaloMETSelector(0),
51 _recPhotonSelector(0),
53 _recCaloJetSelector(0)
56 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::constructor()";
65 if (anpset.
exists(
"parametersTurnOn")) {
69 if (anpset.
exists(
"parametersEta")) {
73 if (anpset.
exists(
"parametersPhi")) {
87 for (std::map<unsigned int, edm::InputTag>::const_iterator it =
_recLabels.begin();
92 auto const genCutParam = objStr +
"_genCut_leading";
93 if (pset.
exists(genCutParam)) {
98 auto const recCutParam = objStr +
"_recCut_leading";
99 if (pset.
exists(recCutParam)) {
107 for (std::map<unsigned int, edm::InputTag>::const_iterator it =
_recLabels.begin();
111 auto const genCutParam = objStr +
"_genCut";
116 auto const recCutParam = objStr +
"_recCut";
184 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::subAnalysisBookHistos()";
191 for (std::map<unsigned int, edm::InputTag>::const_iterator it =
_recLabels.begin();
194 std::vector<std::string> sources(2);
198 for (
size_t i = 0;
i < sources.size();
i++) {
201 if ( source ==
"gen" ) {
202 if ( TString(objStr).Contains(
"MET") ||
203 TString(objStr).Contains(
"MHT") ||
204 TString(objStr).Contains(
"Jet") ) {
207 bookHist(iBooker, source, objStr,
"MaxPt1");
208 bookHist(iBooker, source, objStr,
"MaxPt2");
209 bookHist(iBooker, source, objStr,
"Eta");
210 bookHist(iBooker, source, objStr,
"Phi");
213 if ( TString(objStr).Contains(
"MET") ||
214 TString(objStr).Contains(
"MHT") ) {
215 bookHist(iBooker, source, objStr,
"MaxPt1");
216 bookHist(iBooker, source, objStr,
"SumEt");
218 bookHist(iBooker, source, objStr,
"MaxPt1");
219 bookHist(iBooker, source, objStr,
"MaxPt2");
220 bookHist(iBooker, source, objStr,
"Eta");
221 bookHist(iBooker, source, objStr,
"Phi");
230 for (std::vector<HLTExoticaPlotter>::iterator it =
_plotters.begin();
232 it->plotterBookHistos(iBooker, iRun, iSetup);
239 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::beginRun()";
245 bool changedConfig(
true);
247 edm::LogError(
"ExoticaValidation") <<
"HLTExoticaSubAnalysis::constructor(): "
248 <<
"Initialization of HLTConfigProvider failed!";
261 if (TString(thetriggername).Contains(pattern)) {
266 std::cout <<
"--- TRIGGER PATH : " << thetriggername << std::endl;
271 edm::LogWarning(
"ExoticaValidation") <<
"HLTExoticaSubAnalysis::constructor(): In "
280 <<
"\nHLT Trigger Paths found >>>";
281 for (std::set<std::string>::const_iterator
iter =
_hltPaths.begin();
283 LogTrace(
"ExoticaValidation") << (*iter) <<
"\n";
288 for (std::set<std::string>::iterator iPath =
_hltPaths.begin();
293 if (path.rfind(
"_v") < path.length()) {
294 shortpath = path.substr(0, path.rfind(
"_v"));
302 std::vector<unsigned int> objsNeedHLT;
303 for (std::map<unsigned int, edm::InputTag>::iterator it =
_recLabels.begin() ;
305 objsNeedHLT.push_back(it->first);
330 LogTrace(
"ExoticaValidation") <<
" --- " << shortpath;
343 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::analyze()";
365 std::vector<reco::LeafCandidate> matchesGen; matchesGen.clear();
366 std::vector<reco::LeafCandidate> matchesReco; matchesReco.clear();
367 std::map<int , double> theSumEt;
374 for (std::map<unsigned int, edm::InputTag>::iterator it =
_recLabels.begin();
389 if ( TString(objTypeStr).Contains(
"MET") ||
390 TString(objTypeStr).Contains(
"MHT") ||
391 TString(objTypeStr).Contains(
"Jet") )
continue;
405 matchesGen.push_back(
v);
421 for (std::map<unsigned int, edm::InputTag>::iterator it =
_recLabels.begin();
431 <<
" sumEt=" << theSumEt[it->first] << std::endl;
453 if(
verbose>2)
std::cerr <<
"### matchesGen.size() = " << matchesGen.size() << std::endl;
466 std::map<unsigned int, int> countobjects;
467 for (std::map<unsigned int, edm::InputTag>::iterator co =
_recLabels.begin();
470 countobjects.insert(std::pair<unsigned int, int>(co->first, 0));
475 int totalobjectssize2 = 2 * countobjects.size();
478 bool isPassedLeadingCut =
true;
480 for (
size_t j = 0;
j != matchesGen.size(); ++
j) {
481 const unsigned int objType = matchesGen[
j].pdgId();
484 if ( !
select( matchesGen[
j] ) ) {
485 isPassedLeadingCut =
false;
491 for (
size_t j = 0; (
j != matchesGen.size() ) && isPassedLeadingCut; ++
j) {
492 const unsigned int objType = matchesGen[
j].pdgId();
496 float pt = matchesGen[
j].pt();
498 if (countobjects[objType] == 0) {
499 this->
fillHist(
"gen", objTypeStr,
"MaxPt1", pt);
500 ++(countobjects[objType]);
503 else if (countobjects[objType] == 1) {
504 this->
fillHist(
"gen", objTypeStr,
"MaxPt2", pt);
505 ++(countobjects[objType]);
510 if (counttotal == totalobjectssize2) {
511 size_t max_size = matchesGen.size();
512 for (
size_t jj =
j;
jj < max_size;
jj++ ) {
513 matchesGen.erase(matchesGen.end());
519 float eta = matchesGen[
j].eta();
520 float phi = matchesGen[
j].phi();
522 this->
fillHist(
"gen", objTypeStr,
"Eta", eta);
523 this->
fillHist(
"gen", objTypeStr,
"Phi", phi);
529 for (std::vector<HLTExoticaPlotter>::iterator an =
_plotters.begin(); an !=
_plotters.end(); ++an) {
532 LogDebug(
"ExoticaValidation") <<
" preparing to call the plotters analysis";
533 an->analyze(ispassTrigger,
"gen", matchesGen, theSumEt);
534 LogDebug(
"ExoticaValidation") <<
" called the plotter";
541 if(
verbose>2)
std::cerr <<
"### matchesReco.size() = " << matchesReco.size() << std::endl;
557 std::map<unsigned int, int> countobjects;
558 for (std::map<unsigned int, edm::InputTag>::iterator co =
_recLabels.begin();
560 countobjects.insert(std::pair<unsigned int, int>(co->first, 0));
565 int totalobjectssize2 = 2 * countobjects.size();
571 bool isPassedLeadingCut =
true;
573 for (
size_t j = 0;
j != matchesReco.size(); ++
j) {
574 const unsigned int objType = matchesReco[
j].pdgId();
577 if ( !
select( matchesReco[
j] ) ) {
578 isPassedLeadingCut =
false;
584 for (
size_t j = 0; (
j != matchesReco.size() ) && isPassedLeadingCut; ++
j) {
585 const unsigned int objType = matchesReco[
j].pdgId();
589 float pt = matchesReco[
j].pt();
591 if (countobjects[objType] == 0) {
592 this->
fillHist(
"rec", objTypeStr,
"MaxPt1", pt);
593 ++(countobjects[objType]);
596 else if (countobjects[objType] == 1) {
597 if( ! ( TString(objTypeStr).Contains(
"MET") || TString(objTypeStr).Contains(
"MHT") ) ) {
598 this->
fillHist(
"rec", objTypeStr,
"MaxPt2", pt);
600 ++(countobjects[objType]);
605 if (counttotal == totalobjectssize2) {
606 size_t max_size = matchesReco.size();
607 for (
size_t jj =
j;
jj < max_size;
jj++ ) {
608 matchesReco.erase(matchesReco.end());
614 float eta = matchesReco[
j].eta();
615 float phi = matchesReco[
j].phi();
617 if ( !( TString(objTypeStr).Contains(
"MET") || TString(objTypeStr).Contains(
"MHT") ) ) {
618 this->
fillHist(
"rec", objTypeStr,
"Eta", eta);
619 this->
fillHist(
"rec", objTypeStr,
"Phi", phi);
622 this->
fillHist(
"rec", objTypeStr,
"SumEt", theSumEt[objType]);
632 for (std::vector<HLTExoticaPlotter>::iterator an =
_plotters.begin(); an !=
_plotters.end(); ++an) {
635 LogDebug(
"ExoticaValidation") <<
" preparing to call the plotters analysis";
636 an->analyze(ispassTrigger,
"rec", matchesReco, theSumEt);
637 LogDebug(
"ExoticaValidation") <<
" called the plotter";
647 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::getObjectsType()";
649 static const unsigned int objSize = 14;
650 static const unsigned int objtriggernames[] = {
667 std::set<unsigned int> objsType;
669 for (
unsigned int i = 0;
i < objSize; ++
i) {
673 if (! TString(hltPath).Contains(objTypeStr)) {
677 objsType.insert(objtriggernames[i]);
680 return std::vector<unsigned int>(objsType.begin(), objsType.end());
686 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::getNamesOfObjects()";
688 if (anpset.
exists(
"recMuonLabel")) {
692 if (anpset.
exists(
"recMuonTrkLabel")) {
696 if (anpset.
exists(
"recTrackLabel")) {
700 if (anpset.
exists(
"recElecLabel")) {
704 if (anpset.
exists(
"recPhotonLabel")) {
708 if (anpset.
exists(
"recMETLabel")) {
712 if (anpset.
exists(
"recPFMETLabel")) {
716 if (anpset.
exists(
"recPFMHTLabel")) {
720 if (anpset.
exists(
"genMETLabel")) {
724 if (anpset.
exists(
"recCaloMETLabel")) {
728 if (anpset.
exists(
"hltMETLabel")) {
732 if (anpset.
exists(
"l1METLabel")) {
736 if (anpset.
exists(
"recPFTauLabel")) {
740 if (anpset.
exists(
"recPFJetLabel")) {
744 if (anpset.
exists(
"recCaloJetLabel")) {
750 edm::LogError(
"ExoticaValidation") <<
"HLTExoticaSubAnalysis::getNamesOfObjects, "
751 <<
"Not included any object (recMuonLabel, recElecLabel, ...) "
771 for (std::map<unsigned int, edm::InputTag>::iterator it =
_recLabels.begin();
844 edm::LogError(
"ExoticaValidation") <<
"HLTExoticaSubAnalysis::registerConsumes"
845 <<
" NOT IMPLEMENTED (yet) ERROR: '" << it->second.label() <<
"'";
854 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::getHandlesToObjects()";
862 LogDebug(
"ExoticaValidation") <<
"Added handle to triggerResults";
870 LogDebug(
"ExoticaValidation") <<
"Added handle to genParticles";
875 LogDebug(
"ExoticaValidation") <<
"We have got " <<
_tokens.size() <<
"tokens";
876 for (std::map<unsigned int, edm::EDGetToken>::iterator it =
_tokens.begin();
949 edm::LogError(
"ExoticaValidation") <<
"HLTExoticaSubAnalysis::getHandlesToObjects "
950 <<
" NOT IMPLEMENTED (yet) ERROR: '" << it->first <<
"'";
961 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::bookHist()";
963 sourceUpper[0] = std::toupper(sourceUpper[0]);
967 if (variable.find(
"SumEt") != std::string::npos) {
970 float *
edges =
new float[nBins + 1];
971 for (
size_t i = 0;
i < nBins + 1;
i++) {
974 h =
new TH1F(name.c_str(), title.c_str(), nBins,
edges);
978 else if (variable.find(
"MaxPt") != std::string::npos) {
979 std::string desc = (variable ==
"MaxPt1") ?
"Leading" :
"Next-to-Leading";
982 float *
edges =
new float[nBins + 1];
983 for (
size_t i = 0;
i < nBins + 1;
i++) {
986 h =
new TH1F(name.c_str(), title.c_str(), nBins,
edges);
991 std::string symbol = (variable ==
"Eta") ?
"#eta" :
"#phi";
994 int nBins = (int)params[0];
995 double min = params[1];
996 double max = params[2];
997 h =
new TH1F(name.c_str(), title.c_str(), nBins,
min,
max);
1012 const float &
value)
1015 sourceUpper[0] = toupper(sourceUpper[0]);
1018 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::fillHist() " << name <<
" " <<
value;
1020 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::fillHist() " << name <<
" worked";
1027 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::initSelector()";
1068 LogDebug(
"ExoticaValidation") <<
"In HLTExoticaSubAnalysis::insertCandidates()";
1070 theSumEt[objType] = -1;
1073 for (
size_t i = 0;
i < cols->
muons->size();
i++) {
1074 LogDebug(
"ExoticaValidation") <<
"Inserting muon " <<
i ;
1077 matches->push_back(
m);
1081 for (
size_t i = 0;
i < cols->
tracks->size();
i++) {
1082 LogDebug(
"ExoticaValidation") <<
"Inserting muonTrack " <<
i ;
1084 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double>> mom4;
1086 mom4.SetXYZT(mom3.x(),mom3.y(),mom3.z(),mom3.r());
1088 matches->push_back(
m);
1092 for (
size_t i = 0;
i < cols->
tracks->size();
i++) {
1093 LogDebug(
"ExoticaValidation") <<
"Inserting Track " <<
i ;
1095 ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<double>> mom4;
1097 mom4.SetXYZT(mom3.x(),mom3.y(),mom3.z(),mom3.r());
1099 matches->push_back(
m);
1104 LogDebug(
"ExoticaValidation") <<
"Inserting electron " <<
i ;
1107 matches->push_back(
m);
1111 for (
size_t i = 0;
i < cols->
photons->size();
i++) {
1112 LogDebug(
"ExoticaValidation") <<
"Inserting photon " <<
i ;
1115 matches->push_back(
m);
1122 for (
size_t i = 0;
i < cols->
pfMETs->size();
i++) {
1123 LogDebug(
"ExoticaValidation") <<
"Inserting PFMET " <<
i ;
1126 matches->push_back(
m);
1127 if(
i==0) theSumEt[objType] = cols->
pfMETs->at(
i).sumEt();
1131 for (
size_t i = 0;
i < cols->
pfMHTs->size();
i++) {
1132 LogDebug(
"ExoticaValidation") <<
"Inserting PFMHT " <<
i ;
1135 matches->push_back(
m);
1136 if(
i==0) theSumEt[objType] = cols->
pfMHTs->at(
i).sumEt();
1140 for (
size_t i = 0;
i < cols->
genMETs->size();
i++) {
1141 LogDebug(
"ExoticaValidation") <<
"Inserting GENMET " <<
i ;
1144 matches->push_back(
m);
1145 if(
i==0) theSumEt[objType] = cols->
genMETs->at(
i).sumEt();
1149 for (
size_t i = 0;
i < cols->
caloMETs->size();
i++) {
1150 LogDebug(
"ExoticaValidation") <<
"Inserting CALOMET " <<
i ;
1153 matches->push_back(
m);
1154 if(
i==0) theSumEt[objType] = cols->
caloMETs->at(
i).sumEt();
1158 for (
size_t i = 0;
i < cols->
l1METs->size();
i++) {
1159 LogDebug(
"ExoticaValidation") <<
"Inserting L1MET " <<
i ;
1162 matches->push_back(
m);
1163 if(
i==0) theSumEt[objType] = cols->
l1METs->at(
i).etTotal();
1167 for (
size_t i = 0;
i < cols->
pfTaus->size();
i++) {
1168 LogDebug(
"ExoticaValidation") <<
"Inserting PFtau " <<
i ;
1171 matches->push_back(
m);
1175 for (
size_t i = 0;
i < cols->
pfJets->size();
i++) {
1176 LogDebug(
"ExoticaValidation") <<
"Inserting jet " <<
i ;
1179 matches->push_back(
m);
1183 for (
size_t i = 0;
i < cols->
caloJets->size();
i++) {
1184 LogDebug(
"ExoticaValidation") <<
"Inserting jet " <<
i ;
1187 matches->push_back(
m);
const std::vector< reco::Muon > * muons
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
StringCutObjectSelector< reco::Track > * _recMuonTrkSelector
std::vector< GenParticle > GenParticleCollection
collection of GenParticles
T getParameter(std::string const &) const
unsigned int _minCandidates
The minimum number of reco/gen candidates needed by the analysis.
Entry const & retrieve(char const *) const
T getUntrackedParameter(std::string const &, T const &) const
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
void getNamesOfObjects(const edm::ParameterSet &anpset)
Creates the maps that map which collection should come from which label.
std::vector< PFTau > PFTauCollection
collection of PFTau objects
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
const std::vector< reco::CaloMET > * caloMETs
bool getByToken(EDGetToken token, Handle< PROD > &result) const
std::vector< reco::GenMET > GenMETCollection
collection of GenMET objects
std::map< unsigned int, std::string > _genCut
gen/rec objects cuts
bool accept() const
Has at least one path accepted the event?
const std::vector< std::string > & triggerNames() const
names of trigger paths
std::vector< Track > TrackCollection
collection of Tracks
std::vector< HLTExoticaPlotter > _plotters
The plotters: managers of each hlt path where the plots are done.
bool exists(std::string const ¶meterName) const
checks if a parameter exists
StringCutObjectSelector< reco::CaloJet > * _recCaloJetSelector
StringCutObjectSelector< reco::GenMET > * _genMETSelector
std::vector< double > _parametersPhi
const std::vector< reco::CaloJet > * caloJets
void insert(bool ok_to_replace, char const *, Entry const &)
void fillHist(const std::string &source, const std::string &objType, const std::string &variable, const float &value)
const reco::GenParticleCollection * genParticles
container with all the objects needed
void analyze(const edm::Event &iEvent, const edm::EventSetup &iEventSetup, EVTColContainer *cols)
edm::InputTag _trigResultsLabel
StringCutObjectSelector< reco::MET > * _recMETSelector
edm::EDGetTokenT< edm::TriggerResults > _trigResultsToken
std::vector< reco::MET > METCollection
collection of MET objects
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
const std::vector< reco::PFTau > * pfTaus
std::vector< Muon > MuonCollection
collection of Muon objects
std::map< unsigned int, std::string > _genCut_leading
gen/rec pt-leading objects cuts
StringCutObjectSelector< reco::PFJet > * _recPFJetSelector
void setPFMHT(const reco::PFMETCollection *v)
std::map< unsigned int, edm::InputTag > _recLabels
StringCutObjectSelector< reco::GsfElectron > * _recElecSelector
void set(const reco::MuonCollection *v)
Setter: multiple overloaded function.
std::map< unsigned int, std::string > _recCut_leading
const std::vector< reco::PFMET > * pfMHTs
StringCutObjectSelector< reco::Muon > * _recMuonSelector
tuple path
else: Piece not in the list, fine.
unsigned int triggerIndex(std::string const &name) const
const std::vector< reco::GenMET > * genMETs
edm::ParameterSet _pset
Internal, working copy of the PSet passed from above.
void subAnalysisBookHistos(DQMStore::IBooker &iBooker, const edm::Run &iRun, const edm::EventSetup &iSetup)
std::vector< double > _parametersEta
Some kinematical parameters.
std::map< unsigned int, std::string > _recCut
const std::vector< unsigned int > getObjectsType(const std::string &hltpath) const
closes analyze method
StringCutObjectSelector< reco::Track > * _recTrackSelector
MonitorElement * book1D(Args &&...args)
const std::vector< reco::PFJet > * pfJets
HLTConfigProvider _hltConfig
Interface to the HLT information.
const std::vector< reco::Track > * tracks
const std::vector< reco::Photon > * photons
virtual const Point & vertex() const =0
vertex position
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
~HLTExoticaSubAnalysis()
End Constructor.
std::vector< std::string > _hltPathsToCheck
The hlt paths to check for.
std::string _hltProcessName
The labels of the object collections to be used in this analysis.
static const char *const trigNames[]
Transform3DPJ::Vector XYZVector
const std::vector< l1extra::L1EtMissParticle > * l1METs
void setCurrentFolder(const std::string &fullpath)
std::vector< reco::CaloMET > CaloMETCollection
collection of CaloMET objects
void registerConsumes(edm::ConsumesCollector &consCollector)
Registers consumption of objects.
T const * product() const
void getHandlesToObjects(const edm::Event &iEvent, EVTColContainer *col)
Gets the collections themselves.
StringCutObjectSelector< reco::PFMET > * _recPFMETSelector
std::string _analysisname
The name of this sub-analysis.
StringCutObjectSelector< reco::Photon > * _recPhotonSelector
std::vector< Photon > PhotonCollection
collectin of Photon objects
std::map< unsigned int, StringCutObjectSelector< reco::GenParticle > * > _genSelectorMap
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d'tor
void beginRun(const edm::Run &iRun, const edm::EventSetup &iEventSetup)
StringCutObjectSelector< l1extra::L1EtMissParticle > * _l1METSelector
const std::vector< reco::GsfElectron > * electrons
std::vector< double > _parametersTurnOn
std::map< unsigned int, edm::EDGetToken > _tokens
std::map< std::string, MonitorElement * > _elements
Structure of the MonitorElements.
StringCutObjectSelector< reco::CaloMET > * _recCaloMETSelector
std::vector< PFJet > PFJetCollection
collection of PFJet objects
HLTExoticaSubAnalysis(const edm::ParameterSet &pset, const std::string &analysisname, edm::ConsumesCollector &&consCollector)
Constructor.
std::vector< reco::PFMET > PFMETCollection
collection of PFMET objects
edm::EDGetTokenT< reco::GenParticleCollection > _genParticleToken
And also the tokens to get the object collections.
void initSelector(const unsigned int &objtype)
Initializes the selectors of the objects based on which object it is.
edm::InputTag _genParticleLabel
const std::vector< reco::PFMET > * pfMETs
std::set< std::string > _hltPaths
The hlt paths found in the hltConfig.
static const std::string getTypeString(const unsigned int &objtype)
Tranform types into strings.
const edm::TriggerResults * triggerResults
StringCutObjectSelector< reco::PFMET > * _recPFMHTSelector
static std::string const source
StringCutObjectSelector< reco::PFTau > * _recPFTauSelector
void bookHist(DQMStore::IBooker &iBooker, const std::string &source, const std::string &objType, const std::string &variable)
The internal functions to book and fill histograms.
std::vector< CaloJet > CaloJetCollection
collection of CaloJet objects
std::map< std::string, std::string > _shortpath2long
Relation between the short and long versions of the path.
void insertCandidates(const unsigned int &objtype, const EVTColContainer *col, std::vector< reco::LeafCandidate > *matches, std::map< int, double > &theSumEt)
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector