Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
// -*- C++ -*-
//
// Package:     SiStripChannelChargeFilter
// Class  :     ClusterMTCCFilter
//
//
// Original Author:  dkcira

#include "EventFilter/SiStripChannelChargeFilter/interface/ClusterMTCCFilter.h"
#include "DataFormats/Common/interface/Handle.h"
#include "DataFormats/Common/interface/DetSetVector.h"
#include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
#include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"

using namespace std;

namespace cms {

  ClusterMTCCFilter::ClusterMTCCFilter(const edm::ParameterSet& ps) {
    //
    ModulesToBeExcluded.clear();
    ModulesToBeExcluded = ps.getParameter<std::vector<unsigned>>("ModulesToBeExcluded");
    edm::LogInfo("ClusterMTCCFilter") << "Clusters from " << ModulesToBeExcluded.size()
                                      << " modules will be ignored in the filter:";
    for (std::vector<uint32_t>::const_iterator imod = ModulesToBeExcluded.begin(); imod != ModulesToBeExcluded.end();
         imod++) {
      edm::LogInfo("ClusterMTCCFilter") << *imod;
    }
    //
    ChargeThresholdTIB = ps.getParameter<int>("ChargeThresholdTIB");
    ChargeThresholdTOB = ps.getParameter<int>("ChargeThresholdTOB");
    ChargeThresholdTEC = ps.getParameter<int>("ChargeThresholdTEC");
    MinClustersDiffComponents = ps.getParameter<int>("MinClustersDiffComponents");
    clusterProducer = ps.getParameter<string>("ClusterProducer");
    tTopoToken_ = esConsumes();
    //
    produces<int>();
    produces<unsigned int>();
    produces<map<unsigned int, vector<SiStripCluster>>>();
  }

  bool ClusterMTCCFilter::filter(edm::Event& e, edm::EventSetup const& c) {
    const auto& tTopo = c.getData(tTopoToken_);

    //get SiStripCluster
    edm::Handle<edm::DetSetVector<SiStripCluster>> h;
    e.getByLabel(clusterProducer, h);

    //
    unsigned int sum_of_cluster_charges = 0;
    clusters_in_subcomponents.clear();
    // first find all clusters that are over the threshold
    for (edm::DetSetVector<SiStripCluster>::const_iterator it = h->begin(); it != h->end(); it++) {
      for (vector<SiStripCluster>::const_iterator vit = (it->data).begin(); vit != (it->data).end(); vit++) {
        // calculate sum of amplitudes
        unsigned int amplclus = 0;
        for (auto ia = vit->amplitudes().begin(); ia != vit->amplitudes().end(); ia++) {
          if ((*ia) > 0)
            amplclus += (*ia);  // why should this be negative?
        }
        sum_of_cluster_charges += amplclus;
        DetId thedetId = DetId(it->detId());
        unsigned int generalized_layer = 0;
        bool exclude_this_detid = false;
        for (std::vector<uint32_t>::const_iterator imod = ModulesToBeExcluded.begin();
             imod != ModulesToBeExcluded.end();
             imod++) {
          if (*imod == thedetId.rawId())
            exclude_this_detid = true;  // found in exclusion list
        }
        // apply different thresholds for TIB/TOB/TEC
        if (!exclude_this_detid) {  // only consider if not in exclusion list
          if ((thedetId.subdetId() == StripSubdetector::TIB && amplclus > ChargeThresholdTIB) ||
              (thedetId.subdetId() == StripSubdetector::TOB && amplclus > ChargeThresholdTOB) ||
              (thedetId.subdetId() == StripSubdetector::TEC && amplclus > ChargeThresholdTEC)) {
            // calculate generalized_layer:  31 = TIB1, 32 = TIB2, 33 = TIB3, 50 = TOB, 60 = TEC
            if (thedetId.subdetId() == StripSubdetector::TIB) {
              generalized_layer =
                  10 * thedetId.subdetId() + tTopo.tibLayer(thedetId.rawId()) + tTopo.tibStereo(thedetId.rawId());
              if (tTopo.tibLayer(thedetId.rawId()) == 2) {
                generalized_layer++;
                if (tTopo.tibGlued(thedetId.rawId()))
                  edm::LogError("ClusterMTCCFilter") << "WRONGGGG" << endl;
              }
            } else {
              generalized_layer = 10 * thedetId.subdetId();
              if (thedetId.subdetId() == StripSubdetector::TOB) {
                generalized_layer += tTopo.tobLayer(thedetId.rawId());
              }
            }
            // fill clusters_in_subcomponents
            map<unsigned int, vector<SiStripCluster>>::iterator layer_it =
                clusters_in_subcomponents.find(generalized_layer);
            if (layer_it == clusters_in_subcomponents
                                .end()) {  // if layer not found yet, create DATA vector and generate map KEY + DATA
              vector<SiStripCluster> local_vector;
              local_vector.push_back(*vit);
              clusters_in_subcomponents.insert(std::make_pair(generalized_layer, local_vector));
            } else {  // push into already existing vector
              (layer_it->second).push_back(*vit);
            }
          }
        }
      }
    }

    bool decision = false;  // default value, only accept if set true in this loop
    unsigned int nr_of_subcomps_with_clusters = 0;
    // dk: 2006.08.24 - change filter decision as proposed by V. Ciulli. || TIB1 TIB2 counted as 1, TEC excluded
    //  if( clusters_in_subcomponents[31].size()>0 ) nr_of_subcomps_with_clusters++; // TIB1
    //  if( clusters_in_subcomponents[32].size()>0 ) nr_of_subcomps_with_clusters++; // TIB2
    //  if( clusters_in_subcomponents[60].size()>0 ) nr_of_subcomps_with_clusters++; // TEC
    if (!clusters_in_subcomponents[31].empty() || !clusters_in_subcomponents[32].empty())
      nr_of_subcomps_with_clusters++;  // TIB1 || TIB2
    if (!clusters_in_subcomponents[33].empty())
      nr_of_subcomps_with_clusters++;  // TIB3
    if (!clusters_in_subcomponents[51].empty())
      nr_of_subcomps_with_clusters++;  // TOB1
    if (!clusters_in_subcomponents[52].empty())
      nr_of_subcomps_with_clusters++;  // TOB2
    if (nr_of_subcomps_with_clusters >=
        MinClustersDiffComponents  // more than 'MinClustersDiffComponents' components have at least 1 cluster
    ) {
      decision = true;  // accept event
    }

    e.put(std::make_unique<int>(decision));

    e.put(std::make_unique<unsigned int>(sum_of_cluster_charges));

    e.put(std::make_unique<std::map<unsigned int, std::vector<SiStripCluster>>>(clusters_in_subcomponents));

    return decision;
  }
}  // namespace cms