69 std::vector<std::pair<int, float> >(1, std::pair<int, float>(0, 0.));
78 : mySimEvent(aSimEvent),
80 theMuonEcalEffects(nullptr),
81 theMuonHcalEffects(nullptr),
82 bFixedLength_(
false) {
113 if (fastCalo.
exists(
"ECALResponseScaling")) {
148 std::vector<unsigned int>::const_iterator itcheck =
174 <<
" WARNING: The preshower simulation has been turned on; but no preshower geometry is available "
176 edm::LogWarning(
"CalorimetryManager") <<
" Disabling the preshower simulation " << std::endl;
189 LogInfo(
"FastCalorimetry") <<
" ===> pid = " << pid << std::endl;
196 if (pid == 11 || pid == 22) {
208 else if (pid == 13 || pid == 1000024 || (pid > 1000100 && pid < 1999999 && fabs(charge_) > 0.001)) {
214 else if (pid < 1000000) {
227 std::vector<const RawParticle*> thePart;
231 LogInfo(
"FastCalorimetry") <<
" EMShowerSimulation " << myTrack << std::endl;
242 int onEcal = myTrack.
onEcal();
243 int onHcal = myTrack.
onHcal();
253 XYZPoint layer1entrance, layer2entrance;
279 if (myTrack.
type() == 22) {
284 double eMass = 0.000510998902;
291 xe = random->
flatShoot() * (1. - 2. * xm) + xm;
292 weight = 1. - 4. / 3. * xe * (1. - xe);
293 }
while (weight < random->flatShoot());
298 thePart.push_back(&
myPart);
305 thePart.push_back(&
myElec);
306 thePart.push_back(&
myPosi);
312 thePart.push_back(&
myPart);
316 if (thePart.empty()) {
317 if (myPreshower ==
nullptr)
325 for (
unsigned ip = 0; ip < thePart.size(); ++ip)
346 if (pivot.subdetId() == 0) {
348 <<
"Pivot for egamma e = " << myTrack.
hcalEntrance().
e() <<
" is not found at depth " <<
depth
349 <<
" and meanShower coordinates = " << meanShower << std::endl;
382 if (myTrack.
onEcal() == 2)
384 if ((onLayer1 || onLayer2) &&
myPart.
e() <= 250.) {
410 theShower.
setHcal(&myHcalHitMaker);
415 for (
const auto& mapIterator : myGrid.
getHits()) {
416 simE += mapIterator.second;
430 if (myPreshower !=
nullptr) {
440 LogInfo(
"FastCalorimetry") <<
" reconstructHCAL " << myTrack << std::endl;
452 double pathEta = trackPosition.eta();
453 double pathPhi = trackPosition.phi();
459 if (pid == 13 || pid == 1000024 || (pid > 1000100 && pid < 1999999 && fabs(charge_) > 0.001)) {
462 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - MUON !!!" << std::endl;
463 }
else if (pid == 22 || pid == 11) {
466 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - e/gamma !!!" << std::endl;
472 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::reconstructHCAL - on-calo "
473 <<
" eta = " << pathEta <<
" phi = " << pathPhi <<
" Egen = " << EGen
474 <<
" Emeas = " << emeas << std::endl;
481 std::map<CaloHitID, float> hitMap;
482 hitMap[current_id] = emeas;
496 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::HDShowerSimulation - track param." << std::endl
497 <<
" eta = " << moment.eta() << std::endl
498 <<
" phi = " << moment.phi() << std::endl
499 <<
" et = " << moment.Et() << std::endl
503 LogInfo(
"FastCalorimetry") <<
" HDShowerSimulation " << myTrack << std::endl;
513 }
else if (myTrack.
onVFcal()) {
518 LogInfo(
"FastCalorimetry") <<
" The particle is not in the acceptance " << std::endl;
524 int onHCAL =
hit + 1;
525 int onECAL = myTrack.
onEcal();
527 double pathEta = trackPosition.eta();
528 double pathPhi = trackPosition.phi();
530 double eint = moment.e();
548 }
else if (myTrack.
onHcal()) {
557 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::HDShowerSimulation - on-calo 1 " << std::endl
558 <<
" onEcal = " << myTrack.
onEcal() << std::endl
559 <<
" onHcal = " << myTrack.
onHcal() << std::endl
560 <<
" onVFcal = " << myTrack.
onVFcal() << std::endl
561 <<
" position = " << caloentrance << std::endl;
566 }
else if (myTrack.
onHcal()) {
591 HFShower theShower(random, &theHDShowerparam, &myGrid, &myHcalHitMaker, onECAL, eGen);
599 HDShower theShower(random, &theHDShowerparam, &myGrid, &myHcalHitMaker, onECAL, eGen, pmip);
603 HDRShower theShower(random, &theHDShowerparam, &myGrid, &myHcalHitMaker, onECAL, eGen);
616 int showerType = 99 + myTrack.
onEcal();
617 double globalTime = 150.0;
619 Gflash3Vector gfpos(trackPosition.X(), trackPosition.Y(), trackPosition.Z());
628 std::vector<GflashHit>::const_iterator spotIter = gflashHitList.begin();
629 std::vector<GflashHit>::const_iterator spotIterEnd = gflashHitList.end();
633 for (; spotIter != spotIterEnd; spotIter++) {
635 (30 * 100 / eGen) * (spotIter->getTime() - globalTime);
642 Gflash3Vector positionAtCurrentDepth = trajectoryPoint.getPosition();
644 Gflash3Vector lateralDisplacement = positionAtCurrentDepth - spotIter->getPosition() / CLHEP::cm;
645 double rShower = lateralDisplacement.r();
646 double azimuthalAngle = lateralDisplacement.phi();
651 bool statusPad = myGrid.getPads(currentDepth,
true);
654 myGrid.setSpotEnergy(1.2 * spotIter->getEnergy() /
CLHEP::GeV);
657 bool setHDdepth = myHcalHitMaker.
setDepth(currentDepth,
true);
684 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::HDShowerSimulation - on-calo 2" << std::endl
685 <<
" eta = " << pathEta << std::endl
686 <<
" phi = " << pathPhi << std::endl
687 <<
" Egen = " << eGen << std::endl
688 <<
" Emeas = " << emeas << std::endl
690 <<
" mip = " << mip << std::endl;
692 if (myTrack.
onEcal() > 0) {
710 std::map<CaloHitID, float> hitMap;
711 hitMap[current_id] = emeas;
714 LogInfo(
"FastCalorimetry") <<
" HCAL simple cell " << cell.
rawId() <<
" added E = " << emeas << std::endl;
721 LogInfo(
"FastCalorimetry") << std::endl <<
" FASTEnergyReconstructor::HDShowerSimulation finished " << std::endl;
739 LogInfo(
"FastCalorimetry") <<
"CalorimetryManager::MuonMipSimulation - track param." << std::endl
740 <<
" eta = " << moment.eta() << std::endl
741 <<
" phi = " << moment.phi() << std::endl
742 <<
" et = " << moment.Et() << std::endl;
748 }
else if (myTrack.
onVFcal()) {
752 LogInfo(
"FastCalorimetry") <<
" The particle is not in the acceptance " << std::endl;
760 int onECAL = myTrack.
onEcal();
772 }
else if (myTrack.
onHcal()) {
783 }
else if (myTrack.
onHcal()) {
795 const std::vector<CaloSegment>& segments = myGrid.getSegments();
796 unsigned nsegments = segments.size();
806 for (
unsigned iseg = 0; iseg < nsegments && ifirstHcal < 0; ++iseg) {
808 float segmentSizeinX0 = segments[iseg].X0length();
817 if (energyLossECAL) {
818 energyLossECAL->
updateState(theMuon, segmentSizeinX0, random);
820 moment -= energyLossECAL->
deltaMom();
826 myGrid.getPads(segments[iseg].sX0Entrance() + segmentSizeinX0 * 0.5);
827 myGrid.setSpotEnergy(
energy);
828 myGrid.addHit(0., 0.);
850 float mipenergy = 0.0;
857 if (ifirstHcal > 0 && energyLossHCAL) {
858 for (
unsigned iseg = ifirstHcal; iseg < nsegments; ++iseg) {
859 float segmentSizeinX0 = segments[iseg].X0length();
862 if (segmentSizeinX0 > 0.001) {
867 energyLossHCAL->
updateState(theMuon, segmentSizeinX0, random);
868 mipenergy = energyLossHCAL->
deltaMom().E();
869 moment -= energyLossHCAL->
deltaMom();
871 myHcalHitMaker.
addHit(segments[iseg].entrance());
879 if (energyLossHCAL && ilastHcal >= 0) {
883 }
else if (energyLossECAL && ilastEcal >= 0) {
892 std::map<CaloHitID, float>::const_iterator mapitr;
893 std::map<CaloHitID, float>::const_iterator endmapitr;
894 if (myTrack.
onEcal() > 0) {
903 LogInfo(
"FastCalorimetry") << std::endl <<
" FASTEnergyReconstructor::MipShowerSimulation finished " << std::endl;
936 if (pulledPadSurvivalProbability_ < 0. || pulledPadSurvivalProbability_ > 1)
938 if (crackPadSurvivalProbability_ < 0. || crackPadSurvivalProbability_ > 1)
941 LogInfo(
"FastCalorimetry") <<
" Fast ECAL simulation parameters " << std::endl;
942 LogInfo(
"FastCalorimetry") <<
" =============================== " << std::endl;
944 LogInfo(
"FastCalorimetry") <<
" The preshower is present " << std::endl;
946 LogInfo(
"FastCalorimetry") <<
" The preshower is NOT present " << std::endl;
951 LogInfo(
"FastCalorimetry") <<
" Core of the shower " << std::endl;
956 LogInfo(
"FastCalorimetry") << std::endl;
958 LogInfo(
"FastCalorimetry") <<
" Tail of the shower " << std::endl;
967 LogInfo(
"FastCalorimetry") << std::endl;
969 LogInfo(
"FastCalorimetry") <<
"Improper number of parameters for the preshower ; using 95keV" << std::endl;
981 rsp = CalorimeterParam.
getParameter<std::vector<double> >(
"RespCorrP");
982 LogInfo(
"FastCalorimetry") <<
" RespCorrP (rsp) size " <<
rsp.size() << std::endl;
984 if (
rsp.size() % 3 != 0) {
985 LogInfo(
"FastCalorimetry") <<
" RespCorrP size is wrong -> no corrections applied !!!" << std::endl;
991 for (
unsigned i = 0;
i <
rsp.size();
i += 3) {
992 LogInfo(
"FastCalorimetry") <<
"i = " <<
i / 3 <<
" p = " <<
rsp[
i] <<
" k_e(p) = " <<
rsp[
i + 1]
993 <<
" k_e(p) = " <<
rsp[
i + 2] << std::endl;
1024 useShowerLibrary = m_HS.getUntrackedParameter<
bool>(
"useShowerLibrary",
false);
1025 useCorrectionSL = m_HS.getUntrackedParameter<
bool>(
"useCorrectionSL",
false);
1036 for (
int i = 0;
i < sizeP;
i++) {
1052 double y1 =
k_e[ip - 1];
1053 double y2 =
k_e[ip];
1065 LogInfo(
"FastCalorimetry") <<
" p, ecorr, hcorr = " <<
p <<
" " <<
ecorr <<
" " <<
hcorr << std::endl;
1069 std::map<CaloHitID, float>::const_iterator mapitr;
1070 std::map<CaloHitID, float>::const_iterator endmapitr = hitMap.end();
1073 endmapitr = hitMap.end();
1074 for (mapitr = hitMap.begin(); mapitr != endmapitr; ++mapitr) {
1076 float energy = mapitr->second;
1080 CaloHitID current_id(mapitr->first.unitID(), mapitr->first.timeSlice(), trackID);
1084 }
else if (onEcal == 2) {
1086 endmapitr = hitMap.end();
1087 for (mapitr = hitMap.begin(); mapitr != endmapitr; ++mapitr) {
1089 float energy = mapitr->second;
1093 CaloHitID current_id(mapitr->first.unitID(), mapitr->first.timeSlice(), trackID);
1103 std::map<CaloHitID, float>::const_iterator mapitr;
1104 std::map<CaloHitID, float>::const_iterator endmapitr = hitMap.end();
1106 for (mapitr = hitMap.begin(); mapitr != endmapitr; ++mapitr) {
1108 float energy = mapitr->second;
1111 float time = mapitr->first.timeSlice();
1143 CaloHitID current_id(mapitr->first.unitID(),
time, trackID);
1149 std::map<CaloHitID, float>::const_iterator mapitr;
1150 std::map<CaloHitID, float>::const_iterator endmapitr = hitMap.end();
1152 for (mapitr = hitMap.begin(); mapitr != endmapitr; ++mapitr) {
1154 float energy = mapitr->second;
1158 CaloHitID current_id(mapitr->first.unitID(), mapitr->first.timeSlice(), trackID);
1208 for (
unsigned i = 0;
i <
size; ++
i) {
1209 int id =
muons[
i].trackId();
1215 std::vector<FSimTrack>::const_iterator itcheck =
1218 muons[
i].setTkPosition(itcheck->trackerSurfacePosition());
1219 muons[
i].setTkMomentum(itcheck->trackerSurfaceMomentum());
1227 if (
track.momentum().perp2() > 1.0 && fabs(
track.momentum().eta()) < 3.0 &&
track.isGlobal())
1231 if (
track.momentum().perp2() > 1.0 && fabs(
track.momentum().eta()) < 3.0 &&
track.isGlobal())