126 std::map<DetId, EcalRecHit> recHitsEB_map;
128 std::vector<EcalRecHit> seeds;
132 vector<EBDetId> usedXtals;
137 static const int MAXCLUS = 2000;
140 vector<float> etClus;
141 vector<float> etaClus;
142 vector<float> phiClus;
143 vector<EBDetId> max_hit;
144 vector< vector<EcalRecHit> > RecHitsCluster;
145 vector<float> s4s9Clus;
148 for(itb=rhEB->begin(); itb!=rhEB->end(); ++itb){
150 double energy = itb->energy();
152 std::pair<DetId, EcalRecHit> map_entry(itb->id(), *itb);
153 recHitsEB_map.insert(map_entry);
158 sort(seeds.begin(), seeds.end(), [](
auto&
x,
auto&
y){
return (
x.energy() >
y.energy());});
159 for (std::vector<EcalRecHit>::iterator itseed=seeds.begin(); itseed!=seeds.end(); itseed++) {
160 EBDetId seed_id = itseed->id();
161 std::vector<EBDetId>::const_iterator usedIds;
163 bool seedAlreadyUsed=
false;
164 for(usedIds=usedXtals.begin(); usedIds!=usedXtals.end(); usedIds++){
165 if(*usedIds==seed_id){
166 seedAlreadyUsed=
true;
171 if(seedAlreadyUsed)
continue;
175 std::vector<std::pair<DetId, float> > clus_used;
177 vector<EcalRecHit> RecHitsInWindow;
179 double simple_energy = 0;
181 for (std::vector<DetId>::iterator det=clus_v.begin(); det!=clus_v.end(); det++) {
184 bool HitAlreadyUsed=
false;
185 for(usedIds=usedXtals.begin(); usedIds!=usedXtals.end(); usedIds++){
191 if(HitAlreadyUsed)
continue;
192 if (recHitsEB_map.find(*det) != recHitsEB_map.end()){
194 std::map<DetId, EcalRecHit>::iterator aHit;
195 aHit = recHitsEB_map.find(*det);
196 usedXtals.push_back(*det);
197 RecHitsInWindow.push_back(aHit->second);
198 clus_used.push_back( std::pair<DetId, float>(*det, 1.) );
199 simple_energy = simple_energy + aHit->second.energy();
204 float theta_s = 2. * atan(
exp(-clus_pos.eta()));
205 float p0x_s = simple_energy *
sin(theta_s) *
cos(clus_pos.phi());
206 float p0y_s = simple_energy *
sin(theta_s) *
sin(clus_pos.phi());
208 float et_s =
sqrt( p0x_s*p0x_s + p0y_s*p0y_s);
212 eClus.push_back(simple_energy);
213 etClus.push_back(et_s);
214 etaClus.push_back(clus_pos.eta());
215 phiClus.push_back(clus_pos.phi());
216 max_hit.push_back(seed_id);
217 RecHitsCluster.push_back(RecHitsInWindow);
221 for(
int i=0;
i<4;
i++)s4s9_[
i]= itseed->energy();
222 for(
unsigned int j=0; j<RecHitsInWindow.size();j++){
224 if((((
EBDetId)RecHitsInWindow[j].
id()).ieta() == seed_id.
ieta()-1 && seed_id.
ieta()!=1 ) || ( seed_id.
ieta()==1 && (((
EBDetId)RecHitsInWindow[j].
id()).ieta() == seed_id.
ieta()-2))){
225 if(((
EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.
iphi()-1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()-1 ){
226 s4s9_[0]+=RecHitsInWindow[j].energy();
228 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()){
229 s4s9_[0]+=RecHitsInWindow[j].energy();
230 s4s9_[1]+=RecHitsInWindow[j].energy();
232 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()+1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()+1 ){
233 s4s9_[1]+=RecHitsInWindow[j].energy();
238 if(((
EBDetId)RecHitsInWindow[j].
id()).ieta() == seed_id.
ieta()){
239 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()-1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()-1 ){
240 s4s9_[0]+=RecHitsInWindow[j].energy();
241 s4s9_[3]+=RecHitsInWindow[j].energy();
243 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()+1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()+1 ){
244 s4s9_[1]+=RecHitsInWindow[j].energy();
245 s4s9_[2]+=RecHitsInWindow[j].energy();
249 if((((
EBDetId)RecHitsInWindow[j].
id()).ieta() == seed_id.
ieta()+1 && seed_id.
ieta()!=-1 ) || ( seed_id.
ieta()==-1 && (((
EBDetId)RecHitsInWindow[j].
id()).ieta() == seed_id.
ieta()+2))){
250 if(((
EBDetId)RecHitsInWindow[j].id()).iphi() == seed_id.
iphi()-1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()-1 ){
251 s4s9_[3]+=RecHitsInWindow[j].energy();
253 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()){
254 s4s9_[2]+=RecHitsInWindow[j].energy();
255 s4s9_[3]+=RecHitsInWindow[j].energy();
257 if(((
EBDetId)RecHitsInWindow[j].
id()).iphi() == seed_id.
iphi()+1 ||((
EBDetId)RecHitsInWindow[j].
id()).iphi()-360 == seed_id.
iphi()+1 ){
258 s4s9_[2]+=RecHitsInWindow[j].energy();
263 cout<<
" (EBDetId)RecHitsInWindow[j].id()).ieta() "<<((
EBDetId)RecHitsInWindow[j].
id()).ieta()<<
" seed_id.ieta() "<<seed_id.
ieta()<<endl;
264 cout<<
" Problem with S4 calculation "<<endl;
return;
269 s4s9Clus.push_back(*max_element( s4s9_,s4s9_+4)/simple_energy);
273 if (nClus == MAXCLUS)
return;
280 static const int MAXPI0S = 200;
283 vector<EBDetId> scXtals;
286 if (nClus <= 1)
return;
287 for(Int_t
i=0 ;
i<nClus ;
i++){
288 for(Int_t j=
i+1 ; j<nClus ; j++){
291 float theta_0 = 2. * atan(
exp(-etaClus[
i]));
292 float theta_1 = 2. * atan(
exp(-etaClus[j]));
294 float p0x = eClus[
i] *
sin(theta_0) *
cos(phiClus[
i]);
295 float p1x = eClus[j] *
sin(theta_1) *
cos(phiClus[j]);
296 float p0y = eClus[
i] *
sin(theta_0) *
sin(phiClus[
i]);
297 float p1y = eClus[j] *
sin(theta_1) *
sin(phiClus[j]);
298 float p0z = eClus[
i] *
cos(theta_0);
299 float p1z = eClus[j] *
cos(theta_1);
301 float pt_pi0 =
sqrt( (p0x+p1x)*(p0x+p1x) + (p0y+p1y)*(p0y+p1y));
304 float m_inv =
sqrt ( (eClus[
i] + eClus[j])*(eClus[
i] + eClus[j]) - (p0x+p1x)*(p0x+p1x) - (p0y+p1y)*(p0y+p1y) - (p0z+p1z)*(p0z+p1z) );
311 TVector3 pi0vect = TVector3((p0x+p1x), (p0y+p1y), (p0z+p1z));
312 for(Int_t
k=0 ;
k<nClus ;
k++){
313 if(
k==
i ||
k==j)
continue;
314 TVector3 Clusvect = TVector3(eClus[
k] *
sin(2. * atan(
exp(-etaClus[
k]))) *
cos(phiClus[k]), eClus[k] *
sin(2. * atan(
exp(-etaClus[k]))) *
sin(phiClus[k]) , eClus[k] *
cos(2. * atan(
exp(-etaClus[k]))));
315 float dretaclpi0 = fabs(etaClus[k] - pi0vect.Eta());
316 float drclpi0 = Clusvect.DeltaR(pi0vect);
320 Iso = Iso + etClus[
k];
321 IsoClus.push_back(k);
338 if(npi0_s == MAXPI0S)
return;
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
double clusSeedThr_
parameters needed for pizero finding
MonitorElement * hIsoPi0EB_
Sin< T >::type sin(const T &t)
MonitorElement * hPtPi0EB_
MonitorElement * hMinvPi0EB_
std::vector< EcalRecHit >::const_iterator const_iterator
edm::ParameterSet posCalcParameters_
int iphi() const
get the crystal iphi
Cos< T >::type cos(const T &t)
int ieta() const
get the crystal ieta
virtual std::vector< DetId > getWindow(const DetId &id, const int &northSouthSize, const int &eastWestSize) const
XYZPointD XYZPoint
point in space with cartesian internal representation
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
math::XYZPoint Calculate_Location(const HitsAndFractions &iDetIds, const edm::SortedCollection< HitType > *iRecHits, const CaloSubdetectorGeometry *iSubGeom, const CaloSubdetectorGeometry *iESGeom=0)
MonitorElement * hPt2Pi0EB_
MonitorElement * hPt1Pi0EB_
double seleXtalMinEnergy_