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 &&
track.isGlobal()) c.push_back(
track);
1339 if(
track.momentum().perp2() > 1.0 && fabs(
track.momentum().eta()) < 3.0 &&
track.isGlobal()) 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.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
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