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.