10#include <arich/modules/arichDQM/ARICHDQMModule.h>
13#include <arich/dbobjects/ARICHGeoDetectorPlane.h>
14#include <arich/dbobjects/ARICHGeoAerogelPlane.h>
15#include <arich/dataobjects/ARICHHit.h>
16#include <arich/dataobjects/ARICHDigit.h>
17#include <arich/dataobjects/ARICHTrack.h>
18#include <arich/dataobjects/ARICHLikelihood.h>
19#include <arich/dataobjects/ARICHPhoton.h>
21#include <mdst/dataobjects/Track.h>
24#include <framework/datastore/StoreArray.h>
27#include <Math/Vector3D.h>
28#include <TDirectory.h>
50 addParam(
"UpperMomentumLimit",
m_momUpLim,
"Upper momentum limit of tracks included in monitoring", 10.0);
51 addParam(
"LowerMomentumLimit",
m_momDnLim,
"Lower momentum limit of tracks included in monitoring", 2.5);
52 addParam(
"ArichEvents",
m_arichEvents,
"Include only hits from events where an extrapolated track to arich exists",
false);
53 addParam(
"MaxHits",
m_maxHits,
"Include only events with less than MaxHits hits in ARICH (remove loud events)", 70000);
54 addParam(
"MinHits",
m_minHits,
"Include only events with more than MinHits hits in ARICH", 0);
64 TDirectory* oldDir = gDirectory;
65 TDirectory* dirARICHDQM = oldDir->mkdir(
"ARICH");
70 h_chStat =
new TH1D(
"chStat",
"Status of channels;Channel serial;Status", 420 * 144, -0.5, 420 * 144 - 0.5);
71 h_aeroStat =
new TH1D(
"aeroStat",
"Status of aerogels;Aerogel tile serial;Status", 160, -0.5, 160 - 0.5);
72 h_chHit =
new TH1D(
"chHit",
"Number of hits in each channel;Channel serial;Hits", 420 * 144, -0.5, 420 * 144 - 0.5);
73 h_chipHit =
new TH1D(
"chipHit",
"Number of hits in each chip;Chip serial;Hits", 420 * 4, -0.5, 420 * 4 - 0.5);
74 h_hapdHit =
new TH1D(
"hapdHit",
"Number of hits in each HAPD;HAPD serial;Hits", 420, 0.5, 421 - 0.5);
75 h_hapdHitPerEvent =
new TH2D(
"hapdHitPerEvent",
"Number of hits in each HAPD per Event;HAPD serial;Hits/event", 420, 0.5, 420 + 0.5,
77 h_trackPerEvent =
new TH1D(
"trackPerEvent",
"Number of tracks in ARICH per event; # of tracks;Events", 6, -0.5, 5.5);
79 h_mergerHit =
new TH1D(
"mergerHit",
"Number of hits in each merger board;MB ID;Hits", 72, 0.5, 72 + 0.5);
80 h_bitsPerMergerNorm =
new TH2D(
"bitsPerMergerNorm",
"Normalised number of hits in each bit in each Merger;Bit;MB ID;Hits", 5,
82 4 - 0.5, 72, 0.5, 72 + 0.5);
84 "Number of hits in each bit in each Hapd sorted by mergers;Bit;HAPD unsorted;Hits", 5, -1 - 0.5,
85 4 - 0.5, 432, 1, 432);
87 h_aerogelHit =
new TH1D(
"aerogelHit",
"Number track associated hits in each aerogel tile;Aerogel slot ID;Hits", 125, -0.5,
89 h_bits =
new TH1D(
"bits",
"Number of hits in each bit;Bit;Hits", 5, -1 - 0.5,
91 h_bitsPerChannel =
new TH2D(
"bitsPerChannel",
"Number of hits in each bit in each chanenel;Bit;channel #;Hits", 4, - 0.5,
92 4 - 0.5, 420 * 144, -0.5, 420 * 144 - 0.5);
93 h_hitsPerTrack2D =
new TH2D(
"hitsPerTrack2D",
"2D distribution of track associated hits;X[cm];Y[cm];Hits", 230, -115, 115, 230,
95 h_tracks2D =
new TH2D(
"tracks2D",
"Distribution track positions;X[cm];Y[cm];Tracks", 230, -115, 115, 230, -115, 115);
97 h_hitsPerEvent =
new TH1D(
"hitsPerEvent",
"Number of hit per event;Number of hits;Events", 150, -0.5, 150 - 0.5);
98 h_theta =
new TH1D(
"theta",
"Cherenkov angle distribution;Angle [rad];Events", 60, 0, M_PI / 6);
99 h_hitsPerTrack =
new TH1D(
"hitsPerTrack",
"Number of hit per track;Number of hits;Tracks", 150, -0.5, 150 - 0.5);
101 for (
int i = 0; i < 6; i++) {
102 h_secTheta[i] =
new TH1D(Form(
"thetaSec%d", i + 1), Form(
"Cherenkov angle distribution in sector %d;Angle [rad];Events", i + 1),
105 Form(
"Number of hit per track in sector %d;Number of hits;Tracks", i + 1), 150, -0.5, 150 - 0.5);
106 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,
110 h_chDigit =
new TH1D(
"chDigit",
"Number of raw digits in each channel;Channel serial;Hits", 420 * 144, -0.5, 420 * 144 - 0.5);
111 h_chipDigit =
new TH1D(
"chipDigit",
"Number of raw digits in each chip;Chip serial;Hits", 420 * 4, -0.5, 420 * 4 - 0.5);
112 h_hapdDigit =
new TH1D(
"hapdDigit",
"Number of raw digits in each HAPD;HAPD serial;Hits", 420, 0.5, 421 - 0.5);
114 h_aerogelHits3D =
new TH3D(
"aerogelHits3D",
"Number of track associated hits for each aerogel tile; #phi section; r section", 125,
115 -0.5, 124.5, 20, 0, 20, 20, 0, 20);
117 "Cherenkov theta vs Cherenkov phi for mirror reflected photons; mirroID; #phi_{c} [rad]; #theta_{c} [rad]", 18, 0.5, 18.5, 100,
118 -M_PI, M_PI, 100, 0, 0.5);
119 h_thetaPhi =
new TH2D(
"thetaPhi",
"Cherenkov theta vs phi;#phi [rad];#theta_{c} [rad]", 100, -M_PI, M_PI, 100, 0., 0.5);
121 h_flashPerAPD =
new TH1D(
"flashPerAPD",
"Number of flashes per APD; APD serial; number of flash", 420 * 4, -0.5, 420 * 4 - 0.5);
123 h_ARICHOccAfterInjLer =
new TH1F(
"ARICHOccInjLER",
" ARICHOccInjLER /Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
124 h_ARICHOccAfterInjHer =
new TH1F(
"ARICHOccInjHER",
" ARICHOccInjHER /Time;Time in #mus;Nhits/Time (#mus bins)", 4000, 0, 20000);
125 h_ARICHEOccAfterInjLer =
new TH1F(
"ARICHEOccInjLER",
"ARICHEOccInjLER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
126 h_ARICHEOccAfterInjHer =
new TH1F(
"ARICHEOccInjHER",
"ARICHEOccInjHER/Time;Time in #mus;Triggers/Time (#mus bins)", 4000, 0, 20000);
152 for (
int i = 0; i < 6; i++) {
206 for (
int i = 0; i < 6; i++) {
228 std::vector<int> apds(420 * 4, 0);
230 uint8_t bits = digit.getBitmap();
231 int moduleID = digit.getModuleID();
232 int channelID = digit.getChannelID();
235 unsigned binID = (mergerID - 1) * N_FEB2MERGER + (febSlot);
237 for (
int i = 0; i < 8; i++) {
238 if ((bits & (1 << i)) && !(bits & ~(1 << i))) {
252 h_chDigit ->Fill((moduleID - 1) * 144 + channelID);
253 int chip = (moduleID - 1) * 4 + channelID / 36;
260 for (
auto apd : apds) {
if (apd > 20)
h_flashPerAPD->Fill(iapd); iapd++;}
262 std::vector<int> hpd(420, 0);
265 for (
int i = 0; i <
m_arichHits.getEntries(); i++) {
269 h_chHit->Fill((moduleID - 1) * 144 + channelID);
271 h_chipHit->Fill((moduleID - 1) * 4 + channelID / 36);
273 if (moduleID > 420) B2INFO(
"Invalid hapd number " <<
LogVar(
"hapd ID", moduleID));
275 for (
int j = 1; j <= 7; j++) {
276 int ringStart = (j - 1) * (84 + (j - 2) * 6) / 2 + 1;
277 int ringEnd = j * (84 + (j - 1) * 6) / 2;
278 if (ringStart <= moduleID && moduleID <= ringEnd) {
279 h_secHapdHit[(moduleID - ringStart) / (6 + j)]->Fill((moduleID - ringStart) % (6 + j) + 1 + (ringStart - 1) / 6);
298 if (arichTrack.getMomentum() > 0.5) ntrk++;
301 ROOT::Math::XYZVector recPos = arichTrack.getPosition();
304 if (recPos.Phi() >= 0) {
307 dPhi = 2 * M_PI + recPos.Phi();
309 while (dPhi > M_PI / 3 && trSector < 5) {
313 double trR = recPos.Rho();
315 if (recPos.Phi() >= 0) {
316 trPhi = recPos.Phi();
318 trPhi = 2 * M_PI + recPos.Phi();
323 while (arichGeoAero.
getRingRadius(iRing + 1) < trR && iRing < 4) {
326 if (iRing == 0)
continue;
327 while (arichGeoAero.
getRingDPhi(iRing) * (iAzimuth + 1) < trPhi) {
333 std::vector<ARICHPhoton> photons = arichTrack.getPhotons();
334 for (
auto& photon : photons) {
335 if (photon.getMirror() == 0) {
337 h_thetaPhi->Fill(photon.getPhiCer(), photon.getThetaCer());
338 h_theta->Fill(photon.getThetaCer());
342 if (hitPhi < 0) hitPhi += 2 * M_PI;
343 while (hitPhi > M_PI / 3 && hitSector < 5) {
347 h_secTheta[hitSector]->Fill(photon.getThetaCer());
349 if (trR > 95.)
h_mirrorThetaPhi->Fill(photon.getMirror(), photon.getPhiCer(), photon.getThetaCer());
355 const Track* mdstTrack = NULL;
362 if (!lkh->getFlag())
continue;
378 B2DEBUG(29,
"TTD FTSW : " << std::hex << it.GetTTUtime(0) <<
" " << it.GetTTCtime(0) <<
" EvtNr " << it.GetEveNo(0) <<
" Type " <<
379 (it.GetTTCtimeTRGType(0) & 0xF) <<
" TimeSincePrev " << it.GetTimeSincePrevTrigger(0) <<
" TimeSinceInj " <<
380 it.GetTimeSinceLastInjection(0) <<
" IsHER " << it.GetIsHER(0) <<
" Bunch " << it.GetBunchNumber(0));
381 auto difference = it.GetTimeSinceLastInjection(0);
382 if (difference != 0x7FFFFFFF) {
384 float diff2 = difference / 127.;
385 if (it.GetIsHER(0)) {
399 if (
h_theta->GetEntries() < 200)
return;
400 TF1* f1 =
new TF1(
"arichFitFunc",
"gaus(0)+pol1(3)", 0.25, 0.4);
401 f1->SetParameters(0.8 *
h_theta->GetMaximum(), 0.323, 0.016, 0, 0);
402 f1->SetParName(0,
"C");
403 f1->SetParName(1,
"mean");
404 f1->SetParName(2,
"sigma");
405 f1->SetParName(3,
"p0");
406 f1->SetParName(4,
"p1");
410 for (
int mergerID = 1; mergerID < 73; ++mergerID) {
412 for (
int febSlot = 1; febSlot < 7; ++febSlot) {
417 for (
int i = 1; i <= 5; ++i) {
422 for (
int i = 1; i <= 5; ++i) {
425 bin_value[i - 1] / (bin_value[3] + bin_value[2]) / NHapd);
StoreArray< ARICHHit > m_arichHits
ARICHHits StoreArray.
TH1 * h_chipDigit
The number of raw digits in each ASIC chip.
StoreArray< ARICHDigit > m_arichDigits
ARICHDigits StoreArray.
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.
TH2 * h_bitsPerChannel
Number of bits per channel.
DBObjPtr< ARICHMergerMapping > m_arichMergerMap
ARICH merger mapping payload.
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 hits.
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.
StoreArray< ARICHTrack > m_arichTracks
ARICHTracks StoreArray.
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 tile.
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.
TH2 * h_bitsPerMergerNorm
The number of hits in each bit in each Merger Board normalised to number of HAPDs and sum(bit1,...
TH1 * h_aeroStat
Status of each aerogel tile.
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.
StoreArray< ARICHLikelihood > m_arichLikelihoods
ARICHLikelihoods StoreArray.
TH1 * h_chHit
The number of hits in each channel.
bool m_arichEvents
Process only events that have extrapolated hit in arich.
TH2 * h_bitsPerHapdMerger
The number of hits in each bit in each HAPD sorted by Merger Board.
DBObjPtr< ARICHGeometryConfig > m_arichGeoConfig
ARICH Geometry configuration payload.
TH1 * h_chStat
Status of each channel.
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
The 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.
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.
Store one Ext hit as a ROOT object.
HistoModule.h is supposed to be used instead of Module.h for the modules with histogram definitions t...
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
void setReturnValue(int value)
Sets the return value for this module as integer.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
Accessor to arrays stored in the data store.
Class that bundles various TrackFitResults.
Class to store variables with their name which were sent to the logging service.
ARICHDQMModule()
Constructor.
virtual void initialize() override
Initialize the Module.
virtual void event() override
Event processor.
virtual void endRun() override
End-of-run action.
virtual void beginRun() override
Called when entering a new run.
virtual ~ARICHDQMModule()
Destructor.
virtual void defineHisto() override
Definition of the histograms.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.