9 #include "Math/Interpolator.h"
13 : theEBthreshold(-1000.),
14 theEEthreshold(-1000.),
16 theUseEtEBTresholdFlag(
false),
17 theUseEtEETresholdFlag(
false),
18 theUseSymEBTresholdFlag(
false),
19 theUseSymEETresholdFlag(
false),
22 theHcalThreshold(-1000.),
23 theHBthreshold(-1000.),
24 theHESthreshold(-1000.),
25 theHEDthreshold(-1000.),
26 theHOthreshold0(-1000.),
27 theHOthresholdPlus1(-1000.),
28 theHOthresholdMinus1(-1000.),
29 theHOthresholdPlus2(-1000.),
30 theHOthresholdMinus2(-1000.),
31 theHF1threshold(-1000.),
32 theHF2threshold(-1000.),
33 theEBGrid(std::vector<double>(5,10.)),
34 theEBWeights(std::vector<double>(5,1.)),
35 theEEGrid(std::vector<double>(5,10.)),
36 theEEWeights(std::vector<double>(5,1.)),
37 theHBGrid(std::vector<double>(5,10.)),
38 theHBWeights(std::vector<double>(5,1.)),
39 theHESGrid(std::vector<double>(5,10.)),
40 theHESWeights(std::vector<double>(5,1.)),
41 theHEDGrid(std::vector<double>(5,10.)),
42 theHEDWeights(std::vector<double>(5,1.)),
43 theHOGrid(std::vector<double>(5,10.)),
44 theHOWeights(std::vector<double>(5,1.)),
45 theHF1Grid(std::vector<double>(5,10.)),
46 theHF1Weights(std::vector<double>(5,1.)),
47 theHF2Grid(std::vector<double>(5,10.)),
48 theHF2Weights(std::vector<double>(5,1.)),
58 theEBSumThreshold(-1000.),
59 theEESumThreshold(-1000.),
62 theTowerConstituentsMap(0),
65 theMomConstrMethod(0),
78 bool useSymEBTreshold,
79 bool useSymEETreshold,
82 double HBthreshold,
double HESthreshold,
double HEDthreshold,
83 double HOthreshold0,
double HOthresholdPlus1,
double HOthresholdMinus1,
84 double HOthresholdPlus2,
double HOthresholdMinus2,
85 double HF1threshold,
double HF2threshold,
86 double EBweight,
double EEweight,
87 double HBweight,
double HESweight,
double HEDweight,
88 double HOweight,
double HF1weight,
double HF2weight,
99 : theEBthreshold(EBthreshold),
100 theEEthreshold(EEthreshold),
102 theUseEtEBTresholdFlag(useEtEBTreshold),
103 theUseEtEETresholdFlag(useEtEETreshold),
104 theUseSymEBTresholdFlag(useSymEBTreshold),
105 theUseSymEETresholdFlag(useSymEETreshold),
107 theHcalThreshold(HcalThreshold),
108 theHBthreshold(HBthreshold),
109 theHESthreshold(HESthreshold),
110 theHEDthreshold(HEDthreshold),
111 theHOthreshold0(HOthreshold0),
112 theHOthresholdPlus1(HOthresholdPlus1),
113 theHOthresholdMinus1(HOthresholdMinus1),
114 theHOthresholdPlus2(HOthresholdPlus2),
115 theHOthresholdMinus2(HOthresholdMinus2),
116 theHF1threshold(HF1threshold),
117 theHF2threshold(HF2threshold),
118 theEBGrid(std::vector<double>(5,10.)),
119 theEBWeights(std::vector<double>(5,1.)),
120 theEEGrid(std::vector<double>(5,10.)),
121 theEEWeights(std::vector<double>(5,1.)),
122 theHBGrid(std::vector<double>(5,10.)),
123 theHBWeights(std::vector<double>(5,1.)),
124 theHESGrid(std::vector<double>(5,10.)),
125 theHESWeights(std::vector<double>(5,1.)),
126 theHEDGrid(std::vector<double>(5,10.)),
127 theHEDWeights(std::vector<double>(5,1.)),
128 theHOGrid(std::vector<double>(5,10.)),
129 theHOWeights(std::vector<double>(5,1.)),
130 theHF1Grid(std::vector<double>(5,10.)),
131 theHF1Weights(std::vector<double>(5,1.)),
132 theHF2Grid(std::vector<double>(5,10.)),
133 theHF2Weights(std::vector<double>(5,1.)),
134 theEBweight(EBweight),
135 theEEweight(EEweight),
136 theHBweight(HBweight),
137 theHESweight(HESweight),
138 theHEDweight(HEDweight),
139 theHOweight(HOweight),
140 theHF1weight(HF1weight),
141 theHF2weight(HF2weight),
142 theEcutTower(EcutTower),
143 theEBSumThreshold(EBSumThreshold),
144 theEESumThreshold(EESumThreshold),
147 theMomConstrMethod(momConstrMethod),
148 theMomHBDepth(momHBDepth),
149 theMomHEDepth(momHEDepth),
150 theMomEBDepth(momEBDepth),
151 theMomEEDepth(momEEDepth),
152 theHcalPhase(hcalPhase)
157 bool useEtEBTreshold,
158 bool useEtEETreshold,
159 bool useSymEBTreshold,
160 bool useSymEETreshold,
163 double HBthreshold,
double HESthreshold,
double HEDthreshold,
164 double HOthreshold0,
double HOthresholdPlus1,
double HOthresholdMinus1,
165 double HOthresholdPlus2,
double HOthresholdMinus2,
166 double HF1threshold,
double HF2threshold,
167 const std::vector<double> &
EBGrid,
const std::vector<double> &
EBWeights,
168 const std::vector<double> &
EEGrid,
const std::vector<double> &
EEWeights,
169 const std::vector<double> &
HBGrid,
const std::vector<double> &
HBWeights,
172 const std::vector<double> &
HOGrid,
const std::vector<double> &
HOWeights,
175 double EBweight,
double EEweight,
176 double HBweight,
double HESweight,
double HEDweight,
177 double HOweight,
double HF1weight,
double HF2weight,
188 : theEBthreshold(EBthreshold),
189 theEEthreshold(EEthreshold),
191 theUseEtEBTresholdFlag(useEtEBTreshold),
192 theUseEtEETresholdFlag(useEtEETreshold),
193 theUseSymEBTresholdFlag(useSymEBTreshold),
194 theUseSymEETresholdFlag(useSymEETreshold),
196 theHcalThreshold(HcalThreshold),
197 theHBthreshold(HBthreshold),
198 theHESthreshold(HESthreshold),
199 theHEDthreshold(HEDthreshold),
200 theHOthreshold0(HOthreshold0),
201 theHOthresholdPlus1(HOthresholdPlus1),
202 theHOthresholdMinus1(HOthresholdMinus1),
203 theHOthresholdPlus2(HOthresholdPlus2),
204 theHOthresholdMinus2(HOthresholdMinus2),
205 theHF1threshold(HF1threshold),
206 theHF2threshold(HF2threshold),
208 theEBWeights(EBWeights),
210 theEEWeights(EEWeights),
212 theHBWeights(HBWeights),
214 theHESWeights(HESWeights),
216 theHEDWeights(HEDWeights),
218 theHOWeights(HOWeights),
220 theHF1Weights(HF1Weights),
222 theHF2Weights(HF2Weights),
223 theEBweight(EBweight),
224 theEEweight(EEweight),
225 theHBweight(HBweight),
226 theHESweight(HESweight),
227 theHEDweight(HEDweight),
228 theHOweight(HOweight),
229 theHF1weight(HF1weight),
230 theHF2weight(HF2weight),
231 theEcutTower(EcutTower),
232 theEBSumThreshold(EBSumThreshold),
233 theEESumThreshold(EESumThreshold),
236 theMomConstrMethod(momConstrMethod),
237 theMomHBDepth(momHBDepth),
238 theMomHEDepth(momHEDepth),
239 theMomEBDepth(momEBDepth),
240 theMomEEDepth(momEEDepth),
241 theHcalPhase(hcalPhase)
265 std::vector<int> tower28depths;
266 int ndepths, startdepth;
272 std::vector<bool> isMergedDepth(ndepths,
true);
273 for(
int i = 0;
i <
std::min(6,(
int)(tower28depths.size()));
i++){
274 isMergedDepth[tower28depths[
i]-startdepth] =
false;
278 for(
int i = 0;
i < ndepths;
i++){
294 hbheItr != hbhe.
end(); ++hbheItr)
300 hoItr != ho.
end(); ++hoItr)
306 hfItr != hf.
end(); ++hfItr)
312 ecItr != ec.
end(); ++ecItr)
322 ctcItr != ctc.
end(); ++ctcItr) {
339 if (!mt.empty() ) {
convert(mt.id, mt, result); }
353 ctcItr != ctc.
end(); ++ctcItr) {
356 double newE_em = ctcItr->emEnergy();
357 double newE_had = ctcItr->hadEnergy();
358 double newE_outer = ctcItr->outerEnergy();
365 double E_short = 0.5 * newE_had;
366 double E_long = newE_em + 0.5 * newE_had;
371 newE_em = E_long - E_short;
372 newE_had = 2.0 * E_short;
378 for (
unsigned int iConst = 0; iConst < ctcItr->constituentsSize(); ++iConst) {
379 DetId constId = ctcItr->constituent(iConst);
386 for (
unsigned int iConst = 0; iConst < ctcItr->constituentsSize(); ++iConst) {
387 DetId constId = ctcItr->constituent(iConst);
395 for (
unsigned int iConst = 0; iConst < ctcItr->constituentsSize(); ++iConst) {
396 DetId constId = ctcItr->constituent(iConst);
414 double f_em = 1.0/cosh(emPoint.
eta());
415 double f_had = 1.0/cosh(hadPoint.
eta());
424 double newE_tot = newE_em + newE_had;
431 CaloTower rescaledTower(twrId, newE_em, newE_had, newE_outer, -1, -1, towerP4, emPoint, hadPoint);
433 rescaledTower.
setEcalTime(
int(ctcItr->ecalTime()*100.0 + 0.5) );
434 rescaledTower.
setHcalTime(
int(ctcItr->hcalTime()*100.0 + 0.5) );
442 for (
unsigned int iConst = 0; iConst < ctcItr->constituentsSize(); ++iConst) {
443 contains.push_back(ctcItr->constituent(iConst));
486 if (towerDetId.
null())
return;
492 tower29.numBadHcalCells += 1;
495 else if (0.5*energy >= threshold) {
498 if (towerDetId.
null())
return;
506 tower29.numRecHcalCells += 1;
510 tower29.numProbHcalCells += 1;
514 double e28 = 0.5 *
e;
515 double e29 = 0.5 *
e;
517 tower28.
E_had += e28;
519 std::pair<DetId,float> mc(detId,e28);
522 tower29.E_had += e29;
524 tower29.metaConstituents.push_back(mc);
532 tower29.hadSumTimeTimesE += ( e29 * recHit->
time() );
533 tower29.hadSumEForTime += e29;
538 tower29.E_outer += e29;
551 if (towerDetId.
null())
return;
558 else if (energy >= threshold) {
574 std::pair<DetId,float> mc(detId,e);
586 if (towerDetId.
null())
return;
591 else if (energy >= threshold) {
593 if (towerDetId.
null())
return;
596 if (hcalDetId.
depth() == 1) {
620 std::pair<DetId,float> mc(detId,e);
631 if (towerDetId.
null())
return;
635 else if (energy >= threshold) {
637 if (towerDetId.
null())
return;
665 std::pair<DetId,float> mc(detId,e);
679 unsigned int chStatusForCT;
680 bool ecalIsBad=
false;
700 bool passEmThreshold =
false;
705 else passEmThreshold = (energy >=
threshold);
711 else passEmThreshold = (energy >=
threshold);
715 if (towerDetId.
null())
return;
757 std::pair<DetId,float> mc(detId,e);
772 if (towerDetId.
null())
return;
802 std::pair<DetId, float> mc(detId, 0);
839 double E_had=mt.
E_had;
853 std::vector<std::pair<DetId,float> > metaContains_noecal;
855 for (std::vector<std::pair<DetId,float> >::iterator
i=metaContains.begin();
i!=metaContains.end(); ++
i)
856 if (
i->first.det()!=
DetId::Ecal) metaContains_noecal.push_back(*
i);
857 metaContains.swap(metaContains_noecal);
866 std::vector<std::pair<DetId,float> > metaContains_nohcal;
868 for (std::vector<std::pair<DetId,float> >::iterator
i=metaContains.begin();
i!=metaContains.end(); ++
i)
869 if (
i->first.det()!=
DetId::Hcal) metaContains_nohcal.push_back(*
i);
870 metaContains.swap(metaContains_nohcal);
873 if(metaContains.empty())
return;
891 double momEmDepth = 0.;
892 double momHadDepth = 0.;
893 if (
id.ietaAbs()<=17) {
927 emPoint =
emShwrPos(metaContains, momEmDepth, E_em);
935 if ( (E_had + E_outer) >0) {
936 massless = (E_em<=0);
1002 if unlikely ( (towerP4[3]==0) & (E_outer>0) ) {
1003 collection.emplace_back(
id, E_em, E_had, E_outer, -1, -1,
CaloTower::PolarLorentzVector(0,hadPoint.
eta(), hadPoint.
phi(),0), emPoint, hadPoint);
1005 collection.emplace_back(
id, E_em, E_had, E_outer, -1, -1,
GlobalVector(towerP4), towerP4[3], mass2, emPoint, hadPoint);
1007 auto & caloTower = collection.
back();
1033 unsigned int numBadEcalChan = 0;
1042 if (dropChItr !=
hcalDropChMap.end()) numBadHcalChan += dropChItr->second;
1099 caloTower.setCaloTowerStatus(numBadHcalChan, numBadEcalChan,
1100 numRecHcalChan, numRecEcalChan,
1101 numProbHcalChan, numProbEcalChan);
1103 double maxCellE = -999.0;
1106 contains.reserve(metaContains.size());
1107 for (std::vector<std::pair<DetId,float> >::iterator
i=metaContains.begin();
i!=metaContains.end(); ++
i) {
1109 contains.push_back(
i->first);
1111 if (maxCellE < i->
second) {
1119 maxCellE =
i->second;
1123 maxCellE =
i->second;
1131 caloTower.setConstituents(
std::move(contains));
1132 caloTower.setHottestCellE(maxCellE);
1202 else if(hcalDetId.
ieta() < 0) {
1217 if(hcalDetId.
depth() == 1) {
1235 edm::LogError(
"CaloTowersCreationAlgo") <<
"Bad cell: " << det << std::endl;
1284 if (fracDepth<=0)
return point;
1285 if (fracDepth>1) fracDepth=1;
1288 point += fracDepth * (backPoint-
point);
1300 float fracDepth,
double hadE) {
1312 std::vector<std::pair<DetId,float> >::const_iterator mc_it = metaContains.begin();
1313 for (; mc_it!=metaContains.end(); ++mc_it) {
1328 return GlobalPoint(hadX/nConst, hadY/nConst, hadZ/nConst);
1339 if (fracDepth < 0) fracDepth = 0;
1340 else if (fracDepth > 1) fracDepth = 1;
1344 int iEta = towerId.
ieta();
1345 int iPhi = towerId.
iphi();
1357 int frontDepth = 1000;
1358 int backDepth = -1000;
1359 for(
unsigned i = 0;
i < items.size();
i++){
1364 if(hid.
depth()<frontDepth) { frontCellId = hid; frontDepth = hid.
depth(); }
1365 if(hid.
depth()>backDepth) { backCellId = hid; backDepth = hid.
depth(); }
1372 for(
unsigned i = 0;
i < items28.size();
i++){
1377 if(hid.
depth()>backDepth) { backCellId = hid; backDepth = hid.
depth(); }
1398 point += fracDepth * (backPoint -
point);
1405 float fracDepth,
double emE) {
1415 std::vector<std::pair<DetId,float> >::const_iterator mc_it = metaContains.begin();
1416 for (; mc_it!=metaContains.end(); ++mc_it) {
1419 double e = mc_it->second;
1435 float fracDepth,
double emE) {
1442 double sumWeights = 0;
1444 double crystalThresh = 0.015 * emE;
1446 std::vector<std::pair<DetId,float> >::const_iterator mc_it = metaContains.begin();
1447 for (; mc_it!=metaContains.end(); ++mc_it) {
1448 if (mc_it->second < 0)
continue;
1449 if (mc_it->first.det() ==
DetId::Ecal && mc_it->second > crystalThresh) sumEmE += mc_it->second;
1452 for (mc_it = metaContains.begin(); mc_it!=metaContains.end(); ++mc_it) {
1454 if (mc_it->first.det() !=
DetId::Ecal || mc_it->second < crystalThresh)
continue;
1458 weight = 4.2 +
log(mc_it->second/sumEmE);
1466 return GlobalPoint(emX/sumWeights, emY/sumWeights, emZ/sumWeights);
1475 const float timeUnit = 0.01;
1477 if (time> 300.0)
return 30000;
1478 if (time< -300.0)
return -30000;
1480 return int(time/timeUnit + 0.5);
1501 for (std::vector<DetId>::iterator it = allChanInStatusCont.begin(); it!=allChanInStatusCont.end(); ++it) {
1547 for (std::vector<DetId>::iterator ac_it=allConstituents.begin();
1548 ac_it!=allConstituents.end(); ++ac_it) {
1583 const uint32_t recHitFlag = hit->
flags();
std::vector< double > theHBGrid
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
bool theUseEtEETresholdFlag
const HcalChannelQuality * theHcalChStatus
size_t constituentsSize() const
const GlobalPoint & getBackPoint() const
bool contains(EventRange const &lh, EventID const &rh)
HcalSubdetector subdet() const
get the subdetector
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
int ietaAbs() const
get the absolute value of the tower ieta
const DetId & detid() const
DetId constituent(size_t i) const
void setHF1EScale(double scale)
void setCaloTowerStatus(unsigned int numBadHcalChan, unsigned int numBadEcalChan, unsigned int numRecHcalChan, unsigned int numRecEcalChan, unsigned int numProbHcalChan, unsigned int numProbEcalChan)
std::vector< double > theHESGrid
std::vector< double > theHEDGrid
GlobalPoint emCrystalShwrPos(DetId detId, float fracDepth)
void assignHitHcal(const CaloRecHit *recHit)
std::vector< int > theEcalSeveritiesToBeUsedInBadTowers
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.
Geom::Phi< T > phi() const
Basic3DVector unit() const
Global3DPoint GlobalPoint
const DetId & detid() const
std::vector< HBHERecHit >::const_iterator const_iterator
GlobalPoint emShwrPos(const std::vector< std::pair< DetId, float > > &metaContains, float fracDepth, double totEmE)
void push_back(T const &t)
void setHF2EScale(double scale)
void finish(CaloTowerCollection &destCollection)
const Item * getValues(DetId fId, bool throwOnFail=true) const
std::vector< double > theHOWeights
MetaTower & find(const CaloTowerDetId &id)
looks for a given tower in the internal cache. If it can't find it, it makes it.
std::vector< double > theEEGrid
void rescale(const CaloTower *ct)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
void setHcalSubdet(int lastHB, int lastHE, int lastHF, int lastHO)
void setHBEScale(double scale)
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
std::vector< DetId > constituentsOf(const CaloTowerDetId &id) const
Get the constituent detids for this tower id ( not yet implemented )
std::vector< double > theEEWeights
std::vector< double > theHESWeights
U second(std::pair< T, U > const &p)
void setGeometry(const CaloTowerTopology *cttopo, const CaloTowerConstituentsMap *ctmap, const HcalTopology *htopo, const CaloGeometry *geo)
GlobalPoint hadShwrPos(const std::vector< std::pair< DetId, float > > &metaContains, float fracDepth, double hadE)
const CaloSubdetectorGeometry * theTowerGeometry
CaloTowerDetId detIdFromDenseIndex(uint32_t din) const
int depth() const
get the tower depth
void addConstituents(const std::vector< DetId > &ids)
unsigned int hcalChanStatusForCaloTower(const CaloRecHit *hit)
CaloTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
std::vector< double > theHF2Grid
std::vector< double > theHEDWeights
unsigned int useRejectedRecoveredEcalHits
void rescaleTowers(const CaloTowerCollection &ctInput, CaloTowerCollection &ctResult)
static const int SubdetId
std::vector< DetId > getAllChannels() const
bool recoveredRecHit(const DetId &myid, const uint32_t &myflag) const
const CaloGeometry * theGeometry
int ieta() const
get the cell ieta
GlobalPoint emShwrLogWeightPos(const std::vector< std::pair< DetId, float > > &metaContains, float fracDepth, double totEmE)
int iphi() const
get the tower iphi
Abs< T >::type abs(const T &t)
std::vector< double > theHOGrid
void assignHitEcal(const EcalRecHit *recHit)
adds a single hit to the tower
bool dropChannel(const uint32_t &mystatus) const
void depthBinInformation(HcalSubdetector subdet, int etaRing, int &nDepthBins, int &startingBin) const
finds the number of depth bins and which is the number to start with
const CaloTowerConstituentsMap * theTowerConstituentsMap
double theHOthresholdPlus1
void convert(const CaloTowerDetId &id, const MetaTower &mt, CaloTowerCollection &collection)
const CaloTowerTopology * theTowerTopology
std::vector< double > theHF1Weights
int firstHEDoublePhiRing() const
GlobalPoint hadSegmentShwrPos(DetId detId, float fracDepth)
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
std::vector< int > mergedDepths
bool theRecoveredHcalHitsAreUsed
unsigned towerId(DetId const &)
bool theHOIsUsed
only affects energy and ET calculation. HO is still recorded in the tower
void process(const HBHERecHitCollection &hbhe)
int ietaAbs() const
get the absolute value of the cell ieta
unsigned int useRejectedRecoveredHcalHits
const_iterator end() const
double theHOthresholdMinus2
std::vector< double > theHBWeights
const HcalSeverityLevelComputer * theHcalSevLvlComputer
void setHESEScale(double scale)
void setHEDEScale(double scale)
uint32_t denseIndex(const DetId &id) const
unsigned int theTowerMapSize
bool theUseSymEBTresholdFlag
void setEEEScale(double scale)
CaloTowerDetId id() const
void getDepthSegmentation(unsigned ring, std::vector< int > &readoutDepths) const
int compactTime(float time)
GlobalPoint hadShwPosFromCells(DetId frontCell, DetId backCell, float fracDepth)
bool null() const
is this a null id ?
int zside() const
get the z-side of the tower (1/-1)
void getThresholdAndWeight(const DetId &detId, double &threshold, double &weight) const
helper method to look up the appropriate threshold & weight
int getSeverityLevel(const DetId &myid, const uint32_t &myflag, const uint32_t &mystatus) const
const HcalTopology * theHcalTopology
std::vector< int > theEcalSeveritiesToBeExcluded
std::vector< unsigned short > ecalBadChs
void setHOEScale(double scale)
double theHOthresholdMinus1
const EcalSeverityLevelAlgo * theEcalSevLvlAlgo
const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id.
std::vector< double > theHF1Grid
void reserve(size_type n)
int convertCTtoHcal(int ct_ieta) const
std::vector< double > theEBGrid
std::vector< double > theHF2Weights
volatile std::atomic< bool > shutdown_flag false
int ieta() const
get the tower ieta
bool theUseEtEBTresholdFlag
uint32_t getValue() const
unsigned int theHcalAcceptSeverityLevelForRejectedHit
std::tuple< unsigned int, bool > ecalChanStatusForCaloTower(const EcalRecHit *hit)
Detector det() const
get the detector field from this detid
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
const BasicVectorType & basicVector() const
HcalDropChMap hcalDropChMap
void setEBEScale(double scale)
std::vector< double > theEBWeights
double theHOthresholdPlus2
bool theRecoveredEcalHitsAreUsed
unsigned int theHcalAcceptSeverityLevel
bool theUseSymEETresholdFlag
uint32_t sizeForDenseIndexing() const
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
double outerEnergy() const
const_iterator begin() const
const_reference back() const
Global3DVector GlobalVector
math::PtEtaPhiMLorentzVector PolarLorentzVector
Lorentz vector.