Go to the documentation of this file.00001 #include "FastSimulation/CaloHitMakers/interface/HcalHitMaker.h"
00002 #include "FastSimulation/CaloGeometryTools/interface/CaloGeometryHelper.h"
00003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00004 #include "DataFormats/HcalDetId/interface/HcalDetId.h"
00005 #include <algorithm>
00006 #include <cmath>
00007
00008 typedef ROOT::Math::Transform3DPJ::Point Point;
00009
00010 HcalHitMaker::HcalHitMaker(EcalHitMaker& grid,unsigned shower)
00011 :CaloHitMaker(grid.getCalorimeter(),DetId::Hcal,HcalHitMaker::getSubHcalDet(grid.getFSimTrack()),
00012 grid.getFSimTrack()->onHcal()?grid.getFSimTrack()->onHcal():grid.getFSimTrack()->onVFcal()+1,shower),
00013 myGrid(grid), myTrack((grid.getFSimTrack()))
00014 {
00015
00016 ecalEntrance_=myGrid.ecalEntrance();
00017 particleDirection=myTrack->ecalEntrance().Vect().Unit();
00018 radiusFactor_=(EMSHOWER)? moliereRadius:interactionLength;
00019 mapCalculated_=false;
00020
00021 if(EMSHOWER&&(abs(grid.getFSimTrack()->type())!=11 && grid.getFSimTrack()->type()!=22))
00022 {
00023 std::cout << " FamosHcalHitMaker : Strange. The following shower has EM type" << std::endl <<* grid.getFSimTrack() << std::endl;
00024 }
00025 }
00026
00027 bool
00028 HcalHitMaker::addHit(double r,double phi,unsigned layer)
00029 {
00030
00031
00032
00033 XYZPoint point(r*radiusFactor_*std::cos(phi),r*radiusFactor_*std::sin(phi),0.);
00034
00035
00036
00037 point = locToGlobal_((Point)point);
00038 return addHit(point,layer);
00039 }
00040
00041 bool HcalHitMaker::addHit(const XYZPoint& point, unsigned layer)
00042 {
00043
00044
00045 if(fabs(point.Z())>2000 || fabs(point.X())>2000 || fabs(point.Y())>2000)
00046 {
00047 if(EMSHOWER)
00048 edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from an electromagnetic shower. - Ignoring it" << std::endl;
00049 else if(HADSHOWER)
00050 edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from a hadron shower. - Ignoring it" << std::endl;
00051 else if(MIP)
00052 edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from a muon. - Ignoring it" << std::endl;
00053 return false;
00054 }
00055
00056
00057 double pointeta = fabs(point.eta());
00058 if(pointeta > 5.19) return false;
00059
00060 DetId thecellID(myCalorimeter->getClosestCell(point,false,false));
00061
00062 HcalDetId myDetId(thecellID);
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 if ( myDetId.subdetId() == HcalForward ) {
00079 int mylayer = layer;
00080 if ( myDetId.depth()==2 ) {
00081 mylayer = (int)layer;
00082 } else {
00083 mylayer = 1;
00084 }
00085 HcalDetId myDetId2((HcalSubdetector)myDetId.subdetId(),myDetId.ieta(),myDetId.iphi(),mylayer);
00086 thecellID = myDetId2;
00087 }
00088
00089
00090
00091 if(!thecellID.null())
00092 {
00093 uint32_t cell(thecellID.rawId());
00094
00095
00096
00097
00098 std::map<uint32_t,float>::iterator cellitr;
00099 cellitr = hitMap_.find(cell);
00100 if(cellitr==hitMap_.end())
00101 {
00102 hitMap_.insert(std::pair<uint32_t,float>(cell,spotEnergy));
00103 }
00104 else
00105 {
00106 cellitr->second+=spotEnergy;
00107 }
00108 return true;
00109 }
00110 return false;
00111 }
00112
00113 bool
00114 HcalHitMaker::setDepth(double depth,bool inCm)
00115 {
00116 currentDepth_=depth;
00117 std::vector<CaloSegment>::const_iterator segiterator;
00118 if(inCm)
00119 {
00120 segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inSegment(currentDepth_));
00121 }
00122 else
00123 {
00124 if(EMSHOWER)
00125 segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inX0Segment(currentDepth_));
00126
00127
00128 if(HADSHOWER)
00129 segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inL0Segment(currentDepth_));
00130 }
00131
00132 if(segiterator==myGrid.getSegments().end())
00133 {
00134
00135 if(depth > myGrid.getSegments().back().sL0Exit())
00136 {
00137 segiterator= find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inL0Segment(myGrid.getSegments().back().sL0Exit()-1.));
00138 depth=segiterator->sL0Exit()-1.;
00139 currentDepth_=depth;
00140 if(segiterator==myGrid.getSegments().end())
00141 {
00142 std::cout << " Could not go at such depth " << EMSHOWER << " " << currentDepth_ << std::endl;
00143 std::cout << " Track " << *(myGrid.getFSimTrack()) << std::endl;
00144 return false;
00145 }
00146 }
00147 else
00148 {
00149 std::cout << " Could not go at such depth " << EMSHOWER << " " << currentDepth_ << " " << myGrid.getSegments().back().sL0Exit() << std::endl;
00150 std::cout << " Track " << *(myGrid.getFSimTrack()) << std::endl;
00151 return false;
00152 }
00153 }
00154
00155
00156 XYZPoint origin;
00157 if(inCm)
00158 {
00159 origin=segiterator->positionAtDepthincm(currentDepth_);
00160 }
00161 else
00162 {
00163 if(EMSHOWER)
00164 origin=segiterator->positionAtDepthinX0(currentDepth_);
00165 if(HADSHOWER)
00166 origin=segiterator->positionAtDepthinL0(currentDepth_);
00167 }
00168 XYZVector zaxis(0,0,1);
00169 XYZVector planeVec1=(zaxis.Cross(particleDirection)).Unit();
00170 locToGlobal_=Transform3D(Point(0,0,0),
00171 Point(0,0,1),
00172 Point(1,0,0),
00173 (Point)origin,
00174 (Point)(origin+particleDirection),
00175 (Point)(origin+planeVec1));
00176 return true;
00177 }