69 (1,std::pair<int,float>(0,0.));
124 if( fastCalo.
exists(
"ECALResponseScaling") ) {
185 edm::LogWarning(
"CalorimetryManager") <<
" WARNING: The preshower simulation has been turned on; but no preshower geometry is available " << std::endl;
186 edm::LogWarning(
"CalorimetryManager") <<
" Disabling the preshower simulation " << std::endl;
199 LogInfo(
"FastCalorimetry") <<
" ===> pid = " << pid << std::endl;
205 if ( pid == 11 || pid == 22 ) {
209 else if ( myTrack.
onVFcal() ) {
225 else if ( pid < 1000000 ) {
237 std::vector<const RawParticle*> thePart;
241 LogInfo(
"FastCalorimetry") <<
" EMShowerSimulation " <<myTrack << std::endl;
248 if ( myTrack.
type() == 22 &&
myPart.e()<0.055)
return;
252 int onEcal = myTrack.
onEcal();
253 int onHcal = myTrack.
onHcal();
264 XYZPoint layer1entrance,layer2entrance;
298 if ( myTrack.
type() == 22 ) {
304 double eMass = 0.000510998902;
306 double xm=eMass/
myPart.e();
311 xe = random->
flatShoot()*(1.-2.*xm) + xm;
312 weight = 1. - 4./3.*xe*(1.-xe);
313 }
while ( weight < random->flatShoot() );
316 if (
myPart.e()*xe < 0.055 ||
myPart.e()*(1.-xe) < 0.055 ) {
326 thePart.push_back(&
myElec);
327 thePart.push_back(&
myPosi);
340 if(myPreshower==
nullptr)
return;
347 for(
unsigned ip=0;ip < thePart.size();++ip)
348 if(thePart[ip]->
e() >
maxEnergy) maxEnergy = thePart[ip]->
e();
352 if(maxEnergy>100) size=11;
357 if (maxShower > 20.) maxShower = 2.;
359 double depth((X0depth + maxShower) *
367 if(pivot.subdetId() == 0) {
368 edm::LogWarning(
"CalorimetryManager") <<
"Pivot for egamma e = " << myTrack.
hcalEntrance().e() <<
" is not found at depth " <<
depth <<
" and meanShower coordinates = " << meanShower << std::endl;
369 if(myPreshower)
delete myPreshower;
402 if( (onLayer1 || onLayer2) &&
myPart.e()<=250.)
429 theShower.
setHcal(&myHcalHitMaker);
434 for(
const auto& mapIterator : myGrid.
getHits() ) {
435 simE += mapIterator.second;
448 if(myPreshower!=
nullptr) {
461 LogInfo(
"FastCalorimetry") <<
" reconstructHCAL " << myTrack << std::endl;
473 double pathEta = trackPosition.eta();
474 double pathPhi = trackPosition.phi();
482 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - MUON !!!" << std::endl;
484 else if( pid == 22 || pid == 11) {
487 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - e/gamma !!!" << std::endl;
494 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - on-calo " 495 <<
" eta = " << pathEta
496 <<
" phi = " << pathPhi
497 <<
" Egen = " << EGen
498 <<
" Emeas = " << emeas << std::endl;
504 std::map<CaloHitID,float> hitMap;
505 hitMap[current_id] = emeas;
520 <<
"CalorimetryManager::HDShowerSimulation - track param." 522 <<
" eta = " << moment.eta() << std::endl
523 <<
" phi = " << moment.phi() << std::endl
524 <<
" et = " << moment.Et() << std::endl
528 LogInfo(
"FastCalorimetry") <<
" HDShowerSimulation " << myTrack << std::endl;
539 }
else if ( myTrack.
onVFcal()) {
546 LogInfo(
"FastCalorimetry") <<
" The particle is not in the acceptance " << std::endl;
552 int onHCAL = hit + 1;
553 int onECAL = myTrack.
onEcal();
555 double pathEta = trackPosition.eta();
556 double pathPhi = trackPosition.phi();
558 double eint = moment.e();
595 <<
"CalorimetryManager::HDShowerSimulation - on-calo 1 " 597 <<
" onEcal = " << myTrack.
onEcal() << std::endl
598 <<
" onHcal = " << myTrack.
onHcal() << std::endl
599 <<
" onVFcal = " << myTrack.
onVFcal() << std::endl
600 <<
" position = " << caloentrance << std::endl;
607 true, myTrack.
onEcal()==1);
678 int showerType = 99 + myTrack.
onEcal();
679 double globalTime = 150.0;
681 Gflash3Vector gfpos(trackPosition.X(),trackPosition.Y(),trackPosition.Z());
690 std::vector<GflashHit>::const_iterator spotIter = gflashHitList.begin();
691 std::vector<GflashHit>::const_iterator spotIterEnd = gflashHitList.end();
695 for( ; spotIter != spotIterEnd; spotIter++){
698 + (30*100/eGen)*(spotIter->getTime() - globalTime);
705 Gflash3Vector positionAtCurrentDepth = trajectoryPoint.getPosition();
707 Gflash3Vector lateralDisplacement = positionAtCurrentDepth - spotIter->getPosition()/CLHEP::cm;
708 double rShower = lateralDisplacement.r();
709 double azimuthalAngle = lateralDisplacement.phi();
714 bool statusPad = myGrid.getPads(currentDepth,
true);
715 if(!statusPad)
continue;
716 myGrid.setSpotEnergy(1.2*spotIter->getEnergy()/
CLHEP::GeV);
720 bool setHDdepth = myHcalHitMaker.
setDepth(currentDepth,
true);
721 if(!setHDdepth)
continue;
744 double correction = emeas / eGen;
751 <<
"CalorimetryManager::HDShowerSimulation - on-calo 2" << std::endl
752 <<
" eta = " << pathEta << std::endl
753 <<
" phi = " << pathPhi << std::endl
754 <<
" Egen = " << eGen << std::endl
755 <<
" Emeas = " << emeas << std::endl
756 <<
" corr = " << correction << std::endl
757 <<
" mip = " << mip << std::endl;
759 if(myTrack.
onEcal() > 0) {
779 std::map<CaloHitID,float> hitMap;
780 hitMap[current_id] = emeas;
783 LogInfo(
"FastCalorimetry") <<
" HCAL simple cell " 784 << cell.
rawId() <<
" added E = " 785 << emeas << std::endl;
792 LogInfo(
"FastCalorimetry") << std::endl <<
" FASTEnergyReconstructor::HDShowerSimulation finished " 815 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::MuonMipSimulation - track param." 817 <<
" eta = " << moment.eta() << std::endl
818 <<
" phi = " << moment.phi() << std::endl
819 <<
" et = " << moment.Et() << std::endl;
825 }
else if ( myTrack.
onVFcal()) {
831 LogInfo(
"FastCalorimetry") <<
" The particle is not in the acceptance " << std::endl;
839 int onECAL = myTrack.
onEcal();
868 true, myTrack.
onEcal()==1);
886 const std::vector<CaloSegment>& segments=myGrid.getSegments();
887 unsigned nsegments=segments.size();
898 for(
unsigned iseg=0;iseg<nsegments&&ifirstHcal<0;++iseg)
902 float segmentSizeinX0=segments[iseg].X0length();
910 theMuon.
setID(-(
int)charge*13);
911 if ( energyLossECAL ) {
912 energyLossECAL->
updateState(theMuon, segmentSizeinX0, random);
913 energy = energyLossECAL->
deltaMom().E();
914 moment -= energyLossECAL->
deltaMom();
921 myGrid.getPads(segments[iseg].sX0Entrance()+segmentSizeinX0*0.5);
922 myGrid.setSpotEnergy(energy);
923 myGrid.addHit(0.,0.);
955 if(ifirstHcal>0 && energyLossHCAL){
956 for(
unsigned iseg=ifirstHcal;iseg<nsegments;++iseg)
958 float segmentSizeinX0=segments[iseg].X0length();
961 if (segmentSizeinX0>0.001) {
965 theMuon.
setID(-(
int)charge*13);
966 energyLossHCAL->
updateState(theMuon, segmentSizeinX0, random);
967 mipenergy = energyLossHCAL->
deltaMom().E();
968 moment -= energyLossHCAL->
deltaMom();
970 myHcalHitMaker.
addHit(segments[iseg].entrance());
978 if(energyLossHCAL && ilastHcal>=0) {
982 }
else if(energyLossECAL && ilastEcal>=0) {
991 std::map<CaloHitID,float>::const_iterator mapitr;
992 std::map<CaloHitID,float>::const_iterator endmapitr;
993 if(myTrack.
onEcal() > 0) {
1002 LogInfo(
"FastCalorimetry") << std::endl <<
" FASTEnergyReconstructor::MipShowerSimulation finished " 1031 aTerm = 1.+radiusPreshowerCorrections_[1]*radiusPreshowerCorrections_[0];
1032 bTerm = radiusPreshowerCorrections_[0];
1036 if(gridSize_ <1) gridSize_= 7;
1037 if(pulledPadSurvivalProbability_ <0. || pulledPadSurvivalProbability_>1 ) pulledPadSurvivalProbability_= 1.;
1038 if(crackPadSurvivalProbability_ <0. || crackPadSurvivalProbability_>1 ) crackPadSurvivalProbability_= 0.9;
1040 LogInfo(
"FastCalorimetry") <<
" Fast ECAL simulation parameters " << std::endl;
1041 LogInfo(
"FastCalorimetry") <<
" =============================== " << std::endl;
1042 if(simulatePreshower_)
1043 LogInfo(
"FastCalorimetry") <<
" The preshower is present " << std::endl;
1045 LogInfo(
"FastCalorimetry") <<
" The preshower is NOT present " << std::endl;
1046 LogInfo(
"FastCalorimetry") <<
" Grid Size : " << gridSize_ << std::endl;
1047 if(spotFraction_>0.)
1048 LogInfo(
"FastCalorimetry") <<
" Spot Fraction : " << spotFraction_ << std::endl;
1051 LogInfo(
"FastCalorimetry") <<
" Core of the shower " << std::endl;
1052 for(
unsigned ir=0; ir < theCoreIntervals_.size()/2;++ir)
1054 LogInfo(
"FastCalorimetry") <<
" r < " << theCoreIntervals_[ir*2] <<
" R_M : " << theCoreIntervals_[ir*2+1] <<
" ";
1056 LogInfo(
"FastCalorimetry") << std::endl;
1058 LogInfo(
"FastCalorimetry") <<
" Tail of the shower " << std::endl;
1059 for(
unsigned ir=0; ir < theTailIntervals_.size()/2;++ir)
1061 LogInfo(
"FastCalorimetry") <<
" r < " << theTailIntervals_[ir*2] <<
" R_M : " << theTailIntervals_[ir*2+1] <<
" ";
1064 LogInfo(
"FastCalorimetry") <<
"Radius correction factors: EB & EE " << radiusFactorEB_ <<
" : "<< radiusFactorEE_ << std::endl;
1066 LogInfo(
"FastCalorimetry") << std::endl;
1068 LogInfo(
"FastCalorimetry") <<
"Improper number of parameters for the preshower ; using 95keV" << std::endl;
1074 LogInfo(
"FastCalorimetry") <<
" FrontLeakageProbability : " << pulledPadSurvivalProbability_ << std::endl;
1075 LogInfo(
"FastCalorimetry") <<
" GapLossProbability : " << crackPadSurvivalProbability_ << std::endl;
1081 rsp = CalorimeterParam.
getParameter<std::vector<double> >(
"RespCorrP");
1082 LogInfo(
"FastCalorimetry") <<
" RespCorrP (rsp) size " << rsp.size() << std::endl;
1084 if( rsp.size()%3 !=0 ) {
1086 <<
" RespCorrP size is wrong -> no corrections applied !!!" 1094 for(
unsigned i = 0;
i < rsp.size();
i += 3) {
1095 LogInfo(
"FastCalorimetry") <<
"i = " <<
i/3 <<
" p = " << rsp [
i]
1096 <<
" k_e(p) = " << rsp[
i+1]
1097 <<
" k_e(p) = " << rsp[
i+2] << std::endl;
1100 k_e.push_back (rsp[i+1]);
1101 k_h.push_back (rsp[i+2]);
1129 useShowerLibrary = m_HS.getUntrackedParameter<
bool>(
"useShowerLibrary",
false);
1130 useCorrectionSL = m_HS.getUntrackedParameter<
bool>(
"useCorrectionSL",
false);
1143 for (
int i = 0;
i < sizeP;
i++) {
1158 double y1 =
k_e[ip-1];
1159 double y2 =
k_e[ip];
1161 ecorr = (y1 + (y2 - y1) * (p - x1)/(x2 -
x1));
1165 hcorr = (y1 + (y2 - y1) * (p - x1)/(x2 -
x1));
1172 LogInfo(
"FastCalorimetry") <<
" p, ecorr, hcorr = " << p <<
" " 1179 std::map<CaloHitID,float>::const_iterator mapitr;
1180 std::map<CaloHitID,float>::const_iterator endmapitr=hitMap.end();
1183 endmapitr=hitMap.end();
1184 for(mapitr=hitMap.begin();mapitr!=endmapitr;++mapitr) {
1186 float energy = mapitr->second;
1190 CaloHitID current_id(mapitr->first.unitID(),mapitr->first.timeSlice(),trackID);
1192 EBMapping_.push_back(std::pair<CaloHitID,float>(current_id,energy));
1195 else if(onEcal==2) {
1197 endmapitr=hitMap.end();
1198 for(mapitr=hitMap.begin();mapitr!=endmapitr;++mapitr) {
1200 float energy = mapitr->second;
1204 CaloHitID current_id(mapitr->first.unitID(),mapitr->first.timeSlice(),trackID);
1206 EEMapping_.push_back(std::pair<CaloHitID,float>(current_id,energy));
1216 std::map<CaloHitID,float>::const_iterator mapitr;
1217 std::map<CaloHitID,float>::const_iterator endmapitr=hitMap.end();
1219 for(mapitr=hitMap.begin(); mapitr!=endmapitr; ++mapitr) {
1221 float energy = mapitr->second;
1224 float time = mapitr->first.timeSlice();
1256 HMapping_.push_back(std::pair<CaloHitID,float>(current_id,energy));
1262 std::map<CaloHitID,float>::const_iterator mapitr;
1263 std::map<CaloHitID,float>::const_iterator endmapitr=hitMap.end();
1265 for(mapitr=hitMap.begin();mapitr!=endmapitr;++mapitr) {
1267 float energy = mapitr->second;
1271 CaloHitID current_id(mapitr->first.unitID(),mapitr->first.timeSlice(),trackID);
1273 ESMapping_.push_back(std::pair<CaloHitID,float>(current_id,energy));
1314 unsigned size=muons.size();
1317 int id=muons[
i].trackId();
1318 if(
abs(muons[
i].
type())!=13)
continue;
1324 muons[
i].setTkPosition(itcheck->trackerSurfacePosition());
1325 muons[
i].setTkMomentum(itcheck->trackerSurfaceMomentum());
1336 if(
track.momentum().perp2() > 1.0 && fabs(
track.momentum().eta()) < 3.0) c.push_back(
track);
1339 if(
track.momentum().perp2() > 1.0 && fabs(
track.momentum().eta()) < 3.0) c.push_back(
track);
T getParameter(std::string const &) const
EventNumber_t event() const
T getUntrackedParameter(std::string const &, T const &) const
std::vector< double > rsp
std::vector< double > k_h
bool noEndVertex() const
no end vertex
RawParticle myElec
A few pointers to save time.
std::vector< std::pair< CaloHitID, float > > ESMapping_
float charge() const
charge
void reconstructHCAL(const FSimTrack &myTrack, RandomEngineAndDistribution const *)
std::vector< PCaloHit > PCaloHitContainer
const ECALProperties * ecalProperties(int onEcal) const
ECAL properties.
double responseHCAL(int _mip, double energy, double eta, int partype, RandomEngineAndDistribution const *)
const RawParticle & vfcalEntrance() const
The particle at VFCAL entrance.
void updateHCAL(const std::map< CaloHitID, float > &hitMap, int trackID=0, float corr=1.0)
GflashPiKShowerProfile * thePiKProfile
double flatShoot(double xmin=0.0, double xmax=1.0) const
double pulledPadSurvivalProbability_
std::vector< double > timeShiftHO_
void updatePreshower(const std::map< CaloHitID, float > &hitMap, int trackID=0, float corr=1.0)
GflashTrajectory * getHelix()
MaterialEffects * theMuonEcalEffects
double crackPadSurvivalProbability_
MaterialEffects * theMuonHcalEffects
void recoHFShowerLibrary(const FSimTrack &myTrack)
const XYZTLorentzVector & momentum() const
Temporary (until move of SimTrack to Mathcore) - No! Actually very useful.
void setCrackPadSurvivalProbability(double val)
double getHCALEnergyResponse(double e, int hit, RandomEngineAndDistribution const *)
GflashHadronShowerProfile * theProfile
const RawParticle & layer1Entrance() const
The particle at Preshower Layer 1.
bool compute()
Compute the shower longitudinal and lateral development.
bool exists(std::string const ¶meterName) const
checks if a parameter exists
void correctHF(double e, int type)
void reconstructTrack(FSimTrack &myTrack, RandomEngineAndDistribution const *)
void setPreshower(PreshowerHitMaker *const myPresh)
set the preshower address
void loadFromPreshower(edm::PCaloHitContainer &c) const
void updateState(ParticlePropagator &myTrack, double radlen, RandomEngineAndDistribution const *)
Compute the material effect (calls the sub class)
void updateECAL(const std::map< CaloHitID, float > &hitMap, int onEcal, int trackID=0, float corr=1.0)
const std::map< CaloHitID, float > & getHits() override
const CaloSubdetectorGeometry * getHcalGeometry() const
void MuonMipSimulation(const FSimTrack &myTrack, RandomEngineAndDistribution const *)
void readParameters(const edm::ParameterSet &fastCalo)
const PreshowerLayer1Properties * layer1Properties(int onLayer1) const
Preshower Layer1 properties.
static EEDetId unhashIndex(int hi)
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
static double constexpr eMass
Electron mass[GeV].
std::vector< double > timeShiftHF_
std::vector< double > p_knots
void compute()
Compute the shower longitudinal and lateral development.
std::vector< std::pair< CaloHitID, float > > EBMapping_
std::vector< FSimTrack > muonSimTracks
double radLenIncm() const override
Radiation length in cm.
uint32_t rawId() const
get the raw id
U second(std::pair< T, U > const &p)
void HDShowerSimulation(const FSimTrack &myTrack, RandomEngineAndDistribution const *)
Hadronic Shower Simulation.
const LandauFluctuationGenerator * aLandauGenerator
std::vector< double > samplingHF_
bool compute()
Compute the shower longitudinal and lateral development.
void setRadiusFactor(double r)
bool addHit(double r, double phi, unsigned layer=0) override
add the hit in the HCAL in local coordinates
int depth() const
get the tower depth
void reconstruct(RandomEngineAndDistribution const *)
CalorimeterNumber getCalorimeterNumber(const Gflash3Vector &position)
GflashAntiProtonShowerProfile * theAntiProtonProfile
math::XYZVector XYZVector
GflashShowino * getGflashShowino()
GflashProtonShowerProfile * theProtonProfile
const PreshowerLayer2Properties * layer2Properties(int onLayer2) const
Preshower Layer2 properties.
double getPathLengthAtShower()
virtual void loadParameters()
const std::map< CaloHitID, float > & getHits() override
not been done.
void setTrackParameters(const XYZNormal &normal, double X0depthoffset, const FSimTrack &theTrack)
void loadFromEcalEndcap(edm::PCaloHitContainer &c) const
const XYZTLorentzVector & deltaMom() const
Returns the actual energy lost.
std::vector< double > radiusPreshowerCorrections_
const HCALProperties * hcalProperties(int onHcal) const
HCAL properties.
Abs< T >::type abs(const T &t)
double getMIPfraction(double energy, double eta)
const RawParticle & ecalEntrance() const
The particle at ECAL entrance.
void setSpotEnergy(double e) override
Set the spot energy.
std::vector< double > theTailIntervals_
std::vector< double > samplingHBHE_
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
void loadMuonSimTracks(edm::SimTrackContainer &m) const
unsigned int nTracks() const
Number of tracks.
HCALResponse * myHDResponse_
CaloGeometryHelper * myCalorimeter_
std::vector< double > timeShiftHB_
int ietaAbs() const
get the absolute value of the cell ieta
void initialize(RandomEngineAndDistribution const *random)
const double intLength[kNumberCalorimeter]
std::vector< double > theCoreIntervals_
void getGflashTrajectoryPoint(GflashTrajectoryPoint &point, double s) const
edm::EventID id() const
Method to return the EventId.
const XYZTLorentzVector & vertex() const
the vertex fourvector
void hadronicParameterization()
void loadFromHcal(edm::PCaloHitContainer &c) const
GammaFunctionGenerator * aGammaGenerator
XYZVectorD XYZVector
spatial vector with cartesian internal representation
CLHEP::Hep3Vector Gflash3Vector
std::vector< double > mipValues_
static std::vector< std::pair< int, float > > myZero_
std::vector< FSimTrack > savedMuonSimTracks
bool null() const
is this a null id ?
std::vector< std::pair< CaloHitID, float > > EEMapping_
void setTkPosition(const math::XYZVectorD &pos)
double getPathLengthOnEcal()
void SetRandom(const RandomEngineAndDistribution *)
static EBDetId unhashIndex(int hi)
get a DetId from a compact index for arrays
int type() const
particle type (HEP PDT convension)
void harvestMuonSimTracks(edm::SimTrackContainer &m) const
std::vector< unsigned int > evtsToDebug_
int id() const
the index in FBaseSimEvent and other vectors
bool preshowerPresent() const
const std::map< CaloHitID, float > & getHitsMap()
void setPulledPadSurvivalProbability(double val)
const RawParticle & layer2Entrance() const
The particle at Preshower Layer 2.
std::vector< double > k_e
std::vector< GflashHit > & getGflashHitList()
const std::map< CaloHitID, float > & getHits() override
void setTkMomentum(const math::XYZTLorentzVectorD &mom)
const RawParticle & hcalEntrance() const
The particle at HCAL entrance.
std::vector< std::pair< CaloHitID, float > > HMapping_
std::vector< double > samplingHO_
void setPreshowerPresent(bool ps)
FastHFShowerLibrary * theHFShowerLibrary
DetId getClosestCell(const XYZPoint &point, bool ecal, bool central) const
EnergyLossSimulator * energyLossSimulator() const
Return the Energy Loss engine.
std::unique_ptr< KKCorrectionFactors > ecalCorrection
HSParameters * myHSParameters_
std::vector< SimTrack > SimTrackContainer
void setVertex(const XYZTLorentzVector &vtx)
set the vertex
bool setDepth(double, bool inCm=false)
set the depth in X0 or Lambda0 units depending on showerType
void initialize(int showerType, double energy, double globalTime, double charge, Gflash3Vector &position, Gflash3Vector &momentum)
math::XYZTLorentzVector XYZTLorentzVector
void print() const
print the FBaseSimEvent in an intelligible way
void setHcal(HcalHitMaker *const myHcal)
set the HCAL address
void setGrid(EcalHitMaker *const myGrid)
set the grid address
void EMShowerSimulation(const FSimTrack &myTrack, RandomEngineAndDistribution const *)
std::vector< double > timeShiftHE_
FSimTrack & track(int id) const
Return track with given Id.
double getMaximumOfShower() const
get the depth of the centre of gravity of the shower(s)
void loadFromEcalBarrel(edm::PCaloHitContainer &c) const