CMS 3D CMS Logo

MtdGlobalRecoValidation.cc
Go to the documentation of this file.
1 #include <string>
2 
7 
10 
15 
21 
24 
32 
34 public:
36  ~MtdGlobalRecoValidation() override;
37 
38  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
39 
40 private:
41  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
42 
43  void analyze(const edm::Event&, const edm::EventSetup&) override;
44 
45  // ------------ member data ------------
46 
48  const float trackMinEnergy_;
49  const float trackMinEta_;
50  const float trackMaxEta_;
51 
54 
62 
71 
73 
77 };
78 
79 // ------------ constructor and destructor --------------
81  : folder_(iConfig.getParameter<std::string>("folder")),
82  trackMinEnergy_(iConfig.getParameter<double>("trackMinimumEnergy")),
83  trackMinEta_(iConfig.getParameter<double>("trackMinimumEta")),
84  trackMaxEta_(iConfig.getParameter<double>("trackMaximumEta")) {
85  RecTrackToken_ = consumes<reco::TrackCollection>(iConfig.getParameter<edm::InputTag>("inputTagT"));
86  RecVertexToken_ = consumes<std::vector<reco::Vertex>>(iConfig.getParameter<edm::InputTag>("inputTagV"));
87 }
88 
90 
91 // ------------ method called for each event ------------
93  using namespace edm;
94  using namespace geant_units::operators;
95  using namespace std;
96 
97  edm::ESHandle<MTDTopology> topologyHandle;
98  iSetup.get<MTDTopologyRcd>().get(topologyHandle);
99  const MTDTopology* topology = topologyHandle.product();
100 
101  bool topo1Dis = false;
102  bool topo2Dis = false;
103  if (topology->getMTDTopologyMode() <= static_cast<int>(MTDTopologyMode::Mode::barphiflat)) {
104  topo1Dis = true;
105  }
106  if (topology->getMTDTopologyMode() > static_cast<int>(MTDTopologyMode::Mode::barphiflat)) {
107  topo2Dis = true;
108  }
109 
110  auto RecTrackHandle = makeValid(iEvent.getHandle(RecTrackToken_));
111  auto RecVertexHandle = makeValid(iEvent.getHandle(RecVertexToken_));
112 
113  // --- Loop over all RECO tracks ---
114  for (const auto& track : *RecTrackHandle) {
115  if (track.pt() < trackMinEnergy_)
116  continue;
117 
118  if (fabs(track.eta()) < trackMinEta_) {
119  // --- all BTL tracks (with and without hit in MTD) ---
123 
124  bool MTDBtl = false;
125  int numMTDBtlvalidhits = 0;
126  for (const auto hit : track.recHits()) {
127  if (hit->isValid() == false)
128  continue;
129  MTDDetId Hit = hit->geographicalId();
130  if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 1)) {
131  MTDBtl = true;
132  numMTDBtlvalidhits++;
133  }
134  }
135  meTrackNumHits_->Fill(numMTDBtlvalidhits);
136 
137  // --- keeping only tracks with last hit in MTD ---
138  if (MTDBtl == true) {
143  }
144  }
145 
146  else {
147  // --- all ETL tracks (with and without hit in MTD) ---
148  if ((track.eta() < -trackMinEta_) && (track.eta() > -trackMaxEta_)) {
149  meETLTrackEffEtaTot_[0]->Fill(track.eta());
150  meETLTrackEffPhiTot_[0]->Fill(track.phi());
151  meETLTrackEffPtTot_[0]->Fill(track.pt());
152  }
153 
154  if ((track.eta() > trackMinEta_) && (track.eta() < trackMaxEta_)) {
155  meETLTrackEffEtaTot_[1]->Fill(track.eta());
156  meETLTrackEffPhiTot_[1]->Fill(track.phi());
157  meETLTrackEffPtTot_[1]->Fill(track.pt());
158  }
159 
160  bool MTDEtlZnegD1 = false;
161  bool MTDEtlZnegD2 = false;
162  bool MTDEtlZposD1 = false;
163  bool MTDEtlZposD2 = false;
164  int numMTDEtlvalidhits = 0;
165  for (const auto hit : track.recHits()) {
166  if (hit->isValid() == false)
167  continue;
168  MTDDetId Hit = hit->geographicalId();
169  if ((Hit.det() == 6) && (Hit.subdetId() == 1) && (Hit.mtdSubDetector() == 2)) {
170  ETLDetId ETLHit = hit->geographicalId();
171 
172  if (topo2Dis) {
173  if ((ETLHit.zside() == -1) && (ETLHit.nDisc() == 1)) {
174  MTDEtlZnegD1 = true;
175  numMTDEtlvalidhits++;
176  }
177  if ((ETLHit.zside() == -1) && (ETLHit.nDisc() == 2)) {
178  MTDEtlZnegD2 = true;
179  numMTDEtlvalidhits++;
180  }
181  if ((ETLHit.zside() == 1) && (ETLHit.nDisc() == 1)) {
182  MTDEtlZposD1 = true;
183  numMTDEtlvalidhits++;
184  }
185  if ((ETLHit.zside() == 1) && (ETLHit.nDisc() == 2)) {
186  MTDEtlZposD2 = true;
187  numMTDEtlvalidhits++;
188  }
189  }
190 
191  if (topo1Dis) {
192  if (ETLHit.zside() == -1) {
193  MTDEtlZnegD1 = true;
194  numMTDEtlvalidhits++;
195  }
196  if (ETLHit.zside() == 1) {
197  MTDEtlZposD1 = true;
198  numMTDEtlvalidhits++;
199  }
200  }
201  }
202  }
203  meTrackNumHits_->Fill(-numMTDEtlvalidhits);
204 
205  // --- keeping only tracks with last hit in MTD ---
206  if ((track.eta() < -trackMinEta_) && (track.eta() > -trackMaxEta_)) {
207  if (MTDEtlZnegD1 == true) {
208  meETLTrackEffEtaMtd_[0]->Fill(track.eta());
209  meETLTrackEffPhiMtd_[0]->Fill(track.phi());
210  meETLTrackEffPtMtd_[0]->Fill(track.pt());
211  meETLTrackRPTime_[0]->Fill(track.t0());
212  }
213  if (MTDEtlZnegD2 == true) {
214  meETLTrackEffEtaMtd_[1]->Fill(track.eta());
215  meETLTrackEffPhiMtd_[1]->Fill(track.phi());
216  meETLTrackEffPtMtd_[1]->Fill(track.pt());
217  meETLTrackRPTime_[1]->Fill(track.t0());
218  }
219  }
220  if ((track.eta() > trackMinEta_) && (track.eta() < trackMaxEta_)) {
221  if (MTDEtlZposD1 == true) {
222  meETLTrackEffEtaMtd_[2]->Fill(track.eta());
223  meETLTrackEffPhiMtd_[2]->Fill(track.phi());
224  meETLTrackEffPtMtd_[2]->Fill(track.pt());
225  meETLTrackRPTime_[2]->Fill(track.t0());
226  }
227  if (MTDEtlZposD2 == true) {
228  meETLTrackEffEtaMtd_[3]->Fill(track.eta());
229  meETLTrackEffPhiMtd_[3]->Fill(track.phi());
230  meETLTrackEffPtMtd_[3]->Fill(track.pt());
231  meETLTrackRPTime_[3]->Fill(track.t0());
232  }
233  }
234  }
235  } //RECO tracks loop
236 
237  // --- Loop over the RECO vertices ---
238  int nv = 0;
239  for (const auto& v : *RecVertexHandle) {
240  if (v.isValid()) {
241  meVerZ_->Fill(v.z());
242  meVerTime_->Fill(v.t());
243  nv++;
244  } else
245  cout << "The vertex is not valid" << endl;
246  }
247  meVerNumber_->Fill(nv);
248 }
249 
250 // ------------ method for histogram booking ------------
252  edm::Run const& run,
253  edm::EventSetup const& iSetup) {
254  ibook.setCurrentFolder(folder_);
255 
256  // histogram booking
257  meBTLTrackRPTime_ = ibook.book1D("TrackBTLRPTime", "Track t0 with respect to R.P.;t0 [ns]", 100, -1, 3);
258  meBTLTrackEffEtaTot_ = ibook.book1D("TrackBTLEffEtaTot", "Track efficiency vs eta (Tot);#eta_{RECO}", 100, -1.6, 1.6);
260  ibook.book1D("TrackBTLEffPhiTot", "Track efficiency vs phi (Tot);#phi_{RECO} [rad]", 100, -3.2, 3.2);
261  meBTLTrackEffPtTot_ = ibook.book1D("TrackBTLEffPtTot", "Track efficiency vs pt (Tot);pt_{RECO} [GeV]", 50, 0, 10);
262  meBTLTrackEffEtaMtd_ = ibook.book1D("TrackBTLEffEtaMtd", "Track efficiency vs eta (Mtd);#eta_{RECO}", 100, -1.6, 1.6);
264  ibook.book1D("TrackBTLEffPhiMtd", "Track efficiency vs phi (Mtd);#phi_{RECO} [rad]", 100, -3.2, 3.2);
265  meBTLTrackEffPtMtd_ = ibook.book1D("TrackBTLEffPtMtd", "Track efficiency vs pt (Mtd);pt_{RECO} [GeV]", 50, 0, 10);
266  meETLTrackRPTime_[0] =
267  ibook.book1D("TrackETLRPTimeZnegD1", "Track t0 with respect to R.P. (-Z, Firstl Disk);t0 [ns]", 100, -1, 3);
268  meETLTrackRPTime_[1] =
269  ibook.book1D("TrackETLRPTimeZnegD2", "Track t0 with respect to R.P. (-Z, Second Disk);t0 [ns]", 100, -1, 3);
270  meETLTrackRPTime_[2] =
271  ibook.book1D("TrackETLRPTimeZposD1", "Track t0 with respect to R.P. (+Z, First Disk);t0 [ns]", 100, -1, 3);
272  meETLTrackRPTime_[3] =
273  ibook.book1D("TrackETLRPTimeZposD2", "Track t0 with respect to R.P. (+Z, Second Disk);t0 [ns]", 100, -1, 3);
275  ibook.book1D("TrackETLEffEtaTotZneg", "Track efficiency vs eta (Tot) (-Z);#eta_{RECO}", 100, -3.2, -1.4);
277  ibook.book1D("TrackETLEffEtaTotZpos", "Track efficiency vs eta (Tot) (+Z);#eta_{RECO}", 100, 1.4, 3.2);
279  ibook.book1D("TrackETLEffPhiTotZneg", "Track efficiency vs phi (Tot) (-Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
281  ibook.book1D("TrackETLEffPhiTotZpos", "Track efficiency vs phi (Tot) (+Z);#phi_{RECO} [rad]", 100, -3.2, 3.2);
283  ibook.book1D("TrackETLEffPtTotZneg", "Track efficiency vs pt (Tot) (-Z);pt_{RECO} [GeV]", 50, 0, 10);
285  ibook.book1D("TrackETLEffPtTotZpos", "Track efficiency vs pt (Tot) (+Z);pt_{RECO} [GeV]", 50, 0, 10);
287  ibook.book1D("TrackETLEffEtaMtdZnegD1",
288  "Track efficiency vs eta (Mtd) (-Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}",
289  100,
290  -3.2,
291  -1.4);
292  meETLTrackEffEtaMtd_[1] = ibook.book1D(
293  "TrackETLEffEtaMtdZnegD2", "Track efficiency vs eta (Mtd) (-Z, Second Disk);#eta_{RECO}", 100, -3.2, -1.4);
295  ibook.book1D("TrackETLEffEtaMtdZposD1",
296  "Track efficiency vs eta (Mtd) (+Z, Single(topo1D)/First(topo2D) Disk);#eta_{RECO}",
297  100,
298  1.4,
299  3.2);
300  meETLTrackEffEtaMtd_[3] = ibook.book1D(
301  "TrackETLEffEtaMtdZposD2", "Track efficiency vs eta (Mtd) (+Z, Second Disk);#eta_{RECO}", 100, 1.4, 3.2);
303  ibook.book1D("TrackETLEffPhiMtdZnegD1",
304  "Track efficiency vs phi (Mtd) (-Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]",
305  100,
306  -3.2,
307  3.2);
308  meETLTrackEffPhiMtd_[1] = ibook.book1D(
309  "TrackETLEffPhiMtdZnegD2", "Track efficiency vs phi (Mtd) (-Z, Second Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
311  ibook.book1D("TrackETLEffPhiMtdZposD1",
312  "Track efficiency vs phi (Mtd) (+Z, Single(topo1D)/First(topo2D) Disk);#phi_{RECO} [rad]",
313  100,
314  -3.2,
315  3.2);
316  meETLTrackEffPhiMtd_[3] = ibook.book1D(
317  "TrackETLEffPhiMtdZposD2", "Track efficiency vs phi (Mtd) (+Z, Second Disk);#phi_{RECO} [rad]", 100, -3.2, 3.2);
319  ibook.book1D("TrackETLEffPtMtdZnegD1",
320  "Track efficiency vs pt (Mtd) (-Z, Single(topo1D)/First(topo2D) Disk);pt_{RECO} [GeV]",
321  50,
322  0,
323  10);
324  meETLTrackEffPtMtd_[1] = ibook.book1D(
325  "TrackETLEffPtMtdZnegD2", "Track efficiency vs pt (Mtd) (-Z, Second Disk);pt_{RECO} [GeV]", 50, 0, 10);
327  ibook.book1D("TrackETLEffPtMtdZposD1",
328  "Track efficiency vs pt (Mtd) (+Z, Single(topo1D)/First(topo2D) Disk);pt_{RECO} [GeV]",
329  50,
330  0,
331  10);
332  meETLTrackEffPtMtd_[3] = ibook.book1D(
333  "TrackETLEffPtMtdZposD2", "Track efficiency vs pt (Mtd) (+Z, Second Disk);pt_{RECO} [GeV]", 50, 0, 10);
334  meTrackNumHits_ = ibook.book1D("TrackNumHits", "Number of valid MTD hits per track ; Number of hits", 10, -5, 5);
335  meVerZ_ = ibook.book1D("VerZ", "RECO Vertex Z;Z_{RECO} [cm]", 180, -18, 18);
336  meVerTime_ = ibook.book1D("VerTime", "RECO Vertex Time;t0 [ns]", 100, -1, 1);
337  meVerNumber_ = ibook.book1D("VerNumber", "RECO Vertex Number: Number of vertices", 100, 0, 500);
338 }
339 
340 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
341 
344 
345  desc.add<std::string>("folder", "MTD/GlobalReco");
346  desc.add<edm::InputTag>("inputTagT", edm::InputTag("trackExtenderWithMTD", ""));
347  desc.add<edm::InputTag>("inputTagV", edm::InputTag("offlinePrimaryVertices4D", ""));
348  desc.add<double>("trackMinimumEnergy", 1.0); // [GeV]
349  desc.add<double>("trackMinimumEta", 1.5);
350  desc.add<double>("trackMaximumEta", 3.2);
351 
352  descriptions.add("globalReco", desc);
353 }
354 
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
RefProd.h
Hit
Definition: HitCollection.h:12
dqm::impl::MonitorElement
Definition: MonitorElement.h:98
BTLDetId.h
HLT_FULL_cff.track
track
Definition: HLT_FULL_cff.py:11779
MtdGlobalRecoValidation::meETLTrackNumHits_
MonitorElement * meETLTrackNumHits_[4]
Definition: MtdGlobalRecoValidation.cc:64
MtdGlobalRecoValidation::meETLTrackRPTime_
MonitorElement * meETLTrackRPTime_[4]
Definition: MtdGlobalRecoValidation.cc:63
MtdGlobalRecoValidation::trackMinEnergy_
const float trackMinEnergy_
Definition: MtdGlobalRecoValidation.cc:48
MtdGlobalRecoValidation::~MtdGlobalRecoValidation
~MtdGlobalRecoValidation() override
Definition: MtdGlobalRecoValidation.cc:89
MtdGlobalRecoValidation::meBTLTrackEffEtaMtd_
MonitorElement * meBTLTrackEffEtaMtd_
Definition: MtdGlobalRecoValidation.cc:59
edm::Run
Definition: Run.h:45
MtdGlobalRecoValidation::RecVertexToken_
edm::EDGetTokenT< std::vector< reco::Vertex > > RecVertexToken_
Definition: MtdGlobalRecoValidation.cc:53
edm::EDGetTokenT< reco::TrackCollection >
edm
HLT enums.
Definition: AlignableModifier.h:19
MtdGlobalRecoValidation::meETLTrackEffEtaMtd_
MonitorElement * meETLTrackEffEtaMtd_[4]
Definition: MtdGlobalRecoValidation.cc:68
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HLT_FULL_cff.InputTag
InputTag
Definition: HLT_FULL_cff.py:89353
MTDGeometry.h
edm::ParameterSetDescription
Definition: ParameterSetDescription.h:52
dqm::implementation::NavigatorBase::setCurrentFolder
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:32
MTDDigiGeometryRecord.h
MtdGlobalRecoValidation::meBTLTrackEffPhiTot_
MonitorElement * meBTLTrackEffPhiTot_
Definition: MtdGlobalRecoValidation.cc:57
MtdGlobalRecoValidation::meETLTrackEffEtaTot_
MonitorElement * meETLTrackEffEtaTot_[2]
Definition: MtdGlobalRecoValidation.cc:65
DQMStore.h
MtdGlobalRecoValidation::meTrackNumHits_
MonitorElement * meTrackNumHits_
Definition: MtdGlobalRecoValidation.cc:72
MTDTopologyMode::Mode::barphiflat
MtdGlobalRecoValidation::RecTrackToken_
edm::EDGetTokenT< reco::TrackCollection > RecTrackToken_
Definition: MtdGlobalRecoValidation.cc:52
ETLDetId
Detector identifier class for the Endcap Timing Layer.
Definition: ETLDetId.h:15
MtdGlobalRecoValidation::bookHistograms
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: MtdGlobalRecoValidation.cc:251
geant_units::operators
Definition: GeantUnits.h:18
findQualityFiles.v
v
Definition: findQualityFiles.py:179
MTDTopologyMode.h
ETLDetId.h
MtdGlobalRecoValidation::meETLTrackEffPhiTot_
MonitorElement * meETLTrackEffPhiTot_[2]
Definition: MtdGlobalRecoValidation.cc:66
MtdGlobalRecoValidation::meETLTrackEffPtTot_
MonitorElement * meETLTrackEffPtTot_[2]
Definition: MtdGlobalRecoValidation.cc:67
MakerMacros.h
Track.h
edm::EventSetup::get
T get() const
Definition: EventSetup.h:80
DEFINE_FWK_MODULE
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::ConfigurationDescriptions::add
void add(std::string const &label, ParameterSetDescription const &psetDescription)
Definition: ConfigurationDescriptions.cc:57
MtdGlobalRecoValidation::meETLTrackEffPtMtd_
MonitorElement * meETLTrackEffPtMtd_[4]
Definition: MtdGlobalRecoValidation.cc:70
ecaldqm::topology
const CaloTopology * topology(nullptr)
MtdGlobalRecoValidation::trackMaxEta_
const float trackMaxEta_
Definition: MtdGlobalRecoValidation.cc:50
PtrVector.h
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
edm::ESHandle
Definition: DTSurvey.h:22
RectangularMTDTopology.h
ETLDetId::nDisc
int nDisc() const
Definition: ETLDetId.h:122
MTDDetId::zside
int zside() const
Definition: MTDDetId.h:61
MtdGlobalRecoValidation::meBTLTrackEffEtaTot_
MonitorElement * meBTLTrackEffEtaTot_
Definition: MtdGlobalRecoValidation.cc:56
DQMEDAnalyzer.h
edm::ConfigurationDescriptions
Definition: ConfigurationDescriptions.h:28
ValidHandle.h
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
Vertex.h
folder_
std::string folder_
Definition: DQMEDAnalyzer.cc:60
DQMEDAnalyzer
Definition: DQMEDAnalyzer.py:1
MTDTopology
Definition: MTDTopology.h:16
edm::ParameterSet
Definition: ParameterSet.h:47
RefVector.h
MTDTopologyRcd
Definition: MTDTopologyRcd.h:10
Event.h
GeantUnits.h
MtdGlobalRecoValidation::trackMinEta_
const float trackMinEta_
Definition: MtdGlobalRecoValidation.cc:49
Ptr.h
iEvent
int iEvent
Definition: GenABIO.cc:224
MtdGlobalRecoValidation::meBTLTrackEffPtMtd_
MonitorElement * meBTLTrackEffPtMtd_
Definition: MtdGlobalRecoValidation.cc:61
MtdGlobalRecoValidation::meBTLTrackRPTime_
MonitorElement * meBTLTrackRPTime_
Definition: MtdGlobalRecoValidation.cc:55
MtdGlobalRecoValidation
Definition: MtdGlobalRecoValidation.cc:33
edm::EventSetup
Definition: EventSetup.h:57
edm::makeValid
auto makeValid(const U &iOtherHandleType) noexcept(false)
Definition: ValidHandle.h:52
get
#define get
MtdGlobalRecoValidation::meVerZ_
MonitorElement * meVerZ_
Definition: MtdGlobalRecoValidation.cc:75
ProxyMTDTopology.h
submitPVResolutionJobs.desc
string desc
Definition: submitPVResolutionJobs.py:251
MtdGlobalRecoValidation::meVerNumber_
MonitorElement * meVerNumber_
Definition: MtdGlobalRecoValidation.cc:74
std
Definition: JetResolutionObject.h:76
writedatasetfile.run
run
Definition: writedatasetfile.py:27
Ref.h
MTDTopologyRcd.h
MtdGlobalRecoValidation::meETLTrackEffPhiMtd_
MonitorElement * meETLTrackEffPhiMtd_[4]
Definition: MtdGlobalRecoValidation.cc:69
MtdGlobalRecoValidation::meBTLTrackEffPhiMtd_
MonitorElement * meBTLTrackEffPhiMtd_
Definition: MtdGlobalRecoValidation.cc:60
Frameworkfwd.h
MTDDetId
Detector identifier base class for the MIP Timing Layer.
Definition: MTDDetId.h:21
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
dqm::implementation::IBooker
Definition: DQMStore.h:43
ParameterSet.h
MtdGlobalRecoValidation::analyze
void analyze(const edm::Event &, const edm::EventSetup &) override
Definition: MtdGlobalRecoValidation.cc:92
edm::Event
Definition: Event.h:73
MtdGlobalRecoValidation::folder_
const std::string folder_
Definition: MtdGlobalRecoValidation.cc:47
MtdGlobalRecoValidation::meVerTime_
MonitorElement * meVerTime_
Definition: MtdGlobalRecoValidation.cc:76
MtdGlobalRecoValidation::MtdGlobalRecoValidation
MtdGlobalRecoValidation(const edm::ParameterSet &)
Definition: MtdGlobalRecoValidation.cc:80
edm::InputTag
Definition: InputTag.h:15
MTDTopology.h
hit
Definition: SiStripHitEffFromCalibTree.cc:88
dqm::implementation::IBooker::book1D
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
MtdGlobalRecoValidation::meBTLTrackEffPtTot_
MonitorElement * meBTLTrackEffPtTot_
Definition: MtdGlobalRecoValidation.cc:58
MtdGlobalRecoValidation::fillDescriptions
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
Definition: MtdGlobalRecoValidation.cc:342