File indexing completed on 2024-04-06 11:59:39
0001 #include "CalibTracker/SiStripAPVAnalysis/interface/TT6ApvMask.h"
0002 #include <cmath>
0003 #include <numeric>
0004 #include <algorithm>
0005 using namespace std;
0006
0007
0008
0009 TT6ApvMask::TT6ApvMask(int ctype, float ncut, float dcut, float tcut) {
0010 theCalculationFlag_ = ctype;
0011 theNoiseCut_ = ncut;
0012 theDeadCut_ = dcut;
0013 theTruncationCut_ = tcut;
0014 }
0015
0016
0017
0018
0019 TT6ApvMask::~TT6ApvMask() {
0020 if (false)
0021 cout << "Destructing TT6ApvMask " << endl;
0022 }
0023
0024
0025
0026 void TT6ApvMask::calculateMask(const ApvAnalysis::PedestalType& in) {
0027 theMask_.clear();
0028 ApvAnalysis::PedestalType temp_in(in);
0029 double sumVal, sqSumVal, avVal, sqAvVal, rmsVal;
0030 sort(temp_in.begin(), temp_in.end());
0031 int nSize = in.size();
0032 int cutLow = int(nSize * theTruncationCut_);
0033 int cutHigh = int(nSize * theTruncationCut_);
0034 int effSize = nSize - cutLow - cutHigh;
0035 sumVal = 0.0;
0036 sqSumVal = 0.0;
0037 sumVal = accumulate((temp_in.begin() + cutLow), (temp_in.end() - cutHigh), 0.0);
0038 sqSumVal = inner_product((temp_in.begin() + cutLow), (temp_in.end() - cutHigh), (temp_in.begin() + cutLow), 0.0);
0039
0040 avVal = (effSize) ? sumVal / float(effSize) : 0.0;
0041 sqAvVal = (effSize) ? sqSumVal / float(effSize) : 0.0;
0042 rmsVal = (sqAvVal - avVal * avVal > 0.0) ? sqrt(sqAvVal - avVal * avVal) : 0.0;
0043 if (false)
0044 cout << " TT6ApvMask::calculateMask Mean " << avVal << " RMS " << rmsVal << " " << effSize << endl;
0045 for (unsigned int i = 0; i < in.size(); i++) {
0046 if (defineNoisy(static_cast<float>(avVal), static_cast<float>(rmsVal), in[i])) {
0047 theMask_.push_back(noisy);
0048 } else if (in[i] < theDeadCut_ * avVal) {
0049 theMask_.push_back(dead);
0050 } else {
0051 theMask_.push_back(ok);
0052 }
0053 }
0054 }
0055
0056
0057
0058
0059
0060 bool TT6ApvMask::defineNoisy(float avrg, float rms, float noise) {
0061 bool temp;
0062 temp = false;
0063 if (theCalculationFlag_ == 1) {
0064 if ((noise - avrg) > theNoiseCut_ * rms) {
0065 temp = true;
0066 if (false)
0067 cout << " Mean " << avrg << " rms " << rms << " Noise " << noise << endl;
0068 }
0069 } else if (theCalculationFlag_ == 2) {
0070 if ((noise - avrg) > avrg * theNoiseCut_)
0071 temp = true;
0072 } else if (theCalculationFlag_ == 3) {
0073 if (noise > theNoiseCut_)
0074 temp = true;
0075 }
0076 return temp;
0077 }