CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Protected Member Functions | Private Attributes | Static Private Attributes
CTPPSDiamondDQMSource Class Reference
Inheritance diagram for CTPPSDiamondDQMSource:
DQMEDAnalyzer edm::one::EDProducer< edm::Accumulator, edm::EndLuminosityBlockProducer, edm::EndRunProducer, edm::one::WatchLuminosityBlocks, edm::one::WatchRuns > edm::one::EDProducerBase edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Classes

struct  ChannelPlots
 plots related to one Diamond channel More...
 
struct  GlobalPlots
 plots related to the whole system More...
 
struct  PlanePlots
 plots related to one Diamond plane More...
 
struct  PotPlots
 plots related to one Diamond detector package More...
 

Public Member Functions

 CTPPSDiamondDQMSource (const edm::ParameterSet &)
 
 ~CTPPSDiamondDQMSource () override
 
- Public Member Functions inherited from DQMEDAnalyzer
void accumulate (edm::Event const &ev, edm::EventSetup const &es) final
 
virtual void analyze (edm::Event const &, edm::EventSetup const &)
 
void beginLuminosityBlock (edm::LuminosityBlock const &lumi, edm::EventSetup const &setup) override
 
void beginRun (edm::Run const &run, edm::EventSetup const &setup) final
 
virtual void bookHistograms (DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &)=0
 
virtual void dqmBeginRun (edm::Run const &, edm::EventSetup const &)
 
 DQMEDAnalyzer ()
 
 DQMEDAnalyzer (DQMEDAnalyzer const &)=delete
 
 DQMEDAnalyzer (DQMEDAnalyzer &&)=delete
 
void endLuminosityBlock (edm::LuminosityBlock const &, edm::EventSetup const &) override
 
void endLuminosityBlockProduce (edm::LuminosityBlock &lumi, edm::EventSetup const &setup) final
 
void endRun (edm::Run const &run, edm::EventSetup const &setup) override
 
void endRunProduce (edm::Run &run, edm::EventSetup const &setup) override
 
 ~DQMEDAnalyzer () override=default
 
- Public Member Functions inherited from edm::one::EDProducer< edm::Accumulator, edm::EndLuminosityBlockProducer, edm::EndRunProducer, edm::one::WatchLuminosityBlocks, edm::one::WatchRuns >
 EDProducer ()=default
 
SerialTaskQueueglobalLuminosityBlocksQueue () final
 
SerialTaskQueueglobalRunsQueue () final
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
- Public Member Functions inherited from edm::one::EDProducerBase
 EDProducerBase ()
 
ModuleDescription const & moduleDescription () const
 
bool wantsStreamLuminosityBlocks () const
 
bool wantsStreamRuns () const
 
 ~EDProducerBase () override
 
- Public Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
std::vector< edm::ProductResolverIndex > const & indiciesForPutProducts (BranchType iBranchType) const
 
 ProducerBase ()
 
std::vector< edm::ProductResolverIndex > const & putTokenIndexToProductResolverIndex () const
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription const &)> registrationCallback () const
 used by the fwk to register list of products More...
 
void resolvePutIndicies (BranchType iBranchType, ModuleToResolverIndicies const &iIndicies, std::string const &moduleLabel)
 
 ~ProducerBase () override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector< ProductResolverIndexAndSkipBit > const & itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::vector< ModuleDescription const * > &modules, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
virtual ~EDConsumerBase () noexcept(false)
 

Protected Member Functions

void analyze (const edm::Event &, const edm::EventSetup &) override
 
void beginLuminosityBlock (const edm::LuminosityBlock &, const edm::EventSetup &) override
 
void bookHistograms (DQMStore::IBooker &, const edm::Run &, const edm::EventSetup &) override
 
void dqmBeginRun (const edm::Run &, const edm::EventSetup &) override
 
void endLuminosityBlock (const edm::LuminosityBlock &, const edm::EventSetup &) override
 
void endRun (const edm::Run &, const edm::EventSetup &) override
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Private Attributes

int centralOOT_
 
std::unordered_map< unsigned int, ChannelPlotschannelPlots_
 
int EC_difference_45_
 
int EC_difference_56_
 
bool excludeMultipleHits_
 
GlobalPlots globalPlot_
 
double horizontalShiftBwDiamondPixels_
 
double horizontalShiftOfDiamond_
 
std::unordered_map< unsigned int, PlanePlotsplanePlots_
 
std::unordered_map< unsigned int, PotPlotspotPlots_
 
std::vector< std::pair< edm::EventRange, int > > runParameters_
 
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondRecHit > > tokenDiamondHit_
 
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondLocalTrack > > tokenDiamondTrack_
 
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondDigi > > tokenDigi_
 
edm::EDGetTokenT< std::vector< TotemFEDInfo > > tokenFEDInfo_
 
edm::EDGetTokenT< edm::DetSetVector< CTPPSPixelLocalTrack > > tokenPixelTrack_
 
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus_
 
unsigned int verbosity_
 

Static Private Attributes

static const int CHANNEL_OF_VFAT_CLOCK = 30
 
static const int CTPPS_DIAMOND_NUM_OF_CHANNELS = 12
 
static const int CTPPS_DIAMOND_NUM_OF_PLANES = 4
 
static const int CTPPS_DIAMOND_RP_ID = 6
 
static const int CTPPS_DIAMOND_STATION_ID = 1
 
static const int CTPPS_FAR_RP_ID = 3
 
static const int CTPPS_FED_ID_45 = 583
 
static const int CTPPS_FED_ID_56 = 582
 
static const int CTPPS_NEAR_RP_ID = 2
 
static const int CTPPS_NUM_OF_ARMS = 2
 
static const int CTPPS_PIXEL_STATION_ID = 2
 
static const double DISPLAY_RESOLUTION_FOR_HITS_MM = 0.1
 
static const double HPTDC_BIN_WIDTH_NS = 25./1024
 
static const double INV_DISPLAY_RESOLUTION_FOR_HITS_MM = 1./DISPLAY_RESOLUTION_FOR_HITS_MM
 
static const double SEC_PER_LUMI_SECTION = 23.31
 

Additional Inherited Members

- Public Types inherited from edm::one::EDProducerBase
typedef EDProducerBase ModuleType
 
- Public Types inherited from edm::ProducerBase
using ModuleToResolverIndicies = std::unordered_multimap< std::string, std::tuple< edm::TypeID const *, const char *, edm::ProductResolverIndex >>
 
typedef ProductRegistryHelper::TypeLabelList TypeLabelList
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::one::EDProducerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Attributes inherited from DQMEDAnalyzer
edm::EDPutTokenT< DQMTokenlumiToken_
 
edm::EDPutTokenT< DQMTokenrunToken_
 

Detailed Description

Definition at line 59 of file CTPPSDiamondDQMSource.cc.

Constructor & Destructor Documentation

CTPPSDiamondDQMSource::CTPPSDiamondDQMSource ( const edm::ParameterSet ps)

Definition at line 374 of file CTPPSDiamondDQMSource.cc.

References edm::ParameterSet::getParameter(), muonDTDigis_cfi::pset, and runParameters_.

374  :
380  tokenFEDInfo_ ( consumes< std::vector<TotemFEDInfo> > ( ps.getParameter<edm::InputTag>( "tagFEDInfo" ) ) ),
381  excludeMultipleHits_ ( ps.getParameter<bool>( "excludeMultipleHits" ) ),
382  centralOOT_( -999 ),
383  verbosity_ ( ps.getUntrackedParameter<unsigned int>( "verbosity", 0 ) ),
384  EC_difference_56_( -500 ), EC_difference_45_( -500 )
385 {
386  for ( const auto& pset : ps.getParameter< std::vector<edm::ParameterSet> >( "offsetsOOT" ) ) {
387  runParameters_.emplace_back( std::make_pair( pset.getParameter<edm::EventRange>( "validityRange" ), pset.getParameter<int>( "centralOOT" ) ) );
388  }
389 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondDigi > > tokenDigi_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
std::vector< std::pair< edm::EventRange, int > > runParameters_
edm::EDGetTokenT< edm::DetSetVector< CTPPSPixelLocalTrack > > tokenPixelTrack_
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondLocalTrack > > tokenDiamondTrack_
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondRecHit > > tokenDiamondHit_
edm::EDGetTokenT< std::vector< TotemFEDInfo > > tokenFEDInfo_
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus_
CTPPSDiamondDQMSource::~CTPPSDiamondDQMSource ( )
override

Definition at line 393 of file CTPPSDiamondDQMSource.cc.

394 {}

Member Function Documentation

void CTPPSDiamondDQMSource::analyze ( const edm::Event event,
const edm::EventSetup iSetup 
)
overrideprotected

Definition at line 462 of file CTPPSDiamondDQMSource.cc.

References CTPPSDetId::arm(), edm::EventBase::bunchCrossing(), centralOOT_, CHANNEL_OF_VFAT_CLOCK, channelAlignedWithTrack(), channelPlots_, CTPPS_DIAMOND_RP_ID, CTPPS_DIAMOND_STATION_ID, CTPPS_FAR_RP_ID, CTPPS_FED_ID_45, CTPPS_FED_ID_56, CTPPS_PIXEL_STATION_ID, TauDecayModes::dec, EC_difference_45_, EC_difference_56_, excludeMultipleHits_, MonitorElement::Fill(), HcalObjRepresent::Fill(), edm::EventSetup::get(), HPTDCErrorFlags::getErrorId(), globalPlot_, CTPPSDiamondDQMSource::GlobalPlots::h_trackCorr_hor, horizontalShiftBwDiamondPixels_, horizontalShiftOfDiamond_, HPTDC_BIN_WIDTH_NS, mps_fire::i, edm::eventsetup::heterocontainer::insert(), createfilelist::int, INV_DISPLAY_RESOLUTION_FOR_HITS_MM, edm::HandleBase::isValid(), PixelTracks_cff::pixelTracks, planePlots_, potPlots_, edm::ESHandle< T >::product(), TrackInfoProducer_cfi::rechits, CTPPSDiamondDetId::setChannel(), CTPPSDiamondDetId::setPlane(), mps_update::status, CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING, tokenDiamondHit_, tokenDiamondTrack_, tokenDigi_, tokenFEDInfo_, tokenPixelTrack_, tokenStatus_, HiIsolationCommonParameters_cff::track, l1t::tracks, and verbosity_.

463 {
464  // get event data
466  event.getByToken( tokenStatus_, diamondVFATStatus );
467 
469  event.getByToken( tokenPixelTrack_, pixelTracks );
470 
472  event.getByToken( tokenDigi_, diamondDigis );
473 
475  event.getByToken( tokenFEDInfo_, fedInfo );
476 
478  event.getByToken( tokenDiamondHit_, diamondRecHits );
479 
481  event.getByToken( tokenDiamondTrack_, diamondLocalTracks );
482 
484  iSetup.get<VeryForwardRealGeometryRecord>().get( geometry_ );
485 
486  // check validity
487  bool valid = true;
488  valid &= diamondVFATStatus.isValid();
489  valid &= diamondDigis.isValid();
490  valid &= fedInfo.isValid();
491 
492  if ( !valid ) {
493  if ( verbosity_ ) {
494  edm::LogProblem("CTPPSDiamondDQMSource")
495  << "ERROR in TotemDQMModuleRP::analyze > some of the required inputs are not valid. Skipping this event.\n"
496  << " diamondVFATStatus.isValid = " << diamondVFATStatus.isValid() << "\n"
497  << " diamondDigis.isValid = " << diamondDigis.isValid() << "\n"
498  << " fedInfo.isValid = " << fedInfo.isValid();
499  }
500 
501  return;
502  }
503 
504  //------------------------------
505  // RP Plots
506  //------------------------------
507 
508  //------------------------------
509  // Correlation Plots
510  //------------------------------
511 
512  for ( const auto& ds1 : *pixelTracks ) {
513  for ( const auto& tr1 : ds1 ) {
514  if ( ! tr1.isValid() ) continue;
515 
516  CTPPSDetId rpId1( ds1.detId() );
517  unsigned int arm1 = rpId1.arm();
518  unsigned int stNum1 = rpId1.station();
519  unsigned int rpNum1 = rpId1.rp();
520  if (stNum1 != 0 || ( rpNum1 != 2 && rpNum1 != 3 ) ) continue;
521  unsigned int idx1 = arm1*3 + rpNum1-2;
522 
523  for ( const auto& ds2 : *pixelTracks ) {
524  for ( const auto& tr2 : ds2 ) {
525  if ( ! tr2.isValid() ) continue;
526 
527  CTPPSDetId rpId2(ds2.detId());
528  unsigned int arm2 = rpId2.arm();
529  unsigned int stNum2 = rpId2.station();
530  unsigned int rpNum2 = rpId2.rp();
531  if (stNum2 != 0 || ( rpNum2 != 2 && rpNum2 != 3 ) ) continue;
532  unsigned int idx2 = arm2*3 + rpNum2-2;
533 
534  if ( idx1 >= idx2 ) globalPlot_.h_trackCorr_hor->Fill( 5-idx1, idx2 ); // strips-strips
535  }
536  }
537  for ( const auto& ds2 : *diamondLocalTracks ) {
538  for ( const auto& tr2 : ds2 ) {
539  if ( ! tr2.isValid() ) continue;
540  if ( centralOOT_ != -999 && tr2.getOOTIndex() != centralOOT_ ) continue;
541  if ( excludeMultipleHits_ && tr2.getMultipleHits() > 0 ) continue;
542 
543  CTPPSDetId diamId2( ds2.detId() );
544  unsigned int arm2 = diamId2.arm();
545  if ( idx1 >= arm2*3+2 )
546  globalPlot_.h_trackCorr_hor->Fill( 5-idx1, arm2*3+2 ); // strips-diamonds
547  else
548  globalPlot_.h_trackCorr_hor->Fill( 5-(arm2*3+2 ),idx1 ); // strips-diamonds
549  }
550  }
551  }
552  }
553 
554  for ( const auto& ds1 : *diamondLocalTracks ) {
555  for ( const auto& tr1 : ds1 ) {
556  if ( ! tr1.isValid() ) continue;
557  if ( excludeMultipleHits_ && tr1.getMultipleHits() > 0 ) continue;
558  if ( centralOOT_ != -999 && tr1.getOOTIndex() != centralOOT_ ) continue;
559 
560  CTPPSDetId diamId1( ds1.detId() );
561  unsigned int arm1 = diamId1.arm();
562 
563  globalPlot_.h_trackCorr_hor->Fill( 5-(arm1*3+2), arm1*3+2 ); // diamonds-diamonds
564 
565  for ( const auto& ds2 : *diamondLocalTracks ) {
566  for ( const auto& tr2 : ds2 ) {
567  if ( ! tr2.isValid() ) continue;
568  if ( excludeMultipleHits_ && tr2.getMultipleHits() > 0 ) continue;
569  if ( centralOOT_ != -999 && tr2.getOOTIndex() != centralOOT_ ) continue;
570 
571  CTPPSDetId diamId2( ds2.detId() );
572  unsigned int arm2 = diamId2.arm();
573  if ( arm1 > arm2 ) globalPlot_.h_trackCorr_hor->Fill( 5-(arm1*3+2), arm2*3+2 ); // diamonds-diamonds
574  }
575  }
576  }
577  }
578 
579 
580  // Using CTPPSDiamondDigi
581  for ( const auto& digis : *diamondDigis ) {
582  const CTPPSDiamondDetId detId( digis.detId() );
583  CTPPSDiamondDetId detId_pot( digis.detId() );
584 
585  for ( const auto& digi : digis ) {
586  detId_pot.setPlane( 0 );
587  detId_pot.setChannel( 0 );
588  if ( detId.channel() == CHANNEL_OF_VFAT_CLOCK ) continue;
589  if ( potPlots_.find( detId_pot ) == potPlots_.end() ) continue;
590  //Leading without trailing investigation
591  if ( digi.getLeadingEdge() != 0 || digi.getTrailingEdge() != 0 ) {
592  ++(potPlots_[detId_pot].HitCounter);
593  if ( digi.getLeadingEdge() != 0 ) {
594  potPlots_[detId_pot].leadingEdgeCumulative_all->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge() );
595  }
596  if ( digi.getLeadingEdge() != 0 && digi.getTrailingEdge() == 0 ) {
597  ++(potPlots_[detId_pot].LeadingOnlyCounter);
598  potPlots_[detId_pot].leadingEdgeCumulative_le->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge() );
599  }
600  if ( digi.getLeadingEdge() == 0 && digi.getTrailingEdge() != 0 ) {
601  ++(potPlots_[detId_pot].TrailingOnlyCounter);
602  potPlots_[detId_pot].trailingEdgeCumulative_te->Fill( HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
603  }
604  if ( digi.getLeadingEdge() != 0 && digi.getTrailingEdge() != 0 ) {
605  ++(potPlots_[detId_pot].CompleteCounter);
606  potPlots_[detId_pot].leadingTrailingCorrelationPot->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge(), HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
607  }
608  }
609 
610  // HPTDC Errors
611  const HPTDCErrorFlags hptdcErrors = digi.getHPTDCErrorFlags();
612  for ( unsigned short hptdcErrorIndex = 1; hptdcErrorIndex < 16; ++hptdcErrorIndex )
613  if ( hptdcErrors.getErrorId( hptdcErrorIndex-1 ) ) potPlots_[detId_pot].HPTDCErrorFlags_cumulative->Fill( hptdcErrorIndex );
614  if ( digi.getMultipleHit() ) ++(potPlots_[detId_pot].MHCounter);
615  }
616  }
617 
618  // EC Errors
619  for ( const auto& vfat_status : *diamondVFATStatus ) {
620  const CTPPSDiamondDetId detId( vfat_status.detId() );
621  CTPPSDiamondDetId detId_pot( vfat_status.detId() );
622  detId_pot.setPlane( 0 );
623  detId_pot.setChannel( 0 );
624  for ( const auto& status : vfat_status ) {
625  if ( !status.isOK() ) continue;
626  if ( potPlots_.find(detId_pot) == potPlots_.end() ) continue;
627 
628  // Check Event Number
629  for ( const auto& optorx : *fedInfo ) {
630  if ( detId.arm() == 1 && optorx.getFEDId() == CTPPS_FED_ID_56 ) {
631  potPlots_[detId_pot].ECCheck->Fill((int)((optorx.getLV1()& 0xFF)-((unsigned int) status.getEC() & 0xFF)) & 0xFF);
632  if ( ( static_cast<int>( ( optorx.getLV1() & 0xFF )-status.getEC() ) != EC_difference_56_ ) && ( static_cast<uint8_t>( ( optorx.getLV1() & 0xFF )-status.getEC() ) < 128 ) )
633  EC_difference_56_ = static_cast<int>( optorx.getLV1() & 0xFF )-( static_cast<unsigned int>( status.getEC() ) & 0xFF );
634  if ( EC_difference_56_ != 1 && EC_difference_56_ != -500 && EC_difference_56_ < 128 && EC_difference_56_ > -128 )
635  if (verbosity_)
636  edm::LogProblem("CTPPSDiamondDQMSource") << "FED " << CTPPS_FED_ID_56 << ": ECError at EV: 0x"<< std::hex << optorx.getLV1()
637  << "\t\tVFAT EC: 0x"<< static_cast<unsigned int>( status.getEC() )
638  << "\twith ID: " << std::dec << detId
639  << "\tdiff: " << EC_difference_56_;
640  }
641  else if ( detId.arm() == 0 && optorx.getFEDId()== CTPPS_FED_ID_45 ) {
642  potPlots_[detId_pot].ECCheck->Fill((int)((optorx.getLV1()& 0xFF)-status.getEC()) & 0xFF);
643  if ( ( static_cast<int>( ( optorx.getLV1() & 0xFF )-status.getEC() ) != EC_difference_45_ ) && ( static_cast<uint8_t>( ( optorx.getLV1() & 0xFF )-status.getEC() ) < 128 ) )
644  EC_difference_45_ = static_cast<int>( optorx.getLV1() & 0xFF )-( static_cast<unsigned int>( status.getEC() ) & 0xFF );
645  if ( EC_difference_45_ != 1 && EC_difference_45_ != -500 && EC_difference_45_ < 128 && EC_difference_45_ > -128 )
646  if (verbosity_)
647  edm::LogProblem("CTPPSDiamondDQMSource") << "FED " << CTPPS_FED_ID_45 << ": ECError at EV: 0x"<< std::hex << optorx.getLV1()
648  << "\t\tVFAT EC: 0x"<< static_cast<unsigned int>( status.getEC() )
649  << "\twith ID: " << std::dec << detId
650  << "\tdiff: " << EC_difference_45_;
651  }
652  }
653  }
654  }
655 
656  // Using CTPPSDiamondRecHit
657  std::unordered_map<unsigned int, std::set<unsigned int> > planes;
658  std::unordered_map<unsigned int, std::set<unsigned int> > planes_inclusive;
659 
660 
661  for ( const auto& rechits : *diamondRecHits ) {
662  CTPPSDiamondDetId detId_pot( rechits.detId() );
663  detId_pot.setPlane( 0 );
664  detId_pot.setChannel( 0 );
665  const CTPPSDiamondDetId detId( rechits.detId() );
666 
667  for ( const auto& rechit : rechits ) {
668  planes_inclusive[detId_pot].insert( detId.plane() );
669  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
670  if ( rechit.getToT() != 0 && centralOOT_ != -999 && rechit.getOOTIndex() == centralOOT_ )
671  planes[detId_pot].insert( detId.plane() );
672 
673  if ( potPlots_.find( detId_pot ) == potPlots_.end() ) continue;
674 
675  float UFSDShift = 0.0;
676  if ( rechit.getYWidth() < 3 ) UFSDShift = 0.5; // Display trick for UFSD that have 2 pixels with same X
677 
678  if ( rechit.getToT() != 0 && centralOOT_ != -999 && rechit.getOOTIndex() == centralOOT_ ) {
679  TH2F *hitHistoTmp = potPlots_[detId_pot].hitDistribution2d->getTH2F();
680  TAxis *hitHistoTmpYAxis = hitHistoTmp->GetYaxis();
681  int startBin = hitHistoTmpYAxis->FindBin( rechit.getX() - horizontalShiftOfDiamond_ - 0.5*rechit.getXWidth() );
682  int numOfBins = rechit.getXWidth()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
683  for ( int i=0; i<numOfBins; ++i) {
684  hitHistoTmp->Fill( detId.plane() + UFSDShift, hitHistoTmpYAxis->GetBinCenter(startBin+i) );
685  }
686 
687  hitHistoTmp = potPlots_[detId_pot].hitDistribution2d_lumisection->getTH2F();
688  hitHistoTmpYAxis = hitHistoTmp->GetYaxis();
689  startBin = hitHistoTmpYAxis->FindBin( rechit.getX() - horizontalShiftOfDiamond_ - 0.5*rechit.getXWidth() );
690  numOfBins = rechit.getXWidth()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
691  for ( int i=0; i<numOfBins; ++i) {
692  hitHistoTmp->Fill( detId.plane() + UFSDShift, hitHistoTmpYAxis->GetBinCenter(startBin+i) );
693  }
694 
695  }
696 
697  if ( rechit.getToT() != 0 ) {
698  // Both
699  potPlots_[detId_pot].leadingEdgeCumulative_both->Fill( rechit.getT() + 25*rechit.getOOTIndex() );
700  potPlots_[detId_pot].timeOverThresholdCumulativePot->Fill( rechit.getToT() );
701 
702  TH2F *hitHistoOOTTmp = potPlots_[detId_pot].hitDistribution2dOOT->getTH2F();
703  TAxis *hitHistoOOTTmpYAxis = hitHistoOOTTmp->GetYaxis();
704  int startBin = hitHistoOOTTmpYAxis->FindBin( rechit.getX() - horizontalShiftOfDiamond_ - 0.5*rechit.getXWidth() );
705  int numOfBins = rechit.getXWidth()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
706  for ( int i=0; i<numOfBins; ++i) {
707  hitHistoOOTTmp->Fill( detId.plane() + 0.2 * rechit.getOOTIndex(), hitHistoOOTTmpYAxis->GetBinCenter(startBin+i) );
708  }
709  }
710  else {
711  if ( rechit.getOOTIndex() != CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING ) {
712  // Only leading
713  TH2F *hitHistoOOTTmp = potPlots_[detId_pot].hitDistribution2dOOT_le->getTH2F();
714  TAxis *hitHistoOOTTmpYAxis = hitHistoOOTTmp->GetYaxis();
715  int startBin = hitHistoOOTTmpYAxis->FindBin( rechit.getX() - horizontalShiftOfDiamond_ - 0.5*rechit.getXWidth() );
716  int numOfBins = rechit.getXWidth()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
717  for ( int i=0; i<numOfBins; ++i) {
718  hitHistoOOTTmp->Fill( detId.plane() + 0.2 * rechit.getOOTIndex(), hitHistoOOTTmpYAxis->GetBinCenter(startBin+i) );
719  }
720  }
721  }
722  if ( rechit.getOOTIndex() != CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING && rechit.getOOTIndex() < (int) potPlots_[detId_pot].activity_per_bx.size() )
723  potPlots_[detId_pot].activity_per_bx.at( rechit.getOOTIndex() )->Fill( event.bunchCrossing() );
724  }
725  }
726 
727  for ( const auto& plt : potPlots_ ) {
728  plt.second.activePlanes->Fill( planes[plt.first].size() );
729  plt.second.activePlanesInclusive->Fill( planes_inclusive[plt.first].size() );
730  }
731 
732  // Using CTPPSDiamondLocalTrack
733  for ( const auto& tracks : *diamondLocalTracks ) {
734  CTPPSDiamondDetId detId_pot( tracks.detId() );
735  detId_pot.setPlane( 0 );
736  detId_pot.setChannel( 0 );
737  const CTPPSDiamondDetId detId( tracks.detId() );
738 
739  for ( const auto& track : tracks ) {
740  if ( ! track.isValid() ) continue;
741  if ( track.getOOTIndex() == CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING ) continue;
742  if ( excludeMultipleHits_ && track.getMultipleHits() > 0 ) continue;
743  if ( potPlots_.find( detId_pot ) == potPlots_.end() ) continue;
744 
745  TH2F *trackHistoOOTTmp = potPlots_[detId_pot].trackDistributionOOT->getTH2F();
746  TAxis *trackHistoOOTTmpYAxis = trackHistoOOTTmp->GetYaxis();
747  int startBin = trackHistoOOTTmpYAxis->FindBin( track.getX0() - horizontalShiftOfDiamond_ - track.getX0Sigma() );
748  int numOfBins = 2*track.getX0Sigma()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
749  for ( int i=0; i<numOfBins; ++i) {
750  trackHistoOOTTmp->Fill( track.getOOTIndex(), trackHistoOOTTmpYAxis->GetBinCenter(startBin+i) );
751  }
752 
753  if ( centralOOT_ != -999 && track.getOOTIndex() == centralOOT_ ) {
754  TH1F *trackHistoInTimeTmp = potPlots_[detId_pot].trackDistribution->getTH1F();
755  int startBin = trackHistoInTimeTmp->FindBin( track.getX0() - horizontalShiftOfDiamond_ - track.getX0Sigma() );
756  int numOfBins = 2*track.getX0Sigma()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
757  for ( int i=0; i<numOfBins; ++i) {
758  trackHistoInTimeTmp->Fill( trackHistoInTimeTmp->GetBinCenter(startBin+i) );
759  }
760  }
761  }
762  }
763 
764  // Channel efficiency using CTPPSDiamondLocalTrack
765  for ( const auto& tracks : *diamondLocalTracks ) {
766  CTPPSDiamondDetId detId_pot( tracks.detId() );
767  detId_pot.setPlane( 0 );
768  detId_pot.setChannel( 0 );
769  for ( const auto& track : tracks ) {
770  // Find hits and planes in the track
771  int numOfHits = 0;
772  std::set<int> planesInTrackSet;
773  for ( const auto& vec : *diamondRecHits ) {
774  const CTPPSDiamondDetId detid( vec.detId() );
775  if ( detid.arm() != detId_pot.arm() ) continue;
776 
777  for ( const auto& hit : vec ) {
778  // first check if the hit contributes to the track
779  if ( track.containsHit(hit) ) {
780  ++numOfHits;
781  planesInTrackSet.insert(detid.plane());
782  }
783  }
784  }
785 
786  if ( numOfHits > 0 && numOfHits <= 10 && planesInTrackSet.size() > 2 ) {
787  for ( int plane=0; plane<4; ++plane ) {
788  for ( int channel=0; channel<12; ++channel ) {
789  int map_index = plane*100 + channel;
790  if ( potPlots_[detId_pot].effDoublecountingChMap.find( map_index ) == potPlots_[detId_pot].effDoublecountingChMap.end() ) {
791  potPlots_[detId_pot].effTriplecountingChMap[map_index] = 0;
792  potPlots_[detId_pot].effDoublecountingChMap[map_index] = 0;
793  }
794  CTPPSDiamondDetId detId( detId_pot.arm(), CTPPS_DIAMOND_STATION_ID, CTPPS_DIAMOND_RP_ID, plane, channel);
795  if ( channelAlignedWithTrack( geometry_.product(), detId, track, 0.1) ) {
796  // Channel should fire
797  ++(potPlots_[detId_pot].effDoublecountingChMap[map_index]);
798  for ( const auto& rechits : *diamondRecHits ) {
799  CTPPSDiamondDetId detId_hit( rechits.detId() );
800  if ( detId_hit == detId ) {
801  for ( const auto& rechit : rechits ) {
802  if ( track.containsHit( rechit, 1 ) ) {
803  // Channel fired
804  ++(potPlots_[detId_pot].effTriplecountingChMap[map_index]);
805  }
806  }
807  }
808  }
809  }
810  }
811  }
812  }
813  }
814  }
815 
816  // Tomography of diamonds using pixel
817  for ( const auto& rechits : *diamondRecHits ) {
818  CTPPSDiamondDetId detId_pot( rechits.detId() );
819  detId_pot.setPlane( 0 );
820  detId_pot.setChannel( 0 );
821  const CTPPSDiamondDetId detId( rechits.detId() );
822  for ( const auto& rechit : rechits ) {
823  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
824  if ( rechit.getToT() == 0 ) continue;
825  if ( !pixelTracks.isValid() ) continue;
826  if ( potPlots_.find( detId_pot ) == potPlots_.end() ) continue;
827 
828  for ( const auto& ds : *pixelTracks ) {
829  const CTPPSPixelDetId pixId( ds.detId() );
830  if ( pixId.station() != CTPPS_PIXEL_STATION_ID || pixId.rp() != CTPPS_FAR_RP_ID ) continue;
831  for ( const auto& lt : ds ) {
832  if ( lt.isValid() && pixId.arm() == detId_pot.arm() ) {
833  if ( rechit.getOOTIndex() != CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING && rechit.getOOTIndex() - centralOOT_ < (int) potPlots_[detId_pot].pixelTomographyAll.size() && rechit.getOOTIndex() - centralOOT_ >= 0 )
834  potPlots_[detId_pot].pixelTomographyAll.at( rechit.getOOTIndex() - centralOOT_ )->Fill( lt.getX0() - horizontalShiftBwDiamondPixels_ + 25*detId.plane(), lt.getY0() );
835  }
836  }
837  }
838  }
839  }
840 
841  //------------------------------
842  // Clock Plots
843  //------------------------------
844 
845  for ( const auto& digis : *diamondDigis ) {
846  const CTPPSDiamondDetId detId( digis.detId() );
847  CTPPSDiamondDetId detId_pot( digis.detId() );
848  if ( detId.channel() == CHANNEL_OF_VFAT_CLOCK ) {
849  detId_pot.setPlane( 0 );
850  detId_pot.setChannel( 0 );
851  for ( const auto& digi : digis ) {
852  if ( digi.getLeadingEdge() != 0 ) {
853  if ( detId.plane() == 1 ) {
854  potPlots_[detId_pot].clock_Digi1_le->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge() );
855  potPlots_[detId_pot].clock_Digi1_te->Fill( HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
856  }
857  if ( detId.plane() == 3 ) {
858  potPlots_[detId_pot].clock_Digi3_le->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge() );
859  potPlots_[detId_pot].clock_Digi3_te->Fill( HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
860  }
861  }
862  }
863  }
864  }
865 
866  //------------------------------
867  // Plane Plots
868  //------------------------------
869 
870  // Using CTPPSDiamondDigi
871  std::unordered_map<unsigned int, unsigned int> channelsPerPlane;
872  for ( const auto& digis : *diamondDigis ) {
873  const CTPPSDiamondDetId detId( digis.detId() );
874  CTPPSDiamondDetId detId_plane( digis.detId() );
875  for ( const auto& digi : digis ) {
876  detId_plane.setChannel( 0 );
877  if ( detId.channel() == CHANNEL_OF_VFAT_CLOCK ) continue;
878  if ( planePlots_.find( detId_plane ) == planePlots_.end() ) continue;
879 
880  if ( digi.getLeadingEdge() != 0 ) {
881  planePlots_[detId_plane].digiProfileCumulativePerPlane->Fill( detId.channel() );
882  if ( channelsPerPlane.find(detId_plane) != channelsPerPlane.end() ) channelsPerPlane[detId_plane]++;
883  else channelsPerPlane[detId_plane] = 0;
884  }
885  }
886  }
887 
888  for ( const auto& plt : channelsPerPlane ) {
889  planePlots_[plt.first].hit_multiplicity->Fill( plt.second );
890  }
891 
892  // Using CTPPSDiamondRecHit
893  for ( const auto& rechits : *diamondRecHits ) {
894  CTPPSDiamondDetId detId_plane( rechits.detId() );
895  detId_plane.setChannel( 0 );
896  for ( const auto& rechit : rechits ) {
897  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
898  if ( rechit.getToT() == 0 ) continue;
899  if ( planePlots_.find( detId_plane ) != planePlots_.end() ) {
900  if ( centralOOT_ != -999 && rechit.getOOTIndex() == centralOOT_ ) {
901  TH1F *hitHistoTmp = planePlots_[detId_plane].hitProfile->getTH1F();
902  int startBin = hitHistoTmp->FindBin( rechit.getX() - horizontalShiftOfDiamond_ - 0.5*rechit.getXWidth() );
903  int numOfBins = rechit.getXWidth()*INV_DISPLAY_RESOLUTION_FOR_HITS_MM;
904  for ( int i=0; i<numOfBins; ++i) {
905  hitHistoTmp->Fill( hitHistoTmp->GetBinCenter(startBin+i) );
906  }
907  }
908  }
909  }
910  }
911 
912 
913  //Tomography of diamonds using pixel and Efficiency WRT Pixels
914  for ( const auto& ds : *pixelTracks ) {
915  const CTPPSPixelDetId pixId( ds.detId() );
916  if ( pixId.station() != CTPPS_PIXEL_STATION_ID || pixId.rp() != CTPPS_FAR_RP_ID ) continue;
917  if ( ds.size() > 1 ) continue;
918  for ( const auto& lt : ds ) {
919  if ( lt.isValid() ) {
920  // For efficieny
922  potPlots_[detId_pot].pixelTracksMap.Fill( lt.getX0() - horizontalShiftBwDiamondPixels_, lt.getY0() );
923 
924  std::set< CTPPSDiamondDetId > planesWitHits_set;
925  for ( const auto& rechits : *diamondRecHits ) {
926  CTPPSDiamondDetId detId_plane( rechits.detId() );
927  detId_plane.setChannel( 0 );
928  for ( const auto& rechit : rechits ) {
929  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
930  if ( rechit.getOOTIndex() == CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING || rechit.getToT() == 0 ) continue;
931  if ( planePlots_.find(detId_plane) == planePlots_.end() ) continue;
932  if ( pixId.arm() == detId_plane.arm() ) {
933  planePlots_[detId_plane].pixelTomography_far->Fill( lt.getX0() - horizontalShiftBwDiamondPixels_ + 25*rechit.getOOTIndex(), lt.getY0() );
934  if ( centralOOT_ != -999 && rechit.getOOTIndex() == centralOOT_ ) planesWitHits_set.insert( detId_plane );
935  }
936 
937  }
938  }
939 
940  for (auto& planeId : planesWitHits_set)
941  planePlots_[planeId].pixelTracksMapWithDiamonds.Fill( lt.getX0() - horizontalShiftBwDiamondPixels_, lt.getY0() );
942 
943  }
944 
945  }
946  }
947 
948 
949  //------------------------------
950  // Channel Plots
951  //------------------------------
952 
953  //Check Event Number
954  for ( const auto& vfat_status : *diamondVFATStatus ) {
955  const CTPPSDiamondDetId detId( vfat_status.detId() );
956  for ( const auto& status : vfat_status ) {
957  if ( !status.isOK() ) continue;
958  if ( channelPlots_.find(detId) != channelPlots_.end() ) {
959  for ( const auto& optorx : *fedInfo ) {
960  if ( ( detId.arm() == 1 && optorx.getFEDId() == CTPPS_FED_ID_56 ) || ( detId.arm() == 0 && optorx.getFEDId() == CTPPS_FED_ID_45 ) ) {
961  channelPlots_[detId].ECCheckPerChannel->Fill((int)((optorx.getLV1()& 0xFF)-((unsigned int) status.getEC() & 0xFF)) & 0xFF);
962  }
963  }
964  }
965  }
966  }
967 
968  // digi profile cumulative
969  for ( const auto& digis : *diamondDigis ) {
970  const CTPPSDiamondDetId detId( digis.detId() );
971  for ( const auto& digi : digis ) {
972  if ( detId.channel() == CHANNEL_OF_VFAT_CLOCK ) continue;
973  if ( channelPlots_.find( detId ) != channelPlots_.end() ) {
974  // HPTDC Errors
975  const HPTDCErrorFlags hptdcErrors = digi.getHPTDCErrorFlags();
976  for ( unsigned short hptdcErrorIndex = 1; hptdcErrorIndex < 16; ++hptdcErrorIndex )
977  if ( hptdcErrors.getErrorId( hptdcErrorIndex-1 ) ) channelPlots_[detId].HPTDCErrorFlags->Fill( hptdcErrorIndex );
978  if ( digi.getMultipleHit() ) ++(channelPlots_[detId].MHCounter);
979 
980  // Check dropped trailing edges
981  if ( digi.getLeadingEdge() != 0 || digi.getTrailingEdge() != 0 ) {
982  ++(channelPlots_[detId].HitCounter);
983  if ( digi.getLeadingEdge() != 0 && digi.getTrailingEdge() == 0 ) {
984  ++(channelPlots_[detId].LeadingOnlyCounter);
985  channelPlots_[detId].leadingEdgeCumulative_le->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge() );
986  }
987  if ( digi.getLeadingEdge() == 0 && digi.getTrailingEdge() != 0 ) {
988  ++(channelPlots_[detId].TrailingOnlyCounter);
989  channelPlots_[detId].trailingEdgeCumulative_te->Fill( HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
990  }
991  if ( digi.getLeadingEdge() != 0 && digi.getTrailingEdge() != 0 ) {
992  ++(channelPlots_[detId].CompleteCounter);
993  channelPlots_[detId].LeadingTrailingCorrelationPerChannel->Fill( HPTDC_BIN_WIDTH_NS * digi.getLeadingEdge(), HPTDC_BIN_WIDTH_NS * digi.getTrailingEdge() );
994  }
995  }
996  }
997  }
998  }
999 
1000  // Using CTPPSDiamondRecHit
1001  for ( const auto& rechits : *diamondRecHits ) {
1002  CTPPSDiamondDetId detId( rechits.detId() );
1003  for ( const auto& rechit : rechits ) {
1004  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
1005  if ( channelPlots_.find( detId ) != channelPlots_.end() ) {
1006  if ( rechit.getOOTIndex() != CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING && rechit.getToT() != 0 ) {
1007  channelPlots_[detId].leadingEdgeCumulative_both->Fill( rechit.getT() + 25*rechit.getOOTIndex() );
1008  channelPlots_[detId].TimeOverThresholdCumulativePerChannel->Fill( rechit.getToT() );
1009  }
1010  ++(channelPlots_[detId].hitsCounterPerLumisection);
1011  }
1012 
1013  if ( rechit.getOOTIndex() != CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING && rechit.getOOTIndex() < (int) channelPlots_[detId].activity_per_bx.size() )
1014  channelPlots_[detId].activity_per_bx.at( rechit.getOOTIndex() )->Fill( event.bunchCrossing() );
1015  }
1016 
1017  }
1018 
1019  // Tomography of diamonds using pixel
1020  for ( const auto& rechits : *diamondRecHits ) {
1021  const CTPPSDiamondDetId detId( rechits.detId() );
1022  for ( const auto& rechit : rechits ) {
1023  if ( excludeMultipleHits_ && rechit.getMultipleHits() > 0 ) continue;
1024  if ( rechit.getOOTIndex() == CTPPSDiamondRecHit::TIMESLICE_WITHOUT_LEADING || rechit.getToT() == 0 ) continue;
1025  if ( !pixelTracks.isValid() ) continue;
1026  if (channelPlots_.find(detId) == channelPlots_.end()) continue;
1027 
1028  for ( const auto& ds : *pixelTracks ) {
1029  const CTPPSPixelDetId pixId( ds.detId() );
1030  if ( pixId.station() != CTPPS_PIXEL_STATION_ID || pixId.rp() != CTPPS_FAR_RP_ID ) continue;
1031  for ( const auto& lt : ds ) {
1032  if ( lt.isValid() && pixId.arm() == detId.arm() )
1033  channelPlots_[detId].pixelTomography_far->Fill( lt.getX0() - horizontalShiftBwDiamondPixels_ + 25*rechit.getOOTIndex(), lt.getY0() );
1034  }
1035  }
1036  }
1037  }
1038 
1039 }
static const int CTPPS_FED_ID_56
static const int CHANNEL_OF_VFAT_CLOCK
void setPlane(uint32_t channel)
void setChannel(uint32_t channel)
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondDigi > > tokenDigi_
bool getErrorId(unsigned short id) const
int bunchCrossing() const
Definition: EventBase.h:66
Event setup record containing the real (actual) geometry information.
static const int CTPPS_PIXEL_STATION_ID
void Fill(long long x)
static const int CTPPS_DIAMOND_STATION_ID
void Fill(HcalDetId &id, double val, std::vector< TH2F > &depth)
std::unordered_map< unsigned int, ChannelPlots > channelPlots_
edm::EDGetTokenT< edm::DetSetVector< CTPPSPixelLocalTrack > > tokenPixelTrack_
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
uint32_t arm() const
Definition: CTPPSDetId.h:52
bool isValid() const
Definition: HandleBase.h:74
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondLocalTrack > > tokenDiamondTrack_
static const double HPTDC_BIN_WIDTH_NS
static const double INV_DISPLAY_RESOLUTION_FOR_HITS_MM
const T & get() const
Definition: EventSetup.h:59
bool channelAlignedWithTrack(const CTPPSGeometry *geom, const CTPPSDiamondDetId &detid, const CTPPSDiamondLocalTrack &localTrack, const float tolerance=1)
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
std::unordered_map< unsigned int, PotPlots > potPlots_
static constexpr int TIMESLICE_WITHOUT_LEADING
edm::EDGetTokenT< edm::DetSetVector< CTPPSDiamondRecHit > > tokenDiamondHit_
static const int CTPPS_FAR_RP_ID
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
std::unordered_map< unsigned int, PlanePlots > planePlots_
static const int CTPPS_DIAMOND_RP_ID
edm::EDGetTokenT< std::vector< TotemFEDInfo > > tokenFEDInfo_
static const int CTPPS_FED_ID_45
T const * product() const
Definition: ESHandle.h:86
edm::EDGetTokenT< edm::DetSetVector< TotemVFATStatus > > tokenStatus_
void CTPPSDiamondDQMSource::beginLuminosityBlock ( const edm::LuminosityBlock ,
const edm::EventSetup  
)
overrideprotected

Definition at line 453 of file CTPPSDiamondDQMSource.cc.

References plotFactory::plot, and potPlots_.

454 {
455  for ( auto& plot : potPlots_ )
456  plot.second.hitDistribution2d_lumisection->Reset();
457 }
std::unordered_map< unsigned int, PotPlots > potPlots_
void CTPPSDiamondDQMSource::bookHistograms ( DQMStore::IBooker ibooker,
const edm::Run ,
const edm::EventSetup  
)
overrideprotected

Definition at line 428 of file CTPPSDiamondDQMSource.cc.

References DQMStore::IBooker::cd(), channelPlots_, CTPPS_DIAMOND_NUM_OF_CHANNELS, CTPPS_DIAMOND_NUM_OF_PLANES, CTPPS_DIAMOND_RP_ID, CTPPS_DIAMOND_STATION_ID, CTPPS_NUM_OF_ARMS, globalPlot_, planePlots_, potPlots_, and DQMStore::IBooker::setCurrentFolder().

429 {
430  ibooker.cd();
431  ibooker.setCurrentFolder( "CTPPS" );
432 
433  globalPlot_= GlobalPlots( ibooker );
434 
435  for ( unsigned short arm = 0; arm < CTPPS_NUM_OF_ARMS; ++arm ) {
437  potPlots_[rpId] = PotPlots( ibooker, rpId );
438  for ( unsigned short pl = 0; pl < CTPPS_DIAMOND_NUM_OF_PLANES; ++pl ) {
440  planePlots_[plId] = PlanePlots( ibooker, plId);
441  for ( unsigned short ch = 0; ch < CTPPS_DIAMOND_NUM_OF_CHANNELS; ++ch ) {
443  channelPlots_[chId] = ChannelPlots( ibooker, chId );
444  }
445  }
446  }
447 }
static const int CTPPS_DIAMOND_NUM_OF_PLANES
static const int CTPPS_NUM_OF_ARMS
static const int CTPPS_DIAMOND_NUM_OF_CHANNELS
static const int CTPPS_DIAMOND_STATION_ID
std::unordered_map< unsigned int, ChannelPlots > channelPlots_
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:279
std::unordered_map< unsigned int, PotPlots > potPlots_
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
std::unordered_map< unsigned int, PlanePlots > planePlots_
static const int CTPPS_DIAMOND_RP_ID
void CTPPSDiamondDQMSource::dqmBeginRun ( const edm::Run iRun,
const edm::EventSetup iSetup 
)
overrideprotected

Definition at line 399 of file CTPPSDiamondDQMSource.cc.

References centralOOT_, edm::contains(), CTPPS_DIAMOND_RP_ID, CTPPS_DIAMOND_STATION_ID, CTPPS_FAR_RP_ID, CTPPS_PIXEL_STATION_ID, relativeConstraints::geom, edm::EventSetup::get(), CTPPSGeometry::getSensor(), horizontalShiftBwDiamondPixels_, horizontalShiftOfDiamond_, DetGeomDesc::params(), edm::ESHandle< T >::product(), edm::RunBase::run(), runParameters_, and DetGeomDesc::translation().

400 {
401  centralOOT_ = -999;
402  for ( const auto& oot : runParameters_ ) {
403  if ( edm::contains( oot.first, edm::EventID( iRun.run(), 0, 1 ) ) ) {
404  centralOOT_ = oot.second; break;
405  }
406  }
407 
408  // Get detector shifts from the geometry
410  iSetup.get<VeryForwardRealGeometryRecord>().get( geometry_ );
411  const CTPPSGeometry *geom = geometry_.product();
413  const DetGeomDesc* det = geom->getSensor( detid );
414  horizontalShiftOfDiamond_ = det->translation().x() - det->params().at( 0 );
415 
416  // Rough alignement of pixel detector for diamond thomography
418  if ( iRun.run()>300000 ) { //Pixel installed
419  det = geom->getSensor( pixid );
421  }
422 }
bool contains(EventRange const &lh, EventID const &rh)
Definition: EventRange.cc:38
RunNumber_t run() const
Definition: RunBase.h:40
Event setup record containing the real (actual) geometry information.
static const int CTPPS_PIXEL_STATION_ID
static const int CTPPS_DIAMOND_STATION_ID
const DetGeomDesc * getSensor(unsigned int id) const
returns geometry of a detector performs necessary checks, returns NULL if fails
std::vector< std::pair< edm::EventRange, int > > runParameters_
Geometrical description of a sensor.
Definition: DetGeomDesc.h:37
DDTranslation translation() const
Definition: DetGeomDesc.h:84
The manager class for TOTEM RP geometry.
Definition: CTPPSGeometry.h:33
const T & get() const
Definition: EventSetup.h:59
static const int CTPPS_FAR_RP_ID
std::vector< double > params() const
Definition: DetGeomDesc.h:89
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
static const int CTPPS_DIAMOND_RP_ID
T const * product() const
Definition: ESHandle.h:86
void CTPPSDiamondDQMSource::endLuminosityBlock ( const edm::LuminosityBlock ,
const edm::EventSetup  
)
overrideprotected

Definition at line 1044 of file CTPPSDiamondDQMSource.cc.

References CTPPSDetId::arm(), CTPPSDiamondDetId::channel(), channelPlots_, PostProcessor_cff::efficiency, CTPPSDiamondDetId::plane(), planePlots_, plotFactory::plot, potPlots_, CTPPSDetId::rp(), SEC_PER_LUMI_SECTION, CTPPSDiamondDetId::setPlane(), and pileupDistInMC::total.

1045 {
1046  for ( auto& plot : channelPlots_ ) {
1047  if ( plot.second.hitsCounterPerLumisection != 0 ) {
1048  plot.second.hit_rate->Fill( (double) plot.second.hitsCounterPerLumisection / SEC_PER_LUMI_SECTION );
1049  }
1050  plot.second.hitsCounterPerLumisection = 0;
1051 
1052  double HundredOverHitCounter = .0;
1053  if ( plot.second.HitCounter != 0 )
1054  HundredOverHitCounter = 100. / plot.second.HitCounter;
1055  plot.second.HPTDCErrorFlags->setBinContent( 16, HundredOverHitCounter * plot.second.MHCounter );
1056  plot.second.leadingWithoutTrailing->setBinContent(1, HundredOverHitCounter * plot.second.LeadingOnlyCounter );
1057  plot.second.leadingWithoutTrailing->setBinContent(2, HundredOverHitCounter * plot.second.TrailingOnlyCounter );
1058  plot.second.leadingWithoutTrailing->setBinContent(3, HundredOverHitCounter * plot.second.CompleteCounter );
1059  }
1060 
1061  for ( auto& plot : potPlots_ ) {
1062  double HundredOverHitCounterPot = 0.;
1063  if ( plot.second.HitCounter !=0 )
1064  HundredOverHitCounterPot = 100. / plot.second.HitCounter;
1065  plot.second.HPTDCErrorFlags_cumulative->setBinContent( 16, HundredOverHitCounterPot * plot.second.MHCounter );
1066  plot.second.leadingWithoutTrailingCumulativePot->setBinContent(1, HundredOverHitCounterPot * plot.second.LeadingOnlyCounter );
1067  plot.second.leadingWithoutTrailingCumulativePot->setBinContent(2, HundredOverHitCounterPot * plot.second.TrailingOnlyCounter );
1068  plot.second.leadingWithoutTrailingCumulativePot->setBinContent(3, HundredOverHitCounterPot * plot.second.CompleteCounter );
1069 
1070  plot.second.MHComprensive->Reset();
1071  CTPPSDiamondDetId rpId(plot.first);
1072  for ( auto& chPlot : channelPlots_ ) {
1073  CTPPSDiamondDetId chId(chPlot.first);
1074  if ( chId.arm() == rpId.arm() && chId.rp() == rpId.rp() ) {
1075  plot.second.MHComprensive->Fill(chId.plane(), chId.channel(), chPlot.second.HPTDCErrorFlags->getBinContent( 16 ) );
1076  }
1077  }
1078 
1079  }
1080 
1081  // Efficiencies of single channels
1082  for ( auto& plot : potPlots_ ) {
1083  plot.second.EfficiencyOfChannelsInPot->Reset();
1084  for ( auto& element : plot.second.effTriplecountingChMap ) {
1085  if ( plot.second.effDoublecountingChMap[ element.first ] > 0) {
1086  int plane = element.first / 100;
1087  int channel = element.first % 100;
1088  double counted = element.second;
1089  double total = plot.second.effDoublecountingChMap[ element.first ];
1090  double efficiency = counted / total;
1091 // double error = std::sqrt( efficiency * ( 1 - efficiency ) / total );
1092 
1093  plot.second.EfficiencyOfChannelsInPot->Fill(plane, channel, 100*efficiency);
1094  }
1095  }
1096  }
1097 
1098  // Efficeincy wrt pixels //TODO
1099  for ( auto& plot : planePlots_ ) {
1100  TH2F *hitHistoTmp = plot.second.EfficiencyWRTPixelsInPlane->getTH2F();
1101 
1102  CTPPSDiamondDetId detId_pot( plot.first );
1103  detId_pot.setPlane( 0 );
1104 
1105  hitHistoTmp->Divide( &(plot.second.pixelTracksMapWithDiamonds), &(potPlots_[detId_pot].pixelTracksMap) );
1106  }
1107 }
std::unordered_map< unsigned int, ChannelPlots > channelPlots_
std::unordered_map< unsigned int, PotPlots > potPlots_
static const double SEC_PER_LUMI_SECTION
Detector ID class for CTPPS Timing Diamond detectors. Bits [19:31] : Assigend in CTPPSDetId Calss Bit...
std::unordered_map< unsigned int, PlanePlots > planePlots_
void CTPPSDiamondDQMSource::endRun ( const edm::Run ,
const edm::EventSetup  
)
overrideprotected

Definition at line 1112 of file CTPPSDiamondDQMSource.cc.

References DEFINE_FWK_MODULE.

1113 {}

Member Data Documentation

int CTPPSDiamondDQMSource::centralOOT_
private

Definition at line 102 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and dqmBeginRun().

const int CTPPSDiamondDQMSource::CHANNEL_OF_VFAT_CLOCK = 30
staticprivate

Definition at line 76 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

std::unordered_map<unsigned int, ChannelPlots> CTPPSDiamondDQMSource::channelPlots_
private

Definition at line 208 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), bookHistograms(), and endLuminosityBlock().

const int CTPPSDiamondDQMSource::CTPPS_DIAMOND_NUM_OF_CHANNELS = 12
staticprivate

Definition at line 87 of file CTPPSDiamondDQMSource.cc.

Referenced by bookHistograms().

const int CTPPSDiamondDQMSource::CTPPS_DIAMOND_NUM_OF_PLANES = 4
staticprivate

Definition at line 86 of file CTPPSDiamondDQMSource.cc.

Referenced by bookHistograms().

const int CTPPSDiamondDQMSource::CTPPS_DIAMOND_RP_ID = 6
staticprivate

Definition at line 82 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), bookHistograms(), and dqmBeginRun().

const int CTPPSDiamondDQMSource::CTPPS_DIAMOND_STATION_ID = 1
staticprivate

Definition at line 81 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), bookHistograms(), and dqmBeginRun().

const int CTPPSDiamondDQMSource::CTPPS_FAR_RP_ID = 3
staticprivate

Definition at line 85 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and dqmBeginRun().

const int CTPPSDiamondDQMSource::CTPPS_FED_ID_45 = 583
staticprivate

Definition at line 88 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

const int CTPPSDiamondDQMSource::CTPPS_FED_ID_56 = 582
staticprivate

Definition at line 89 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

const int CTPPSDiamondDQMSource::CTPPS_NEAR_RP_ID = 2
staticprivate

Definition at line 84 of file CTPPSDiamondDQMSource.cc.

const int CTPPSDiamondDQMSource::CTPPS_NUM_OF_ARMS = 2
staticprivate

Definition at line 80 of file CTPPSDiamondDQMSource.cc.

Referenced by bookHistograms().

const int CTPPSDiamondDQMSource::CTPPS_PIXEL_STATION_ID = 2
staticprivate

Definition at line 83 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and dqmBeginRun().

const double CTPPSDiamondDQMSource::DISPLAY_RESOLUTION_FOR_HITS_MM = 0.1
staticprivate

Definition at line 77 of file CTPPSDiamondDQMSource.cc.

int CTPPSDiamondDQMSource::EC_difference_45_
private

Definition at line 164 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

int CTPPSDiamondDQMSource::EC_difference_56_
private

Definition at line 164 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

bool CTPPSDiamondDQMSource::excludeMultipleHits_
private

Definition at line 98 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

GlobalPlots CTPPSDiamondDQMSource::globalPlot_
private

Definition at line 114 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and bookHistograms().

double CTPPSDiamondDQMSource::horizontalShiftBwDiamondPixels_
private

Definition at line 99 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and dqmBeginRun().

double CTPPSDiamondDQMSource::horizontalShiftOfDiamond_
private

Definition at line 100 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), and dqmBeginRun().

const double CTPPSDiamondDQMSource::HPTDC_BIN_WIDTH_NS = 25./1024
staticprivate

Definition at line 79 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

const double CTPPSDiamondDQMSource::INV_DISPLAY_RESOLUTION_FOR_HITS_MM = 1./DISPLAY_RESOLUTION_FOR_HITS_MM
staticprivate
std::unordered_map<unsigned int, PlanePlots> CTPPSDiamondDQMSource::planePlots_
private

Definition at line 182 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze(), bookHistograms(), and endLuminosityBlock().

std::unordered_map<unsigned int, PotPlots> CTPPSDiamondDQMSource::potPlots_
private
std::vector< std::pair<edm::EventRange, int> > CTPPSDiamondDQMSource::runParameters_
private

Definition at line 101 of file CTPPSDiamondDQMSource.cc.

Referenced by CTPPSDiamondDQMSource(), and dqmBeginRun().

const double CTPPSDiamondDQMSource::SEC_PER_LUMI_SECTION = 23.31
staticprivate

Definition at line 75 of file CTPPSDiamondDQMSource.cc.

Referenced by endLuminosityBlock().

edm::EDGetTokenT< edm::DetSetVector<CTPPSDiamondRecHit> > CTPPSDiamondDQMSource::tokenDiamondHit_
private

Definition at line 94 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

edm::EDGetTokenT< edm::DetSetVector<CTPPSDiamondLocalTrack> > CTPPSDiamondDQMSource::tokenDiamondTrack_
private

Definition at line 95 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

edm::EDGetTokenT< edm::DetSetVector<CTPPSDiamondDigi> > CTPPSDiamondDQMSource::tokenDigi_
private

Definition at line 93 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

edm::EDGetTokenT< std::vector<TotemFEDInfo> > CTPPSDiamondDQMSource::tokenFEDInfo_
private

Definition at line 96 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

edm::EDGetTokenT< edm::DetSetVector<CTPPSPixelLocalTrack> > CTPPSDiamondDQMSource::tokenPixelTrack_
private

Definition at line 92 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

edm::EDGetTokenT< edm::DetSetVector<TotemVFATStatus> > CTPPSDiamondDQMSource::tokenStatus_
private

Definition at line 91 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().

unsigned int CTPPSDiamondDQMSource::verbosity_
private

Definition at line 103 of file CTPPSDiamondDQMSource.cc.

Referenced by analyze().