Belle II Software  release-06-01-15
ARICHDQMModule.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 // Own include
10 #include <arich/modules/arichDQM/ARICHDQMModule.h>
11 
12 // ARICH
13 #include <arich/dbobjects/ARICHGeometryConfig.h>
14 #include <arich/dbobjects/ARICHChannelMapping.h>
15 #include <arich/dbobjects/ARICHMergerMapping.h>
16 #include <arich/dbobjects/ARICHGeoDetectorPlane.h>
17 #include <arich/dbobjects/ARICHGeoAerogelPlane.h>
18 #include <arich/dataobjects/ARICHHit.h>
19 #include <arich/dataobjects/ARICHDigit.h>
20 #include <arich/dataobjects/ARICHAeroHit.h>
21 #include <arich/dataobjects/ARICHTrack.h>
22 #include <arich/dataobjects/ARICHLikelihood.h>
23 #include <arich/dataobjects/ARICHPhoton.h>
24 
25 #include <mdst/dataobjects/Track.h>
26 #include <mdst/dataobjects/MCParticle.h>
27 
28 // framework - DataStore
29 #include <framework/datastore/StoreArray.h>
30 
31 // Dataobject classes
32 #include <framework/database/DBObjPtr.h>
33 
34 #include <TF1.h>
35 #include <TVector3.h>
36 #include <TDirectory.h>
37 
38 #include <fstream>
39 #include <math.h>
40 
41 using namespace std;
42 
43 namespace Belle2 {
49  //-----------------------------------------------------------------
50  // Register module
51  //-----------------------------------------------------------------
52 
53  REG_MODULE(ARICHDQM);
54 
55  ARICHDQMModule::ARICHDQMModule() : HistoModule()
56  {
57  // set module description (e.g. insert text)
58  setDescription("Make summary of data quality.");
60  addParam("debug", m_debug, "debug mode", false);
61  addParam("UpperMomentumLimit", m_momUpLim, "Upper momentum limit of tracks included in monitoring", 10.0);
62  addParam("LowerMomentumLimit", m_momDnLim, "Lower momentum limit of tracks included in monitoring", 2.5);
63  addParam("ArichEvents", m_arichEvents, "Include only hits from events where an extrapolated track to arich exists", false);
64  addParam("MaxHits", m_maxHits, "Include only events with less than MaxHits hits in ARICH (remove loud events)", 70000);
65  addParam("MinHits", m_minHits, "Include only events with more than MinHits hits in ARICH", 0);
66  }
67 
69  {
70  }
71 
73  {
74 
75  TDirectory* oldDir = gDirectory;
76  TDirectory* dirARICHDQM = oldDir->mkdir("ARICH");
77  dirARICHDQM->cd();
78 
79  //Histograms for analysis and statistics
80 
81  h_chStat = new TH1D("chStat", "Status of channels;Channel serial;Status", 420 * 144, -0.5, 420 * 144 - 0.5);
82  h_aeroStat = new TH1D("aeroStat", "Status of aerogels;Aerogel tile serial;Status", 160, -0.5, 160 - 0.5);
83  h_chHit = new TH1D("chHit", "Number of hits in each channel;Channel serial;Hits", 420 * 144, -0.5, 420 * 144 - 0.5);
84  h_chipHit = new TH1D("chipHit", "Number of hits in each chip;Chip serial;Hits", 420 * 4, -0.5, 420 * 4 - 0.5);
85  h_hapdHit = new TH1D("hapdHit", "Number of hits in each HAPD;HAPD serial;Hits", 420, 0.5, 421 - 0.5);
86  h_hapdHitPerEvent = new TH2D("hapdHitPerEvent", "Number of hits in each HAPD per Event;HAPD serial;Hits/event", 420, 0.5, 420 + 0.5,
87  144, -0.5, 143.5);
88  h_trackPerEvent = new TH1D("trackPerEvent", "Number of tracks in ARICH per event; # of tracks;Events", 6, -0.5, 5.5);
89 
90  h_mergerHit = new TH1D("mergerHit", "Number of hits in each merger board;MB ID;Hits", 72, 0.5, 72 + 0.5);
91  h_bitsPerMergerNorm = new TH2D("bitsPerMergerNorm", "Normalised number of hits in each bit in each Merger;Bit;MB ID;Hits", 5,
92  -1 - 0.5,
93  4 - 0.5, 72, 0.5, 72 + 0.5); // copy of h_bits, normalised to number of connected Hapds and to sum(bit1, bit2)
94  h_bitsPerHapdMerger = new TH2D("bitsPerHapdMerger",
95  "Number of hits in each bit in each Hapd sorted by mergers;Bit;HAPD unsorted;Hits", 5, -1 - 0.5,
96  4 - 0.5, 432, 1, 432);
97 
98  h_aerogelHit = new TH1D("aerogelHit", "Number track associated hits in each aerogel tile;Aerogel slot ID;Hits", 125, -0.5,
99  125 - 0.5);
100  h_bits = new TH1D("bits", "Number of hits in each bit;Bit;Hits", 5, -1 - 0.5,
101  4 - 0.5); //Bin at -1 is added to set minimum 0 without SetMinimum(0) due to bugs in jsroot on DQM server.
102  h_bitsPerChannel = new TH2D("bitsPerChannel", "Number of hits in each bit in each chanenel;Bit;channel #;Hits", 4, - 0.5,
103  4 - 0.5, 420 * 144, -0.5, 420 * 144 - 0.5); // copy of h_bits
104  h_hitsPerTrack2D = new TH2D("hitsPerTrack2D", "2D distribution of track associated hits;X[cm];Y[cm];Hits", 230, -115, 115, 230,
105  -115, 115);
106  h_tracks2D = new TH2D("tracks2D", "Distribution track positions;X[cm];Y[cm];Tracks", 230, -115, 115, 230, -115, 115);
107 
108  h_hitsPerEvent = new TH1D("hitsPerEvent", "Number of hit per event;Number of hits;Events", 150, -0.5, 150 - 0.5);
109  h_theta = new TH1D("theta", "Cherenkov angle distribution;Angle [rad];Events", 60, 0, M_PI / 6);
110  h_hitsPerTrack = new TH1D("hitsPerTrack", "Number of hit per track;Number of hits;Tracks", 150, -0.5, 150 - 0.5);
111 
112  for (int i = 0; i < 6; i++) {
113  h_secTheta[i] = new TH1D(Form("thetaSec%d", i + 1), Form("Cherenkov angle distribution in sector %d;Angle [rad];Events", i + 1),
114  60, 0, M_PI / 6);
115  h_secHitsPerTrack[i] = new TH1D(Form("hitsPerTrackSec%d", i + 1),
116  Form("Number of hit per track in sector %d;Number of hits;Tracks", i + 1), 150, -0.5, 150 - 0.5);
117  h_secHapdHit[i] = new TH1D(Form("hapdHit%d", i + 1), Form("Number of hits in each HAPD in sector %d;HAPD serial;Hits", i + 1), 70,
118  0.5, 71 - 0.5);
119  }
120 
121  h_chDigit = new TH1D("chDigit", "Number of raw digits in each channel;Channel serial;Hits", 420 * 144, -0.5, 420 * 144 - 0.5);
122  h_chipDigit = new TH1D("chipDigit", "Number of raw digits in each chip;Chip serial;Hits", 420 * 4, -0.5, 420 * 4 - 0.5);
123  h_hapdDigit = new TH1D("hapdDigit", "Number of raw digits in each HAPD;HAPD serial;Hits", 420, 0.5, 421 - 0.5);
124 
125  h_aerogelHits3D = new TH3D("aerogelHits3D", "Number of track associated hits for each aerogel tile; #phi section; r section", 125,
126  -0.5, 124.5, 20, 0, 20, 20, 0, 20);
127  h_mirrorThetaPhi = new TH3D("mirrorThetaPhi",
128  "Cherenkov theta vs Cherenkov phi for mirror reflected photons; mirroID; #phi_{c} [rad]; #theta_{c} [rad]", 18, 0.5, 18.5, 100,
129  -M_PI, M_PI, 100, 0, 0.5);
130  h_thetaPhi = new TH2D("thetaPhi", "Cherenkov theta vs phi;#phi [rad];#theta_{c} [rad]", 100, -M_PI, M_PI, 100, 0., 0.5);
131 
132  h_flashPerAPD = new TH1D("flashPerAPD", "Number of flashes per APD; APD serial; number of flash", 420 * 4, -0.5, 420 * 4 - 0.5);
133 
134  h_ARICHOccAfterInjLer = new TH1F("ARICHOccInjLER", " ARICHOccInjLER /Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
135  h_ARICHOccAfterInjHer = new TH1F("ARICHOccInjHER", " ARICHOccInjHER /Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
136  h_ARICHEOccAfterInjLer = new TH1F("ARICHEOccInjLER", "ARICHEOccInjLER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
137  h_ARICHEOccAfterInjHer = new TH1F("ARICHEOccInjHER", "ARICHEOccInjHER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
138 
139  //Select "LIVE" monitoring histograms
140  h_chStat->SetOption("LIVE");
141  h_aeroStat->SetOption("LIVE");
142 
143  h_chHit->SetOption("LIVE");
144  h_chipHit->SetOption("LIVE");
145  h_hapdHit->SetOption("LIVE");
146 
147  h_chDigit->SetOption("LIVE");
148  h_chipDigit->SetOption("LIVE");
149  h_hapdDigit->SetOption("LIVE");
150  h_mergerHit->SetOption("LIVE");
151  h_bitsPerMergerNorm->SetOption("LIVE");
152  h_bitsPerHapdMerger->SetOption("LIVE");
153 
154  h_aerogelHit->SetOption("LIVE");
155  h_bits->SetOption("LIVE");
156  h_hitsPerTrack2D->SetOption("LIVE");
157  h_tracks2D->SetOption("LIVE");
158 
159  h_hitsPerEvent->SetOption("LIVE");
160  h_theta->SetOption("LIVE");
161  h_hitsPerTrack->SetOption("LIVE");
162  h_trackPerEvent->SetOption("LIVE");
163  h_flashPerAPD->SetOption("LivE");
164 
165  for (int i = 0; i < 6; i++) {
166  h_secTheta[i]->SetOption("LIVE");
167  h_secHitsPerTrack[i]->SetOption("LIVE");
168  }
169  h_ARICHOccAfterInjLer->SetOption("LIVE");
170  h_ARICHEOccAfterInjLer->SetOption("LIVE");
171  h_ARICHOccAfterInjHer->SetOption("LIVE");
172  h_ARICHEOccAfterInjHer->SetOption("LIVE");
173 
174  //Set the minimum to 0
175  h_chDigit->SetMinimum(0);
176  h_chipDigit->SetMinimum(0);
177  h_hapdDigit->SetMinimum(0);
178  h_chHit->SetMinimum(0);
179  h_chipHit->SetMinimum(0);
180  h_hapdHit->SetMinimum(0);
181  h_mergerHit->SetMinimum(0);
182  h_bitsPerMergerNorm->SetMinimum(0);
183  h_bitsPerHapdMerger->SetMinimum(0);
184  h_aerogelHit->SetMinimum(0);
185  h_bits->SetMinimum(0);
186  h_bitsPerChannel->SetMinimum(0);
187  h_hitsPerTrack2D->SetMinimum(0);
188  h_tracks2D->SetMinimum(0);
189  h_flashPerAPD->SetMinimum(0);
190  h_hitsPerEvent->SetMinimum(0);
191  h_theta->SetMinimum(0);
192  h_hitsPerTrack->SetMinimum(0);
193  h_ARICHOccAfterInjLer->SetMinimum(0);
194  h_ARICHEOccAfterInjLer->SetMinimum(0);
195  h_ARICHOccAfterInjHer->SetMinimum(0);
196  h_ARICHEOccAfterInjHer->SetMinimum(0);
197 
198  for (int i = 0; i < 6; i++) {
199  h_secTheta[i]->SetMinimum(0);
200  h_secHitsPerTrack[i]->SetMinimum(0);
201  }
202 
203  oldDir->cd();
204  }
205 
207  {
208  REG_HISTOGRAM
209  StoreArray<MCParticle> MCParticles;
210  MCParticles.isOptional();
211  StoreArray<Track> tracks;
212  tracks.isOptional();
213  StoreArray<ARICHHit> arichHits;
214  arichHits.isOptional();
215  StoreArray<ARICHDigit> arichDigits;
216  arichDigits.isRequired();
217  StoreArray<ARICHTrack> arichTracks;
218  arichTracks.isOptional();
219  StoreArray<ARICHAeroHit> arichAeroHits;
220  arichAeroHits.isOptional();
221  StoreArray<ARICHLikelihood> likelihoods;
222  likelihoods.isOptional();
223  m_rawFTSW.isOptional();
224  }
225 
227  {
228 
229  h_chStat->Reset();
230  h_aeroStat->Reset();
231  h_chDigit->Reset();
232  h_chipDigit->Reset();
233  h_hapdDigit->Reset();
234 
235  h_chHit->Reset();
236  h_chipHit->Reset();
237  h_hapdHit->Reset();
238  h_mergerHit->Reset();
239  h_bitsPerMergerNorm->Reset();
240  h_bitsPerHapdMerger->Reset();
241 
242  h_aerogelHit->Reset();
243  h_bits->Reset();
244  h_bitsPerChannel->Reset();
245  h_hitsPerTrack2D->Reset();
246  h_tracks2D->Reset();
247  h_aerogelHits3D->Reset();
248 
249  h_hitsPerEvent->Reset();
250  h_theta->Reset();
251  h_hitsPerTrack->Reset();
252  h_trackPerEvent->Reset();
253  h_flashPerAPD->Reset();
254  h_mirrorThetaPhi->Reset();
255  h_thetaPhi->Reset();
256 
257  for (int i = 0; i < 6; i++) {
258  h_secTheta[i]->Reset();
259  h_secHitsPerTrack[i]->Reset();
260  }
261 
262  h_ARICHOccAfterInjLer->Reset();
263  h_ARICHEOccAfterInjLer->Reset();
264  h_ARICHOccAfterInjHer->Reset();
265  h_ARICHEOccAfterInjHer->Reset();
266  }
267 
269  {
270  StoreArray<MCParticle> MCParticles;
271  StoreArray<Track> tracks;
272  StoreArray<ARICHDigit> arichDigits;
273  StoreArray<ARICHHit> arichHits;
274  StoreArray<ARICHTrack> arichTracks;
275  StoreArray<ARICHAeroHit> arichAeroHits;
276  StoreArray<ARICHLikelihood> arichLikelihoods;
277  DBObjPtr<ARICHGeometryConfig> arichGeoConfig;
278  const ARICHGeoDetectorPlane& arichGeoDec = arichGeoConfig->getDetectorPlane();
279  const ARICHGeoAerogelPlane& arichGeoAero = arichGeoConfig->getAerogelPlane();
280  DBObjPtr<ARICHChannelMapping> arichChannelMap;
281  DBObjPtr<ARICHMergerMapping> arichMergerMap;
282 
283  setReturnValue(1);
284 
285  if (arichHits.getEntries() < m_minHits || arichHits.getEntries() > m_maxHits) { setReturnValue(0); return;}
286 
287  if (!arichLikelihoods.getEntries() && m_arichEvents) { setReturnValue(0); return;}
288 
289  std::vector<int> apds(420 * 4, 0);
290  for (const auto& digit : arichDigits) {
291  uint8_t bits = digit.getBitmap();
292  int moduleID = digit.getModuleID();
293  int channelID = digit.getChannelID();
294  int mergerID = arichMergerMap->getMergerID(moduleID);
295  int febSlot = arichMergerMap->getFEBSlot(moduleID);
296  unsigned binID = (mergerID - 1) * N_FEB2MERGER + (febSlot);
297 
298  for (int i = 0; i < 8; i++) {
299  if ((bits & (1 << i)) && !(bits & ~(1 << i))) {
300  h_bits->Fill(i);
301  h_bitsPerChannel->Fill(i, (moduleID - 1) * 144 + channelID);
302  h_bitsPerMergerNorm->Fill(i, mergerID);
303  h_bitsPerHapdMerger->Fill(i, binID);
304  } else if (!bits) {
305  h_bits->Fill(8);
306  h_bitsPerChannel->Fill(8, (moduleID - 1) * 144 + channelID);
307  h_bitsPerMergerNorm->Fill(8, mergerID);
308  h_bitsPerHapdMerger->Fill(8, binID);
309  }
310  }
311 
312  // fill occupancy histograms for raw data
313  h_chDigit ->Fill((moduleID - 1) * 144 + channelID);
314  int chip = (moduleID - 1) * 4 + channelID / 36;
315  h_chipDigit->Fill(chip);
316  apds[chip] += 1;
317  h_hapdDigit->Fill(moduleID);
318  }
319 
320  int iapd = 0;
321  for (auto apd : apds) { if (apd > 20) h_flashPerAPD->Fill(iapd); iapd++;}
322 
323  std::vector<int> hpd(420, 0);
324  int nHit = 0;
325 
326  for (int i = 0; i < arichHits.getEntries(); i++) {
327 
328  int moduleID = arichHits[i]->getModule();
329  int channelID = arichHits[i]->getChannel();
330  h_chHit->Fill((moduleID - 1) * 144 + channelID);
331  hpd[moduleID - 1]++;
332  h_chipHit->Fill((moduleID - 1) * 4 + channelID / 36);
333  h_hapdHit->Fill(moduleID);
334  if (moduleID > 420) B2INFO("Invalid hapd number " << LogVar("hapd ID", moduleID));
335 
336  for (int j = 1; j <= 7; j++) {
337  int ringStart = (j - 1) * (84 + (j - 2) * 6) / 2 + 1; // The smallest module ID in each ring
338  int ringEnd = j * (84 + (j - 1) * 6) / 2; // The biggest module ID in each ring
339  if (ringStart <= moduleID && moduleID <= ringEnd) {
340  h_secHapdHit[(moduleID - ringStart) / (6 + j)]->Fill((moduleID - ringStart) % (6 + j) + 1 + (ringStart - 1) / 6);
341  }
342  }
343 
344  int mergerID = arichMergerMap->getMergerID(moduleID);
345  h_mergerHit->Fill(mergerID);
346  nHit++;
347  }
348 
349  h_hitsPerEvent->Fill(nHit);
350  int mmid = 1;
351  for (auto hh : hpd) { h_hapdHitPerEvent->Fill(mmid, hh); mmid++;}
352 
353  int ntrk = 0;
354  for (const auto& arichTrack : arichTracks) {
355 
356 
357  //Momentum limits are applied
358  //if (arichTrack.getPhotons().size() == 0) continue;
359  if (arichTrack.getMomentum() > 0.5) ntrk++; // count tracks with momentum larger than 0.5 GeV
360  if (arichTrack.getMomentum() < m_momDnLim || arichTrack.getMomentum() > m_momUpLim) continue;
361 
362  TVector3 recPos = arichTrack.getPosition();
363  int trSector = 0;
364  double dPhi = 0;
365  if (recPos.Phi() >= 0) {
366  dPhi = recPos.Phi();
367  } else {
368  dPhi = 2 * M_PI + recPos.Phi();
369  }
370  while (dPhi > M_PI / 3 && trSector < 5) {
371  dPhi -= M_PI / 3;
372  trSector++;
373  }
374  double trR = recPos.XYvector().Mod();
375  double trPhi = 0;
376  if (recPos.Phi() >= 0) {
377  trPhi = recPos.Phi();
378  } else {
379  trPhi = 2 * M_PI + recPos.Phi();
380  }
381 
382  int iRing = 0;
383  int iAzimuth = 0;
384  while (arichGeoAero.getRingRadius(iRing + 1) < trR && iRing < 4) {
385  iRing++;
386  }
387  if (iRing == 0) continue;
388  while (arichGeoAero.getRingDPhi(iRing) * (iAzimuth + 1) < trPhi) {
389  iAzimuth++;
390  }
391 
392  h_tracks2D->Fill(recPos.X(), recPos.Y());
393 
394  std::vector<ARICHPhoton> photons = arichTrack.getPhotons();
395  for (auto& photon : photons) {
396  if (photon.getMirror() == 0) {
397  if (trR < 93.) {
398  h_thetaPhi->Fill(photon.getPhiCer(), photon.getThetaCer());
399  h_theta->Fill(photon.getThetaCer());
400  }
401  int hitSector = 0;
402  double hitPhi = arichGeoDec.getSlotPhi(arichHits[photon.getHitID()]->getModule());
403  if (hitPhi < 0) hitPhi += 2 * M_PI;
404  while (hitPhi > M_PI / 3 && hitSector < 5) {
405  hitPhi -= M_PI / 3;
406  hitSector++;
407  }
408  h_secTheta[hitSector]->Fill(photon.getThetaCer());
409  } else {
410  if (trR > 95.) h_mirrorThetaPhi->Fill(photon.getMirror(), photon.getPhiCer(), photon.getThetaCer());
411  }
412  }
413 
414  //Get ARICHLikelihood related to the ARICHTrack
415  const ExtHit* extHit = arichTrack.getRelated<ExtHit>();
416  const Track* mdstTrack = NULL;
417  if (extHit) mdstTrack = extHit->getRelated<Track>();
418  const ARICHLikelihood* lkh = NULL;
419  if (mdstTrack) lkh = mdstTrack->getRelated<ARICHLikelihood>();
420  else lkh = arichTrack.getRelated<ARICHLikelihood>();
421 
422  if (lkh) {
423  if (!lkh->getFlag()) continue; //Fill only when the number of expected photons is more than 0.
424  double nphoton = lkh->getDetPhot();
425  h_hitsPerTrack->Fill(nphoton);
426  h_secHitsPerTrack[trSector]->Fill(nphoton);
427  h_hitsPerTrack2D->Fill(recPos.X(), recPos.Y(), nphoton);
428  int aeroID = arichGeoAero.getAerogelTileID(recPos.X(), recPos.Y());
429  h_aerogelHits3D->Fill(aeroID, (trPhi - arichGeoAero.getRingDPhi(iRing)*iAzimuth) / (arichGeoAero.getRingDPhi(iRing) / 20) ,
430  (trR - arichGeoAero.getRingRadius(iRing)) / ((arichGeoAero.getRingRadius(iRing + 1) - arichGeoAero.getRingRadius(iRing)) / 20),
431  nphoton);
432  h_aerogelHit->Fill(aeroID, nphoton);
433  }
434  }
435 
436  h_trackPerEvent->Fill(ntrk);
437 
438  for (auto& it : m_rawFTSW) {
439  B2DEBUG(29, "TTD FTSW : " << hex << it.GetTTUtime(0) << " " << it.GetTTCtime(0) << " EvtNr " << it.GetEveNo(0) << " Type " <<
440  (it.GetTTCtimeTRGType(0) & 0xF) << " TimeSincePrev " << it.GetTimeSincePrevTrigger(0) << " TimeSinceInj " <<
441  it.GetTimeSinceLastInjection(0) << " IsHER " << it.GetIsHER(0) << " Bunch " << it.GetBunchNumber(0));
442  auto difference = it.GetTimeSinceLastInjection(0);
443  if (difference != 0x7FFFFFFF) {
444  unsigned int nentries = arichDigits.getEntries();
445  float diff2 = difference / 127.; // 127MHz clock ticks to us, inexact rounding
446  if (it.GetIsHER(0)) {
447  h_ARICHOccAfterInjHer->Fill(diff2, nentries);
448  h_ARICHEOccAfterInjHer->Fill(diff2);
449  } else {
450  h_ARICHOccAfterInjLer->Fill(diff2, nentries);
451  h_ARICHEOccAfterInjLer->Fill(diff2);
452  }
453  }
454  }
455 
456  }
457 
459  {
460 
461  DBObjPtr<ARICHMergerMapping> arichMergerMap;
462  if (h_theta->GetEntries() < 200) return;
463  TF1* f1 = new TF1("arichFitFunc", "gaus(0)+pol1(3)", 0.25, 0.4);
464  f1->SetParameters(0.8 * h_theta->GetMaximum(), 0.323, 0.016, 0, 0);
465  f1->SetParName(0, "C");
466  f1->SetParName(1, "mean");
467  f1->SetParName(2, "sigma");
468  f1->SetParName(3, "p0");
469  f1->SetParName(4, "p1");
470  h_theta->Fit(f1, "R");
471 
472  //Normalise bins in histogram bitsPerMergerNorm
473  for (int mergerID = 1; mergerID < 73; ++mergerID) {
474  double NHapd = 0;
475  for (int febSlot = 1; febSlot < 7; ++febSlot) {
476  if (arichMergerMap->getModuleID(mergerID, febSlot) > 0) NHapd++;
477  }
478 
479  double bin_value[5];
480  for (int i = 1; i <= 5; ++i) {
481  // loop over bits and save values
482  bin_value[i - 1] = h_bitsPerMergerNorm->GetBinContent(i, mergerID);
483  }
484 
485  for (int i = 1; i <= 5; ++i) {
486  // loop over bits again and set bin content
487  h_bitsPerMergerNorm->SetBinContent(i, mergerID,
488  bin_value[i - 1] / (bin_value[3] + bin_value[2]) / NHapd); // normalise with sum of bit1 and bit2, and number of connected HAPDs
489  }
490  }
491 
492 
493  }
494 
496  {
497  }
499 }
TH1 * h_chipDigit
The number of raw digits in each ASIC chip.
TH2 * h_hitsPerTrack2D
Sum of 2D hit/track map on each position of track.
TH1 * h_chipHit
The number of hits in each ASIC chip.
int m_maxHits
exclude events with very large number of hits in arich
TH1 * h_ARICHEOccAfterInjHer
Histogram for Nr Entries (=Triggrs) for normalization after HER injection.
TH3 * h_aerogelHits3D
3D histogram of
int m_minHits
exclude events with number of hits lower than this
TH1 * h_flashPerAPD
Number of flashes in each APD.
TH1 * h_hitsPerTrack
Average hits/track calculated from h_hits2D and h_track2D.
TH1 * h_trackPerEvent
Number of tracks in ARICH per event (with p>0.5 GeV)
TH1 * h_ARICHOccAfterInjLer
Histogram Ndigits after LER injection.
StoreArray< RawFTSW > m_rawFTSW
Input array for DAQ Status.
TH1 * h_chDigit
The number of raw digits in each channel.
TH1 * h_aerogelHit
The number of reconstructed photons in each aerogel tiles.
TH1 * h_mergerHit
The number of hits in each Merger Boards.
double m_momDnLim
Lower momentum limit of tracks used in GeV (if set 0, no limit is applied)
double m_momUpLim
Upper momentum limit of tracks used in GeV (if set 0, no limit is applied)
TH1 * h_theta
Reconstructed Cherenkov angles.
TH2 * h_thetaPhi
cherenkov theta vs phi for non-mirror-reflected photons
TH1 * h_aeroStat
Status of each aerogel tiles.
TH1 * h_ARICHOccAfterInjHer
Histogram Ndigits after HER injection.
TH3 * h_mirrorThetaPhi
cherenkov theta vs phi for mirror reflected photons (for each mirror plate)
TH2 * h_hapdHitPerEvent
number of hits in each HAPD per event
TH1 * h_hapdDigit
The number of raw digits in each HAPD.
TH1 * h_chHit
The number of hits in each channel.
bool m_arichEvents
process only events that have extrapolated hit in arich
TH1 * h_chStat
Status of each channels.
TH1 * h_secHitsPerTrack[6]
Detailed average hits/track for each sector.
TH1 * h_hapdHit
The number of hits in each HAPD.
TH1 * h_ARICHEOccAfterInjLer
Histogram for Nr Entries (=Triggrs) for normalization after LER injection.
TH1 * h_secTheta[6]
Detailed view of Cherenkov angle for each sector.
TH1 * h_hitsPerEvent
Ihe number of all hits in each event.
TH2 * h_tracks2D
2D track distribution of whole ARICH
TH1 * h_secHapdHit[6]
The number of hits in each HAPDs of each sector.
TH1 * h_bits
Timing bits.
Geometry parameters of HAPD.
double getRingDPhi(unsigned iRing) const
Get phi (angle) distance between "phi" aluminum wall between aerogel tiles in i-th tile ring.
double getRingRadius(unsigned iRing) const
Get radius of i-th aluminum ring between aerogel tiles (inner radius of ring)
unsigned getAerogelTileID(double x, double y) const
Get ID of aerogel tile containing point (x,y) (actually this is tile slot ID, as it is the same for a...
Geometry parameters of ARICH photon detector plane.
double getSlotPhi(unsigned modID) const
Get phi (angle) position of module with given module ID number.
This is a class to store ARICH likelihoods in the datastore.
float getDetPhot() const
Return number of detected photons for a given particle.
Class for accessing objects in the database.
Definition: DBObjPtr.h:21
Store one Ext hit as a ROOT object.
Definition: ExtHit.h:30
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
Definition: HistoModule.h:29
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:214
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:208
void setReturnValue(int value)
Sets the return value for this module as integer.
Definition: Module.cc:220
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:80
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
int getEntries() const
Get the number of objects in the array.
Definition: StoreArray.h:216
Class that bundles various TrackFitResults.
Definition: Track.h:25
Class to store variables with their name which were sent to the logging service.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual void endRun() override
End-of-run action.
virtual void terminate() override
Termination action.
virtual void beginRun() override
Called when entering a new run.
virtual ~ARICHDQMModule()
Destructor.
virtual void defineHisto() override
Function to define histograms.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:560
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:650
Abstract base class for different kinds of events.