CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

ValidateGeometry Class Reference

Inheritance diagram for ValidateGeometry:
edm::EDAnalyzer

List of all members.

Public Member Functions

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

Private Member Functions

virtual void analyze (const edm::Event &, const edm::EventSetup &)
virtual void beginJob ()
void clearData ()
void compareShape (const GeomDet *det, const float *shape)
void compareTransform (const GlobalPoint &point, const TGeoMatrix *matrix)
bool dataEmpty ()
virtual void endJob ()
double getDistance (const GlobalPoint &point1, const GlobalPoint &point2)
void makeHistogram (const std::string &name, std::vector< double > &data)
void makeHistograms (const char *detector)
void validateCaloGeometry (DetId::Detector detector, int subdetector, const char *detname)
void validateCSChamberGeometry (const int endcap, const char *detname)
void validateCSCLayerGeometry (const int endcap, const char *detname)
void validateDTChamberGeometry ()
void validateDTLayerGeometry ()
void validatePixelTopology (const TrackerGeometry::DetContainer &dets, const char *detname)
void validateRPCGeometry (const int regionNumber, const char *regionName)
void validateStripTopology (const TrackerGeometry::DetContainer &dets, const char *detname)
void validateTrackerGeometry (const TrackerGeometry::DetUnitContainer &dets, const char *detname)
void validateTrackerGeometry (const TrackerGeometry::DetContainer &dets, const char *detname)

Private Attributes

std::vector< double > bottomWidths_
edm::ESHandle< CaloGeometrycaloGeometry_
edm::ESHandle< CSCGeometrycscGeometry_
edm::ESHandle< DTGeometrydtGeometry_
FWGeometry fwGeometry_
std::vector< double > globalDistances_
std::string infileName_
std::vector< double > lengths_
TFile * outFile_
std::string outfileName_
edm::ESHandle< RPCGeometryrpcGeometry_
std::vector< double > thicknesses_
std::vector< double > topWidths_
edm::ESHandle< TrackerGeometrytrackerGeometry_

Detailed Description

Definition at line 63 of file ValidateGeometry.cc.


Constructor & Destructor Documentation

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

Definition at line 149 of file ValidateGeometry.cc.

References fwGeometry_, infileName_, FWGeometry::loadMap(), outFile_, and outfileName_.

  : infileName_(iConfig.getUntrackedParameter<std::string>("infileName")),
    outfileName_(iConfig.getUntrackedParameter<std::string>("outfileName"))
{
  fwGeometry_.loadMap(infileName_.c_str());

  outFile_ = new TFile(outfileName_.c_str(), "RECREATE");
}
ValidateGeometry::~ValidateGeometry ( )

Definition at line 159 of file ValidateGeometry.cc.

{}

Member Function Documentation

void ValidateGeometry::analyze ( const edm::Event event,
const edm::EventSetup eventSetup 
) [private, virtual]

Implements edm::EDAnalyzer.

Definition at line 164 of file ValidateGeometry.cc.

References DetId::Calo, caloGeometry_, gather_cfg::cout, cscGeometry_, dtGeometry_, DetId::Ecal, EcalBarrel, EcalEndcap, EcalPreshower, fwLog, edm::EventSetup::get(), DetId::Hcal, HcalBarrel, HcalEndcap, HcalForward, HcalOuter, edm::ESHandleBase::isValid(), fwlog::kWarning, rpcGeometry_, HcalCastorDetId::SubdetectorId, HcalZDCDetId::SubdetectorId, trackerGeometry_, validateCaloGeometry(), validateCSChamberGeometry(), validateCSCLayerGeometry(), validateDTChamberGeometry(), validateDTLayerGeometry(), validatePixelTopology(), validateRPCGeometry(), validateStripTopology(), and validateTrackerGeometry().

{
  eventSetup.get<MuonGeometryRecord>().get(rpcGeometry_);

  if ( rpcGeometry_.isValid() )
  {
    std::cout<<"Validating RPC -z endcap geometry"<<std::endl;
    validateRPCGeometry(-1, "RPC -z endcap");

    std::cout<<"Validating RPC +z endcap geometry"<<std::endl;
    validateRPCGeometry(+1, "RPC +z endcap");

    std::cout<<"Validating RPC barrel geometry"<<std::endl;
    validateRPCGeometry(0, "RPC barrel");
  }
  else
    fwLog(fwlog::kWarning)<<"Invalid RPC geometry"<<std::endl; 


  eventSetup.get<MuonGeometryRecord>().get(dtGeometry_);

  if ( dtGeometry_.isValid() )
  {
    std::cout<<"Validating DT chamber geometry"<<std::endl;
    validateDTChamberGeometry();

    std::cout<<"Validating DT layer geometry"<<std::endl;
    validateDTLayerGeometry();
  }
  else
    fwLog(fwlog::kWarning)<<"Invalid DT geometry"<<std::endl; 


  eventSetup.get<MuonGeometryRecord>().get(cscGeometry_);

  if ( cscGeometry_.isValid() )
  {
    std::cout<<"Validating CSC -z geometry"<<std::endl;
    validateCSChamberGeometry(-1, "CSC chamber -z endcap");

    std::cout<<"Validating CSC +z geometry"<<std::endl;
    validateCSChamberGeometry(+1, "CSC chamber +z endcap");

    std::cout<<"Validating CSC layer -z geometry"<<std::endl;
    validateCSCLayerGeometry(-1, "CSC layer -z endcap");

    std::cout<<"Validating CSC layer +z geometry"<<std::endl;
    validateCSCLayerGeometry(+1, "CSC layer +z endcap");
  }
  else
    fwLog(fwlog::kWarning)<<"Invalid CSC geometry"<<std::endl; 

  
  eventSetup.get<TrackerDigiGeometryRecord>().get(trackerGeometry_);

  if ( trackerGeometry_.isValid() )
  {
    std::cout<<"Validating TIB geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsTIB(), "TIB");
    validateStripTopology(trackerGeometry_->detsTIB(), "TIB");

    std::cout<<"Validating TOB geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsTOB(), "TOB");
    validateStripTopology(trackerGeometry_->detsTOB(), "TOB");

    std::cout<<"Validating TEC geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsTEC(), "TEC");
    validateStripTopology(trackerGeometry_->detsTEC(), "TEC");

    std::cout<<"Validating TID geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsTID(), "TID");
    validateStripTopology(trackerGeometry_->detsTID(), "TID");

    std::cout<<"Validating PXB geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsPXB(), "PXB");
    validatePixelTopology(trackerGeometry_->detsPXB(), "PXB");

    std::cout<<"Validating PXF geometry and topology"<<std::endl;
    validateTrackerGeometry(trackerGeometry_->detsPXF(), "PXF");
    validatePixelTopology(trackerGeometry_->detsPXF(), "PXF");
  }
  else
    fwLog(fwlog::kWarning)<<"Invalid Tracker geometry"<<std::endl;

  eventSetup.get<CaloGeometryRecord>().get(caloGeometry_);


  if ( caloGeometry_.isValid() )
  {
    std::cout<<"Validating EB geometry"<<std::endl;
    validateCaloGeometry(DetId::Ecal, EcalBarrel, "EB");

    std::cout<<"Validating EE geometry"<<std::endl;
    validateCaloGeometry(DetId::Ecal, EcalEndcap, "EE");

    std::cout<<"Validating ES geometry"<<std::endl;
    validateCaloGeometry(DetId::Ecal, EcalPreshower, "ES");

    std::cout<<"Validating HB geometry"<<std::endl;
    validateCaloGeometry(DetId::Hcal, HcalBarrel, "HB");
  
    std::cout<<"Validating HE geometry"<<std::endl;
    validateCaloGeometry(DetId::Hcal, HcalEndcap, "HE");

    std::cout<<"Validating HO geometry"<<std::endl;
    validateCaloGeometry(DetId::Hcal, HcalOuter, "HO");
    
    std::cout<<"Validating HF geometry"<<std::endl;
    validateCaloGeometry(DetId::Hcal, HcalForward, "HF");

    std::cout<<"Validating Castor geometry"<<std::endl;
    validateCaloGeometry(DetId::Calo, HcalCastorDetId::SubdetectorId, "Castor");

    std::cout<<"Validating ZDC geometry"<<std::endl;
    validateCaloGeometry(DetId::Calo, HcalZDCDetId::SubdetectorId, "ZDC");
  }
  else
    fwLog(fwlog::kWarning)<<"Invalid Calo geometry"<<std::endl; 

}
void ValidateGeometry::beginJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 1289 of file ValidateGeometry.cc.

References outFile_.

{
  outFile_->cd();
}
void ValidateGeometry::clearData ( void  ) [inline, private]
void ValidateGeometry::compareShape ( const GeomDet det,
const float *  shape 
) [private]

Definition at line 1128 of file ValidateGeometry.cc.

References bottomWidths_, BoundSurface::bounds(), gather_cfg::cout, Bounds::length(), lengths_, GeomDet::surface(), Bounds::thickness(), thicknesses_, topWidths_, and Bounds::width().

Referenced by validateCSChamberGeometry(), validateCSCLayerGeometry(), validateDTChamberGeometry(), validateDTLayerGeometry(), validateRPCGeometry(), and validateTrackerGeometry().

{
  double shape_topWidth;
  double shape_bottomWidth;
  double shape_length;
  double shape_thickness;

  bool tgeotrap = false;
  bool tgeobbox = false;

  if ( shape[0] == 1 )
  {
    shape_topWidth = shape[2];
    shape_bottomWidth = shape[1];
    shape_length = shape[4];
    shape_thickness = shape[3];

    tgeotrap = true;
  }
  
  else if ( shape[0] == 2 )
  {
    shape_topWidth = shape[1];
    shape_bottomWidth = shape[1];
    shape_length = shape[2];
    shape_thickness = shape[3];

    tgeobbox = true;
  }
  
  else
  {
    std::cout<<"Failed to get box or trapezoid from shape"<<std::endl;
    return;
  }

  double topWidth, bottomWidth;
  double length, thickness;

  bool trapezoid = false;
  bool rectangle = false;

  const Bounds* bounds = &(det->surface().bounds());
 
  if ( const TrapezoidalPlaneBounds* tpbs = dynamic_cast<const TrapezoidalPlaneBounds*>(bounds) )
  {
    std::vector<float> ps = tpbs->parameters();

    assert(ps.size() == 4);
    
    bottomWidth = ps[0];
    topWidth = ps[1];
    thickness = ps[2];
    length = ps[3];

    trapezoid = true;
  }

  else if ( (dynamic_cast<const RectangularPlaneBounds*>(bounds)) )
  {
    length = det->surface().bounds().length()*0.5;
    topWidth = det->surface().bounds().width()*0.5;
    bottomWidth = topWidth;
    thickness = det->surface().bounds().thickness()*0.5;

    rectangle = true;
  }
  
  else
  {
    std::cout<<"Failed to get bounds"<<std::endl;
    return;
  }
   
  //assert((tgeotrap && trapezoid) || (tgeobbox && rectangle)); 

  /*
  std::cout<<"topWidth: "<< shape_topWidth <<" "<< topWidth <<std::endl;
  std::cout<<"bottomWidth: "<< shape_bottomWidth <<" "<< bottomWidth <<std::endl;
  std::cout<<"length: "<< shape_length <<" "<< length <<std::endl;
  std::cout<<"thickness: "<< shape_thickness <<" "<< thickness <<std::endl;
  */

  topWidths_.push_back(fabs(shape_topWidth - topWidth));
  bottomWidths_.push_back(fabs(shape_bottomWidth - bottomWidth));
  lengths_.push_back(fabs(shape_length - length));
  thicknesses_.push_back(fabs(shape_thickness - thickness));

  return;
}
void ValidateGeometry::compareTransform ( const GlobalPoint point,
const TGeoMatrix *  matrix 
) [private]

Definition at line 1111 of file ValidateGeometry.cc.

References getDistance(), and globalDistances_.

Referenced by validateCSChamberGeometry(), validateCSCLayerGeometry(), validateDTChamberGeometry(), validateDTLayerGeometry(), validateRPCGeometry(), and validateTrackerGeometry().

{
  double local[3] = 
    {
      0.0, 0.0, 0.0
    };
      
  double global[3];

  matrix->LocalToMaster(local, global);

  double distance = getDistance(GlobalPoint(global[0], global[1], global[2]), gp);
  globalDistances_.push_back(distance);
}
bool ValidateGeometry::dataEmpty ( ) [inline, private]

Definition at line 138 of file ValidateGeometry.cc.

References bottomWidths_, globalDistances_, lengths_, thicknesses_, and topWidths_.

    {
      return (globalDistances_.empty() && 
              topWidths_.empty() && 
              bottomWidths_.empty() && 
              lengths_.empty() && 
              thicknesses_.empty());
    }
void ValidateGeometry::endJob ( void  ) [private, virtual]

Reimplemented from edm::EDAnalyzer.

Definition at line 1296 of file ValidateGeometry.cc.

References gather_cfg::cout, outFile_, and outfileName_.

{
  std::cout<<"Done. "<<std::endl;
  std::cout<<"Results written to "<< outfileName_ <<std::endl;
  outFile_->Close();
}
double ValidateGeometry::getDistance ( const GlobalPoint point1,
const GlobalPoint point2 
) [private]

Definition at line 1223 of file ValidateGeometry.cc.

References mathSSE::sqrt(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by compareTransform(), and validateCaloGeometry().

{
  /*
  std::cout<<"X: "<< p1.x() <<" "<< p2.x() <<std::endl;
  std::cout<<"Y: "<< p1.y() <<" "<< p2.y() <<std::endl;
  std::cout<<"Z: "<< p1.z() <<" "<< p2.z() <<std::endl;
  */

  return sqrt((p1.x()-p2.x())*(p1.x()-p2.x())+
              (p1.y()-p2.y())*(p1.y()-p2.y())+
              (p1.z()-p2.z())*(p1.z()-p2.z()));
}
void ValidateGeometry::makeHistogram ( const std::string &  name,
std::vector< double > &  data 
) [private]

Definition at line 1264 of file ValidateGeometry.cc.

References estimatePileup::hist.

Referenced by makeHistograms(), validateCSCLayerGeometry(), validateDTLayerGeometry(), validatePixelTopology(), validateRPCGeometry(), and validateStripTopology().

{
  if ( data.empty() )
    return;

  std::vector<double>::iterator it;
  
  it = std::min_element(data.begin(), data.end());
  double minE = *it;

  it = std::max_element(data.begin(), data.end());
  double maxE = *it;

  std::vector<double>::iterator itEnd = data.end();

  TH1D hist(name.c_str(), name.c_str(), 100, minE*(1+0.10), maxE*(1+0.10));
  
  for ( it = data.begin(); it != itEnd; ++it )
    hist.Fill(*it);
 
  hist.GetXaxis()->SetTitle("[cm]");
  hist.Write();
}
void ValidateGeometry::makeHistograms ( const char *  detector) [private]

Definition at line 1238 of file ValidateGeometry.cc.

References bottomWidths_, globalDistances_, lengths_, makeHistogram(), outFile_, thicknesses_, and topWidths_.

Referenced by validateCaloGeometry(), validateCSChamberGeometry(), validateCSCLayerGeometry(), validateDTChamberGeometry(), validateDTLayerGeometry(), validateRPCGeometry(), and validateTrackerGeometry().

{
  outFile_->cd();

  std::string d(detector);
  
  std::string gdn = d+": distance between points in global coordinates";
  makeHistogram(gdn, globalDistances_);

  std::string twn = d + ": absolute difference between top widths (along X)";
  makeHistogram(twn, topWidths_);

  std::string bwn = d + ": absolute difference between bottom widths (along X)";
  makeHistogram(bwn, bottomWidths_);

  std::string ln = d + ": absolute difference between lengths (along Y)";
  makeHistogram(ln, lengths_);

  std::string tn = d + ": absolute difference between thicknesses (along Z)";
  makeHistogram(tn, thicknesses_);

  return;
}
void ValidateGeometry::validateCaloGeometry ( DetId::Detector  detector,
int  subdetector,
const char *  detname 
) [private]

Definition at line 829 of file ValidateGeometry.cc.

References caloGeometry_, clearData(), gather_cfg::cout, fwGeometry_, geometry, FWGeometry::getCorners(), CaloCellGeometry::getCorners(), getDistance(), CaloSubdetectorGeometry::getGeometry(), CaloSubdetectorGeometry::getValidDetIds(), globalDistances_, i, makeHistograms(), evf::evtn::offset(), EZArrayFL< T >::size(), x, detailsBasic3DVector::y, and z.

Referenced by analyze().

{
  clearData();

  const CaloSubdetectorGeometry* geometry = 
    caloGeometry_->getSubdetectorGeometry(detector, subdetector);

  const std::vector<DetId>& ids = geometry->getValidDetIds(detector, subdetector);

  for (std::vector<DetId>::const_iterator it = ids.begin(), 
                                        iEnd = ids.end(); 
       it != iEnd; ++it) 
  {
    unsigned int rawId = (*it).rawId();

    const float* points = fwGeometry_.getCorners(rawId);

    if ( points == 0 )
    { 
      std::cout <<"Failed to get points of "<< detname 
                <<" element with detid: "<< rawId <<std::endl;
      continue;
    }

    const CaloCellGeometry* cellGeometry = geometry->getGeometry(*it);
    const CaloCellGeometry::CornersVec& corners = cellGeometry->getCorners();
    
    assert(corners.size() == 8);
    
    for ( unsigned int i = 0, offset = 0; i < 8; ++i )
    {
      offset = 2*i;

      double distance = getDistance(GlobalPoint(points[i+offset], points[i+1+offset], points[i+2+offset]), 
                                    GlobalPoint(corners[i].x(), corners[i].y(), corners[i].z()));
     
      globalDistances_.push_back(distance);
    }
  }

  makeHistograms(detname);
}
void ValidateGeometry::validateCSChamberGeometry ( const int  endcap,
const char *  detname 
) [private]

Definition at line 508 of file ValidateGeometry.cc.

References chambers, clearData(), compareShape(), compareTransform(), gather_cfg::cout, cscGeometry_, Reference_intrackfit_cff::endcap, CSCDetId::endcap(), fwGeometry_, GeomDet::geographicalId(), FWGeometry::getMatrix(), FWGeometry::getShapePars(), CSCChamber::id(), makeHistograms(), DetId::rawId(), GeomDet::surface(), and Surface::toGlobal().

Referenced by analyze().

{
  clearData();

  std::vector<CSCChamber *> chambers = cscGeometry_->chambers();
     
  for ( std::vector<CSCChamber*>::const_iterator it = chambers.begin(), 
                                              itEnd = chambers.end(); 
        it != itEnd; ++it )
  {
    const CSCChamber* chamber = *it;
         
    if ( chamber && chamber->id().endcap() == endcap )
    {
      DetId detId = chamber->geographicalId();
      GlobalPoint gp = chamber->surface().toGlobal(LocalPoint(0.0,0.0,0.0));

      const TGeoMatrix* matrix = fwGeometry_.getMatrix(detId.rawId());
  
      if ( ! matrix ) 
      {     
        std::cout<<"Failed to get matrix of CSC chamber with detid: " 
                 << detId.rawId() <<std::endl;
        continue;
      }

      compareTransform(gp, matrix);

      const float* shape = fwGeometry_.getShapePars(detId.rawId());

      if ( ! shape )
      {
        std::cout<<"Failed to get shape of CSC chamber with detid: "
                 << detId.rawId() <<std::endl;
        continue;
      }
      
      compareShape(chamber, shape);
    }
  }

  makeHistograms(detname);
}
void ValidateGeometry::validateCSCLayerGeometry ( const int  endcap,
const char *  detname 
) [private]

Definition at line 553 of file ValidateGeometry.cc.

References RadialStripTopology::angularWidth(), RadialStripTopology::centreToIntersection(), clearData(), compareShape(), compareTransform(), gather_cfg::cout, cscGeometry_, Reference_intrackfit_cff::endcap, CSCDetId::endcap(), fwGeometry_, GeomDet::geographicalId(), CSCLayer::geometry(), FWGeometry::getMatrix(), FWGeometry::getParameters(), FWGeometry::getShapePars(), CSCLayer::id(), CSCLayerGeometry::localCenterOfWireGroup(), makeHistogram(), makeHistograms(), CSCLayerGeometry::numberOfStrips(), CSCLayerGeometry::numberOfWireGroups(), Parameters::parameters, RadialStripTopology::phiOfOneEdge(), DetId::rawId(), CSCDetId::ring(), relativeConstraints::ring, relativeConstraints::station, CSCDetId::station(), OffsetRadialStripTopology::stripOffset(), GeomDet::surface(), funct::tan(), Surface::toGlobal(), CSCLayerGeometry::topology(), CSCWireTopology::wireAngle(), CSCWireTopology::wireSpacing(), CSCLayerGeometry::wireTopology(), CSCLayerGeometry::xOfStrip(), PV3DBase< T, PVType, FrameType >::y(), RadialStripTopology::yAxisOrientation(), and RadialStripTopology::yCentreOfStripPlane().

Referenced by analyze().

{
  clearData();
  std::vector<double> strip_positions;
  std::vector<double> wire_positions;

  std::vector<double> me11_wiresLocal;
  std::vector<double> me12_wiresLocal;
  std::vector<double> me13_wiresLocal;
  std::vector<double> me14_wiresLocal;
  std::vector<double> me21_wiresLocal;
  std::vector<double> me22_wiresLocal;
  std::vector<double> me31_wiresLocal;
  std::vector<double> me32_wiresLocal;
  std::vector<double> me41_wiresLocal;
  std::vector<double> me42_wiresLocal;
  
  std::vector<CSCLayer*> layers = cscGeometry_->layers();
     
  for ( std::vector<CSCLayer*>::const_iterator it = layers.begin(), 
                                            itEnd = layers.end(); 
        it != itEnd; ++it )
  {
    const CSCLayer* layer = *it;
         
    if ( layer && layer->id().endcap() == endcap )
    {
      DetId detId = layer->geographicalId();
      GlobalPoint gp = layer->surface().toGlobal(LocalPoint(0.0,0.0,0.0));
      
      const TGeoMatrix* matrix = fwGeometry_.getMatrix(detId.rawId());
  
      if ( ! matrix ) 
      {     
        std::cout<<"Failed to get matrix of CSC layer with detid: " 
                 << detId.rawId() <<std::endl;
        continue;
      }

      compareTransform(gp, matrix);
      
      const float* shape = fwGeometry_.getShapePars(detId.rawId());

      if ( ! shape )
      {
        std::cout<<"Failed to get shape of CSC layer with detid: "
                 << detId.rawId() <<std::endl;
        continue;
      }
      
      compareShape(layer, shape);

      double length;
 
      if ( shape[0] == 1 )
      {
        length = shape[4];
      }
       
      else
      {      
        std::cout<<"Failed to get trapezoid from shape for CSC layer with detid: "
                 << detId.rawId() <<std::endl;
        continue;
      }

      const float* parameters = fwGeometry_.getParameters(detId.rawId());

      if ( parameters == 0 )
      {
        std::cout<<"Parameters empty for CSC layer with detid: "
                 << detId.rawId() <<std::endl;
        continue;
      }

      int yAxisOrientation = layer->geometry()->topology()->yAxisOrientation();
      assert(yAxisOrientation == parameters[0]);
     
      float centreToIntersection = layer->geometry()->topology()->centreToIntersection();
      assert(centreToIntersection == parameters[1]);

      float yCentre = layer->geometry()->topology()->yCentreOfStripPlane();
      assert(yCentre == parameters[2]);

      float phiOfOneEdge = layer->geometry()->topology()->phiOfOneEdge();
      assert(phiOfOneEdge == parameters[3]);

      float stripOffset = layer->geometry()->topology()->stripOffset();
      assert(stripOffset == parameters[4]);

      float angularWidth = layer->geometry()->topology()->angularWidth();
      assert(angularWidth == parameters[5]);

      for ( int nStrip = 1; nStrip <= layer->geometry()->numberOfStrips(); 
            ++nStrip )
      {
        float xOfStrip1 = layer->geometry()->xOfStrip(nStrip);
      
        double stripAngle = phiOfOneEdge + yAxisOrientation*(nStrip-(0.5-stripOffset))*angularWidth;
        double xOfStrip2 = yAxisOrientation*(centreToIntersection-yCentre)*tan(stripAngle);

        strip_positions.push_back(xOfStrip1-xOfStrip2);
      }

      int station = layer->id().station();
      int ring    = layer->id().ring();

      double wireSpacingInGroup = layer->geometry()->wireTopology()->wireSpacing();
      assert(wireSpacingInGroup == parameters[6]);

      double wireSpacing = 0.0;
      // we calculate an average wire group 
      // spacing from radialExtentOfTheWirePlane / numOfWireGroups
      
      double extentOfWirePlane = 0.0;

      if ( ring == 2 )
      {
        if ( station == 1 )
          extentOfWirePlane = 174.81; //wireSpacing = 174.81/64;
        else
          extentOfWirePlane = 323.38; //wireSpacing = 323.38/64;
      }
      else if ( station == 1 && (ring == 1 || ring == 4))
        extentOfWirePlane = 150.5; //wireSpacing = 150.5/48;
      else if ( station == 1 && ring == 3 )
        extentOfWirePlane = 164.47; //wireSpacing = 164.47/32;
      else if ( station == 2 && ring == 1 )
        extentOfWirePlane = 189.97; //wireSpacing = 189.97/112;
      else if ( station == 3 && ring == 1 )
        extentOfWirePlane = 170.01; //wireSpacing = 170.01/96;
      else if ( station == 4 && ring == 1 )
        extentOfWirePlane = 149.73; //wireSpacing = 149.73/96;

      float wireAngle = layer->geometry()->wireTopology()->wireAngle();
      assert(wireAngle == parameters[7]);

      //float cosWireAngle = cos(wireAngle);

      /* NOTE
         Some parameters don't seem available in a public interface
         so have to perhaps hard-code. This may not be too bad as there
         seems to be a lot of degeneracy. 
      */

      double alignmentPinToFirstWire;
      double yAlignmentFrame = 3.49;
   
      if ( station == 1 ) 
      { 
        if ( ring == 1 || ring == 4 )
        {
          alignmentPinToFirstWire = 1.065;
          yAlignmentFrame = 0.0;
        }
        
        else // ME12, ME 13 
          alignmentPinToFirstWire = 2.85;
      }

      else if ( station == 4 && ring == 1 )
        alignmentPinToFirstWire = 3.04;
      
      else if ( station == 3 && ring == 1 )
        alignmentPinToFirstWire =  2.84;
      
      else  // ME21, ME22, ME32, ME42 
        alignmentPinToFirstWire = 2.87;
       
      double yOfFirstWire = (yAlignmentFrame-length) + alignmentPinToFirstWire;

      int nWireGroups = layer->geometry()->numberOfWireGroups();
      double E = extentOfWirePlane/nWireGroups;

      for ( int nWireGroup = 1; nWireGroup <= nWireGroups; ++nWireGroup )
      {         
        LocalPoint centerOfWireGroup = layer->geometry()->localCenterOfWireGroup(nWireGroup); 
        double yOfWire1 = centerOfWireGroup.y(); 

        //double yOfWire2 = (-0.5 - (nWireGroups*0.5 - 1) + (nWireGroup-1))*E; 
        //yOfWire2 += 0.5*E;
        double yOfWire2 = yOfFirstWire + ((nWireGroup-1)*E);
        yOfWire2 += wireSpacing*0.5;

        double ydiff_local = yOfWire1 - yOfWire2; 
        wire_positions.push_back(ydiff_local);

        GlobalPoint globalPoint = layer->surface().toGlobal(LocalPoint(0.0,yOfWire1,0.0));

        /*
        float fwLocalPoint[3] = 
        {
          0.0, yOfWire2, 0.0
        };
        
        float fwGlobalPoint[3]; 
        fwGeometry_.localToGlobal(detId.rawId(), fwLocalPoint, fwGlobalPoint);
        double ydiff_global = globalPoint.y() - fwGlobalPoint[1]; 
        */

        if ( station == 1 )
        {
          if ( ring == 1 )
          {
            me11_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 2 )
          {
            me12_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 3 )
          {
            me13_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 4 )
          {
            me14_wiresLocal.push_back(ydiff_local);
          }
        }
        else if ( station == 2 ) 
        {
          if ( ring == 1 )
          {
            me21_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 2 )
          {
            me22_wiresLocal.push_back(ydiff_local);
          }
        }
        else if ( station == 3 )
        {
          if ( ring == 1 )
          {
            me31_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 2 )
          {
            me32_wiresLocal.push_back(ydiff_local);
          }
        }
        else if ( station == 4 )
        {
          if ( ring == 1 )
          {
            me41_wiresLocal.push_back(ydiff_local);
          }
          else if ( ring == 2 )
          {
            me42_wiresLocal.push_back(ydiff_local);
          }
        }
      } 
    }
  }
  
  std::string hn(detname);
  makeHistogram(hn+": xOfStrip", strip_positions);

  makeHistogram(hn+": local yOfWire", wire_positions);
  
  makeHistogram("ME11: local yOfWire", me11_wiresLocal);
  makeHistogram("ME12: local yOfWire", me12_wiresLocal);
  makeHistogram("ME13: local yOfWire", me13_wiresLocal);
  makeHistogram("ME14: local yOfWire", me14_wiresLocal);
  makeHistogram("ME21: local yOfWire", me21_wiresLocal);
  makeHistogram("ME22: local yOfWire", me22_wiresLocal);
  makeHistogram("ME31: local yOfWire", me31_wiresLocal);
  makeHistogram("ME32: local yOfWire", me32_wiresLocal);
  makeHistogram("ME41: local yOfWire", me41_wiresLocal);
  makeHistogram("ME42: local yOfWire", me42_wiresLocal);

  makeHistograms(detname);
}
void ValidateGeometry::validateDTChamberGeometry ( ) [private]

Definition at line 375 of file ValidateGeometry.cc.

References chambers, clearData(), compareShape(), compareTransform(), gather_cfg::cout, dtGeometry_, fwGeometry_, FWGeometry::getMatrix(), FWGeometry::getShapePars(), DTChamber::id(), makeHistograms(), DetId::rawId(), GeomDet::surface(), and Surface::toGlobal().

Referenced by analyze().

{
  clearData();

  std::vector<DTChamber*> chambers = dtGeometry_->chambers();
  
  for ( std::vector<DTChamber*>::const_iterator it = chambers.begin(), 
                                             itEnd = chambers.end(); 
        it != itEnd; ++it)
  {
    const DTChamber* chamber = *it;
      
    if ( chamber )
    {
      DTChamberId chId = chamber->id();
      GlobalPoint gp = chamber->surface().toGlobal(LocalPoint(0.0, 0.0, 0.0)); 
     
      const TGeoMatrix* matrix = fwGeometry_.getMatrix(chId.rawId());
 
      if ( ! matrix )   
      {     
        std::cout<<"Failed to get matrix of DT chamber with detid: " 
                 << chId.rawId() <<std::endl;
        continue;
      }

      compareTransform(gp, matrix);

      const float* shape = fwGeometry_.getShapePars(chId.rawId());

      if ( ! shape )
      {
        std::cout<<"Failed to get shape of DT chamber with detid: "
                 << chId.rawId() <<std::endl;
        continue;
      }
      
      compareShape(chamber, shape);
    }
  }

  makeHistograms("DT chamber");
}
void ValidateGeometry::validateDTLayerGeometry ( ) [private]

Definition at line 421 of file ValidateGeometry.cc.

References BoundSurface::bounds(), clearData(), compareShape(), compareTransform(), gather_cfg::cout, dtGeometry_, DTTopology::firstChannel(), fwGeometry_, FWGeometry::getMatrix(), FWGeometry::getParameters(), FWGeometry::getShapePars(), DTLayer::id(), DTTopology::lastChannel(), Bounds::length(), makeHistogram(), makeHistograms(), Parameters::parameters, DetId::rawId(), DTLayer::specificTopology(), GeomDet::surface(), Bounds::thickness(), Surface::toGlobal(), tablePrinter::width, Bounds::width(), and DTTopology::wirePosition().

Referenced by analyze().

{
  clearData();
  
  std::vector<double> wire_positions;

  std::vector<DTLayer*> layers = dtGeometry_->layers();
  
  for ( std::vector<DTLayer*>::const_iterator it = layers.begin(), 
                                           itEnd = layers.end(); 
        it != itEnd; ++it)
  {
    const DTLayer* layer = *it;
      
    if ( layer )
    {
      DTLayerId layerId = layer->id();
      GlobalPoint gp = layer->surface().toGlobal(LocalPoint(0.0, 0.0, 0.0)); 
     
      const TGeoMatrix* matrix = fwGeometry_.getMatrix(layerId.rawId());
 
      if ( ! matrix )   
      {     
        std::cout<<"Failed to get matrix of DT layer with detid: " 
                 << layerId.rawId() <<std::endl;
        continue;
      }

      compareTransform(gp, matrix);

      const float* shape = fwGeometry_.getShapePars(layerId.rawId());

      if ( ! shape )
      {
        std::cout<<"Failed to get shape of DT layer with detid: "
                 << layerId.rawId() <<std::endl;
        continue;
      }
      
      compareShape(layer, shape);

        
      const float* parameters = fwGeometry_.getParameters(layerId.rawId());
      
      if ( parameters == 0 )
      {
        std::cout<<"Parameters empty for DT layer with detid: " 
                 << layerId.rawId() <<std::endl;
        continue;
      }
           
      float width = layer->surface().bounds().width();
      assert(width == parameters[6]); 

      float thickness = layer->surface().bounds().thickness();
      assert(thickness == parameters[7]);

      float length = layer->surface().bounds().length();
      assert(length == parameters[8]);

      int firstChannel = layer->specificTopology().firstChannel();
      assert(firstChannel == parameters[3]);

      int lastChannel  = layer->specificTopology().lastChannel();
      int nChannels = parameters[5];
      assert(nChannels == (lastChannel-firstChannel)+1);

      for ( int wireN = firstChannel; wireN <= lastChannel; ++wireN )
      {
        double localX1 = layer->specificTopology().wirePosition(wireN);
        double localX2 = (wireN -(firstChannel-1)-0.5)*parameters[0] - nChannels/2.0*parameters[0];

        wire_positions.push_back(localX1-localX2);

        //std::cout<<"wireN, localXpos: "<< wireN <<" "<< localX1 <<" "<< localX2 <<std::endl;

      }
    }
  }

  makeHistogram("DT layer wire localX", wire_positions);

  makeHistograms("DT layer");
}
void ValidateGeometry::validatePixelTopology ( const TrackerGeometry::DetContainer dets,
const char *  detname 
) [private]

Definition at line 956 of file ValidateGeometry.cc.

References gather_cfg::cout, fwGeometry_, FWGeometry::getParameters(), makeHistogram(), Parameters::parameters, fireworks::pixelLocalX(), fireworks::pixelLocalY(), trackerGeometry_, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by analyze().

{
  std::vector<double> pixelLocalXs;
  std::vector<double> pixelLocalYs;

  for ( TrackerGeometry::DetContainer::const_iterator it = dets.begin(),
                                                   itEnd = dets.end();
        it != itEnd; ++it )
  {
    unsigned int rawId = (*it)->geographicalId().rawId();

    const float* parameters = fwGeometry_.getParameters(rawId);

    if ( parameters == 0 )
    {
      std::cout<<"Parameters empty for "<< detname <<" element with detid: "
               << rawId <<std::endl;
      continue;
    }

    if ( const PixelGeomDetUnit* det = 
         dynamic_cast<const PixelGeomDetUnit*>(trackerGeometry_->idToDetUnit((*it)->geographicalId())) )
    {           
      if ( const PixelTopology* rpt = &det->specificTopology() )
      { 
        int nrows = rpt->nrows();
        int ncolumns = rpt->ncolumns();
        
        assert(parameters[0] == nrows);
        assert(parameters[1] == ncolumns);
        
        for ( int row = 1; row <= nrows; ++row )
        {
          for ( int column = 1; column <= ncolumns; ++column )
          {
            LocalPoint localPoint = rpt->localPosition(MeasurementPoint(row, column));

            pixelLocalXs.push_back(localPoint.x() - fireworks::pixelLocalX(row, nrows));
            pixelLocalYs.push_back(localPoint.y() - fireworks::pixelLocalY(column, ncolumns));
           }
        }
      }
       
      else
        std::cout<<"No topology for "<< detname <<" "<< rawId <<std::endl; 
    }

    else
      std::cout<<"No geomDetUnit for "<< detname <<" "<< rawId <<std::endl;
  }

  std::string hn(detname);
  makeHistogram(hn+" pixelLocalX", pixelLocalXs);
  makeHistogram(hn+" pixelLocalY", pixelLocalYs);
}
void ValidateGeometry::validateRPCGeometry ( const int  regionNumber,
const char *  regionName 
) [private]

Definition at line 287 of file ValidateGeometry.cc.

References RPCRoll::centreOfStrip(), clearData(), compareShape(), compareTransform(), gather_cfg::cout, fwGeometry_, FWGeometry::getMatrix(), FWGeometry::getParameters(), FWGeometry::getShapePars(), RPCRoll::id(), makeHistogram(), makeHistograms(), RPCRoll::nstrips(), evf::evtn::offset(), Parameters::parameters, StripTopology::pitch(), DetId::rawId(), RPCDetId::region(), rpcGeometry_, RPCRoll::specificTopology(), strip(), StripTopology::stripLength(), GeomDet::surface(), Surface::toGlobal(), and PV3DBase< T, PVType, FrameType >::x().

Referenced by analyze().

{
  clearData();
 
  std::vector<double> centers;
 
  std::vector<RPCRoll*> rolls = rpcGeometry_->rolls();
  
  for ( std::vector<RPCRoll*>::const_iterator it = rolls.begin(), 
                                           itEnd = rolls.end();
        it != itEnd; ++it )
  {
    const RPCRoll* roll = *it;

    if ( roll )
    {
      RPCDetId rpcDetId = roll->id();

      if ( rpcDetId.region() == regionNumber )
      {  
        const GeomDetUnit* det = rpcGeometry_->idToDetUnit(rpcDetId);
        GlobalPoint gp = det->surface().toGlobal(LocalPoint(0.0, 0.0, 0.0)); 
      
        const TGeoMatrix* matrix = fwGeometry_.getMatrix(rpcDetId.rawId());

        if ( ! matrix )
        {
          std::cout<<"Failed to get matrix of RPC with detid: "
                   << rpcDetId.rawId() <<std::endl;
          continue;
        }

        compareTransform(gp, matrix);

        const float* shape = fwGeometry_.getShapePars(rpcDetId.rawId());

        if ( ! shape )
        {
          std::cout<<"Failed to get shape of RPC with detid: "
                   << rpcDetId.rawId() <<std::endl;
          continue;
        }
      
        compareShape(det, shape);

        const float* parameters = fwGeometry_.getParameters(rpcDetId.rawId());

        if ( parameters == 0 )
        {
          std::cout<<"Parameters empty for RPC with detid: "
                   << rpcDetId.rawId() <<std::endl;
          continue;
        }
              
        // Yes, I know that below I'm comparing the equivalence
        // of floating point numbers
       
        int nStrips = roll->nstrips();
        assert(nStrips == parameters[0]); 
        
        float stripLength = roll->specificTopology().stripLength();
        assert(stripLength == parameters[1]);

        float pitch = roll->specificTopology().pitch();
        assert(pitch == parameters[2]);

        float offset = -0.5*nStrips*pitch;

        for ( int strip = 1; strip <= roll->nstrips(); ++strip )
        {
          LocalPoint centreOfStrip1 = roll->centreOfStrip(strip);        
          LocalPoint centreOfStrip2 = LocalPoint((strip-0.5)*pitch + offset, 0.0);

          centers.push_back(centreOfStrip1.x()-centreOfStrip2.x());
        }      
      }
    }
  }

  std::string hn(regionName);
  makeHistogram(hn+": centreOfStrip", centers);
 

  makeHistograms(regionName);
}
void ValidateGeometry::validateStripTopology ( const TrackerGeometry::DetContainer dets,
const char *  detname 
) [private]

Definition at line 1014 of file ValidateGeometry.cc.

References gather_cfg::cout, fwGeometry_, FWGeometry::getParameters(), StripTopology::localPosition(), makeHistogram(), StripTopology::nstrips(), Parameters::parameters, StripTopology::pitch(), strip(), StripTopology::stripLength(), funct::tan(), trackerGeometry_, and PV3DBase< T, PVType, FrameType >::x().

Referenced by analyze().

{
  std::vector<double> radialStripLocalXs;
  std::vector<double> rectangularStripLocalXs;

  for ( TrackerGeometry::DetContainer::const_iterator it = dets.begin(),
                                                   itEnd = dets.end();
        it != itEnd; ++it )
  {
    unsigned int rawId = (*it)->geographicalId().rawId();
    
    const float* parameters = fwGeometry_.getParameters(rawId);

    if ( parameters == 0 )
    {    
      std::cout<<"Parameters empty for "<< detname <<" element with detid: "
               << rawId <<std::endl;
      continue;
    }

    if ( const StripGeomDetUnit* det = 
         dynamic_cast<const StripGeomDetUnit*>(trackerGeometry_->idToDet((*it)->geographicalId())) )
      {
      // NOTE: why the difference in dets vs. units between these and pixels? The dynamic cast above 
      // fails for many of the detids...
      
      const StripTopology* st = dynamic_cast<const StripTopology*>(&det->specificTopology()); 
      
      if ( st ) 
      {
        //assert(parameters[0] == 0);
        int nstrips = st->nstrips();
        assert(parameters[1] == nstrips);                             
        assert(parameters[2] == st->stripLength());
        
        if( const RadialStripTopology* rst = dynamic_cast<const RadialStripTopology*>(&(det->specificType().specificTopology())) ) 
        {
          assert(parameters[0] == 1);
          assert(parameters[3] == rst->yAxisOrientation());
          assert(parameters[4] == rst->originToIntersection());
          assert(parameters[5] == rst->phiOfOneEdge());
          assert(parameters[6] == rst->angularWidth());

          for ( uint16_t strip = 1; strip <= nstrips; ++strip )
          {
            float stripAngle1 = rst->stripAngle(strip);
            float stripAngle2 = parameters[5] + parameters[3]*strip*parameters[6];
          
            assert((stripAngle1-stripAngle2) == 0); 
            
            LocalPoint stripPosition = st->localPosition(strip);
            
            float stripX = parameters[3]*parameters[4]*tan(stripAngle2);
            radialStripLocalXs.push_back(stripPosition.x()-stripX);
          }
        }
         
        else if( dynamic_cast<const RectangularStripTopology*>(&(det->specificType().specificTopology())) )
        {
          assert(parameters[0] == 2);
          assert(parameters[3] == st->pitch());

          for ( uint16_t strip = 1; strip <= nstrips; ++strip )
          {
            LocalPoint stripPosition = st->localPosition(strip);
            float stripX = -parameters[1]*0.5*parameters[3];
            stripX += strip*parameters[3];
            rectangularStripLocalXs.push_back(stripPosition.x()-stripX);
          }
        }
        
        else if( dynamic_cast<const TrapezoidalStripTopology*>(&(det->specificType().specificTopology())) )
        {
          assert(parameters[0] == 3); 
          assert(parameters[3] == st->pitch());                               
        }
        
        else
          std::cout<<"Failed to get pitch for "<< detname <<" "<< rawId <<std::endl;
      }
      
      else
        std::cout<<"Failed cast to StripTopology for "<< detname <<" "<< rawId <<std::endl;
    }
    
    //else
    //  std::cout<<"Failed cast to StripGeomDetUnit for "<< detname <<" "<< rawId <<std::endl;
  }

  std::string hn(detname);
  makeHistogram(hn+" radial strip localX", radialStripLocalXs);
  makeHistogram(hn+" rectangular strip localX", rectangularStripLocalXs);
}
void ValidateGeometry::validateTrackerGeometry ( const TrackerGeometry::DetUnitContainer dets,
const char *  detname 
) [private]

Definition at line 916 of file ValidateGeometry.cc.

References clearData(), compareShape(), compareTransform(), gather_cfg::cout, fwGeometry_, FWGeometry::getMatrix(), FWGeometry::getShapePars(), makeHistograms(), and trackerGeometry_.

{
  clearData();

  for ( TrackerGeometry::DetUnitContainer::const_iterator it = dets.begin(), 
                                                       itEnd = dets.end(); 
        it != itEnd; ++it )
  {
    GlobalPoint gp = (trackerGeometry_->idToDet((*it)->geographicalId()))->surface().toGlobal(LocalPoint(0.0,0.0,0.0));
    unsigned int rawId = (*it)->geographicalId().rawId();

    const TGeoMatrix* matrix = fwGeometry_.getMatrix(rawId);

    if ( ! matrix )
    {
      std::cout<< "Failed to get matrix of "<< detname 
               <<" element with detid: "<< rawId <<std::endl;
      continue;
    }

    compareTransform(gp, matrix);


    const float* shape = fwGeometry_.getShapePars(rawId);

    if ( ! shape )
    {
      std::cout<<"Failed to get shape of "<< detname 
               <<" element with detid: "<< rawId <<std::endl;
      continue;
    }

    compareShape(*it, shape);
  }
  
  makeHistograms(detname);
}
void ValidateGeometry::validateTrackerGeometry ( const TrackerGeometry::DetContainer dets,
const char *  detname 
) [private]

Definition at line 876 of file ValidateGeometry.cc.

References clearData(), compareShape(), compareTransform(), gather_cfg::cout, fwGeometry_, FWGeometry::getMatrix(), FWGeometry::getShapePars(), makeHistograms(), and trackerGeometry_.

Referenced by analyze().

{
  clearData();

  for ( TrackerGeometry::DetContainer::const_iterator it = dets.begin(), 
                                                   itEnd = dets.end(); 
        it != itEnd; ++it )
  {
    GlobalPoint gp = (trackerGeometry_->idToDet((*it)->geographicalId()))->surface().toGlobal(LocalPoint(0.0,0.0,0.0));
    unsigned int rawId = (*it)->geographicalId().rawId();

    const TGeoMatrix* matrix = fwGeometry_.getMatrix(rawId);

    if ( ! matrix )
    {
      std::cout <<"Failed to get matrix of "<< detname 
                <<" element with detid: "<< rawId <<std::endl;
      continue;
    }

    compareTransform(gp, matrix);

    const float* shape = fwGeometry_.getShapePars(rawId);

    if ( ! shape )
    {
      std::cout<<"Failed to get shape of "<< detname 
               <<" element with detid: "<< rawId <<std::endl;
      continue;
    }

    compareShape(*it, shape);
  }
  
  makeHistograms(detname);
}

Member Data Documentation

std::vector<double> ValidateGeometry::bottomWidths_ [private]

Definition at line 125 of file ValidateGeometry.cc.

Referenced by clearData(), compareShape(), dataEmpty(), and makeHistograms().

Definition at line 116 of file ValidateGeometry.cc.

Referenced by analyze(), and validateCaloGeometry().

std::vector<double> ValidateGeometry::globalDistances_ [private]
std::string ValidateGeometry::infileName_ [private]

Definition at line 110 of file ValidateGeometry.cc.

Referenced by ValidateGeometry().

std::vector<double> ValidateGeometry::lengths_ [private]

Definition at line 126 of file ValidateGeometry.cc.

Referenced by clearData(), compareShape(), dataEmpty(), and makeHistograms().

TFile* ValidateGeometry::outFile_ [private]

Definition at line 121 of file ValidateGeometry.cc.

Referenced by beginJob(), endJob(), makeHistograms(), and ValidateGeometry().

std::string ValidateGeometry::outfileName_ [private]

Definition at line 111 of file ValidateGeometry.cc.

Referenced by endJob(), and ValidateGeometry().

Definition at line 113 of file ValidateGeometry.cc.

Referenced by analyze(), and validateRPCGeometry().

std::vector<double> ValidateGeometry::thicknesses_ [private]

Definition at line 127 of file ValidateGeometry.cc.

Referenced by clearData(), compareShape(), dataEmpty(), and makeHistograms().

std::vector<double> ValidateGeometry::topWidths_ [private]

Definition at line 124 of file ValidateGeometry.cc.

Referenced by clearData(), compareShape(), dataEmpty(), and makeHistograms().