CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes

DTOccupancyClusterBuilder Class Reference

#include <DTOccupancyClusterBuilder.h>

List of all members.

Public Member Functions

void addPoint (const DTOccupancyPoint &point)
 Add an occupancy point for a given layer.
void buildClusters ()
 build the clusters
void drawClusters (std::string canvasName)
 draw a TH2F histograms showing the clusters
 DTOccupancyClusterBuilder ()
 Constructor.
DTOccupancyCluster getBestCluster () const
 get the cluster correspondig to "normal" cell occupancy.
bool isProblematic (DTLayerId layerId) const
virtual ~DTOccupancyClusterBuilder ()
 Destructor.

Private Member Functions

bool buildNewCluster ()
void computeDistancesToCluster (const DTOccupancyCluster &cluster)
void computePointToPointDistances ()
std::pair< DTOccupancyPoint,
DTOccupancyPoint
getInitialPair ()
void sortClusters ()

Private Attributes

double maxMean
double maxRMS
std::vector< DTOccupancyClustertheClusters
std::map< double, std::pair
< DTOccupancyPoint,
DTOccupancyPoint > > 
theDistances
std::map< double,
DTOccupancyPoint
theDistancesFromTheCluster
std::set< DTOccupancyPointthePoints
std::set< DTLayerIdtheProblematicLayers

Detailed Description

Build clusters of layer occupancies (DTOccupancyCluster) to spot problematic layers. It's used by DTOccupancyTest.

Date:
2008/10/16 09:33:39
Revision:
1.3
Author:
G. Cerminara - INFN Torino

Definition at line 22 of file DTOccupancyClusterBuilder.h.


Constructor & Destructor Documentation

DTOccupancyClusterBuilder::DTOccupancyClusterBuilder ( )

Constructor.

Definition at line 23 of file DTOccupancyClusterBuilder.cc.

                                                       : maxMean(-1.),
                                                           maxRMS(-1.) {
}
DTOccupancyClusterBuilder::~DTOccupancyClusterBuilder ( ) [virtual]

Destructor.

Definition at line 27 of file DTOccupancyClusterBuilder.cc.

{}

Member Function Documentation

void DTOccupancyClusterBuilder::addPoint ( const DTOccupancyPoint point)

Add an occupancy point for a given layer.

Definition at line 31 of file DTOccupancyClusterBuilder.cc.

References theDistances, and thePoints.

Referenced by DTOccupancyTest::runOccupancyTest().

                                                                      {
  // loop over points already stored
  for(set<DTOccupancyPoint>::const_iterator pt = thePoints.begin(); pt != thePoints.end(); ++pt) {
    theDistances[(*pt).distance(point)] = make_pair(*pt, point);
  }
  //   cout << "[DTOccupancyClusterBuilder] Add point with mean: " << point.mean()
  //        << " RMS: " << point.rms() << endl;
  thePoints.insert(point);
}
void DTOccupancyClusterBuilder::buildClusters ( )

build the clusters

Definition at line 42 of file DTOccupancyClusterBuilder.cc.

References buildNewCluster(), LogTrace, DTOccupancyCluster::maxMean(), maxMean, DTOccupancyCluster::maxRMS(), maxRMS, sortClusters(), theClusters, and thePoints.

Referenced by DTOccupancyTest::runOccupancyTest().

                                              {
  //   cout << "[DTOccupancyClusterBuilder] buildClusters" << endl;
  while(buildNewCluster()) {
    //     cout << "New cluster builded" << endl;
    //     cout << "# of remaining points: " << thePoints.size() << endl;
    if(thePoints.size() <= 1) break;
  }
    
  // build single point clusters with the remaining points
  for(set<DTOccupancyPoint>::const_iterator pt = thePoints.begin(); pt != thePoints.end();
      ++pt) {
    DTOccupancyCluster clusterCandidate(*pt);
    theClusters.push_back(clusterCandidate);
    // store the range for building the histograms later
    if(clusterCandidate.maxMean() > maxMean) maxMean = clusterCandidate.maxMean();
    if(clusterCandidate.maxRMS() > maxRMS) maxRMS = clusterCandidate.maxRMS();
  }
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
    << " # of valid clusters: " << theClusters.size() << endl;
  sortClusters();
  
}
bool DTOccupancyClusterBuilder::buildNewCluster ( ) [private]

Definition at line 118 of file DTOccupancyClusterBuilder.cc.

References DTOccupancyCluster::addPoint(), DTOccupancyCluster::averageMean(), DTOccupancyCluster::averageRMS(), computeDistancesToCluster(), computePointToPointDistances(), getInitialPair(), DTOccupancyCluster::isValid(), LogTrace, DTOccupancyCluster::maxMean(), maxMean, DTOccupancyCluster::maxRMS(), maxRMS, DTOccupancyCluster::nPoints(), theClusters, theDistancesFromTheCluster, and thePoints.

Referenced by buildClusters().

                                                {
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
    << "--------- New Cluster Candidate ----------------------" << endl;
  pair<DTOccupancyPoint, DTOccupancyPoint> initialPair = getInitialPair();
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
    << "   Initial Pair: " << endl
    << "           point1: mean " << initialPair.first.mean()
    << " rms " << initialPair.first.rms() << endl
    << "           point2: mean " << initialPair.second.mean()
    << " rms " << initialPair.second.rms() << endl;
  DTOccupancyCluster clusterCandidate(initialPair.first, initialPair.second);
  if(clusterCandidate.isValid()) {
    //     cout <<   " cluster candidate is valid" << endl;
    // remove already used pair
    thePoints.erase(initialPair.first);
    thePoints.erase(initialPair.second);
    if(thePoints.size() != 0) {
      computeDistancesToCluster(clusterCandidate);
      while(clusterCandidate.addPoint(theDistancesFromTheCluster.begin()->second)) {
        thePoints.erase(theDistancesFromTheCluster.begin()->second);
        if(thePoints.size() ==0) break;
        computeDistancesToCluster(clusterCandidate);
      }
    }
  } else {
    return false;
  }
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
    << "   # of layers: " << clusterCandidate.nPoints()
    << " avrg. mean: " << clusterCandidate.averageMean() << " avrg. rms: " << clusterCandidate.averageRMS() << endl;
  theClusters.push_back(clusterCandidate);
  // store the range for building the histograms later
  if(clusterCandidate.maxMean() > maxMean) maxMean = clusterCandidate.maxMean();
  if(clusterCandidate.maxRMS() > maxRMS) maxRMS = clusterCandidate.maxRMS();
  computePointToPointDistances();
  return true;
}
void DTOccupancyClusterBuilder::computeDistancesToCluster ( const DTOccupancyCluster cluster) [private]

Definition at line 110 of file DTOccupancyClusterBuilder.cc.

References DTOccupancyCluster::distance(), theDistancesFromTheCluster, and thePoints.

Referenced by buildNewCluster().

                                                                                           {
  theDistancesFromTheCluster.clear();
  for(set<DTOccupancyPoint>::const_iterator pt = thePoints.begin(); pt != thePoints.end(); ++pt) {
    theDistancesFromTheCluster[cluster.distance(*pt)] = *pt;
  }
}
void DTOccupancyClusterBuilder::computePointToPointDistances ( ) [private]

Definition at line 95 of file DTOccupancyClusterBuilder.cc.

References theDistances, and thePoints.

Referenced by buildNewCluster().

                                                             {
  theDistances.clear();
  for(set<DTOccupancyPoint>::const_iterator pt_i = thePoints.begin(); pt_i != thePoints.end();
      ++pt_i) { // i loopo
    for(set<DTOccupancyPoint>::const_iterator pt_j = thePoints.begin(); pt_j != thePoints.end();
        ++pt_j) { // j loop
      if(*pt_i != *pt_j) {
        theDistances[pt_i->distance(*pt_j)] = make_pair(*pt_i, *pt_j);
      }
    }
  }
}
void DTOccupancyClusterBuilder::drawClusters ( std::string  canvasName)

draw a TH2F histograms showing the clusters

Definition at line 66 of file DTOccupancyClusterBuilder.cc.

References svgfig::canvas(), timingPdfMaker::histo, maxMean, maxRMS, and theClusters.

                                                                 {
  int nBinsX = 100;
  int nBinsY = 100;
  int colorMap[12] = {632, 600, 800, 400, 820, 416, 432, 880, 616, 860, 900, 920};

  //   cout << "Draw clusters: " << endl;
  //   cout << "    max mean: " << maxMean << " max rms: " << maxRMS << endl;

  TCanvas *canvas = new TCanvas(canvasName.c_str(),canvasName.c_str()); 
  canvas->cd();
  for(vector<DTOccupancyCluster>::const_iterator cluster = theClusters.begin();
      cluster != theClusters.end(); ++cluster) {
    stringstream stream;
    stream << canvasName << "_" << cluster-theClusters.begin();
    string histoName = stream.str();
    TH2F *histo = (*cluster).getHisto(histoName, nBinsX, 0, maxMean+3*maxMean/100.,
                                      nBinsY, 0, maxRMS+3*maxRMS/100., colorMap[cluster-theClusters.begin()]);
    if(cluster == theClusters.begin()) 
      histo->Draw("box");
    else
      histo->Draw("box,same");
  }
}
DTOccupancyCluster DTOccupancyClusterBuilder::getBestCluster ( ) const

get the cluster correspondig to "normal" cell occupancy.

Definition at line 174 of file DTOccupancyClusterBuilder.cc.

References theClusters.

Referenced by DTOccupancyTest::runOccupancyTest().

                                                                   {
  return theClusters.front();
}
std::pair< DTOccupancyPoint, DTOccupancyPoint > DTOccupancyClusterBuilder::getInitialPair ( ) [private]

Definition at line 91 of file DTOccupancyClusterBuilder.cc.

References theDistances.

Referenced by buildNewCluster().

                                                                                      {
  return theDistances.begin()->second;
}
bool DTOccupancyClusterBuilder::isProblematic ( DTLayerId  layerId) const

Definition at line 178 of file DTOccupancyClusterBuilder.cc.

References theProblematicLayers.

Referenced by DTOccupancyTest::runOccupancyTest().

                                                                     {
  if(theProblematicLayers.find(layerId) != theProblematicLayers.end()) {
    return true;
  }
  return false;
}
void DTOccupancyClusterBuilder::sortClusters ( ) [private]

Definition at line 158 of file DTOccupancyClusterBuilder.cc.

References clusterIsLessThan(), LogTrace, python::multivaluedict::sort(), theClusters, and theProblematicLayers.

Referenced by buildClusters().

                                             {
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder") << " sorting" << endl;
  sort(theClusters.begin(), theClusters.end(), clusterIsLessThan);
  // we save the detid of the clusters which are not the best one
  for(vector<DTOccupancyCluster>::const_iterator cluster = ++(theClusters.begin());
      cluster != theClusters.end(); ++cluster) { // loop over clusters skipping the first
    set<DTLayerId> clusterLayers = (*cluster).getLayerIDs();
    LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
      << "     # layers in the cluster: " << clusterLayers.size() << endl;
    theProblematicLayers.insert(clusterLayers.begin(), clusterLayers.end());
  }
  LogTrace("DTDQM|DTMonitorClient|DTOccupancyTest|DTOccupancyClusterBuilder")
    << " # of problematic layers: " << theProblematicLayers.size() << endl;
}

Member Data Documentation

Definition at line 64 of file DTOccupancyClusterBuilder.h.

Referenced by buildClusters(), buildNewCluster(), and drawClusters().

Definition at line 65 of file DTOccupancyClusterBuilder.h.

Referenced by buildClusters(), buildNewCluster(), and drawClusters().

Definition at line 60 of file DTOccupancyClusterBuilder.h.

Referenced by buildNewCluster(), and computeDistancesToCluster().

Definition at line 62 of file DTOccupancyClusterBuilder.h.

Referenced by isProblematic(), and sortClusters().