@@ -19,11 +19,13 @@ SBND::CRTCalibService::CRTCalibService(fhicl::ParameterSet const& pset)
1919{
2020 const std::string timingOffsetFile = pset.get <std::string>(" TimingOffsetFileName" );
2121 const std::string pedestalFile = pset.get <std::string>(" PedestalFileName" );
22+ const std::string badChannelsFile = pset.get <std::string>(" BadChannelsFileName" );
2223
23- std::string timingOffsetPath, pedestalPath;
24+ std::string timingOffsetPath, pedestalPath, badChannelsPath ;
2425 cet::search_path sp (" FW_SEARCH_PATH" );
2526 sp.find_file (timingOffsetFile, timingOffsetPath);
2627 sp.find_file (pedestalFile, pedestalPath);
28+ sp.find_file (badChannelsFile, badChannelsPath);
2729
2830 if (timingOffsetPath.empty ())
2931 {
@@ -37,9 +39,16 @@ SBND::CRTCalibService::CRTCalibService(fhicl::ParameterSet const& pset)
3739 throw cet::exception (" File not found" );
3840 }
3941
42+ if (badChannelsPath.empty ())
43+ {
44+ std::cout << " SBND::CRTCalibService Input file " << badChannelsFile << " not found" << std::endl;
45+ throw cet::exception (" File not found" );
46+ }
47+
4048 std::cout << " SBND CRT Channel Map: Building map from files...\n "
4149 << " \t Timing Offsets: " << timingOffsetFile << ' \n '
42- << " \t Pedestals: " << pedestalFile << std::endl;
50+ << " \t Pedestals: " << pedestalFile << ' \n '
51+ << " \t Bad Channels: " << badChannelsFile << std::endl;
4352
4453 std::ifstream timingOffsetStream (timingOffsetPath, std::ios::in);
4554 std::string line;
@@ -72,8 +81,49 @@ SBND::CRTCalibService::CRTCalibService(fhicl::ParameterSet const& pset)
7281
7382 fPedestalFromFEBMAC5AndChannel [mac5][ch] = pedestal;
7483 }
75-
84+
7685 pedestalStream.close ();
86+
87+ std::ifstream badChannelsStream (badChannelsPath, std::ios::in);
88+
89+ while (std::getline (badChannelsStream, line))
90+ {
91+ std::stringstream linestream (line);
92+
93+ unsigned int mac5, ch;
94+ std::string status_string;
95+
96+ linestream
97+ >> mac5
98+ >> ch
99+ >> status_string;
100+
101+ sbnd::crt::CRTChannelStatus status = sbnd::crt::CRTChannelStatus::kGoodChannel ;
102+ sbnd::crt::CRTChannelStatus status_pair = sbnd::crt::CRTChannelStatus::kGoodChannel ;
103+
104+ if (status_string.compare (" kDeadChannel" ) == 0 )
105+ {
106+ status = sbnd::crt::CRTChannelStatus::kDeadChannel ;
107+ status_pair = sbnd::crt::CRTChannelStatus::kDeadNeighbourChannel ;
108+ }
109+ else if (status_string.compare (" kQuietChannel" ) == 0 )
110+ {
111+ status = sbnd::crt::CRTChannelStatus::kQuietChannel ;
112+ status_pair = sbnd::crt::CRTChannelStatus::kQuietNeighbourChannel ;
113+ }
114+ else
115+ {
116+ std::cout << " SBND::CRTCalibService unknown channel status " << status_string << std::endl;
117+ throw cet::exception (" Unknown status" );
118+ }
119+
120+ fChannelStatusFromFEBMAC5AndChannel [mac5][ch] = status;
121+
122+ unsigned int ch_pair = ch % 2 ? ch - 1 : ch + 1 ;
123+ fChannelStatusFromFEBMAC5AndChannel [mac5][ch_pair] = status_pair;
124+ }
125+
126+ badChannelsStream.close ();
77127}
78128
79129SBND ::CRTCalibService::CRTCalibService(fhicl::ParameterSet const & pset, art::ActivityRegistry&)
@@ -125,4 +175,20 @@ double SBND::CRTCalibService::GetPedestalFromFEBMAC5AndChannel(unsigned int feb_
125175 return subIter->second ;
126176}
127177
178+ enum sbnd::crt::CRTChannelStatus SBND::CRTCalibService::GetChannelStatusFromFEBMAC5AndChannel (unsigned int feb_mac5,
179+ unsigned int ch) const
180+ {
181+ auto iter = fChannelStatusFromFEBMAC5AndChannel .find (feb_mac5);
182+
183+ if (iter == fChannelStatusFromFEBMAC5AndChannel .end ())
184+ return sbnd::crt::CRTChannelStatus::kGoodChannel ;
185+
186+ auto subIter = iter->second .find (ch);
187+
188+ if (subIter == iter->second .end ())
189+ return sbnd::crt::CRTChannelStatus::kGoodChannel ;
190+
191+ return subIter->second ;
192+ }
193+
128194DEFINE_ART_SERVICE (SBND ::CRTCalibService)
0 commit comments