CMS 3D CMS Logo

PreshowerClusterShapeProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <vector>
3 #include <memory>
4 
5 // user include files
8 
16 
17 // Reconstruction Classes
20 
30 #include <fstream>
31 #include <sstream>
32 
34 
35 using namespace std;
36 using namespace reco;
37 using namespace edm;
39 
41  // use configuration file to setup input/output collection names
42  // Parameters to identify the hit collections
43  preshHitToken_ =
44  consumes<EcalRecHitCollection>(ps.getParameter<edm::InputTag>("preshRecHitProducer"));
45  endcapSClusterToken_ =
46  consumes<reco::SuperClusterCollection>(ps.getParameter<edm::InputTag>("endcapSClusterProducer"));
47 
48  PreshowerClusterShapeCollectionX_ = ps.getParameter<string>("PreshowerClusterShapeCollectionX");
49  PreshowerClusterShapeCollectionY_ = ps.getParameter<string>("PreshowerClusterShapeCollectionY");
50 
51  produces< reco::PreshowerClusterShapeCollection >(PreshowerClusterShapeCollectionX_);
52  produces< reco::PreshowerClusterShapeCollection >(PreshowerClusterShapeCollectionY_);
53 
54  float preshStripECut = ps.getParameter<double>("preshStripEnergyCut");
55  int preshNst = ps.getParameter<int>("preshPi0Nstrip");
56 
57  string debugString = ps.getParameter<string>("debugLevel");
58 
59 
60  string tmpPath = ps.getUntrackedParameter<string>("pathToWeightFiles","RecoEcal/EgammaClusterProducers/data/");
61 
62  presh_pi0_algo = new EndcapPiZeroDiscriminatorAlgo(preshStripECut, preshNst, tmpPath);
63 
64  LogTrace("EcalClusters") << "PreshowerClusterShapeProducer:presh_pi0_algo class instantiated " ;
65 
66 
67  nEvt_ = 0;
68 
69 }
70 
71 
73  delete presh_pi0_algo;
74 }
75 
76 
78 
79  ostringstream ostr; // use this stream for all messages in produce
80 
81  LogTrace("EcalClusters") << "\n ....... Event " << evt.id() << " with Number = " << nEvt_+1 << " is analyzing ....... " ;
82 
83 
85  Handle< SuperClusterCollection > pSuperClusters;
86 
87  // get the ECAL -> Preshower geometry and topology:
88  ESHandle<CaloGeometry> geoHandle;
89  es.get<CaloGeometryRecord>().get(geoHandle);
91  const CaloSubdetectorGeometry *& geometry_p = geometry;
92 
93 
94  // create a unique_ptr to a PreshowerClusterShapeCollection
95  auto ps_cl_for_pi0_disc_x = std::make_unique<reco::PreshowerClusterShapeCollection>();
96  auto ps_cl_for_pi0_disc_y = std::make_unique<reco::PreshowerClusterShapeCollection>();
97 
98 
99  CaloSubdetectorTopology* topology_p=nullptr;
100  if (geometry)
101  topology_p = new EcalPreshowerTopology(geoHandle);
102 
103 
104  // fetch the Preshower product (RecHits)
105  evt.getByToken( preshHitToken_, pRecHits);
106  // pointer to the object in the product
107  const EcalRecHitCollection* rechits = pRecHits.product();
108 
109  LogTrace("EcalClusters") << "PreshowerClusterShapeProducer: ### Total # of preshower RecHits: " << rechits->size() ;
110 
111  // if ( rechits->size() <= 0 ) return;
112 
113  // make the map of Preshower rechits:
114  map<DetId, EcalRecHit> rechits_map;
116  for (it = rechits->begin(); it != rechits->end(); it++) {
117  rechits_map.insert(make_pair(it->id(), *it));
118  }
119 
120  LogTrace("EcalClusters") << "PreshowerClusterShapeProducer: ### Preshower RecHits_map of size " << rechits_map.size() <<" was created!" ;
121 
122  reco::PreshowerClusterShapeCollection ps_cl_x, ps_cl_y;
123 
124  //make cycle over Photon Collection
125  int SC_index = 0;
126 // Handle<PhotonCollection> correctedPhotonHandle;
127 // evt.getByLabel(photonCorrCollectionProducer_, correctedPhotonCollection_ , correctedPhotonHandle);
128 // const PhotonCollection corrPhoCollection = *(correctedPhotonHandle.product());
129 // cout << " Photon Collection size : " << corrPhoCollection.size() << endl;
130 
131  evt.getByToken(endcapSClusterToken_, pSuperClusters);
132  const reco::SuperClusterCollection* SClusts = pSuperClusters.product();
133  LogTrace("EcalClusters") << "### Total # Endcap Superclusters: " << SClusts->size() ;
134 
135  SuperClusterCollection::const_iterator it_s;
136  for ( it_s=SClusts->begin(); it_s!=SClusts->end(); it_s++ ) {
137 
138  SuperClusterRef it_super(reco::SuperClusterRef(pSuperClusters,SC_index));
139 
140  float SC_Et = it_super->energy()*sin(2*atan(exp(-it_super->eta())));
141  float SC_eta = it_super->eta();
142  float SC_phi = it_super->phi();
143 
144  LogTrace("EcalClusters") << "PreshowerClusterShapeProducer: superCl_E = " << it_super->energy() << " superCl_Et = " << SC_Et << " superCl_Eta = " << SC_eta << " superCl_Phi = " << SC_phi ;
145 
146 
147  if(fabs(SC_eta) >= 1.65 && fabs(SC_eta) <= 2.5)
148  { // Use Preshower region only
149  if (geometry)
150  {
151  const GlobalPoint pointSC(it_super->x(),it_super->y(),it_super->z()); // get the centroid of the SC
152  LogTrace("EcalClusters") << "SC centroind = " << pointSC ;
153 
154  // Get the Preshower 2-planes RecHit vectors associated with the given SC
155 
156  DetId tmp_stripX = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(pointSC, 1);
157  DetId tmp_stripY = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(pointSC, 2);
158  ESDetId stripX = (tmp_stripX == DetId(0)) ? ESDetId(0) : ESDetId(tmp_stripX);
159  ESDetId stripY = (tmp_stripY == DetId(0)) ? ESDetId(0) : ESDetId(tmp_stripY);
160 
161  vector<float> vout_stripE1 = presh_pi0_algo->findPreshVector(stripX, &rechits_map, topology_p);
162  vector<float> vout_stripE2 = presh_pi0_algo->findPreshVector(stripY, &rechits_map, topology_p);
163 
164  LogTrace("EcalClusters") << "PreshowerClusterShapeProducer : ES Energy vector associated to the given SC = " ;
165  for(int k1=0;k1<11;k1++) {
166  LogTrace("EcalClusters") << vout_stripE1[k1] << " " ;
167  }
168 
169  for(int k1=0;k1<11;k1++) {
170  LogTrace("EcalClusters") << vout_stripE2[k1] << " " ;
171  }
172 
174  ps1.setSCRef(it_super);
175  ps_cl_x.push_back(ps1);
176 
178  ps2.setSCRef(it_super);
179  ps_cl_y.push_back(ps2);
180 
181  }
182  SC_index++;
183  } // end of cycle over Endcap SC
184  }
185  // put collection of PreshowerClusterShape in the Event:
186  ps_cl_for_pi0_disc_x->assign(ps_cl_x.begin(), ps_cl_x.end());
187  ps_cl_for_pi0_disc_y->assign(ps_cl_y.begin(), ps_cl_y.end());
188 
189  evt.put(std::move(ps_cl_for_pi0_disc_x), PreshowerClusterShapeCollectionX_);
190  evt.put(std::move(ps_cl_for_pi0_disc_y), PreshowerClusterShapeCollectionY_);
191  LogTrace("EcalClusters") << "PreshowerClusterShapeCollection added to the event" ;
192 
193  if (topology_p)
194  delete topology_p;
195 
196  nEvt_++;
197 
198  LogDebug("PiZeroDiscriminatorDebug") << ostr.str();
199 }
#define LogDebug(id)
T getParameter(std::string const &) const
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:45
T getUntrackedParameter(std::string const &, T const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:127
void setSCRef(const SuperClusterRef &r)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:508
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
std::vector< EcalRecHit >::const_iterator const_iterator
std::vector< SuperCluster > SuperClusterCollection
collection of SuperCluser objectr
std::vector< PreshowerClusterShape > PreshowerClusterShapeCollection
collection of PreshowerClusterShape objects
#define LogTrace(id)
const_iterator end() const
void produce(edm::Event &evt, const edm::EventSetup &es) override
Definition: DetId.h:18
T const * product() const
Definition: Handle.h:81
const T & get() const
Definition: EventSetup.h:55
ESHandle< TrackerGeometry > geometry
edm::EventID id() const
Definition: EventBase.h:60
fixed size matrix
HLT enums.
size_type size() const
PreshowerClusterShapeProducer(const edm::ParameterSet &ps)
def move(src, dest)
Definition: eostools.py:510
const_iterator begin() const