Skip to content

Commit 9bdd09b

Browse files
authored
Merge pull request #466 from SBNSoftware/trj_digitalnoisechannelstatus_may3_2024
Trj digitalnoisechannelstatus may3 2024
2 parents 80a3419 + 372f12a commit 9bdd09b

4 files changed

Lines changed: 187 additions & 0 deletions

File tree

sbndcode/Utilities/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ cet_build_plugin( SignalShapingServiceSBND art::service SOURCE SignalShapingSer
2727
${sbnd_util_lib_list}
2828
)
2929

30+
cet_build_plugin( DigitalNoiseChannelStatus art::service SOURCE DigitalNoiseChannelStatus_service.cc LIBRARIES
31+
${sbnd_util_lib_list}
32+
)
33+
3034
cet_build_plugin ( SBNDGeoHelper art::module
3135
larcorealg::Geometry
3236
larcore::Geometry_Geometry_service
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
////////////////////////////////////////////////////////////////////////
2+
// Class: DigitalNoiseChannelStatus
3+
// Plugin Type: service (Unknown Unknown)
4+
// File: DigitalNoiseChannelStatus_service.cc
5+
//
6+
// Generated at Thu May 2 17:24:05 2024 by Thomas Junk using cetskelgen
7+
// from cetlib version 3.18.02.
8+
////////////////////////////////////////////////////////////////////////
9+
10+
#ifndef DigitalNoiseChannelStatusService_H
11+
#define DigitalNoiseChannelStatusService_H
12+
13+
#include "art/Framework/Services/Registry/ActivityRegistry.h"
14+
#include "art/Framework/Services/Registry/ServiceMacros.h"
15+
#include "fhiclcpp/ParameterSet.h"
16+
17+
#include "lardataobj/RawData/RawDigit.h"
18+
#include "lardataobj/RecoBase/Wire.h"
19+
20+
#include <unordered_set>
21+
22+
namespace sbnd {
23+
class DigitalNoiseChannelStatus;
24+
}
25+
26+
27+
class sbnd::DigitalNoiseChannelStatus {
28+
public:
29+
explicit DigitalNoiseChannelStatus(fhicl::ParameterSet const& p, art::ActivityRegistry& areg);
30+
// The compiler-generated destructor is fine for non-base
31+
// classes without bare pointers or other resource use.
32+
33+
bool IsBad(raw::ChannelID_t chan) const;
34+
35+
const std::unordered_set<raw::ChannelID_t> & GetSetOfBadChannels() const;
36+
37+
size_t NBadChannels() const;
38+
39+
void pub_PrepEvent(const art::Event& evt, art::ScheduleContext);
40+
41+
private:
42+
43+
std::unordered_set<raw::ChannelID_t> fDNChannels; // set of channels with digital noise on them on this event
44+
float fRMSCutWire;
45+
float fRMSCutRawDigit;
46+
int fNBADCutRawDigit;
47+
std::string fRawDigitLabel;
48+
std::string fRecobWireLabel;
49+
50+
int fNAwayFromPedestalRawDigit;
51+
int fDistFromPedestalRawDigit;
52+
int fNAwayFromPedestalRecobWire;
53+
float fDistFromPedestalRecobWire;
54+
55+
};
56+
57+
DECLARE_ART_SERVICE(sbnd::DigitalNoiseChannelStatus, LEGACY)
58+
59+
#endif
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
BEGIN_PROLOG
2+
3+
DigitalNoiseChannelStatusDefaults :
4+
{
5+
RawDigitLabel: "daq"
6+
RecobWireLabel: "caldata"
7+
RMSCutRawDigit: 100
8+
RMSCutWire: 100
9+
NBADCutRawDigit: 5
10+
NAwayFromPedestalRawDigit: 200
11+
DistFromPedestalRawDigit: 1000
12+
NAwayFromPedestalRecobWire: 200
13+
DistFromPedestalRecobWire: 1000
14+
}
15+
16+
END_PROLOG
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
2+
#include "DigitalNoiseChannelStatus.h"
3+
#include "TMath.h"
4+
#include "lardataobj/RawData/raw.h"
5+
#include "art/Framework/Principal/Event.h"
6+
7+
sbnd::DigitalNoiseChannelStatus::DigitalNoiseChannelStatus(fhicl::ParameterSet const& p, art::ActivityRegistry& areg)
8+
// :
9+
// Initialize member data here.
10+
{
11+
fRMSCutWire = p.get<float>("RMSCutWire",100.0);
12+
fRMSCutRawDigit = p.get<float>("RMSCutRawDigit",100.0);
13+
fNBADCutRawDigit = p.get<float>("NBADCutRawDigit",5);
14+
fRawDigitLabel = p.get<std::string>("RawDigitLabel","daq");
15+
fRecobWireLabel = p.get<std::string>("RecobWireLabel","caldata");
16+
fNAwayFromPedestalRawDigit = p.get<int>("NAwayFromPedestalRawDigit",100);
17+
fDistFromPedestalRawDigit = p.get<int>("DistFromPedestalRawDigit",100);
18+
fNAwayFromPedestalRecobWire = p.get<int>("NAwayFromPedestalRecobWire",100);
19+
fDistFromPedestalRecobWire = p.get<float>("DistFromPedestalRecobWire",100);
20+
21+
areg.sPreProcessEvent.watch(this, &sbnd::DigitalNoiseChannelStatus::pub_PrepEvent);
22+
}
23+
24+
bool sbnd::DigitalNoiseChannelStatus::IsBad(raw::ChannelID_t chan) const
25+
{
26+
return (fDNChannels.find(chan) != fDNChannels.end());
27+
}
28+
29+
const std::unordered_set<raw::ChannelID_t> & sbnd::DigitalNoiseChannelStatus::GetSetOfBadChannels() const
30+
{
31+
return fDNChannels;
32+
}
33+
34+
size_t sbnd::DigitalNoiseChannelStatus::NBadChannels() const
35+
{
36+
return fDNChannels.size();
37+
}
38+
39+
// prepare channel status data for the event
40+
41+
// put cuts on RMS, number of 0xBAD samples, and whether the differences between a sample and
42+
// the first are all even (catches all the powers of two).
43+
44+
void sbnd::DigitalNoiseChannelStatus::pub_PrepEvent(const art::Event& evt, art::ScheduleContext)
45+
{
46+
fDNChannels.clear();
47+
if (fRawDigitLabel != "")
48+
{
49+
auto const& rawdigits = evt.getProduct<std::vector<raw::RawDigit>>(fRawDigitLabel);
50+
for (const auto& rd : rawdigits)
51+
{
52+
bool chanbad = false;
53+
chanbad |= (rd.GetSigma() > fRMSCutRawDigit);
54+
int nhexbad = 0;
55+
std::vector<short> rawadc;
56+
rawadc.resize(rd.Samples());
57+
raw::Uncompress(rd.ADCs(), rawadc, rd.GetPedestal(), rd.Compression());
58+
bool alleven = true;
59+
int naway = 0;
60+
const short adc0 = rawadc.at(0);
61+
for (size_t i=0; i< rd.Samples(); ++i)
62+
{
63+
const short adc = rawadc.at(i);
64+
if (adc == 0xBAD) ++nhexbad;
65+
alleven &= ( ((adc - adc0) % 2) == 0 );
66+
if (std::abs(adc - rd.GetPedestal()) > fDistFromPedestalRawDigit)
67+
{
68+
++naway;
69+
}
70+
}
71+
chanbad |= (nhexbad > fNBADCutRawDigit);
72+
chanbad |= alleven;
73+
chanbad |= (naway > fNAwayFromPedestalRawDigit);
74+
if (chanbad) fDNChannels.emplace(rd.Channel());
75+
}
76+
}
77+
else if (fRecobWireLabel != "")
78+
{
79+
art::InputTag rwtag(fRecobWireLabel);
80+
auto const& rbwires = evt.getProduct<std::vector<recob::Wire>>(fRecobWireLabel);
81+
for (const auto& rw : rbwires)
82+
{
83+
bool chanbad = false;
84+
auto rms = TMath::RMS(rw.NSignal(),rw.Signal().data());
85+
chanbad |= (rms > fRMSCutWire);
86+
auto mns = TMath::Mean(rw.NSignal(),rw.Signal().data());
87+
int naway = 0;
88+
for (size_t i=0; i<rw.NSignal(); ++i)
89+
{
90+
if (std::abs(rw.Signal()[i] - mns) > fDistFromPedestalRecobWire)
91+
{
92+
naway ++;
93+
}
94+
}
95+
chanbad |= (naway > fNAwayFromPedestalRecobWire);
96+
if (chanbad) fDNChannels.emplace(rw.Channel());
97+
}
98+
}
99+
//std::cout << "sbnd::DigitalNoiseStatus_service: NBadChannels: " << fDNChannels.size() << std::endl;
100+
//for (const auto& c : fDNChannels)
101+
// {
102+
// std::cout << "noisy chan: " << c << std::endl;
103+
// }
104+
}
105+
106+
DEFINE_ART_SERVICE(sbnd::DigitalNoiseChannelStatus)
107+
108+

0 commit comments

Comments
 (0)