Belle II Software  release-08-01-10
RawCluster.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #include <framework/logging/Logger.h>
10 #include <svd/reconstruction/RawCluster.h>
11 #include <vxd/geometry/GeoCache.h>
12 #include <svd/geometry/SensorInfo.h>
13 #include <framework/core/Environment.h>
14 
15 #include <framework/datastore/StoreArray.h>
16 #include <svd/dataobjects/SVDShaperDigit.h>
17 #include <svd/calibration/SVDPulseShapeCalibrations.h>
18 #include <svd/reconstruction/SVDMaxSumAlgorithm.h>
19 
20 using namespace std;
21 
22 namespace Belle2 {
28  namespace SVD {
29 
30  RawCluster::RawCluster(VxdID vxdID, bool isUside, double cutSeed, double cutAdjacent)
31  : m_vxdID(vxdID)
32  , m_isUside(isUside)
33  , m_cutSeed(cutSeed)
34  , m_cutAdjacent(cutAdjacent)
35  , m_seedMaxSample(-1)
36  , m_seedSNR(-1)
37  , m_seedIndex(-1)
38  , m_seedInternalIndex(-1)
39  , m_storeShaperDigitsName("SVDShaperDigits")
40  {m_strips.clear();};
41 
42  RawCluster::RawCluster(VxdID vxdID, bool isUside, double cutSeed, double cutAdjacent, const std::string& storeShaperDigitsName)
43  : m_vxdID(vxdID)
44  , m_isUside(isUside)
45  , m_cutSeed(cutSeed)
46  , m_cutAdjacent(cutAdjacent)
47  , m_seedMaxSample(-1)
48  , m_seedSNR(-1)
49  , m_seedIndex(-1)
50  , m_seedInternalIndex(-1)
51  , m_storeShaperDigitsName(storeShaperDigitsName)
52  {m_strips.clear();};
53 
54  bool RawCluster::add(VxdID vxdID, bool isUside, struct StripInRawCluster& aStrip)
55  {
56 
57  bool added = false;
58 
59  //do not add if you are on the wrong sensor or side
60  if ((m_vxdID != vxdID) || (m_isUside != isUside))
61  return false;
62 
63  //do not add if its SNR is below the minimum SNR for adjacents strips
64  if ((float)aStrip.maxSample / aStrip.noise < m_cutAdjacent)
65  return false;
66 
67  //add if it's the first strip
68  if (m_strips.size() == 0)
69  added = true;
70 
71  //add if it is adjacent to the last strip added
72  //(we assume that SVDShaperDigits are ordered)
73  if ((m_strips.size() > 0 && (aStrip.cellID == m_strips.at(m_strips.size() - 1).cellID + 1)))
74  added = true;
75 
76  //add it to the vector of strips, update the seed max sample and index:
77  if (added) {
78  m_strips.push_back(aStrip);
79 
80  if (aStrip.maxSample > m_seedMaxSample) {
81  m_seedMaxSample = aStrip.maxSample;
82  m_seedSNR = (float)aStrip.maxSample / (float)aStrip.noise;
83  m_seedInternalIndex = m_strips.size() - 1;
85  }
86  }
87  return added;
88 
89  };
90 
91 
93  {
94 
95  bool isGood = false;
96 
97  if (m_seedMaxSample > 0 && m_seedSNR >= m_cutSeed)
98  isGood = true;
99 
100  return isGood;
101  };
102 
103 
105  {
106 
107  if (m_strips.size() == 0)
108  B2ERROR("oopps ... you are asking for the cluster samples of a cluster candidate with no strips");
109 
110  //steps:
111  //1.loop on m_strips
112  //2. access the index of the shaperdigit from the element of m_strip
113  //3. sum each sample for each strip accessed in the loop
114  //4. you are done
115 
116  Belle2::SVDShaperDigit::APVFloatSamples returnSamples = {0, 0, 0, 0, 0, 0};
117 
118  const StoreArray<SVDShaperDigit> m_storeShaperDigits(m_storeShaperDigitsName.c_str());
119 
120  SVDPulseShapeCalibrations pulseShapeCal;
121 
122  for (auto istrip : m_strips) {
123  const SVDShaperDigit* shaperdigit = m_storeShaperDigits[istrip.shaperDigitIndex];
124  if (!shaperdigit) B2ERROR("No SVDShaperDigit for this strip! Are you sure you set the correct SVDShaperDigit StoreArray name?");
125  Belle2::SVDShaperDigit::APVFloatSamples APVsamples = shaperdigit->getSamples();
126  for (int iSample = 0; iSample < static_cast<int>(APVsamples.size()); ++iSample)
127  if (inElectrons)
128  returnSamples.at(iSample) += pulseShapeCal.getChargeFromADC(m_vxdID, m_isUside, shaperdigit->getCellID(), APVsamples.at(iSample));
129  else
130  returnSamples.at(iSample) += APVsamples.at(iSample);
131  }
132 
133 
134  return returnSamples;
135  }
136 
137  std::pair<int, std::vector<float>> RawCluster::getMaxSum3Samples(bool inElectrons) const
138  {
139 
140  //take the cluster samples
141  Belle2::SVDShaperDigit::APVFloatSamples clsSamples = getClsSamples(inElectrons);
142 
143  SVDMaxSumAlgorithm maxSum = SVDMaxSumAlgorithm(clsSamples);
144  return std::make_pair(maxSum.getFirstFrame(), maxSum.getSelectedSamples());
145 
146  }
147 
148  } //SVD namespace
150 } //Belle2 namespace
This class defines the dbobject and the methods to access the SVD calibrations from the local runs pr...
double getChargeFromADC(const Belle2::VxdID &sensorID, const bool &isU, const unsigned short &strip, const double &pulseADC) const
Return the charge (number of electrons/holes) collected on a specific strip, given the number of ADC ...
The SVD ShaperDigit class.
std::array< APVFloatSampleType, c_nAPVSamples > APVFloatSamples
array of APVFloatSampleType objects
APVFloatSamples getSamples() const
Get array of samples.
short int getCellID() const
Get strip ID.
RawCluster()
Default Constructor to create an empty RawCluster.
Definition: RawCluster.h:40
std::pair< int, std::vector< float > > getMaxSum3Samples(bool inElectrons=false) const
Definition: RawCluster.cc:137
std::string m_storeShaperDigitsName
Name of the collection to use for the SVDShaperDigits.
Definition: RawCluster.h:165
Belle2::SVDShaperDigit::APVFloatSamples getClsSamples(bool inElectrons) const
Definition: RawCluster.cc:104
int m_seedInternalIndex
stripsInRawCluster index of the seed strip of the cluster
Definition: RawCluster.h:159
bool add(VxdID vxdID, bool isUside, struct StripInRawCluster &aStrip)
Add a Strip to the current cluster.
Definition: RawCluster.cc:54
bool m_isUside
side of the cluster
Definition: RawCluster.h:141
VxdID m_vxdID
VxdID of the cluster.
Definition: RawCluster.h:138
float m_seedSNR
SNR (using MaxSample) of the seed strip.
Definition: RawCluster.h:153
int m_seedMaxSample
ADC MaxSample of the seed strip.
Definition: RawCluster.h:150
double m_cutSeed
SNR above which the strip can be considered as seed.
Definition: RawCluster.h:144
int m_seedIndex
SVDShaperDigit index of the seed strip of the cluster.
Definition: RawCluster.h:156
std::vector< StripInRawCluster > m_strips
vector containing the strips in the cluster
Definition: RawCluster.h:162
double m_cutAdjacent
SNR above which the strip can be considered for clustering.
Definition: RawCluster.h:147
Class implementing the MaxSum algorithm.
std::vector< float > getSelectedSamples()
Accessor to arrays stored in the data store.
Definition: StoreArray.h:113
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
Abstract base class for different kinds of events.
structure containing the relevant informations of each strip of the raw cluster
Definition: RawCluster.h:20
int shaperDigitIndex
index of the shaper digit
Definition: RawCluster.h:21
int maxSample
ADC max of the acquired samples.
Definition: RawCluster.h:23