CMS 3D CMS Logo

Public Types | Public Member Functions | Static Public Member Functions | Private Attributes

HcalHitMaker Class Reference

#include <HcalHitMaker.h>

Inheritance diagram for HcalHitMaker:
CaloHitMaker

List of all members.

Public Types

typedef ROOT::Math::Transform3DPJ Transform3D
typedef math::XYZVector XYZPoint
typedef math::XYZVector XYZVector

Public Member Functions

bool addHit (double r, double phi, unsigned layer=0)
 add the hit in the HCAL in local coordinates
bool addHit (const XYZPoint &point, unsigned layer=0)
 add the hit in the HCAL in global coordinates
const std::map< CaloHitID,
float > & 
getHits ()
 HcalHitMaker (EcalHitMaker &, unsigned)
bool setDepth (double, bool inCm=false)
 set the depth in X0 or Lambda0 units depending on showerType
void setSpotEnergy (double e)
 Set the spot energy.
 ~HcalHitMaker ()

Static Public Member Functions

static int getSubHcalDet (const FSimTrack *t)

Private Attributes

double currentDepth_
XYZPoint ecalEntrance_
Transform3D locToGlobal_
bool mapCalculated_
EcalHitMakermyGrid
const FSimTrackmyTrack
int onHcal
XYZVector particleDirection
double radiusFactor_

Detailed Description

Definition at line 16 of file HcalHitMaker.h.


Member Typedef Documentation

Definition at line 22 of file HcalHitMaker.h.

Reimplemented from CaloHitMaker.

Definition at line 21 of file HcalHitMaker.h.

Reimplemented from CaloHitMaker.

Definition at line 20 of file HcalHitMaker.h.


Constructor & Destructor Documentation

HcalHitMaker::HcalHitMaker ( EcalHitMaker grid,
unsigned  shower 
)

Definition at line 10 of file HcalHitMaker.cc.

References abs, gather_cfg::cout, EcalHitMaker::ecalEntrance(), FSimTrack::ecalEntrance(), ecalEntrance_, CaloHitMaker::EMSHOWER, EcalHitMaker::getFSimTrack(), CaloHitMaker::interactionLength, mapCalculated_, CaloHitMaker::moliereRadius, myGrid, myTrack, particleDirection, radiusFactor_, and CoreSimTrack::type().

  :CaloHitMaker(grid.getCalorimeter(),DetId::Hcal,HcalHitMaker::getSubHcalDet(grid.getFSimTrack()),
                grid.getFSimTrack()->onHcal()?grid.getFSimTrack()->onHcal():grid.getFSimTrack()->onVFcal()+1,shower),
   myGrid(grid),  myTrack((grid.getFSimTrack()))
{
  // normalize the direction
  ecalEntrance_=myGrid.ecalEntrance();
  particleDirection=myTrack->ecalEntrance().Vect().Unit();
  radiusFactor_=(EMSHOWER)? moliereRadius:interactionLength;
  mapCalculated_=false;
  //std::cout << " Famos HCAL " << grid.getTrack()->onHcal() << " " <<  grid.getTrack()->onVFcal() << " " << showerType << std::endl;
  if(EMSHOWER&&(abs(grid.getFSimTrack()->type())!=11 && grid.getFSimTrack()->type()!=22))
    {
      std::cout << " FamosHcalHitMaker : Strange. The following shower has EM type" << std::endl <<* grid.getFSimTrack() << std::endl;
    }
}
HcalHitMaker::~HcalHitMaker ( ) [inline]

Definition at line 25 of file HcalHitMaker.h.

{;}

Member Function Documentation

bool HcalHitMaker::addHit ( double  r,
double  phi,
unsigned  layer = 0 
) [virtual]

add the hit in the HCAL in local coordinates

Implements CaloHitMaker.

Definition at line 28 of file HcalHitMaker.cc.

References funct::cos(), locToGlobal_, point, radiusFactor_, and funct::sin().

Referenced by EMShower::compute(), HFShower::compute(), HDShower::compute(), CalorimetryManager::HDShowerSimulation(), CalorimetryManager::MuonMipSimulation(), and HDRShower::setHit().

{
    //  std::cout << " FamosHcalHitMaker::addHit - radiusFactor = " << radiusFactor
  //        << std::endl;

  XYZPoint point(r*radiusFactor_*std::cos(phi),r*radiusFactor_*std::sin(phi),0.);

  // Watch out !!!! (Point) is a real point in the MathCore terminology (not a redefined a XYZPoint which
  // is actually a XYZVector in the MatchCore terminology). Therefore, the Transform3D is correctly applied
  point = locToGlobal_((Point)point);
  return addHit(point,layer);
}
bool HcalHitMaker::addHit ( const XYZPoint point,
unsigned  layer = 0 
)

add the hit in the HCAL in global coordinates

Definition at line 41 of file HcalHitMaker.cc.

References CaloHitMaker::EMSHOWER, CaloGeometryHelper::getClosestCell(), CaloHitMaker::HADSHOWER, HcalForward, CaloHitMaker::hitMap_, CaloHitMaker::MIP, CaloHitMaker::myCalorimeter, CaloHitMaker::spotEnergy, and mathSSE::sqrt().

{
  // Temporary nasty hacks to avoid misbehaviour of not-intended-for-that
  //  getClosestCell in case of large (eta beyond HF ...)  and in EM showers 
  if(fabs(point.Z())>2000 || fabs(point.X())>2000 || fabs(point.Y())>2000) 
    { 
      if(EMSHOWER) 
        edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from an electromagnetic shower. - Ignoring it" << std::endl;
      else if(HADSHOWER)
        edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from a hadron shower. - Ignoring it" << std::endl;
      else if(MIP)
        edm::LogWarning("HcalHitMaker") << "received a hit very far from the detector " << point << " coming from a muon. - Ignoring it" << std::endl;
      return false; 
    } 


  double pointeta = fabs(point.eta());
  if(pointeta > 5.19) return false; 

  //calculate time of flight
  double dist = std::sqrt(point.X()*point.X() + point.Y()*point.Y() + point.Z()*point.Z());
  double tof = dist/29.98; //speed of light

  DetId thecellID(myCalorimeter->getClosestCell(point,false,false));
  
  HcalDetId myDetId(thecellID);
                                                                                                                                      
//   if ( myDetId.subdetId() == HcalForward ) {
//     std::cout << "HcalHitMaker : " << point.Z() << " " << myDetId.depth()    << std::endl;
//   }
                                                                                                                                      
//   std::cout << "BEFORE" << std::endl;
//   std::cout << "HcalHitMaker : subdetId : " << myDetId.subdetId() << std::endl;
//   std::cout << "HcalHitMaker : depth    : " << myDetId.depth()    << std::endl;
//   std::cout << "HcalHitMaker : ieta     : " << myDetId.ieta()     << std::endl;
//   std::cout << "HcalHitMaker : iphi     : " << myDetId.iphi()     << std::endl;
//   std::cout << "HcalHitMaker : spotE    : " << spotEnergy         << std::endl;
//   std::cout << "HcalHitMaker : point.X  : " << point.X()          << std::endl;
//   std::cout << "HcalHitMaker : point.Y  : " << point.Y()          << std::endl;
//   std::cout << "HcalHitMaker : point.Z  : " << point.Z()          << std::endl;
                                                                                                                                      
  if ( myDetId.subdetId() == HcalForward ) {
    int mylayer = layer;
    if ( myDetId.depth()==2 ) {
      mylayer = (int)layer;
    } else {
      mylayer = 1;
    }
    HcalDetId myDetId2((HcalSubdetector)myDetId.subdetId(),myDetId.ieta(),myDetId.iphi(),mylayer);
    thecellID = myDetId2;
        myDetId = myDetId2;
  }


  
  if(!thecellID.null()  && myDetId.depth()>0)
    {   
      CaloHitID current_id(thecellID.rawId(),tof,0); //no track yet
      
      //      std::cout << " FamosHcalHitMaker::addHit - the cell num " << cell
      //                << std::endl;

      std::map<CaloHitID,float>::iterator cellitr;
      cellitr = hitMap_.find(current_id);
      if(cellitr==hitMap_.end())
        {
          hitMap_.insert(std::pair<CaloHitID,float>(current_id,spotEnergy));
        }
      else
        {
          cellitr->second+=spotEnergy;
        }
      return true;
    }
  return false;
}
const std::map<CaloHitID,float>& HcalHitMaker::getHits ( ) [inline, virtual]
static int HcalHitMaker::getSubHcalDet ( const FSimTrack t) [inline, static]

Definition at line 56 of file HcalHitMaker.h.

References HcalBarrel, HcalEndcap, HcalForward, FSimTrack::onHcal(), and FSimTrack::onVFcal().

      {
        //      std::cout << " getSubHcalDet " << std::endl;
        // According to  DataFormats/ HcalDetId/ interface/ HcalSubdetector.h
        //      std::cout << " onHcal " << t->onHcal() << " onVFcal " << t->onVFcal() << std::endl;
        if(t->onHcal()==1) return HcalBarrel;
        if(t->onHcal()==2) return HcalEndcap;
        if(t->onVFcal()==2) return HcalForward;
        return -1;
      } 
bool HcalHitMaker::setDepth ( double  depth,
bool  inCm = false 
)

set the depth in X0 or Lambda0 units depending on showerType

Definition at line 119 of file HcalHitMaker.cc.

References gather_cfg::cout, currentDepth_, CaloHitMaker::EMSHOWER, EcalHitMaker::getFSimTrack(), EcalHitMaker::getSegments(), CaloHitMaker::HADSHOWER, locToGlobal_, myGrid, and particleDirection.

Referenced by EMShower::compute(), HFShower::compute(), HDShower::compute(), CalorimetryManager::HDShowerSimulation(), and HDRShower::setHit().

{
  currentDepth_=depth;
  std::vector<CaloSegment>::const_iterator segiterator;
  if(inCm)
    {
      segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inSegment(currentDepth_));
    }
  else
    {
      if(EMSHOWER)
        segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inX0Segment(currentDepth_));
      
      //Hadron shower 
      if(HADSHOWER)
        segiterator = find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inL0Segment(currentDepth_));
    }
  
  if(segiterator==myGrid.getSegments().end()) 
    {
      // Special trick  - As advised by Salavat, no leakage should be simulated
      if(depth > myGrid.getSegments().back().sL0Exit())
        {
          segiterator= find_if(myGrid.getSegments().begin(),myGrid.getSegments().end(),CaloSegment::inL0Segment(myGrid.getSegments().back().sL0Exit()-1.));
          depth=segiterator->sL0Exit()-1.;
          currentDepth_=depth;
          if(segiterator==myGrid.getSegments().end())
            {
              std::cout << " Could not go at such depth " << EMSHOWER << "  " << currentDepth_ << std::endl;
              std::cout << " Track " << *(myGrid.getFSimTrack()) << std::endl;
              return false;
            }
        }
      else
        {
          std::cout << " Could not go at such depth " << EMSHOWER << "  " << currentDepth_ << " " << myGrid.getSegments().back().sL0Exit() << std::endl; 
          std::cout << " Track " << *(myGrid.getFSimTrack()) << std::endl; 
          return false; 
        }
    }


  XYZPoint origin;
  if(inCm)
    {
      origin=segiterator->positionAtDepthincm(currentDepth_);
    }
  else
    {
      if(EMSHOWER)
        origin=segiterator->positionAtDepthinX0(currentDepth_);
      if(HADSHOWER)
        origin=segiterator->positionAtDepthinL0(currentDepth_);
    }
  XYZVector zaxis(0,0,1);
  XYZVector planeVec1=(zaxis.Cross(particleDirection)).Unit();
  locToGlobal_=Transform3D(Point(0,0,0),
                           Point(0,0,1),
                           Point(1,0,0),
                           (Point)origin,
                           (Point)(origin+particleDirection),
                           (Point)(origin+planeVec1));
  return true;
}
void HcalHitMaker::setSpotEnergy ( double  e) [inline, virtual]

Member Data Documentation

double HcalHitMaker::currentDepth_ [private]

Definition at line 50 of file HcalHitMaker.h.

Referenced by setDepth().

Definition at line 46 of file HcalHitMaker.h.

Referenced by HcalHitMaker().

Definition at line 51 of file HcalHitMaker.h.

Referenced by addHit(), and setDepth().

Definition at line 53 of file HcalHitMaker.h.

Referenced by HcalHitMaker().

Definition at line 43 of file HcalHitMaker.h.

Referenced by HcalHitMaker(), and setDepth().

const FSimTrack* HcalHitMaker::myTrack [private]

Definition at line 45 of file HcalHitMaker.h.

Referenced by HcalHitMaker().

int HcalHitMaker::onHcal [private]

Definition at line 48 of file HcalHitMaker.h.

Definition at line 47 of file HcalHitMaker.h.

Referenced by HcalHitMaker(), and setDepth().

double HcalHitMaker::radiusFactor_ [private]

Definition at line 52 of file HcalHitMaker.h.

Referenced by addHit(), and HcalHitMaker().