CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

PFRecHitProducerHO Class Reference

Producer for particle flow rechits (PFRecHit) in HO. More...

#include <PFRecHitProducerHO.h>

Inheritance diagram for PFRecHitProducerHO:
PFRecHitProducer edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

 PFRecHitProducerHO (const edm::ParameterSet &)
 ~PFRecHitProducerHO ()

Private Member Functions

reco::PFRecHitcreateHORecHit (const DetId &detid, double energy, PFLayer::Layer layer, const CaloSubdetectorGeometry *geom)
void createRecHits (std::vector< reco::PFRecHit > &rechits, std::vector< reco::PFRecHit > &rechitsCleaned, edm::Event &, const edm::EventSetup &)
bool findHORecHitGeometry (const DetId &detid, const CaloSubdetectorGeometry *geom, math::XYZVector &position, math::XYZVector &axis)
 find the position and the axis of the cell for a given rechit
void findRecHitNeighbours (reco::PFRecHit &rh, const std::map< unsigned, unsigned > &sortedHits, const CaloSubdetectorTopology &barrelTopo, const CaloSubdetectorGeometry &barrelGeom)
void findRecHitNeighboursHO (reco::PFRecHit &rh, const std::map< unsigned, unsigned > &sortedHits)
 find rechit neighbours, using the hashed index
void hoNeighbArray (const CaloSubdetectorGeometry &barrelGeom, const CaloSubdetectorTopology &barrelTopo)
DetId move (DetId cell, const CaloDirection &dir) const
bool stdmove (DetId &cell, const CaloDirection &dir, const CaloSubdetectorTopology &barrelTopo, const CaloSubdetectorGeometry &barrelGeom) const
bool stdsimplemove (DetId &cell, const CaloDirection &dir, const CaloSubdetectorTopology &barrelTopo, const CaloSubdetectorGeometry &barrelGeom) const

Private Attributes

int HOMaxAllowedSev_
edm::InputTag inputTagHORecHits_
bool neighbourmapcalculated_
 set to true in hoNeighbArray
std::vector< std::vector< DetId > > neighboursHO_
 for each HO barrel rechit, keep track of the neighbours
double thresholdR0_
double thresholdR1_

Detailed Description

Producer for particle flow rechits (PFRecHit) in HO.

Author:
Gobinda Majumder
Date:
November 2011

Definition at line 35 of file PFRecHitProducerHO.h.


Constructor & Destructor Documentation

PFRecHitProducerHO::PFRecHitProducerHO ( const edm::ParameterSet iConfig) [explicit]

Definition at line 43 of file PFRecHitProducerHO.cc.

References edm::ParameterSet::getParameter(), HOMaxAllowedSev_, inputTagHORecHits_, and neighbourmapcalculated_.

  : PFRecHitProducer(iConfig) {
  
  // access to the collections of rechits
  inputTagHORecHits_ = 
    iConfig.getParameter<InputTag>("recHitsHO");
  
  HOMaxAllowedSev_ = iConfig.getParameter<int>("HOMaxAllowedSev");
  neighbourmapcalculated_ = false;
}
PFRecHitProducerHO::~PFRecHitProducerHO ( )

Definition at line 56 of file PFRecHitProducerHO.cc.

{}

Member Function Documentation

reco::PFRecHit * PFRecHitProducerHO::createHORecHit ( const DetId detid,
double  energy,
PFLayer::Layer  layer,
const CaloSubdetectorGeometry geom 
) [private]

Definition at line 172 of file PFRecHitProducerHO.cc.

References abs, relval_parameters_module::energy, CaloCellGeometry::getCorners(), CaloSubdetectorGeometry::getGeometry(), CaloCellGeometry::getPosition(), position, DetId::rawId(), reco::PFRecHit::setNECorner(), reco::PFRecHit::setNWCorner(), reco::PFRecHit::setSECorner(), reco::PFRecHit::setSWCorner(), PV3DBase< T, PVType, FrameType >::x(), x, PV3DBase< T, PVType, FrameType >::y(), detailsBasic3DVector::y, PV3DBase< T, PVType, FrameType >::z(), and z.

                                                                          {
  
  math::XYZVector position;
  math::XYZVector axis;
  
  const CaloCellGeometry *thisCell 
    = geom->getGeometry(detid);
  
  // find rechit geometry
  if(!thisCell) {
    LogError("PFRecHitProducerHO")
      <<"warning detid "<<detid.rawId()
      <<" not found in geometry"<<endl;
    return 0;
  }
  
  double sclel0l1r=0.946; //384.8/406.6
  
  if (abs(thisCell->getPosition().z())>130) {
    position.SetCoordinates ( sclel0l1r*thisCell->getPosition().x(),
                              sclel0l1r*thisCell->getPosition().y(),
                              sclel0l1r*thisCell->getPosition().z() );   
    
  } else {
    position.SetCoordinates ( thisCell->getPosition().x(),
                              thisCell->getPosition().y(),
                              thisCell->getPosition().z() );
  }
  
  // the axis vector is the difference 
  
  //   const TruncatedPyramid* pyr 
  //     = dynamic_cast< const TruncatedPyramid* > (thisCell);    
  //   if( pyr ) {
  //     axis.SetCoordinates( pyr->getPosition(1).x(), 
  //                     pyr->getPosition(1).y(), 
  //                     pyr->getPosition(1).z() ); 
  
  //     math::XYZVector axis0( pyr->getPosition(0).x(), 
  //                       pyr->getPosition(0).y(), 
  //                       pyr->getPosition(0).z() );
  
  //     axis -= axis0;    
  //   }
  //   else return 0;
  
  axis = math::XYZVector(0,0,0);
  
  //   if( !geomfound ) {
  //     LogError("PFRecHitProducerHO")<<"cannor find geometry for detid "
  //                             <<detid.rawId()<<" in layer "<<layer<<endl;
  //     return 0; // geometry not found, skip rechit
  //   }
  
  
  reco::PFRecHit *rh 
    = new reco::PFRecHit( detid.rawId(), layer, 
                          energy, 
                          position.x(), position.y(), position.z(), 
                          axis.x(), axis.y(), axis.z() ); 
  
  const CaloCellGeometry::CornersVec& corners = thisCell->getCorners();
  assert( corners.size() == 8 );
  
  if (abs(corners[0].z())>130.0) {
    rh->setNECorner( sclel0l1r*corners[0].x(), sclel0l1r*corners[0].y(),  sclel0l1r*corners[0].z() );
    rh->setSECorner( sclel0l1r*corners[1].x(), sclel0l1r*corners[1].y(),  sclel0l1r*corners[1].z() );
    rh->setSWCorner( sclel0l1r*corners[2].x(), sclel0l1r*corners[2].y(),  sclel0l1r*corners[2].z() );
    rh->setNWCorner( sclel0l1r*corners[3].x(), sclel0l1r*corners[3].y(),  sclel0l1r*corners[3].z() );
    
  } else {
    rh->setNECorner( corners[0].x(), corners[0].y(),  corners[0].z() );
    rh->setSECorner( corners[1].x(), corners[1].y(),  corners[1].z() );
    rh->setSWCorner( corners[2].x(), corners[2].y(),  corners[2].z() );
    rh->setNWCorner( corners[3].x(), corners[3].y(),  corners[3].z() );
  }
  
  return rh;
}
void PFRecHitProducerHO::createRecHits ( std::vector< reco::PFRecHit > &  rechits,
std::vector< reco::PFRecHit > &  rechitsCleaned,
edm::Event ,
const edm::EventSetup  
) [private, virtual]

translate the standard rechits ( or calotowers) them to PFRecHits, which are stored in the rechits vector

Implements PFRecHitProducer.

bool PFRecHitProducerHO::findHORecHitGeometry ( const DetId detid,
const CaloSubdetectorGeometry geom,
math::XYZVector position,
math::XYZVector axis 
) [private]

find the position and the axis of the cell for a given rechit

Definition at line 257 of file PFRecHitProducerHO.cc.

References CaloSubdetectorGeometry::getGeometry(), CaloCellGeometry::getPosition(), DetId::rawId(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

                                                               {
  
  
  const CaloCellGeometry *thisCell 
    = geom->getGeometry(detid);
  
  // find rechit geometry
  if(!thisCell) {
    LogError("PFRecHitProducerHO")
      <<"warning detid "<<detid.rawId()
      <<" not found in geometry"<<endl;
    return false;
  }
  
  position.SetCoordinates ( thisCell->getPosition().x(),
                            thisCell->getPosition().y(),
                            thisCell->getPosition().z() );
  
  
  
  // the axis vector is the difference 
  //   const TruncatedPyramid* pyr 
  //     = dynamic_cast< const TruncatedPyramid* > (thisCell);    
  //   if( pyr ) {
  //     axis.SetCoordinates( pyr->getPosition(1).x(), 
  //                     pyr->getPosition(1).y(), 
  //                     pyr->getPosition(1).z() ); 
  
  //     math::XYZVector axis0( pyr->getPosition(0).x(), 
  //                       pyr->getPosition(0).y(), 
  //                       pyr->getPosition(0).z() );
  
  //     axis -= axis0;
  
  
  //     return true;
  //   }
  
  axis = math::XYZVector(0,0,0);
  return true;
  
  //  else return false;
}
void PFRecHitProducerHO::findRecHitNeighbours ( reco::PFRecHit rh,
const std::map< unsigned, unsigned > &  sortedHits,
const CaloSubdetectorTopology barrelTopo,
const CaloSubdetectorGeometry barrelGeom 
) [private]
void PFRecHitProducerHO::findRecHitNeighboursHO ( reco::PFRecHit rh,
const std::map< unsigned, unsigned > &  sortedHits 
) [private]

find rechit neighbours, using the hashed index

Definition at line 308 of file PFRecHitProducerHO.cc.

References reco::PFRecHit::add4Neighbour(), reco::PFRecHit::add8Neighbour(), reco::PFRecHit::detId(), EAST, i, NORTH, NORTHEAST, NORTHWEST, DetId::rawId(), SOUTH, SOUTHEAST, SOUTHWEST, and WEST.

                                              {
  
  DetId center( rh.detId() );
  
  
  DetId north = move( center, NORTH );
  DetId northeast = move( center, NORTHEAST );
  DetId northwest = move( center, NORTHWEST ); 
  DetId south = move( center, SOUTH );  
  DetId southeast = move( center, SOUTHEAST );  
  DetId southwest = move( center, SOUTHWEST );  
  DetId east  = move( center, EAST );  
  DetId west  = move( center, WEST );  
  
  IDH i = sortedHits.find( north.rawId() );
  if(i != sortedHits.end() ) 
    rh.add4Neighbour( i->second );
  
  i = sortedHits.find( northeast.rawId() );
  if(i != sortedHits.end() ) 
    rh.add8Neighbour( i->second );
  
  i = sortedHits.find( south.rawId() );
  if(i != sortedHits.end() ) 
    rh.add4Neighbour( i->second );
  
  i = sortedHits.find( southwest.rawId() );
  if(i != sortedHits.end() ) 
    rh.add8Neighbour( i->second );
  
  i = sortedHits.find( east.rawId() );
  if(i != sortedHits.end() ) 
    rh.add4Neighbour( i->second );
  
  i = sortedHits.find( southeast.rawId() );
  if(i != sortedHits.end() ) 
    rh.add8Neighbour( i->second );
  
  i = sortedHits.find( west.rawId() );
  if(i != sortedHits.end() ) 
    rh.add4Neighbour( i->second );
  
  i = sortedHits.find( northwest.rawId() );
  if(i != sortedHits.end() ) 
    rh.add8Neighbour( i->second );
}
void PFRecHitProducerHO::hoNeighbArray ( const CaloSubdetectorGeometry barrelGeom,
const CaloSubdetectorTopology barrelTopo 
) [private]

fill the vectors neighboursEB_ and neighboursEE_ which keep track of the neighbours of each rechit. to be called at the beginning of the run

Definition at line 359 of file PFRecHitProducerHO.cc.

References EAST, CaloSubdetectorGeometry::getValidDetIds(), CaloSubdetectorTopology::getWindow(), HcalDetId::hashed_index(), DetId::Hcal, HcalOuter, recoMuon::in, LogDebug, neighbourmapcalculated_, neighboursHO_, NORTH, NORTHEAST, NORTHWEST, findQualityFiles::size, SOUTH, SOUTHEAST, SOUTHWEST, ntuplemaker::status, stdmove(), and WEST.

                                                                            {
  
  static const CaloDirection orderedDir[8]={SOUTHWEST,
                                            SOUTH,
                                            SOUTHEAST,
                                            WEST,
                                            EAST,
                                            NORTHWEST,
                                            NORTH,
                                            NORTHEAST};
  
  const unsigned nbarrel = 2160; //62000;
  // Barrel first. The hashed index runs from 0 to 2199 61199
  neighboursHO_.resize(nbarrel);
  
  //std::cout << " Building the array of neighbours (barrel) " ;
  
  const std::vector<DetId>& vec(barrelGeom.getValidDetIds(DetId::Hcal,
                                                          HcalOuter));
  unsigned size=vec.size();    
  for(unsigned ic=0; ic<size; ++ic) 
    {
      // We get the 9 cells in a square. 
      std::vector<DetId> neighbours(barrelTopo.getWindow(vec[ic],3,3));
      unsigned nneighbours=neighbours.size();
      
      unsigned hashedindex=HcalDetId(vec[ic]).hashed_index()-5184; //2*( kHBhalf + kHEhalf )
      //           std::cout << " Cell " << ic<<" "<<vec[ic].rawId()<<" "<<HcalDetId(vec[ic]) <<" "<<hashedindex<<" "<<nneighbours<< std::endl;
      if(hashedindex>=nbarrel)
        {
          LogDebug("CaloGeometryTools")  << " Array overflow " << std::endl;
        }
      
      
      // If there are 9 cells, it is easy, and this order is know:
      //      6  7  8
      //      3  4  5 
      //      0  1  2   (0 = SOUTHWEST)
      
      if(nneighbours==9)
        {
          neighboursHO_[hashedindex].reserve(8);
          for(unsigned in=0;in<nneighbours;++in)
            {
              // remove the centre
              //    cout<<"ic "<<ic<<" "<<in<<" "<<neighbours[in].rawId()<<" "<<vec[ic].rawId()<<" "<<hashedindex<<endl; 
              if(neighbours[in]!=vec[ic]) 
                {
                  neighboursHO_[hashedindex].push_back(neighbours[in]);
                  //            std::cout << " Neighbour " << ic<<" "<<size<<" "<<in << " " <<hashedindex<<" "<< HcalDetId(neighbours[in]) << std::endl;
                }
            }
        }
      else
        {
          DetId central(vec[ic]);
          neighboursHO_[hashedindex].resize(8,DetId(0));
          for(unsigned idir=0;idir<8;++idir)
            {
              DetId testid=central;
              bool status=stdmove(testid,orderedDir[idir],
                                  barrelTopo, barrelGeom);
              if(status) neighboursHO_[hashedindex][idir]=testid;
            }
          
        }
    }
  
  //    std::cout << " done " << size <<std::endl;
  neighbourmapcalculated_ = true;
}
DetId PFRecHitProducerHO::move ( DetId  cell,
const CaloDirection dir 
) const [private]

Definition at line 556 of file PFRecHitProducerHO.cc.

References dir, HcalDetId::hashed_index(), neighbourmapcalculated_, neighboursHO_, NONE, and query::result.

{  
  DetId originalcell = cell; 
  if(dir==NONE || cell==DetId(0)) return false;
  
  // Conversion CaloDirection and index in the table
  // CaloDirection :NONE,SOUTH,SOUTHEAST,SOUTHWEST,EAST,WEST, NORTHEAST,NORTHWEST,NORTH
  // Table : SOUTHWEST,SOUTH,SOUTHEAST,WEST,EAST,NORTHWEST,NORTH, NORTHEAST
  static const int calodirections[9]={-1,1,2,0,4,3,7,5,6};
  
  assert(neighbourmapcalculated_);
  
  DetId result = neighboursHO_[HcalDetId(originalcell).hashed_index()-5184][calodirections[dir]];
  return result; 
}
bool PFRecHitProducerHO::stdmove ( DetId cell,
const CaloDirection dir,
const CaloSubdetectorTopology barrelTopo,
const CaloSubdetectorGeometry barrelGeom 
) const [private]

Definition at line 467 of file PFRecHitProducerHO.cc.

References EAST, NORTH, NORTHEAST, NORTHWEST, query::result, SOUTH, SOUTHEAST, SOUTHWEST, stdsimplemove(), and WEST.

Referenced by hoNeighbArray().

        {
  
  
  bool result; 
  
  if(dir==NORTH) {
    result = stdsimplemove(cell,NORTH, barrelTopo, barrelGeom);
    return result;
  }
  else if(dir==SOUTH) {
    result = stdsimplemove(cell,SOUTH, barrelTopo, barrelGeom);
    return result;
  }
  else if(dir==EAST) {
    result = stdsimplemove(cell,EAST, barrelTopo, barrelGeom);
    return result;
  }
  else if(dir==WEST) {
    result = stdsimplemove(cell,WEST, barrelTopo, barrelGeom);
    return result;
  }
  
  
  // One has to try both paths
  else if(dir==NORTHEAST)
    {
      result = stdsimplemove(cell,NORTH, barrelTopo, barrelGeom);
      if(result)
        return stdsimplemove(cell,EAST, barrelTopo, barrelGeom);
      else
        {
          result = stdsimplemove(cell,EAST, barrelTopo, barrelGeom);
          if(result)
            return stdsimplemove(cell,NORTH, barrelTopo, barrelGeom);
          else
            return false; 
        }
    }
  else if(dir==NORTHWEST)
    {
      result = stdsimplemove(cell,NORTH, barrelTopo, barrelGeom );
      if(result)
        return stdsimplemove(cell,WEST, barrelTopo, barrelGeom );
      else
        {
          result = stdsimplemove(cell,WEST, barrelTopo, barrelGeom );
          if(result)
            return stdsimplemove(cell,NORTH, barrelTopo, barrelGeom );
          else
            return false; 
        }
    }
  else if(dir == SOUTHEAST)
    {
      result = stdsimplemove(cell,SOUTH, barrelTopo, barrelGeom );
      if(result)
        return stdsimplemove(cell,EAST, barrelTopo, barrelGeom );
      else
        {
          result = stdsimplemove(cell,EAST, barrelTopo, barrelGeom );
          if(result)
            return stdsimplemove(cell,SOUTH, barrelTopo, barrelGeom );
          else
            return false; 
        }
    }
  else if(dir == SOUTHWEST)
    {
      result = stdsimplemove(cell,SOUTH, barrelTopo, barrelGeom );
      if(result)
        return stdsimplemove(cell,WEST, barrelTopo, barrelGeom );
      else
        {
          result = stdsimplemove(cell,SOUTH, barrelTopo, barrelGeom );
          if(result)
            return stdsimplemove(cell,WEST, barrelTopo, barrelGeom );
          else
            return false; 
        }
    }
  cell = DetId(0);
  return false;
}
bool PFRecHitProducerHO::stdsimplemove ( DetId cell,
const CaloDirection dir,
const CaloSubdetectorTopology barrelTopo,
const CaloSubdetectorGeometry barrelGeom 
) const [private]

Definition at line 434 of file PFRecHitProducerHO.cc.

References CaloSubdetectorTopology::getNeighbours(), HcalOuter, and DetId::subdetId().

Referenced by stdmove().

        {
  
  std::vector<DetId> neighbours;
  
  // BARREL CASE 
  if(cell.subdetId()==HcalOuter) {
    HcalDetId hoDetId = cell;
    
    neighbours = barrelTopo.getNeighbours(hoDetId,dir);
    
    // first try to move according to the standard navigation
    if(neighbours.size()>0 && !neighbours[0].null()) {
      cell = neighbours[0];
      return true;
    }
    
    // failed.
    
    
  }
  
  // everything failed 
  cell = DetId(0);
  return false;
}

Member Data Documentation

Definition at line 114 of file PFRecHitProducerHO.h.

Referenced by PFRecHitProducerHO().

Definition at line 105 of file PFRecHitProducerHO.h.

Referenced by PFRecHitProducerHO().

set to true in hoNeighbArray

Definition at line 99 of file PFRecHitProducerHO.h.

Referenced by hoNeighbArray(), move(), and PFRecHitProducerHO().

std::vector<std::vector<DetId> > PFRecHitProducerHO::neighboursHO_ [private]

for each HO barrel rechit, keep track of the neighbours

Definition at line 96 of file PFRecHitProducerHO.h.

Referenced by hoNeighbArray(), and move().

Definition at line 108 of file PFRecHitProducerHO.h.

Definition at line 111 of file PFRecHitProducerHO.h.