1 #ifndef RecoEcal_EgammaCoreTools_EcalClusterTools_h
2 #define RecoEcal_EgammaCoreTools_EcalClusterTools_h
53 #include "CLHEP/Geometry/Transform3D.h"
196 static Cluster2ndMoments cluster2ndMoments(
const std::vector<std::pair<const EcalRecHit*, float> >& RH_ptrs_fracs,
double phiCorrectionFactor=0.8,
double w0=4.7,
bool useLogWeights=
true);
211 static float matrixEnergy(
const reco::BasicCluster &cluster,
const EcalRecHitCollection *recHits,
const CaloTopology* topology,
DetId id,
int ixMin,
int ixMax,
int iyMin,
int iyMax,
const std::vector<int>& flagsexcl,
const std::vector<int>& severitiesexcl,
const EcalSeverityLevelAlgo *sevLv );
212 static float getFraction(
const std::vector< std::pair<DetId, float> > &v_id,
DetId id);
226 static std::vector<float>
roundnessSelectedBarrelRecHits(
const std::vector<std::pair<const EcalRecHit*,float> >&rhVector,
int weightedPositionMethod = 0);
247 static double f00(
double r) {
return 1; }
248 static double f11(
double r) {
return r; }
249 static double f20(
double r) {
return 2.0*r*r-1.0; }
250 static double f22(
double r) {
return r*
r; }
251 static double f31(
double r) {
return 3.0*r*r*r - 2.0*
r; }
252 static double f33(
double r) {
return r*r*
r; }
253 static double f40(
double r) {
return 6.0*r*r*r*r-6.0*r*r+1.0; }
254 static double f42(
double r) {
return 4.0*r*r*r*r-3.0*r*
r; }
255 static double f44(
double r) {
return r*r*r*
r; }
256 static double f51(
double r) {
return 10.0*
pow(r,5)-12.0*
pow(r,3)+3.0*
r; }
257 static double f53(
double r) {
return 5.0*
pow(r,5) - 4.0*
pow(r,3); }
258 static double f55(
double r) {
return pow(r,5); }
266 for (
int i = 2;
i <=
n; ++
i) res *=
i;
280 static int deltaIEta(
int seed_ieta,
int rh_ieta);
281 static int deltaIPhi(
int seed_iphi,
int rh_iphi);
282 static std::vector<int>
getSeedPosition(
const std::vector<std::pair<const EcalRecHit*,float> >&RH_ptrs);
283 static float getSumEnergy(
const std::vector<std::pair<const EcalRecHit*,float> >&RH_ptrs_fracs);
284 static float computeWeight(
float eRH,
float energyTotal,
int weightedPositionMethod);
294 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
295 if(v_id[
i].
first.rawId()==
id.rawId()){
296 frac= v_id[
i].second;
308 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
309 float energy = recHitEnergy( v_id[
i].
first, recHits ) * (noZS ? 1.0 : v_id[
i].second);
310 if ( energy > max ) {
315 return std::pair<DetId, float>(id,
max);
323 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
324 float energy = recHitEnergy( v_id[
i].
first, recHits,flagsexcl, severitiesexcl, sevLv ) * (noZS ? 1.0 : v_id[
i].second);
325 if ( energy > max ) {
330 return std::pair<DetId, float>(id,
max);
336 return getMaximum( cluster.hitsAndFractions(), recHits );
342 return getMaximum( cluster.hitsAndFractions(), recHits, flagsexcl, severitiesexcl, sevLv );
349 if (
id ==
DetId(0) ) {
353 if ( it != recHits->
end() ) {
362 return (*it).energy();
376 if (
id ==
DetId(0) ) {
380 if ( it != recHits->
end() ) {
382 uint32_t rhFlag = (*it).recoFlag();
383 std::vector<int>::const_iterator vit =
std::find( flagsexcl.begin(), flagsexcl.end(), rhFlag );
386 if ( vit != flagsexcl.end() )
return 0;
388 int severityFlag = sevLv->
severityLevel( it->id(), *recHits);
389 std::vector<int>::const_iterator sit =
std::find(severitiesexcl.begin(), severitiesexcl.end(), severityFlag);
392 if (sit!= severitiesexcl.end())
395 return (*it).energy();
425 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
426 for (
int i = ixMin;
i <= ixMax; ++
i ) {
427 for (
int j = iyMin;
j <= iyMax; ++
j ) {
429 cursor.offsetBy(
i,
j );
430 float frac=getFraction(v_id,*cursor);
431 energy += recHitEnergy( *cursor, recHits )*
frac;
444 float EcalClusterToolsT<noZS>::matrixEnergy(
const reco::BasicCluster &cluster,
const EcalRecHitCollection *recHits,
const CaloTopology* topology,
DetId id,
int ixMin,
int ixMax,
int iyMin,
int iyMax,
const std::vector<int>& flagsexcl,
const std::vector<int>& severitiesexcl,
const EcalSeverityLevelAlgo *sevLv )
448 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
450 for (
int i = ixMin;
i <= ixMax; ++
i ) {
451 for (
int j = iyMin;
j <= iyMax; ++
j ) {
453 cursor.offsetBy(
i,
j );
454 float frac=getFraction(v_id,*cursor);
455 energy += recHitEnergy( *cursor, recHits, flagsexcl, severitiesexcl, sevLv )*
frac;
466 std::vector<DetId>
v;
467 for (
int i = ixMin;
i <= ixMax; ++
i ) {
468 for (
int j = iyMin;
j <= iyMax; ++
j ) {
470 cursor.offsetBy(
i,
j );
471 if ( *cursor !=
DetId(0) ) v.push_back( *cursor );
481 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
482 std::list<float> energies;
483 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 0, -1, 0 );
484 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 0, 0, 1 ) );
485 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, 0, 1 ) );
486 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, -1, 0 ) );
493 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
494 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 0, -1, 0,flagsexcl, severitiesexcl, sevLv );
495 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 0, 0, 1,flagsexcl, severitiesexcl, sevLv ) );
496 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, 0, 1,flagsexcl, severitiesexcl, sevLv ) );
497 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, -1, 0,flagsexcl, severitiesexcl, sevLv ) );
504 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
505 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 1, -1, 0 );
506 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, -1, 1 ) );
507 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 1, 0, 1 ) );
508 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 0, -1, 1 ) );
515 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
516 std::list<float> energies;
517 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 1, -1, 0,flagsexcl, severitiesexcl, sevLv );
518 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, 0, 1, -1, 1,flagsexcl, severitiesexcl, sevLv ) );
519 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 1, 0, 1,flagsexcl, severitiesexcl, sevLv ) );
520 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 0, -1, 1,flagsexcl, severitiesexcl, sevLv ) );
527 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
528 return matrixEnergy( cluster, recHits, topology,
id, -1, 1, -1, 1 );
534 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
535 return matrixEnergy( cluster, recHits, topology,
id, -1, 1, -1, 1,flagsexcl, severitiesexcl, sevLv );
541 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
542 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 2, -2, 1 );
543 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -2, 1, -2, 1 ) );
544 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -2, 1, -1, 2 ) );
545 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 2, -1, 2 ) );
552 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
553 std::list<float> energies;
554 float max_E = matrixEnergy( cluster, recHits, topology,
id, -1, 2, -2, 1,flagsexcl, severitiesexcl, sevLv );
555 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -2, 1, -2, 1,flagsexcl, severitiesexcl, sevLv ) );
556 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -2, 1, -1, 2,flagsexcl, severitiesexcl, sevLv ) );
557 max_E =
std::max( max_E, matrixEnergy( cluster, recHits, topology,
id, -1, 2, -1, 2,flagsexcl, severitiesexcl, sevLv ) );
565 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
566 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, -2, 2 );
572 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
573 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, -2, 2,flagsexcl, severitiesexcl, sevLv );
579 return getMaximum( cluster.hitsAndFractions(), recHits ).
second;
585 return getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
second;
591 std::vector<float> energies;
592 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
593 energies.reserve( v_id.size() );
594 if ( v_id.size() < 2 )
return 0;
595 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
596 energies.push_back( recHitEnergy( v_id[
i].
first, recHits ) * (noZS ? 1.0 : v_id[
i].
second) );
598 std::partial_sort( energies.begin(), energies.begin()+2, energies.end(), std::greater<float>() );
607 std::vector<float> energies;
608 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
609 energies.reserve( v_id.size() );
610 if ( v_id.size() < 2 )
return 0;
611 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
612 energies.push_back( recHitEnergy( v_id[
i].
first, recHits,flagsexcl, severitiesexcl, sevLv ) * (noZS ? 1.0 : v_id[
i].
second) );
614 std::partial_sort( energies.begin(), energies.begin()+2, energies.end(), std::greater<float>() );
623 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
624 return matrixEnergy( cluster, recHits, topology,
id, 1, 2, -2, 2 );
630 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
631 return matrixEnergy( cluster, recHits, topology,
id, 1, 2, -2, 2,flagsexcl, severitiesexcl, sevLv );
637 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
638 return matrixEnergy( cluster, recHits, topology,
id, -2, -1, -2, 2 );
644 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
645 return matrixEnergy( cluster, recHits, topology,
id, -2, -1, -2, 2,flagsexcl, severitiesexcl, sevLv );
652 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
653 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, 1, 2 );
659 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
660 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, 1, 2,flagsexcl, severitiesexcl, sevLv );
666 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
667 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, -2, -1 );
673 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
674 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, -2, -1,flagsexcl, severitiesexcl, sevLv );
682 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
685 float left = matrixEnergy( cluster, recHits, topology,
id, -1, -1, -2, 2 );
687 float right = matrixEnergy( cluster, recHits, topology,
id, 1, 1, -2, 2 );
689 float centre = matrixEnergy( cluster, recHits, topology,
id, 0, 0, -2, 2 );
692 return left > right ? left+centre : right+centre;
698 DetId id = getMaximum( cluster.hitsAndFractions(), recHits,flagsexcl, severitiesexcl, sevLv ).
first;
701 float left = matrixEnergy( cluster, recHits, topology,
id, -1, -1, -2, 2,flagsexcl, severitiesexcl, sevLv );
703 float right = matrixEnergy( cluster, recHits, topology,
id, 1, 1, -2, 2,flagsexcl, severitiesexcl, sevLv );
705 float centre = matrixEnergy( cluster, recHits, topology,
id, 0, 0, -2, 2,flagsexcl, severitiesexcl, sevLv );
708 return left > right ? left+centre : right+centre;
714 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
715 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -2, 2 );
721 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
722 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -2, 2 ,
723 flagsexcl, severitiesexcl, sevLv);
729 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
730 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, 0, 0 );
736 DetId id = getMaximum( cluster.hitsAndFractions(), recHits).
first;
737 return matrixEnergy( cluster, recHits, topology,
id, -2, 2, 0, 0,flagsexcl, severitiesexcl, sevLv );
743 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
744 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -1, 1 );
750 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
751 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -1, 1,flagsexcl, severitiesexcl, sevLv );
757 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
758 return matrixEnergy( cluster, recHits, topology,
id, -1, 1, 0, 0 );
764 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
765 return matrixEnergy( cluster, recHits, topology,
id, -1, 1, 0, 0,flagsexcl, severitiesexcl, sevLv );
771 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
772 return matrixEnergy( cluster, recHits, topology,
id, -1, -1, 0, 0 );
778 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
779 return matrixEnergy( cluster, recHits, topology,
id, -1, -1, 0, 0,flagsexcl, severitiesexcl, sevLv );
785 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
786 return matrixEnergy( cluster, recHits, topology,
id, 1, 1, 0, 0 );
792 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
793 return matrixEnergy( cluster, recHits, topology,
id, 1, 1, 0, 0,flagsexcl, severitiesexcl, sevLv );
799 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
800 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, 1, 1 );
806 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
807 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, 1, 1,flagsexcl, severitiesexcl, sevLv );
813 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
814 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -1, -1 );
820 DetId id = getMaximum( cluster.hitsAndFractions(), recHits ).
first;
821 return matrixEnergy( cluster, recHits, topology,
id, 0, 0, -1, -1,flagsexcl, severitiesexcl, sevLv );
828 float clusterEnergy = cluster.energy();
829 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
831 edm::LogWarning(
"EcalClusterToolsT<noZS>::energyBasketFractionEta") <<
"Trying to get basket fraction for endcap basic-clusters. Basket fractions can be obtained ONLY for barrel basic-clusters. Returning empty vector.";
832 return basketFraction;
834 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
837 std::sort( basketFraction.rbegin(), basketFraction.rend() );
838 return basketFraction;
845 float clusterEnergy = cluster.energy();
846 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
848 edm::LogWarning(
"EcalClusterToolsT<noZS>::energyBasketFractionEta") <<
"Trying to get basket fraction for endcap basic-clusters. Basket fractions can be obtained ONLY for barrel basic-clusters. Returning empty vector.";
849 return basketFraction;
851 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
854 std::sort( basketFraction.rbegin(), basketFraction.rend() );
855 return basketFraction;
862 float clusterEnergy = cluster.energy();
863 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
865 edm::LogWarning(
"EcalClusterToolsT<noZS>::energyBasketFractionPhi") <<
"Trying to get basket fraction for endcap basic-clusters. Basket fractions can be obtained ONLY for barrel basic-clusters. Returning empty vector.";
866 return basketFraction;
868 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
871 std::sort( basketFraction.rbegin(), basketFraction.rend() );
872 return basketFraction;
879 float clusterEnergy = cluster.energy();
880 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
882 edm::LogWarning(
"EcalClusterToolsT<noZS>::energyBasketFractionPhi") <<
"Trying to get basket fraction for endcap basic-clusters. Basket fractions can be obtained ONLY for barrel basic-clusters. Returning empty vector.";
883 return basketFraction;
885 for (
size_t i = 0;
i < v_id.size(); ++
i ) {
888 std::sort( basketFraction.rbegin(), basketFraction.rend() );
889 return basketFraction;
895 std::vector<typename EcalClusterToolsT<noZS>::EcalClusterEnergyDeposition> energyDistribution;
898 CLHEP::Hep3Vector clVect(cluster.position().x(), cluster.position().y(), cluster.position().z());
899 CLHEP::Hep3Vector clDir(clVect);
900 clDir*=1.0/clDir.mag();
902 CLHEP::Hep3Vector theta_axis(clDir.y(),-clDir.x(),0.0);
903 theta_axis *= 1.0/theta_axis.mag();
904 CLHEP::Hep3Vector phi_axis = theta_axis.cross(clDir);
906 const std::vector< std::pair<DetId, float> >& clusterDetIds = cluster.hitsAndFractions();
910 std::vector< std::pair<DetId, float> >::const_iterator posCurrent;
912 for(posCurrent=clusterDetIds.begin(); posCurrent!=clusterDetIds.end(); ++posCurrent) {
916 if(( (*posCurrent).first !=
DetId(0)) && (recHits->
find( (*posCurrent).first ) != recHits->
end())) {
924 LogDebug(
"ClusterShapeAlgo") <<
"Crystal has insufficient energy: E = "
930 DetId id_ = (*posCurrent).first;
933 CLHEP::Hep3Vector gblPos (cellPos.
x(),cellPos.
y(),cellPos.
z());
935 CLHEP::Hep3Vector
diff = gblPos - clVect;
939 CLHEP::Hep3Vector DigiVect = diff - diff.dot(clDir)*clDir;
940 clEdep.
r = DigiVect.mag();
942 <<
"\tdiff = " << diff.mag()
943 <<
"\tr = " << clEdep.
r;
944 clEdep.
phi = DigiVect.angle(theta_axis);
945 if(DigiVect.dot(phi_axis)<0) clEdep.
phi = 2 *
M_PI - clEdep.
phi;
946 energyDistribution.push_back(clEdep);
949 return energyDistribution;
955 std::vector<EcalClusterToolsT::EcalClusterEnergyDeposition> energyDistribution = getEnergyDepTopology( cluster, recHits, geometry, logW, w0 );
957 std::vector<float> lat;
958 double r, redmoment=0;
959 double phiRedmoment = 0 ;
960 double etaRedmoment = 0 ;
962 int clusterSize=energyDistribution.size();
963 float etaLat_, phiLat_, lat_;
974 if (energyDistribution[1].deposited_energy >
975 energyDistribution[0].deposited_energy)
977 tmp=n2; n2=n1; n1=
tmp;
979 for (
int i=2;
i<clusterSize;
i++) {
981 if (energyDistribution[
i].deposited_energy >
982 energyDistribution[n1].deposited_energy)
985 n2 = n1; n1 =
i; n=
tmp;
987 if (energyDistribution[
i].deposited_energy >
988 energyDistribution[n2].deposited_energy)
994 r = energyDistribution[
n].r;
995 redmoment += r*r* energyDistribution[
n].deposited_energy;
996 double rphi = r *
cos (energyDistribution[n].
phi) ;
997 phiRedmoment += rphi * rphi * energyDistribution[
n].deposited_energy;
998 double reta = r *
sin (energyDistribution[n].phi) ;
999 etaRedmoment += reta * reta * energyDistribution[
n].deposited_energy;
1001 double e1 = energyDistribution[n1].deposited_energy;
1002 double e2 = energyDistribution[n2].deposited_energy;
1004 lat_ = redmoment/(redmoment+2.19*2.19*(e1+
e2));
1005 phiLat_ = phiRedmoment/(phiRedmoment+2.19*2.19*(e1+
e2));
1006 etaLat_ = etaRedmoment/(etaRedmoment+2.19*2.19*(e1+
e2));
1008 lat.push_back(etaLat_);
1009 lat.push_back(phiLat_);
1010 lat.push_back(lat_);
1019 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1020 std::vector<DetId> v_id = matrixDetId( topology, getMaximum( cluster, recHits ).
first, -2, 2, -2, 2 );
1021 for(
const std::pair<DetId,float>& hitAndFrac : hsAndFs ) {
1022 for( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1023 if( hitAndFrac.first != *it && !noZS)
continue;
1026 meanPosition = meanPosition + recHitEnergy( *it, recHits ) *
position * hitAndFrac.second;
1030 return meanPosition / e5x5( cluster, recHits, topology );
1039 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1040 std::vector<DetId> v_id = matrixDetId( topology, getMaximum( cluster, recHits ).
first, -2, 2, -2, 2 );
1041 for(
const std::pair<DetId,float>& hitAndFrac : hsAndFs ) {
1042 for( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1043 if( hitAndFrac.first != *it && !noZS )
continue;
1046 meanPosition = meanPosition + recHitEnergy( *it, recHits,flagsexcl, severitiesexcl, sevLv ) *
position * hitAndFrac.second;
1050 return meanPosition / e5x5( cluster, recHits, topology,flagsexcl, severitiesexcl, sevLv );
1063 DetId seedId = getMaximum( cluster, recHits ).first;
1068 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1069 std::vector<DetId> v_id = matrixDetId( topology,seedId, -2, 2, -2, 2 );
1070 for(
const std::pair<DetId,float>& hAndF : hsAndFs ) {
1071 for ( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1072 if( hAndF.first != *it && !noZS )
continue;
1073 float energy = recHitEnergy(*it,recHits) * hAndF.second;
1074 if(energy<0.)
continue;
1075 meanDEta += energy * getNrCrysDiffInEta(*it,seedId);
1076 meanDPhi += energy * getNrCrysDiffInPhi(*it,seedId);
1083 return std::pair<float,float>(meanDEta,meanDPhi);
1089 DetId seedId = getMaximum( cluster, recHits ).first;
1094 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1095 std::vector<DetId> v_id = matrixDetId( topology,seedId, -2, 2, -2, 2 );
1096 for(
const std::pair<DetId,float>& hAndF : hsAndFs ) {
1097 for ( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1098 if( hAndF.first != *it && !noZS )
continue;
1099 float energy = recHitEnergy(*it,recHits,flagsexcl, severitiesexcl, sevLv) * hAndF.second;
1100 if(energy<0.)
continue;
1101 meanDEta += energy * getNrCrysDiffInEta(*it,seedId);
1102 meanDPhi += energy * getNrCrysDiffInPhi(*it,seedId);
1109 return std::pair<float,float>(meanDEta,meanDPhi);
1121 DetId seedId = getMaximum( cluster, recHits ).first;
1123 std::pair<float,float> meanXY(0.,0.);
1128 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1129 std::vector<DetId> v_id = matrixDetId( topology,seedId, -2, 2, -2, 2 );
1130 for(
const std::pair<DetId,float>& hAndF : hsAndFs ) {
1131 for ( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1132 if( hAndF.first != *it && !noZS)
continue;
1133 float energy = recHitEnergy(*it,recHits) * hAndF.second;
1134 if(energy<0.)
continue;
1135 meanXY.first += energy * getNormedIX(*it);
1136 meanXY.second += energy * getNormedIY(*it);
1149 DetId seedId = getMaximum( cluster, recHits ).first;
1151 std::pair<float,float> meanXY(0.,0.);
1156 const std::vector<std::pair<DetId,float> >& hsAndFs = cluster.hitsAndFractions();
1157 std::vector<DetId> v_id = matrixDetId( topology,seedId, -2, 2, -2, 2 );
1158 for(
const std::pair<DetId,float>& hAndF : hsAndFs ) {
1159 for ( std::vector<DetId>::const_iterator it = v_id.begin(); it != v_id.end(); ++it ) {
1160 if( hAndF.first != *it && !noZS)
continue;
1161 float energy = recHitEnergy(*it,recHits,flagsexcl, severitiesexcl, sevLv) * (noZS ? 1.0 : hAndF.second);
1162 if(energy<0.)
continue;
1163 meanXY.first += energy * getNormedIX(*it);
1164 meanXY.second += energy * getNormedIY(*it);
1177 float e_5x5 = e5x5( cluster, recHits, topology );
1178 float covEtaEta, covEtaPhi, covPhiPhi;
1181 const std::vector< std::pair<DetId, float>>& v_id =cluster.hitsAndFractions();
1182 math::XYZVector meanPosition = meanClusterPosition( cluster, recHits, topology, geometry );
1185 double numeratorEtaEta = 0;
1186 double numeratorEtaPhi = 0;
1187 double numeratorPhiPhi = 0;
1190 DetId id = getMaximum( v_id, recHits ).first;
1192 for (
int i = -2;
i <= 2; ++
i ) {
1193 for (
int j = -2;
j <= 2; ++
j ) {
1195 cursor.offsetBy(
i,
j );
1196 float frac=getFraction(v_id,*cursor);
1197 float energy = recHitEnergy( *cursor, recHits )*
frac;
1199 if ( energy <= 0 )
continue;
1203 double dPhi = position.
phi() - meanPosition.
phi();
1207 double dEta = position.
eta() - meanPosition.eta();
1212 numeratorEtaEta += w * dEta * dEta;
1213 numeratorEtaPhi += w * dEta *
dPhi;
1214 numeratorPhiPhi += w * dPhi *
dPhi;
1218 if (denominator != 0.0) {
1235 std::vector<float>
v;
1236 v.push_back( covEtaEta );
1237 v.push_back( covEtaPhi );
1238 v.push_back( covPhiPhi );
1246 float e_5x5 = e5x5( cluster, recHits, topology,flagsexcl, severitiesexcl, sevLv );
1247 float covEtaEta, covEtaPhi, covPhiPhi;
1250 const std::vector<std::pair<DetId, float>>& v_id= cluster.hitsAndFractions();
1251 math::XYZVector meanPosition = meanClusterPosition( cluster, recHits, topology, geometry,flagsexcl, severitiesexcl, sevLv );
1254 double numeratorEtaEta = 0;
1255 double numeratorEtaPhi = 0;
1256 double numeratorPhiPhi = 0;
1260 DetId id = getMaximum( v_id, recHits ).first;
1262 for (
int i = -2;
i <= 2; ++
i ) {
1263 for (
int j = -2;
j <= 2; ++
j ) {
1265 cursor.offsetBy(
i,
j );
1266 float frac = getFraction(v_id,*cursor);
1267 float energy = recHitEnergy( *cursor, recHits,flagsexcl, severitiesexcl, sevLv )*
frac;
1269 if ( energy <= 0 )
continue;
1273 double dPhi = position.
phi() - meanPosition.
phi();
1277 double dEta = position.
eta() - meanPosition.eta();
1282 numeratorEtaEta += w * dEta * dEta;
1283 numeratorEtaPhi += w * dEta *
dPhi;
1284 numeratorPhiPhi += w * dPhi *
dPhi;
1288 if (denominator != 0.0) {
1305 std::vector<float>
v;
1306 v.push_back( covEtaEta );
1307 v.push_back( covEtaPhi );
1308 v.push_back( covPhiPhi );
1320 float e_5x5 = e5x5( cluster, recHits, topology );
1321 float covEtaEta, covEtaPhi, covPhiPhi;
1325 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
1326 std::pair<float,float> mean5x5PosInNrCrysFromSeed = mean5x5PositionInLocalCrysCoord( cluster, recHits, topology );
1327 std::pair<float,float> mean5x5XYPos = mean5x5PositionInXY(cluster,recHits,topology);
1330 double numeratorEtaEta = 0;
1331 double numeratorEtaPhi = 0;
1332 double numeratorPhiPhi = 0;
1337 const double barrelCrysSize = 0.01745;
1338 const double endcapCrysSize = 0.0447;
1340 DetId seedId = getMaximum( v_id, recHits ).first;
1343 const double crysSize = isBarrel ? barrelCrysSize : endcapCrysSize;
1345 CaloNavigator<DetId> cursor = CaloNavigator<DetId>( seedId, topology->
getSubdetectorTopology( seedId ) );
1347 for (
int eastNr = -2; eastNr <= 2; ++eastNr ) {
1348 for (
int northNr = -2; northNr <= 2; ++northNr ) {
1350 cursor.offsetBy( eastNr, northNr);
1351 float frac = getFraction(v_id,*cursor);
1352 float energy = recHitEnergy( *cursor, recHits )*
frac;
1353 if ( energy <= 0 )
continue;
1355 float dEta = getNrCrysDiffInEta(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.first;
1358 if(isBarrel) dPhi = getNrCrysDiffInPhi(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.second;
1359 else dPhi = getDPhiEndcap(*cursor,mean5x5XYPos.first,mean5x5XYPos.second);
1365 numeratorEtaEta += w * dEta * dEta;
1366 numeratorEtaPhi += w * dEta *
dPhi;
1367 numeratorPhiPhi += w * dPhi *
dPhi;
1373 if (denominator != 0.0) {
1374 covEtaEta = crysSize*crysSize* numeratorEtaEta /
denominator;
1375 covEtaPhi = crysSize*crysSize* numeratorEtaPhi /
denominator;
1376 covPhiPhi = crysSize*crysSize* numeratorPhiPhi /
denominator;
1391 std::vector<float>
v;
1392 v.push_back( covEtaEta );
1393 v.push_back( covEtaPhi );
1394 v.push_back( covPhiPhi );
1403 float e_5x5 = e5x5( cluster, recHits, topology,flagsexcl, severitiesexcl, sevLv );
1404 float covEtaEta, covEtaPhi, covPhiPhi;
1408 const std::vector< std::pair<DetId, float> >& v_id = cluster.hitsAndFractions();
1409 std::pair<float,float> mean5x5PosInNrCrysFromSeed = mean5x5PositionInLocalCrysCoord( cluster, recHits, topology,flagsexcl, severitiesexcl, sevLv );
1410 std::pair<float,float> mean5x5XYPos = mean5x5PositionInXY(cluster,recHits,topology,flagsexcl, severitiesexcl, sevLv);
1413 double numeratorEtaEta = 0;
1414 double numeratorEtaPhi = 0;
1415 double numeratorPhiPhi = 0;
1420 const double barrelCrysSize = 0.01745;
1421 const double endcapCrysSize = 0.0447;
1423 DetId seedId = getMaximum( v_id, recHits ).first;
1426 const double crysSize = isBarrel ? barrelCrysSize : endcapCrysSize;
1428 CaloNavigator<DetId> cursor = CaloNavigator<DetId>( seedId, topology->
getSubdetectorTopology( seedId ) );
1430 for (
int eastNr = -2; eastNr <= 2; ++eastNr ) {
1431 for (
int northNr = -2; northNr <= 2; ++northNr ) {
1433 cursor.offsetBy( eastNr, northNr);
1434 float frac = getFraction(v_id,*cursor);
1435 float energy = recHitEnergy( *cursor, recHits,flagsexcl, severitiesexcl, sevLv)*
frac;
1436 if ( energy <= 0 )
continue;
1438 float dEta = getNrCrysDiffInEta(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.first;
1441 if(isBarrel) dPhi = getNrCrysDiffInPhi(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.second;
1442 else dPhi = getDPhiEndcap(*cursor,mean5x5XYPos.first,mean5x5XYPos.second);
1448 numeratorEtaEta += w * dEta * dEta;
1449 numeratorEtaPhi += w * dEta *
dPhi;
1450 numeratorPhiPhi += w * dPhi *
dPhi;
1456 if (denominator != 0.0) {
1457 covEtaEta = crysSize*crysSize* numeratorEtaEta /
denominator;
1458 covEtaPhi = crysSize*crysSize* numeratorEtaPhi /
denominator;
1459 covPhiPhi = crysSize*crysSize* numeratorPhiPhi /
denominator;
1474 std::vector<float>
v;
1475 v.push_back( covEtaEta );
1476 v.push_back( covEtaPhi );
1477 v.push_back( covPhiPhi );
1484 return absZernikeMoment( cluster, recHits, geometry, 2, 0, R0, logW, w0 );
1490 return absZernikeMoment( cluster, recHits, geometry, 4, 2, R0, logW, w0 );
1497 if ((m>n) || ((n-m)%2 != 0) || (n<0) || (m<0))
return -1;
1501 if ((n>20) || (R0<=2.19))
return -1;
1502 if (n<=5)
return fast_AbsZernikeMoment(cluster, recHits, geometry, n, m, R0, logW, w0 );
1503 else return calc_AbsZernikeMoment(cluster, recHits, geometry, n, m, R0, logW, w0 );
1509 double r,ph,
e,Re=0,Im=0;
1510 double TotalEnergy = cluster.energy();
1511 int index = (n/2)*(n/2)+(n/2)+m;
1512 std::vector<EcalClusterEnergyDeposition> energyDistribution = getEnergyDepTopology( cluster, recHits, geometry, logW, w0 );
1513 int clusterSize = energyDistribution.size();
1514 if(clusterSize < 3)
return 0.0;
1516 for (
int i=0;
i<clusterSize;
i++)
1518 r = energyDistribution[
i].r / R0;
1520 std::vector<double> pol;
1521 pol.push_back( f00(r) );
1522 pol.push_back( f11(r) );
1523 pol.push_back( f20(r) );
1524 pol.push_back( f22(r) );
1525 pol.push_back( f31(r) );
1526 pol.push_back( f33(r) );
1527 pol.push_back( f40(r) );
1528 pol.push_back( f42(r) );
1529 pol.push_back( f44(r) );
1530 pol.push_back( f51(r) );
1531 pol.push_back( f53(r) );
1532 pol.push_back( f55(r) );
1533 ph = (energyDistribution[
i]).
phi;
1534 e = energyDistribution[
i].deposited_energy;
1535 Re = Re + e/TotalEnergy * pol[
index] *
cos( (
double) m * ph);
1536 Im = Im - e/TotalEnergy * pol[
index] *
sin( (
double) m * ph);
1539 return sqrt(Re*Re+Im*Im);
1545 double r, ph,
e, Re=0, Im=0, f_nm;
1546 double TotalEnergy = cluster.energy();
1547 std::vector<EcalClusterEnergyDeposition> energyDistribution = getEnergyDepTopology( cluster, recHits, geometry, logW, w0 );
1548 int clusterSize=energyDistribution.size();
1549 if(clusterSize<3)
return 0.0;
1551 for (
int i = 0;
i < clusterSize; ++
i)
1553 r = energyDistribution[
i].r / R0;
1555 ph = energyDistribution[
i].phi;
1556 e = energyDistribution[
i].deposited_energy;
1558 for (
int s=0;
s<=(n-
m)/2;
s++) {
1565 Re = Re + e/TotalEnergy * f_nm *
cos( (
double) m*ph);
1566 Im = Im - e/TotalEnergy * f_nm *
sin( (
double) m*ph);
1569 return sqrt(Re*Re+Im*Im);
1584 float iXNorm = getNormedIX(
id);
1585 float iYNorm = getNormedIY(
id);
1587 return std::sqrt(iXNorm*iXNorm+iYNorm*iYNorm);
1616 int iXNorm = eeId.
ix()-50;
1617 if(iXNorm<=0) iXNorm--;
1629 int iYNorm = eeId.
iy()-50;
1630 if(iYNorm<=0) iYNorm--;
1640 float crysIEta = getIEta(crysId);
1641 float orginIEta = getIEta(orginId);
1644 float nrCrysDiff = crysIEta-orginIEta;
1649 if(crysIEta*orginIEta<0){
1650 if(crysIEta>0) nrCrysDiff--;
1661 float crysIPhi = getIPhi(crysId);
1662 float orginIPhi = getIPhi(orginId);
1665 float nrCrysDiff = crysIPhi-orginIPhi;
1668 if (nrCrysDiff > + 180) { nrCrysDiff = nrCrysDiff - 360; }
1669 if (nrCrysDiff < - 180) { nrCrysDiff = nrCrysDiff + 360; }
1678 float iXNorm = getNormedIX(crysId);
1679 float iYNorm = getNormedIY(crysId);
1681 float hitLocalR2 = (iXNorm-meanX)*(iXNorm-meanX)+(iYNorm-meanY)*(iYNorm-meanY);
1682 float hitR2 = iXNorm*iXNorm+iYNorm*iYNorm;
1683 float meanR2 = meanX*meanX+meanY*meanY;
1684 float hitR =
sqrt(hitR2);
1685 float meanR =
sqrt(meanR2);
1687 float tmp = (hitR2+meanR2-hitLocalR2)/(2*hitR*meanR);
1688 if (tmp<-1) tmp =-1;
1690 float phi = acos(tmp);
1701 float e_5x5 = e5x5(bcluster, recHits, topology);
1702 float covEtaEta, covEtaPhi, covPhiPhi;
1705 const std::vector<std::pair<DetId, float> >& v_id = cluster.
hitsAndFractions();
1706 std::pair<float,float> mean5x5PosInNrCrysFromSeed = mean5x5PositionInLocalCrysCoord(bcluster, recHits, topology);
1707 std::pair<float,float> mean5x5XYPos = mean5x5PositionInXY(cluster,recHits,topology);
1709 double numeratorEtaEta = 0;
1710 double numeratorEtaPhi = 0;
1711 double numeratorPhiPhi = 0;
1714 const double barrelCrysSize = 0.01745;
1715 const double endcapCrysSize = 0.0447;
1717 DetId seedId = getMaximum(v_id, recHits).first;
1720 const double crysSize = isBarrel ? barrelCrysSize : endcapCrysSize;
1722 for (
size_t i = 0;
i < v_id.size(); ++
i) {
1724 float frac = getFraction(v_id,*cursor);
1725 float energy = recHitEnergy(*cursor, recHits)*
frac;
1727 if (energy <= 0)
continue;
1729 float dEta = getNrCrysDiffInEta(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.first;
1731 if(isBarrel) dPhi = getNrCrysDiffInPhi(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.second;
1732 else dPhi = getDPhiEndcap(*cursor,mean5x5XYPos.first,mean5x5XYPos.second);
1740 numeratorEtaEta += w * dEta * dEta;
1741 numeratorEtaPhi += w * dEta *
dPhi;
1742 numeratorPhiPhi += w * dPhi *
dPhi;
1746 if (denominator != 0.0) {
1747 covEtaEta = crysSize*crysSize* numeratorEtaEta /
denominator;
1748 covEtaPhi = crysSize*crysSize* numeratorEtaPhi /
denominator;
1749 covPhiPhi = crysSize*crysSize* numeratorPhiPhi /
denominator;
1764 std::vector<float>
v;
1765 v.push_back( covEtaEta );
1766 v.push_back( covEtaPhi );
1767 v.push_back( covPhiPhi );
1779 float e_5x5 = e5x5(bcluster, recHits, topology);
1780 float covEtaEta, covEtaPhi, covPhiPhi;
1783 const std::vector<std::pair<DetId, float> >& v_id = cluster.
hitsAndFractions();
1784 std::pair<float,float> mean5x5PosInNrCrysFromSeed = mean5x5PositionInLocalCrysCoord(bcluster, recHits, topology,flagsexcl, severitiesexcl, sevLv);
1785 std::pair<float,float> mean5x5XYPos = mean5x5PositionInXY(cluster,recHits,topology,flagsexcl, severitiesexcl, sevLv);
1787 double numeratorEtaEta = 0;
1788 double numeratorEtaPhi = 0;
1789 double numeratorPhiPhi = 0;
1792 const double barrelCrysSize = 0.01745;
1793 const double endcapCrysSize = 0.0447;
1795 DetId seedId = getMaximum(v_id, recHits).first;
1798 const double crysSize = isBarrel ? barrelCrysSize : endcapCrysSize;
1800 for (
size_t i = 0;
i < v_id.size(); ++
i) {
1802 float frac = getFraction(v_id,*cursor);
1803 float energy = recHitEnergy(*cursor, recHits,flagsexcl, severitiesexcl, sevLv)*
frac;
1805 if (energy <= 0)
continue;
1807 float dEta = getNrCrysDiffInEta(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.first;
1809 if(isBarrel) dPhi = getNrCrysDiffInPhi(*cursor,seedId) - mean5x5PosInNrCrysFromSeed.second;
1810 else dPhi = getDPhiEndcap(*cursor,mean5x5XYPos.first,mean5x5XYPos.second);
1818 numeratorEtaEta += w * dEta * dEta;
1819 numeratorEtaPhi += w * dEta *
dPhi;
1820 numeratorPhiPhi += w * dPhi *
dPhi;
1824 if (denominator != 0.0) {
1825 covEtaEta = crysSize*crysSize* numeratorEtaEta /
denominator;
1826 covEtaPhi = crysSize*crysSize* numeratorEtaPhi /
denominator;
1827 covPhiPhi = crysSize*crysSize* numeratorPhiPhi /
denominator;
1842 std::vector<float>
v;
1843 v.push_back( covEtaEta );
1844 v.push_back( covEtaPhi );
1845 v.push_back( covPhiPhi );
1861 std::vector<std::pair<const EcalRecHit*, float> > RH_ptrs_fracs;
1863 const std::vector< std::pair<DetId, float> >& myHitsPair = basicCluster.hitsAndFractions();
1865 for(
unsigned int i=0;
i<myHitsPair.size();
i++){
1868 RH_ptrs_fracs.push_back( std::make_pair(&(*myRH) , myHitsPair[
i].
second) );
1879 returnMoments.
sMaj = -1.;
1880 returnMoments.
sMin = -1.;
1881 returnMoments.
alpha = 0.;
1888 return returnMoments;
1895 double mid_eta(0),mid_phi(0),mid_x(0),mid_y(0);
1899 double max_phi=-10.;
1900 double min_phi=100.;
1903 std::vector<double> etaDetId;
1904 std::vector<double> phiDetId;
1905 std::vector<double> xDetId;
1906 std::vector<double> yDetId;
1907 std::vector<double> wiDetId;
1909 unsigned int nCry=0;
1914 for(std::vector<std::pair<const EcalRecHit*, float> >::const_iterator rhf_ptr = RH_ptrs_fracs.begin(); rhf_ptr != RH_ptrs_fracs.end(); rhf_ptr++){
1919 double temp_eta(0),temp_phi(0),temp_x(0),temp_y(0);
1923 temp_eta = (getIEta(rh_ptr->
detid()) > 0. ? getIEta(rh_ptr->
detid()) + 84.5 : getIEta(rh_ptr->
detid()) + 85.5);
1924 temp_phi= getIPhi(rh_ptr->
detid()) - 0.5;
1927 temp_eta = getIEta(rh_ptr->
detid());
1928 temp_x = getNormedIX(rh_ptr->
detid());
1929 temp_y = getNormedIY(rh_ptr->
detid());
1932 double temp_ene=rh_ptr->
energy() * (noZS ? 1.0 : rhf_ptr->second);
1934 double temp_wi=((useLogWeights) ?
1939 if(temp_phi>max_phi) max_phi=temp_phi;
1940 if(temp_phi<min_phi) min_phi=temp_phi;
1941 etaDetId.push_back(temp_eta);
1942 phiDetId.push_back(temp_phi);
1943 xDetId.push_back(temp_x);
1944 yDetId.push_back(temp_y);
1945 wiDetId.push_back(temp_wi);
1946 denominator+=temp_wi;
1952 if(max_phi==359.5 && min_phi==0.5){
1953 for(
unsigned int i=0;
i<nCry;
i++){
1954 if(phiDetId[
i] - 179. > 0.) phiDetId[
i]-=360.;
1955 mid_phi+=phiDetId[
i]*wiDetId[
i];
1956 mid_eta+=etaDetId[
i]*wiDetId[
i];
1959 for(
unsigned int i=0;
i<nCry;
i++){
1960 mid_phi+=phiDetId[
i]*wiDetId[
i];
1961 mid_eta+=etaDetId[
i]*wiDetId[
i];
1965 for(
unsigned int i=0;
i<nCry;
i++){
1966 mid_eta+=etaDetId[
i]*wiDetId[
i];
1967 mid_x+=xDetId[
i]*wiDetId[
i];
1968 mid_y+=yDetId[
i]*wiDetId[
i];
1984 double deta(0),dphi(0);
1986 for(
unsigned int i=0;
i<nCry;
i++) {
1988 deta = etaDetId[
i]-mid_eta;
1989 dphi = phiDetId[
i]-mid_phi;
1991 deta = etaDetId[
i]-mid_eta;
1992 float hitLocalR2 = (xDetId[
i]-mid_x)*(xDetId[
i]-mid_x)+(yDetId[
i]-mid_y)*(yDetId[
i]-mid_y);
1993 float hitR2 = xDetId[
i]*xDetId[
i]+yDetId[
i]*yDetId[
i];
1994 float meanR2 = mid_x*mid_x+mid_y*mid_y;
1995 float hitR =
sqrt(hitR2);
1996 float meanR =
sqrt(meanR2);
1997 float phi = acos((hitR2+meanR2-hitLocalR2)/(2*hitR*meanR));
2001 See += (wiDetId[
i]* deta * deta) / denominator;
2002 Spp += phiCorrectionFactor*(wiDetId[
i]* dphi * dphi) / denominator;
2003 Sep +=
sqrt(phiCorrectionFactor)*(wiDetId[
i]*deta*dphi) / denominator;
2009 returnMoments.
sMaj = ((See + Spp) +
sqrt((See - Spp)*(See - Spp) + 4.*Sep*Sep)) / 2.;
2010 returnMoments.
sMin = ((See + Spp) -
sqrt((See - Spp)*(See - Spp) + 4.*Sep*Sep)) / 2.;
2012 returnMoments.
alpha = atan( (See - Spp +
sqrt( (Spp - See)*(Spp - See) + 4.*Sep*Sep )) / (2.*Sep));
2014 return returnMoments;
2027 std::vector<std::pair<const EcalRecHit*, float> > RH_ptrs_fracs;
2028 const std::vector< std::pair<DetId, float> >& myHitsPair = superCluster.
hitsAndFractions();
2029 for(
unsigned int i=0;
i< myHitsPair.size(); ++
i){
2032 if( myRH != recHits.
end() && myRH->energy()*(noZS ? 1.0 : myHitsPair[
i].second) > energyThreshold){
2034 RH_ptrs_fracs.push_back( std::make_pair(&(*myRH) , myHitsPair[
i].
second) );
2048 std::vector<std::pair<const EcalRecHit*, float> > RH_ptrs_fracs;
2049 const std::vector< std::pair<DetId, float> >& myHitsPair = superCluster.
hitsAndFractions();
2050 for(
unsigned int i=0;
i<myHitsPair.size(); ++
i){
2053 if(myRH != recHits.
end() && myRH->energy()*(noZS ? 1.0 : myHitsPair[
i].second) > energyRHThresh)
2054 RH_ptrs_fracs.push_back( std::make_pair(&(*myRH) , myHitsPair[
i].
second) );
2061 EBDetId EBdetIdi( rh->detid() );
2062 float the_fraction = 0;
2064 bool inEtaWindow = (
abs( deltaIEta(seedPosition[0],EBdetIdi.ieta()) ) <= ieta_delta );
2065 bool inPhiWindow = (
abs( deltaIPhi(seedPosition[1],EBdetIdi.iphi()) ) <= iphi_delta );
2066 bool passEThresh = ( rh->energy() > energyRHThresh );
2067 bool alreadyCounted =
false;
2070 bool is_SCrh_inside_recHits =
false;
2071 for(
unsigned int i=0;
i<myHitsPair.size();
i++){
2073 if(SCrh != recHits.
end()){
2074 the_fraction = myHitsPair[
i].second;
2075 is_SCrh_inside_recHits =
true;
2076 if( rh->detid() == SCrh->detid() ) alreadyCounted =
true;
2080 if( is_SCrh_inside_recHits && !alreadyCounted && passEThresh && inEtaWindow && inPhiWindow){
2081 RH_ptrs_fracs.push_back( std::make_pair(&(*rh),the_fraction) );
2095 std::vector<float> shapes;
2098 if(RH_ptrs_fracs.size()<2){
2099 shapes.push_back( -3 );
2100 shapes.push_back( -3 );
2106 int tempInt = seedPosition[0];
2107 if(tempInt <0) tempInt++;
2111 float centerIEta = 0.;
2112 float centerIPhi = 0.;
2115 for(std::vector<std::pair<const EcalRecHit*,float> >::const_iterator rhf_ptr = RH_ptrs_fracs.begin(); rhf_ptr != RH_ptrs_fracs.end(); rhf_ptr++){
2119 if(fabs(energyTotal) < 0.0001){
2121 shapes.push_back( -2 );
2122 shapes.push_back( -2 );
2125 float rh_energy = rh_ptr->
energy() * (noZS ? 1.0 : rhf_ptr->second);
2127 if(fabs(weightedPositionMethod)<0.0001){
2128 weight = rh_energy/energyTotal;
2130 weight =
std::max(0.0, 4.2 +
log(rh_energy/energyTotal));
2133 centerIEta += weight*deltaIEta(seedPosition[0],EBdetIdi.ieta());
2134 centerIPhi += weight*deltaIPhi(seedPosition[1],EBdetIdi.iphi());
2136 if(fabs(denominator) < 0.0001){
2138 shapes.push_back( -2 );
2139 shapes.push_back( -2 );
2147 TMatrixDSym inertia(2);
2148 double inertia00 = 0.;
2149 double inertia01 = 0.;
2150 double inertia11 = 0.;
2152 for(std::vector<std::pair<const EcalRecHit*,float> >::const_iterator rhf_ptr = RH_ptrs_fracs.begin(); rhf_ptr != RH_ptrs_fracs.end(); rhf_ptr++){
2157 if(fabs(energyTotal) < 0.0001){
2159 shapes.push_back( -2 );
2160 shapes.push_back( -2 );
2163 float rh_energy = rh_ptr->
energy() * (noZS ? 1.0 : rhf_ptr->second);
2165 if(fabs(weightedPositionMethod) < 0.0001){
2166 weight = rh_energy/energyTotal;
2168 weight =
std::max(0.0, 4.2 +
log(rh_energy/energyTotal));
2171 float ieta_rh_to_center = deltaIEta(seedPosition[0],EBdetIdi.ieta()) - centerIEta;
2172 float iphi_rh_to_center = deltaIPhi(seedPosition[1],EBdetIdi.iphi()) - centerIPhi;
2174 inertia00 += weight*iphi_rh_to_center*iphi_rh_to_center;
2175 inertia01 -= weight*iphi_rh_to_center*ieta_rh_to_center;
2176 inertia11 += weight*ieta_rh_to_center*ieta_rh_to_center;
2180 inertia[0][0] = inertia00;
2181 inertia[0][1] = inertia01;
2182 inertia[1][0] = inertia01;
2183 inertia[1][1] = inertia11;
2187 TMatrixD eVectors(2,2);
2188 TVectorD eValues(2);
2190 eVectors=inertia.EigenVectors(eValues);
2197 TVectorD smallerAxis(2);
2198 smallerAxis[0]=eVectors[0][1];
2199 smallerAxis[1]=eVectors[1][1];
2202 Double_t
temp = fabs(smallerAxis[0]);
2203 if(fabs(eValues[0]) < 0.0001){
2205 shapes.push_back( -2 );
2206 shapes.push_back( -2 );
2210 float Roundness = eValues[1]/eValues[0];
2211 float Angle=acos(temp);
2213 if( -0.00001 < Roundness && Roundness < 0) Roundness = 0.;
2214 if( -0.00001 < Angle && Angle < 0 ) Angle = 0.;
2216 shapes.push_back( Roundness );
2217 shapes.push_back( Angle );
2227 int rel_iphi = rh_iphi - seed_iphi;
2229 if(rel_iphi > 180) rel_iphi = rel_iphi - 360;
2230 if(rel_iphi < -180) rel_iphi = rel_iphi + 360;
2240 if(seed_ieta < 0) seed_ieta++;
2241 if(rh_ieta < 0) rh_ieta++;
2242 int rel_ieta = rh_ieta - seed_ieta;
2249 std::vector<int> seedPosition;
2254 for(std::vector<std::pair<const EcalRecHit*,float> >::const_iterator rhf_ptr = RH_ptrs_fracs.begin(); rhf_ptr != RH_ptrs_fracs.end(); rhf_ptr++){
2258 float rh_energy = rh_ptr->
energy() * (noZS ? 1.0 : rhf_ptr->second);
2260 if(eSeedRH < rh_energy){
2261 eSeedRH = rh_energy;
2262 iEtaSeedRH = EBdetIdi.ieta();
2263 iPhiSeedRH = EBdetIdi.iphi();
2268 seedPosition.push_back(iEtaSeedRH);
2269 seedPosition.push_back(iPhiSeedRH);
2270 return seedPosition;
2277 for(
const auto& hAndF : RH_ptrs_fracs ) {
2278 sumE += hAndF.first->energy() * (noZS ? 1.0 : hAndF.second);
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
const DetId & detid() const
Sin< T >::type sin(const T &t)
Geom::Phi< T > phi() const
std::vector< EcalRecHit >::const_iterator const_iterator
const std::vector< std::pair< DetId, float > > & hitsAndFractions() const
static const int kTowersInPhi
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
static int position[TOTALCHAMBERS][3]
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
int iphi() const
get the crystal iphi
U second(std::pair< T, U > const &p)
int im() const
get the number of module inside the SM (1-4)
static const int kCrystalsInPhi
double dPhi(double phi1, double phi2)
const T & max(const T &a, const T &b)
Cos< T >::type cos(const T &t)
static const int kModulesPerSM
Abs< T >::type abs(const T &t)
int ieta() const
get the crystal ieta
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
const_iterator end() const
static const int MAX_IPHI
EcalClusterToolsT< true > EcalClusterTools
XYZVectorD XYZVector
spatial vector with cartesian internal representation
const CaloSubdetectorTopology * getSubdetectorTopology(const DetId &id) const
access the subdetector Topology for the given subdetector directly
std::vector< std::vector< double > > tmp
ESHandle< TrackerGeometry > geometry
iterator find(key_type k)
int factorial(int n)
factorial function
const CaloClusterPtr & seed() const
seed BasicCluster
double energySum(const DataFrame &df, int fs, int ls)
const GlobalPoint & getPosition() const
Returns the position of reference for this cell.
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id, const EcalRecHitCollection &rhs) const
Evaluate status from id.
Power< A, B >::type pow(const A &a, const B &b)
const_iterator begin() const