Execute on an entire collection of clusters.
331{
333
335
336
337
338 using clusterIdx_t = std::uint16_t;
339 typedef std::pair<clusterIdx_t, clusterIdx_t> clusterPair_t;
340 std::vector<clusterPair_t> clusterIdx;
341 const clusterIdx_t noCluster = std::numeric_limits<clusterIdx_t>::max();
342
343 const CaloNoise*
noise=
nullptr;
347 }
348
349 SG::ReadCondHandle<CaloDetDescrManager> caloMgrHandle{
m_caloMgrKey, ctx };
350 const CaloDetDescrManager* caloDDMgr = *caloMgrHandle;
351
352
353 int nbEmpty[CaloCell_ID::Unknown];
354 int nbNonEmpty[CaloCell_ID::Unknown];
355
356
357
358
360
361 if (theClusColl->size() >= noCluster) {
362 msg(MSG::ERROR) <<
"Too many clusters" <<
endmsg;
363 return StatusCode::FAILURE;
364 }
365
366
367 clusterIdx.resize(
m_calo_id->calo_cell_hash_max(),
368 clusterPair_t(noCluster, noCluster));
369
370 int iClus = 0;
372
375 for(; cellIter != cellIterEnd; cellIter++ ){
377 const CaloCell* pCell = *cellIter;
378 const CaloDetDescrElement * caloDDE = pCell->
caloDDE();
379
380
381 IdentifierHash hashid=caloDDE->
calo_hash() ;
383 if(hashid >= (signalCells)->
size())
continue;
384
385 pCell = (*signalCells).findCell(hashid);
386 if(!pCell) continue;
387
388
389 Identifier myId = pCell->
ID();
390 IdentifierHash myHashId =
m_calo_id->calo_cell_hash(myId);
391 if ( clusterIdx[(unsigned int)myHashId].first != noCluster) {
392
394 if ( weight > 0.5 )
395 clusterIdx[(
unsigned int)myHashId].first = iClus;
396 }
397 else {
398 clusterIdx[(
unsigned int)myHashId].first = iClus;
399 }
400 }
401 ++iClus;
402 }
403 }
404
405
406
407
408
409 std::vector<CaloClusterMomentsMaker_DigiHSTruth_detail::cellinfo> cellinfo;
410 std::vector<double> maxSampE (CaloCell_ID::Unknown);
413 std::vector<std::tuple<int,int> > nCellsSamp; nCellsSamp.reserve(CaloCell_ID::Unknown);
414 std::vector<IdentifierHash> theNeighbors;
415
418 int iClus = 0;
419 for( ;clusIter!=clusIterEnd;++clusIter,++iClus) {
421
422 double w(0),xc(0),yc(0),zc(0),
mx(0),
my(0),
mz(0),
mass(0);
423 double eBad(0),ebad_dac(0),ePos(0),eBadLArQ(0),sumSig2(0),maxAbsSig(0);
424 double eLAr2(0),eLAr2Q(0);
425 double eTile2(0),eTile2Q(0);
426 double eBadLArHV(0);
427 int nbad(0),nbad_dac(0),nBadLArHV(0);
428 unsigned int i,nSigSampl(0);
429 unsigned int theNumOfCells = theCluster->
size();
430
431 double theClusterEnergy = 0;
432 double theClusterAbsEnergy = 0;
433 double theClusterEta = 0;
434 double theClusterPhi = 0;
435 double theNewSecondTime = 0;
436 double timeNorm = 0;
437
438
439 int iCellMax(-1);
440 int iCellScndMax(-1);
441
442 cellinfo.clear();
443 if (cellinfo.capacity() == 0)
444 cellinfo.reserve (theNumOfCells*2);
445
446 double phi0 = theCluster->
phi();
447
448 for(i=0;
i<(
unsigned int)CaloCell_ID::Unknown;
i++)
449 maxSampE[i] = 0;
450
452 std::fill (myMoments.begin(), myMoments.end(), 0);
453 std::fill (myNorms.begin(), myNorms.end(), 0);
455 std::fill_n(nbNonEmpty, CaloCell_ID::Unknown, 0);
456 std::fill_n(nbEmpty, CaloCell_ID::Unknown, 0);
457 }
458
459
462 for(; cellIter != cellIterEnd; cellIter++ ){
464
465 const CaloCell* pCell = (*cellIter);
466 const CaloDetDescrElement* caloDDE = pCell->
caloDDE();
467
468
469 IdentifierHash hashid=caloDDE->
calo_hash() ;
471 if(hashid >= (signalCells)->
size())
continue;
472 pCell = (*signalCells).findCell(hashid);
473
474
475 Identifier myId = pCell->
ID();
476 const CaloDetDescrElement* myCDDE = pCell->
caloDDE();
477 if (!myCDDE){
479 return StatusCode::FAILURE;
480 }
481 double ene = pCell->
e();
484
485 double cellPhi = myCDDE->
phi();
486 double thePhi =
proxim (cellPhi, phi0);
487
488 theClusterEnergy +=
weight * ene;
489 theClusterAbsEnergy +=
weight*std::abs(ene);
490 theClusterEta +=
weight*std::abs(ene)*pCell->
eta();
491 theClusterPhi +=
weight*std::abs(ene)* thePhi;
492
495 nbad++;
496 if(ene!=0){
498 nbad_dac++;
499 }
500 }
501 else {
504 && !((pCell->
provenance() & 0x0800) == 0x0800)) {
507 }
510 }
515
516 if ( ((tq1&0xFF) != 0xFF) && ((tq2&0xFF) != 0xFF) ) {
518
519
521 }
522 }
523 }
524 if ( ene > 0 ) {
526 }
527
529
531
535
537
541 if ( ( std::abs(Sig) > std::abs(maxAbsSig) ) ||
542 ( std::abs(Sig) == std::abs(maxAbsSig) && thisSampl > nSigSampl ) ||
543 ( std::abs(Sig) == std::abs(maxAbsSig) && thisSampl == nSigSampl && Sig > maxAbsSig ) ) {
544 maxAbsSig = Sig;
545 nSigSampl = thisSampl;
546 }
547
548 }
549 else {
550 if ( std::abs(Sig) > std::abs(maxAbsSig) ) {
551 maxAbsSig = Sig;
553 }
554 }
555 }
557
558
559
560 IdentifierHash myHashId =
m_calo_id->calo_cell_hash(myId);
561 if ( clusterIdx[myHashId].first == iClus ) {
562 theNeighbors.clear();
564 for (const auto& nhash: theNeighbors) {
565 clusterPair_t&
idx = clusterIdx[nhash];
566
567
568 if (
idx.second == iClus )
continue;
570
571 if (
idx.first == noCluster ) {
572 ++ nbEmpty[
m_calo_id->calo_sample(nhash)];
573 }
else if (
idx.first != iClus ) {
574 ++ nbNonEmpty[
m_calo_id->calo_sample(nhash)];
575 }
576
577 }
578 }
579 }
582 if (sam != CaloSampling::PreSamplerB &&
583 sam != CaloSampling::PreSamplerE){
584 unsigned int pmask = myCDDE->
is_tile() ? 0x8080 : 0x2000;
585
587
588 double theTimeNorm = std::abs(weight) *
weight * ene * ene;
589 theNewSecondTime += theTimeNorm * pCell->
time() * pCell->
time();
590 timeNorm += theTimeNorm;
591 }
592 }
593 }
594
595
596 if ( ene > 0. && weight > 0) {
597
598 cellinfo.push_back (CaloClusterMomentsMaker_DigiHSTruth_detail::cellinfo {
603 .eta = myCDDE->
eta(),
604 .phi = myCDDE->
phi(),
605 .r = 0,
606 .lambda = 0,
607 .volume = myCDDE->
volume(),
609 .identifier = cellIter.
index()
610
611
612
613 });
614
615 CaloClusterMomentsMaker_DigiHSTruth_detail::cellinfo& ci = cellinfo.back();
616
619
621 if (iCellMax < 0 ||
622 ci.
energy > cellinfo[iCellMax].energy ||
623 (ci.
energy == cellinfo[iCellMax].energy && ci.
identifier > cellinfo[iCellMax].identifier) ) {
624 iCellScndMax = iCellMax;
625 iCellMax = cellinfo.size()-1;
626 }
627 else if (iCellScndMax < 0 ||
628 ci.
energy > cellinfo[iCellScndMax].energy ||
629 (ci.
energy == cellinfo[iCellScndMax].energy && ci.
identifier > cellinfo[iCellScndMax].identifier) )
630 {
631 iCellScndMax = cellinfo.size()-1;
632 }
633 }
634 else {
635 if (iCellMax < 0 || ci.energy > cellinfo[iCellMax].energy ) {
636 iCellScndMax = iCellMax;
637 iCellMax = cellinfo.size()-1;
638 }
639 else if (iCellScndMax < 0 ||
640 ci.
energy > cellinfo[iCellScndMax].energy )
641 {
642 iCellScndMax = cellinfo.size()-1;
643 }
644 }
645
649
650 double dir = ci.
x*ci.
x+ci.
y*ci.
y+ci.
z*ci.
z;
651
652 if ( dir > 0) {
655 }
659
661 }
662 }
665 eBadLArHV= hvFrac.first;
666 nBadLArHV=hvFrac.second;
667 }
668
671 if ( mass > 0) {
673 }
674 else {
675
677 }
678
679 if (w == 0) {
681 }
682
688
689
690
691
692
693
694
697
698
699
700
701
702
704 if ( cellinfo.size() > 2 ) {
705 Eigen::Matrix3d
C=Eigen::Matrix3d::Zero();
706 for(const CaloClusterMomentsMaker_DigiHSTruth_detail::cellinfo& ci : cellinfo) {
708
709 C(0,0) +=
e2*(ci.
x-xc)*(ci.
x-xc);
710 C(1,0) +=
e2*(ci.
x-xc)*(ci.
y-yc);
711 C(2,0) +=
e2*(ci.
x-xc)*(ci.
z-zc);
712
713 C(1,1) +=
e2*(ci.
y-yc)*(ci.
y-yc);
714 C(2,1) +=
e2*(ci.
y-yc)*(ci.
z-zc);
715
716 C(2,2) +=
e2*(ci.
z-zc)*(ci.
z-zc);
718 }
719 C/=(
w != 0 ?
w : 1.0);
720
721 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigensolver(
C);
722 if (eigensolver.info() != Eigen::Success) {
723 msg(MSG::WARNING) <<
"Failed to compute Eigenvalues -> Can't determine shower axis" <<
endmsg;
724 }
725 else {
726
727
728
729 const Eigen::Vector3d&
S=eigensolver.eigenvalues();
730 const Eigen::Matrix3d& U=eigensolver.eigenvectors();
731
733
734 if ( std::abs(S[0]) >= epsilon && std::abs(S[1]) >= epsilon && std::abs(S[2]) >= epsilon ) {
735
737 int iEigen = -1;
738
741
742
743 double tmpAngle=
Amg::angle(tmpAxis,showerAxis);
744
745 if ( tmpAngle > 90*
deg ) {
746 tmpAngle = 180*
deg - tmpAngle;
747 tmpAxis = -tmpAxis;
748 }
749
750 if ( iEigen == -1 || tmpAngle <
angle ) {
753 prAxis = tmpAxis;
754 }
755 }
756
757
758
760
761 deltaTheta = showerAxis.theta() - prAxis.theta();
762
763
764
766 showerAxis = prAxis;
767 }
768 else
770 << prAxis[
Amg::y] <<
", " << prAxis[
Amg::z] <<
") deviates more than "
772 <<
" deg from IP-to-ClusterCenter-axis (" << showerAxis[
Amg::x] <<
", "
773 << showerAxis[
Amg::y] <<
", " << showerAxis[
Amg::z] <<
")");
774 }
775 else {
776 ATH_MSG_DEBUG(
"Eigenvalues close to 0, do not use principal axis");
777 }
778 }
779 }
780
782 << showerAxis[
Amg::y] <<
", " << showerAxis[
Amg::z] <<
")");
783
784
785
786
787
788
789 for (auto& ci : cellinfo) {
791
792 ci.
r = ((currentCell-showerCenter).cross(showerAxis)).mag();
793
794 ci.
lambda = (currentCell-showerCenter).
dot(showerAxis);
795 }
796
797
798
799
800 double commonNorm = 0;
801 double phi0 = cellinfo.size() > 0 ? cellinfo[0].phi : 0;
802
803 for(
unsigned i=0;
i<cellinfo.size();
i++) {
804 const CaloClusterMomentsMaker_DigiHSTruth_detail::cellinfo& ci = cellinfo[
i];
805
809 ++ iMoment)
810 {
811
813 case FIRST_ETA_DigiHSTruth:
815 break;
816 case FIRST_PHI_DigiHSTruth:
817
818
819
821 break;
822 case SECOND_R_DigiHSTruth:
823 myMoments[iMoment] += ci.
energy*ci.
r*ci.
r;
824 break;
825 case SECOND_LAMBDA_DigiHSTruth:
827 break;
828 case LATERAL_DigiHSTruth:
829 if ( (int)i != iCellMax && (int)i != iCellScndMax ) {
830 myMoments[iMoment] += ci.
energy*ci.
r*ci.
r;
831 myNorms[iMoment] += ci.
energy*ci.
r*ci.
r;
832 }
833 else {
837 myNorms[iMoment] += rm*rm*ci.
energy;
838 }
839 break;
840 case LONGITUDINAL_DigiHSTruth:
841 if ( (int)i != iCellMax && (int)i != iCellScndMax ) {
844 }
845 else {
849 myNorms[iMoment] += lm*lm*ci.
energy;
850 }
851 break;
852 case FIRST_ENG_DENS_DigiHSTruth:
855 myNorms[iMoment] += ci.
energy;
856 }
857 break;
858 case SECOND_ENG_DENS_DigiHSTruth:
861 myNorms[iMoment] += ci.
energy;
862 }
863 break;
864 case ENG_FRAC_EM_DigiHSTruth:
865 if ( ci.
sample == CaloCell_ID::EMB1
866 || ci.
sample == CaloCell_ID::EMB2
867 || ci.
sample == CaloCell_ID::EMB3
868 || ci.
sample == CaloCell_ID::EME1
869 || ci.
sample == CaloCell_ID::EME2
870 || ci.
sample == CaloCell_ID::EME3
871 || ci.
sample == CaloCell_ID::FCAL0 )
872 myMoments[iMoment] += ci.
energy;
873 break;
874 case ENG_FRAC_MAX_DigiHSTruth:
875 if ( (int)i == iCellMax )
876 myMoments[iMoment] = ci.
energy;
877 break;
878 case PTD_DigiHSTruth:
879
880
881
883 myNorms[iMoment] += ci.
energy;
884 break;
885 default:
886
887 break;
888 }
889 }
890 }
891
892
895 ++ iMoment)
896 {
897
899 case FIRST_ETA_DigiHSTruth:
900 case FIRST_PHI_DigiHSTruth:
901 case SECOND_R_DigiHSTruth:
902 case SECOND_LAMBDA_DigiHSTruth:
903 case ENG_FRAC_EM_DigiHSTruth:
904 case ENG_FRAC_MAX_DigiHSTruth:
905 myNorms[iMoment] = commonNorm;
906 break;
907 case DELTA_PHI_DigiHSTruth:
909 break;
910 case DELTA_THETA_DigiHSTruth:
911 myMoments[iMoment] = deltaTheta;
912 break;
913 case DELTA_ALPHA_DigiHSTruth:
914 myMoments[iMoment] =
angle;
915 break;
916 case CENTER_X_DigiHSTruth:
917 myMoments[iMoment] = showerCenter.x();
918 break;
919 case CENTER_Y_DigiHSTruth:
920 myMoments[iMoment] = showerCenter.y();
921 break;
922 case CENTER_Z_DigiHSTruth:
923 myMoments[iMoment] = showerCenter.z();
924 break;
925 case CENTER_MAG_DigiHSTruth:
926 myMoments[iMoment] = showerCenter.mag();
927 break;
928 case CENTER_LAMBDA_DigiHSTruth:
929
930
931
932
933
934
935 {
936 double r_calo(0),z_calo(0),lambda_c(0);
938 showerCenter.eta(),
939 showerCenter.phi(),
940 caloDDMgr);
941 if ( r_calo == 0 ) {
943 showerCenter.eta(),
944 showerCenter.phi(),
945 caloDDMgr);
946 if ( z_calo == 0 )
948 showerCenter.eta(),
949 showerCenter.phi(),
950 caloDDMgr);
951 if ( z_calo == 0 )
953 showerCenter.eta(),
954 showerCenter.phi(),
955 caloDDMgr);
956 if ( z_calo == 0 )
958 showerCenter.eta(),
959 showerCenter.phi(),
960 caloDDMgr);
961 if ( z_calo != 0 && showerAxis.z() != 0 ) {
962 lambda_c = std::abs((z_calo-showerCenter.z())/showerAxis.z());
963 }
964 }
965 else {
966 double r_s2 = showerAxis.x()*showerAxis.x()
967 +showerAxis.y()*showerAxis.y();
968 double r_cs = showerAxis.x()*showerCenter.x()
969 +showerAxis.y()*showerCenter.y();
970 double r_cr = showerCenter.x()*showerCenter.x()
971 +showerCenter.y()*showerCenter.y()-r_calo*r_calo;
972 if ( r_s2 > 0 ) {
973 double det = r_cs*r_cs/(r_s2*r_s2) - r_cr/r_s2;
974 if ( det > 0 ) {
976 double l1(-r_cs/r_s2);
980 if ( std::abs(l1) < std::abs(l2) )
981 lambda_c = std::abs(l1);
982 else
983 lambda_c = std::abs(l2);
984 }
985 }
986 }
987 myMoments[iMoment] = lambda_c;
988 }
989 break;
990 case ENG_FRAC_CORE_DigiHSTruth:
991 for(i=0;
i<(
int)CaloCell_ID::Unknown;
i++)
992 myMoments[iMoment] += maxSampE[i];
993 myNorms[iMoment] = commonNorm;
994 break;
995 case ISOLATION_DigiHSTruth:
996 {
997
998
999 for(
unsigned int i=0;
i != CaloSampling::Unknown; ++
i) {
1002 const double eSample = theCluster->
eSample(s);
1003 if (eSample > 0) {
1004 int nAll = nbEmpty[
i]+nbNonEmpty[
i];
1005 if (nAll > 0) {
1006 myMoments[iMoment] += (eSample*nbEmpty[
i])/nAll;
1007 myNorms[iMoment] += eSample;
1008 }
1009 }
1010 }
1011 }
1012 }
1013 break;
1014 case ENG_BAD_CELLS_DigiHSTruth:
1015 myMoments[iMoment] = eBad;
1016 break;
1017 case N_BAD_CELLS_DigiHSTruth:
1018 myMoments[iMoment] = nbad;
1019 break;
1020 case N_BAD_CELLS_CORR_DigiHSTruth:
1021 myMoments[iMoment] = nbad_dac;
1022 break;
1023 case BAD_CELLS_CORR_E_DigiHSTruth:
1024 myMoments[iMoment] = ebad_dac;
1025 break;
1026 case BADLARQ_FRAC_DigiHSTruth:
1027 myMoments[iMoment] = eBadLArQ/(theCluster->
e()!=0.?theCluster->
e():1.);
1028 break;
1029 case ENG_POS_DigiHSTruth:
1030 myMoments[iMoment] = ePos;
1031 break;
1032 case SIGNIFICANCE_DigiHSTruth:
1033 myMoments[iMoment] = (sumSig2>0?theCluster->
e()/sqrt(sumSig2):0.);
1034 break;
1035 case CELL_SIGNIFICANCE_DigiHSTruth:
1036 myMoments[iMoment] = maxAbsSig;
1037 break;
1038 case CELL_SIG_SAMPLING_DigiHSTruth:
1039 myMoments[iMoment] = nSigSampl;
1040 break;
1041 case AVG_LAR_Q_DigiHSTruth:
1042 myMoments[iMoment] = eLAr2Q/(eLAr2>0?eLAr2:1);
1043 break;
1044 case AVG_TILE_Q_DigiHSTruth:
1045 myMoments[iMoment] = eTile2Q/(eTile2>0?eTile2:1);
1046 break;
1047 case ENG_BAD_HV_CELLS_DigiHSTruth:
1048 myMoments[iMoment] = eBadLArHV;
1049 break;
1050 case N_BAD_HV_CELLS_DigiHSTruth:
1051 myMoments[iMoment] = nBadLArHV;
1052 break;
1053 case PTD_DigiHSTruth:
1054 myMoments[iMoment] = sqrt(myMoments[iMoment]);
1055 break;
1056 case MASS_DigiHSTruth:
1057 myMoments[iMoment] =
mass;
1058 break;
1059 case ENERGY_DigiHSTruth:
1060 myMoments[iMoment] = theClusterEnergy;
1061 break;
1062 case ETA_DigiHSTruth:
1063 if(theClusterAbsEnergy > 0)
1064 myMoments[iMoment] = theClusterEta / theClusterAbsEnergy;
1065 else{
1066 myMoments[iMoment] = 0;
1067 }
1068 break;
1069 case PHI_DigiHSTruth:
1070 if(theClusterAbsEnergy > 0)
1072 else{
1073 myMoments[iMoment] = 0;
1074 }
1075 break;
1076 default:
1077
1078 break;
1079 }
1080 }
1081 }
1082
1083
1085 for (
size_t iMoment = 0; iMoment !=
size; ++iMoment) {
1087 if ( myNorms[iMoment] != 0 )
1088 myMoments[iMoment] /= myNorms[iMoment];
1089 if ( moment == FIRST_PHI_DigiHSTruth )
1092 }
1093 }
1094
1096 double secondTime(0.0);
1097 if (timeNorm > 0){
1098 secondTime = theNewSecondTime/timeNorm-theCluster->
time()*theCluster->
time();
1099 }
1101 }
1102
1103 }
1104
1105 return StatusCode::SUCCESS;
1106}
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
size_t size() const
Number of registered mappings.
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
float time() const
get time (data member)
virtual double e() const override final
get energy (data member) (synonym to method energy()
double energy() const
get energy (data member)
const CaloDetDescrElement * caloDDE() const
get pointer to CaloDetDescrElement (data member)
uint16_t provenance() const
get provenance (data member)
virtual double eta() const override final
get eta (through CaloDetDescrElement)
uint16_t quality() const
get quality (data member)
virtual bool badcell() const
check is cell is dead
CaloGain::CaloGain gain() const
get gain (data member )
Identifier ID() const
get ID (from cached data member) non-virtual and inline for fast access
unsigned index() const
Accessor for the index of the cell in the CaloCellContainer.
weight_t weight() const
Accessor for weight associated to this cell.
SG::ReadCondHandleKey< CaloNoise > m_noiseCDOKey
Key of the CaloNoise Conditions data object.
bool m_secondTime
Retrieve second moment of cell times and store as moment.
SG::ReadHandleKey< CaloCellContainer > m_signalCellKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Gaudi::Property< bool > m_useGPUCriteria
std::vector< xAOD::CaloCluster::MomentType > m_validMoments
set of moments which will be calculated.
IdentifierHash calo_hash() const
cell calo hash
bool is_tile() const
cell belongs to Tile
CaloCell_ID::CaloSample getSampling() const
cell sampling
float eta() const
cell eta
float phi() const
cell phi
float volume() const
cell volume
static double fix(double phi)
static double diff(double phi1, double phi2)
simple phi1 - phi2 calculation, but result is fixed to respect range.
DataModel_detail::iterator< DataVector > iterator
constexpr bool is_valid() const
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version).
flt_t time() const
Access cluster time.
size_t size() const
size method (forwarded from CaloClusterCellLink obj)
CaloClusterCellLink::iterator cell_iterator
Iterator of the underlying CaloClusterCellLink (non-const version).
virtual double e() const
The total energy of the particle.
void insertMoment(MomentType type, double value)
const_cell_iterator cell_end() const
float eSample(const CaloSample sampling) const
virtual double phi() const
The azimuthal angle ( ) of the particle.
MomentType
Enums to identify different moments.
@ SECOND_TIME_DigiHSTruth
const_cell_iterator cell_begin() const
Iterator of the underlying CaloClusterCellLink (const version).
CaloSampling::CaloSample CaloSample
bool hasSampling(const CaloSample s) const
Checks if certain smapling contributes to cluster.
void setMag(Amg::Vector3D &v, double mag)
scales the vector length without changing the angles
double angle(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
calculates the opening angle between two vectors
Eigen::Matrix< double, 3, 1 > Vector3D
void nextDDE(Iter iter, Iter endIter)
Prefetch next CaloDDE.
void prefetchNext(Iter iter, Iter endIter)
Prefetch next object in sequence.
dot(G, fn, nodesToHighlight=[])
double e2(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 2nd sampling
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
double proxim(double b, double a)
CaloCell_ID::CaloSample sample
#define CXXUTILS_TRAPPING_FP