Skip to content
Snippets Groups Projects
Commit f60bd9b8 authored by Walter Lampl's avatar Walter Lampl
Browse files

Merge branch 'triggeneric_cleanup' into 'master'

TrigGenericAlgs: Delete some obsolete algorithms

See merge request atlas/athena!36122
parents 766f2e9b 13739cbc
6 merge requests!58791DataQualityConfigurations: Modify L1Calo config for web display,!46784MuonCondInterface: Enable thread-safety checking.,!46776Updated LArMonitoring config file for WD to match new files produced using MT,!45405updated ART test cron job,!42417Draft: DIRE and VINCIA Base Fragments for Pythia 8.3,!36122TrigGenericAlgs: Delete some obsolete algorithms
Showing
with 4 additions and 2321 deletions
...@@ -17,5 +17,3 @@ atlas_add_component( TrigGenericAlgs ...@@ -17,5 +17,3 @@ atlas_add_component( TrigGenericAlgs
# Install files from the package: # Install files from the package:
atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} --extend-extensions=ATL900,ATL901 ) atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} --extend-extensions=ATL900,ATL901 )
atlas_install_joboptions( share/*.py )
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef TRIGGENERICALGS_DETECTORTIMINGALGO_H
#define TRIGGENERICALGS_DETECTORTIMINGALGO_H
/**
* @brief Algorithm to analyse the detector timing information after the L1 correlation algo
* @author Nils Ruthmann
*
* $Id: $
*/
//#include "TrigInterfaces/Algo.h"
#include "TrigInterfaces/AllTEAlgo.h"
#include "GaudiKernel/ServiceHandle.h"
#include "GaudiKernel/ToolHandle.h"
#include "Gaudi/Property.h"
#include <string>
#include <vector>
#include <map>
#include <stdint.h>
#include "TrigT1Interfaces/RecMuonRoiSvc.h"
#include "TrigMuonToolInterfaces/ITrigMuonRoITool.h"
#include "TrigConfInterfaces/ITrigConfigSvc.h"
#include "xAODTrigL1Calo/TriggerTowerContainer.h"
#include "TrigSteeringEvent/TrigRoiDescriptor.h"
#include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
/* #include "TrigL2MuonSA/MuFastDataPreparator.h" */
/* #include "TrigL2MuonSA/MuFastPatternFinder.h" */
/* #include "TrigL2MuonSA/MuFastStationFitter.h" */
/* #include "TrigL2MuonSA/MuFastTrackFitter.h" */
/* #include "TrigL2MuonSA/MuFastTrackExtrapolator.h" */
/* #include "TrigL2MuonSA/RecMuonRoIUtils.h" */
/* #include "TrigL2MuonSA/MuCalStreamerTool.h" */
#include "TrigL2MuonSA/RpcDataPreparator.h"
#include "xAODTrigMuon/L2StandAloneMuonContainer.h"
#include "xAODTrigL1Calo/TriggerTowerContainer.h"
class DetectorTimingAlgo : public HLT::AllTEAlgo {
public:
unsigned int getBitMaskValue( const unsigned int uintValue, const unsigned int mask );
DetectorTimingAlgo(const std::string& name, ISvcLocator* pSvcLocator);
HLT::ErrorCode hltInitialize();
HLT::ErrorCode hltFinalize() { return HLT::OK; }
/// Run once per event
HLT::ErrorCode hltExecute(std::vector<HLT::TEVec>&, unsigned int output);
void updateHandler(Gaudi::Details::PropertyBase& p);
// TrigL2MuonSA::RecMuonRoIUtils m_recMuonRoIUtils;
// ToolHandle<TrigL2MuonSA::MuFastDataPreparator> m_dataPreparator;
ToolHandle<TrigL2MuonSA::RpcDataPreparator>m_rpcDataPreparator;
ToolHandle<ITrigMuonRoITool> m_trigMuonRoITool;
ToolHandle<TrigL2MuonSA::RpcPatFinder> m_dummypatfinder;
//ToolHandle<RpcDataPreparator> m_rpcDataPreparator;
// ToolHandle<ITrigMuonBackExtrapolator> m_backExtrapolatorTool;
private:
const xAOD::CaloClusterContainer *m_caloCluster;
//const TrigRoiDescriptor* m_roiDescriptor;
std::vector<const TrigRoiDescriptor*> m_roiDescriptorVector;
//const xAOD::L2StandAloneMuonContainer *m_muonColl;
/* ToolHandle<ITrigMuonRoITool> m_trigMuonRoITool; */
ServiceHandle<LVL1::RecMuonRoiSvc> m_recRPCRoiSvc;
/* ServiceHandle<LVL1::RecMuonRoiSvc> m_recTGCRoiSvc; */
ServiceHandle<TrigConf::ITrigConfigSvc > m_configSvc;
std::vector<double> m_l1roi_eta;
std::vector<double> m_l1roi_phi;
std::vector<float> m_clustertime_5;
std::vector<float> m_clustertime_10;
float m_clustertime_10_sigma;
std::vector<float> m_clustertime_25;
std::vector<float> m_clustertime_50;
std::vector<float> m_muonroi_intime_pt;
std::vector<float> m_muonroi_intime_eta;
std::vector<float> m_muonroi_intime_phi;
std::vector<float> m_muonroi_outtime_eta;
std::vector<float> m_muonroi_outtime_phi;
std::vector<float> m_rpctime_matched_intimeroi;
std::vector<float> m_rpctime_matched_outtimeroi;
std::vector<float> m_rpctime_matched_intimeroi_averaged;
std::vector<float> m_rpctime_matched_outtimeroi_averaged;
std::vector<float> m_rpctime_matched_intimeroi_averaged_NOL1BC;
std::vector<float> m_rpctime_matched_outtimeroi_averaged_NOL1BC;
std::vector<float> m_rpceta_matched_intimeroi;
std::vector<float> m_rpcphi_matched_intimeroi;
std::vector<float> m_rpceta_matched_outtimeroi;
std::vector<float> m_rpcphi_matched_outtimeroi;
std::vector<float> m_rpctime_all;
std::vector<float> m_rpctime_eta;
std::vector<float> m_rpctime_phi;
std::vector<float> m_rpctime_005;
std::vector<float> m_rpctime_intimemuonl1;
std::vector<float> m_rpctime_othermuonl1;
//float m_ootfrac_bc;
//float m_ootfrac_bc_10;
//float m_ootfrac_bc_25;
//float m_ootfrac_bc_50;
//float m_ootfrac;
//float m_itfrac;
int m_accept;
//double m_weighted_L1AClusterEta;
double m_weighted_L1AClusterTime;
double m_max_L1AClusterTime_10;
double m_max_L1AClusterTime_2;
double m_closest_L1AClusterTime;
double m_summed_L1AClusterE;
std::vector<double> m_L1ACluster_E;
std::vector<double> m_L1ACluster_eta;
std::vector<double> m_L1ACluster_phi;
std::vector<double> m_L1ACluster_t;
std::vector<double> m_L1ACluster_eta_funnypeak;
std::vector<double> m_L1ACluster_phi_funnypeak;
std::vector<double> m_L1ACluster_t_funnypeak;
/* TrigL2MuonSA::MuonRoad m_muonRoad; */
/* TrigL2MuonSA::RpcHits m_rpcHits; */
/* TrigL2MuonSA::RpcFitResult m_rpcFitResult; */
/* TrigL2MuonSA::TgcFitResult m_tgcFitResult; */
/* TrigL2MuonSA::MdtHits m_mdtHits_normal; */
/* TrigL2MuonSA::MdtHits m_mdtHits_overlap; */
/* TrigL2MuonSA::CscHits m_cscHits; */
/* TrigL2MuonSA::MdtRegion m_mdtRegion; */
/* float m_scaleRoadBarrelInner; */
/* float m_scaleRoadBarrelMiddle; */
/* float m_scaleRoadBarrelOuter; */
const xAOD::TriggerTowerContainer *m_TriggerTowers;
float m_TT_median;
float m_TT_mean;
float m_TT_sigma;
int m_TT_nHad;
int m_TT_nEM;
int m_TT_total;
std::vector<float> m_TT_timings;
std::vector<float> m_TT_timings_noFCAL;
std::vector<float> m_TT_timings_RoI;
std::vector<float> m_deltaR;
int m_y0, m_y1, m_y2, m_y3, m_y4;
float m_x0, m_x1, m_x2, m_x3, m_x4;
float m_eta, m_xv;
int m_readout, m_TTAlg_accept;
int m_ObjAlg_accept_symmetric;
//float m_TT_median_noFCAL, m_TT_median_RoI;
//float m_TT_mean_noFCAL, m_TT_mean_RoI;
//float m_TT_sigma_noFCAL, m_TT_sigma_RoI;
float m_combinedObjects_mean;
float m_combinedObjects_sigma;
std::vector<float> m_combinedObjects_timings;
float m_mu_mean;
float m_mu_sigma;
std::vector<float> m_mu_timings;
};
#endif
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef TRIGGENERICALGS_L1CORRELATIONALGO_H
#define TRIGGENERICALGS_L1CORRELATIONALGO_H
/**
* @brief Algorithm to correlate L1 items across neighbouring BCs
* @author Nils Ruthmann
*
* $Id: $
*/
//#include "TrigInterfaces/Algo.h"
#include "TrigInterfaces/AllTEAlgo.h"
#include "GaudiKernel/ServiceHandle.h"
#include "Gaudi/Property.h"
#include <string>
#include <vector>
#include <map>
#include <stdint.h>
/// for muon tests
#include "TrigT1Interfaces/RecMuonRoiSvc.h"
#include "TrigMuonToolInterfaces/ITrigMuonRoITool.h"
#include "TrigConfInterfaces/ITrigConfigSvc.h"
#include "xAODTrigger/TrigComposite.h"
#include "xAODTrigger/TrigCompositeContainer.h"
class IROBDataProviderSvc;
typedef std::vector<uint32_t> ROBList;
/**
* Algorithm to perform predefined ROB requests.
*
* The ROBs to be requested are definined in the 'ROBRequest' property,
* which is a list of strings of the following format:
* SPEC[,SPEC]* with SPEC = ROBSPEC[#N]
*
* For each list entry, a separate ROB request is performed.
*
* ROBSPEC: (partial) ROB ID to be requested
* If less than 3 bytes, match highest bytes against enabled ROBs
* N : Randomly request N ROBs matching ROBSPEC
*
* Examples:
* '0x11' request all ROBs starting with 0x11
* '0x11, 0x12' ROBs starting with 0x11 or 0x12 within one ROB request
* '0x11a#2' 2 random ROBs out of 0x11a*
* '0x234234' this ROB
* 'ROS-0x1c36#3' 3 random ROBs from ROS with NodeID 0x1c36
* '0x11a#2,0x12#5' INVALID (cannot use more than one random selection per request)
*/
class L1CorrelationAlgo : public HLT::AllTEAlgo {
public:
L1CorrelationAlgo(const std::string& name, ISvcLocator* pSvcLocator);
HLT::ErrorCode hltInitialize();
HLT::ErrorCode hltFinalize() { return HLT::OK; }
/// Run once per event
HLT::ErrorCode hltExecute(std::vector<HLT::TEVec>&, unsigned int output);
void updateHandler(Gaudi::Details::PropertyBase& p);
private:
std::vector<uint32_t> m_bitmasks;
std::vector<uint32_t> m_bitmasks_ele;
std::vector<uint32_t> m_bitmasks_mu;
std::vector<uint32_t> m_bitmasks_jets;
// monitoring:
int m_beforeafterflag;
int m_l1a_type;
int m_other_type;
std::vector<std::string> m_l1itemlist;
// Ideally would like to set the following variables in the init phase
// but need a first ctpfragement to detect all these.. can I do it on first execute? Probably not ?
/* int32_t m_fragment_size ; */
/* int32_t m_header_size ; */
/* int32_t m_trailer_size ; */
/* int32_t m_status_size ; */
/* int32_t m_payload_size ; */
/* int32_t m_timestampwords_size; */
/* int32_t m_extrawords_size; */
/* uint32_t m_ctpFormatVersion; */
/* int m_nitems; */
bool m_nomuon;
bool m_currentBCincl;
std::vector<float> m_etaOutOfTimeMuon;
std::vector<float> m_phiOutOfTimeMuon;
std::vector<float> m_ptThrOutOfTimeMuon;
/* void parseROBRequest(); */
/* bool getROBs(const std::string& robSpec, ROBRequest& req); */
/* std::vector< std::vector<ROBRequest> > m_requestList; */
/* SimpleProperty< ROBList > m_enabledROBs; */
ServiceHandle<IROBDataProviderSvc> m_robDataProviderSvc;
/* std::map< int, ROBList > m_ros_rob_map; // ROS->ROB map */
/* // Properties */
/* StringArrayProperty m_robRequest; */
/* SimpleProperty< std::map<int,int> > m_rob_ros_map ; */
ToolHandle<ITrigMuonRoITool> m_trigMuonRoITool;
ServiceHandle<LVL1::RecMuonRoiSvc> m_recRPCRoiSvc;
ServiceHandle<LVL1::RecMuonRoiSvc> m_recTGCRoiSvc;
ServiceHandle<TrigConf::ITrigConfigSvc > m_configSvc;
xAOD::TrigCompositeContainer * m_passBitContainer ; //!
};
#endif
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
from TrigGenericAlgs.TrigGenericAlgsConf import OverlapRemoval, MergeTopoStarts, L1CorrelationAlgo, DetectorTimingAlgo, AcceptL1TopoMonitor from TrigGenericAlgs.TrigGenericAlgsConf import OverlapRemoval, MergeTopoStarts, AcceptL1TopoMonitor
from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig
class OverlapRemovalConfig(OverlapRemoval): class OverlapRemovalConfig(OverlapRemoval):
...@@ -22,23 +22,6 @@ class MergeTopoStartsConfig(MergeTopoStarts): ...@@ -22,23 +22,6 @@ class MergeTopoStartsConfig(MergeTopoStarts):
self.AthenaMonTools = [monitoring] self.AthenaMonTools = [monitoring]
class L1CorrelationAlgoConfig(L1CorrelationAlgo):
def __init__(self, name="L1CorrelationAlgoDefault", **kwargs):
super(L1CorrelationAlgoConfig , self ).__init__(name)
from TrigGenericAlgs.TrigGenericAlgsMonitoring import L1CorrelationAlgoMonitoring
validationMon = L1CorrelationAlgoMonitoring()
self.AthenaMonTools = [ validationMon ]
class DetectorTimingAlgoConfig(DetectorTimingAlgo):
def __init__(self, name="DetectorTimingAlgoDefault", **kwargs):
super(DetectorTimingAlgoConfig , self ).__init__(name)
from TrigGenericAlgs.TrigGenericAlgsMonitoring import DetectorTimingAlgoMonitoring
validationMon = DetectorTimingAlgoMonitoring()
self.AthenaMonTools = [ validationMon ]
class AcceptL1TopoMonitorConfig(AcceptL1TopoMonitor): class AcceptL1TopoMonitorConfig(AcceptL1TopoMonitor):
def __init__(self, name="AcceptL1TopoMonitorDefault", **kwargs): def __init__(self, name="AcceptL1TopoMonitorDefault", **kwargs):
super(AcceptL1TopoMonitorConfig , self ).__init__(name) super(AcceptL1TopoMonitorConfig , self ).__init__(name)
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
# flake8: noqa (legacy code)
from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig
class L1CorrelationAlgoMonitoring(TrigGenericMonitoringToolConfig):
def __init__ (self, name="L1CorrelationAlgoMonitoring"):
super(L1CorrelationAlgoMonitoring, self).__init__(name)
self.defineTarget(["Online","Validation"])
self.Histograms = [ defineHistogram('EF_L1Corr_beforeafterflag',type='TH1F', title="beforeafterflag", xbins=4, xmin=-1.5, xmax=2.5),
defineHistogram('EF_L1Corr_l1a_type, EF_L1Corr_other_type',type='TH2F', title="typeMatrix ; L1A; Other", xbins=8, xmin=-0.5, xmax=7.5, ybins=8, ymin=-0.5, ymax=7.5),
# defineHistogram('EF_etaOutOfTimeMuon, EF_phiOutOfTimeMuon',type='TH2F', title="lateMuon_etaphi ; #eta; #phi", xbins=20, xmin=-3.5, xmax=3.5, ybins=20, ymin=-3.15, ymax=3.15),
]
class DetectorTimingAlgoMonitoring(TrigGenericMonitoringToolConfig):
def __init__ (self, name="DetectorTimingAlgoMonitoring"):
super(DetectorTimingAlgoMonitoring, self).__init__(name)
self.defineTarget(["Online","Validation"])
self.Histograms = [# defineHistogram('EF_ootfrac_bc',type='TH1F', title="ootfrac_bc", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_ootfrac_bc_10',type='TH1F', title="ootfrac_bc_10", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_ootfrac_bc_25',type='TH1F', title="ootfrac_bc_25", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_ootfrac_bc_50',type='TH1F', title="ootfrac_bc_50", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_ootfrac',type='TH1F', title="ootfrac", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_itfrac',type='TH1F', title="itfrac", xbins=50, xmin=0., xmax=1),
# defineHistogram('EF_L1AClusterTime_weighted',type='TH1F', title="L1AClusterTime_weighted", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_L1AClusterTime_max_2',type='TH1F', title="L1AClusterTime_max_2", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_L1AClusterTime_max_10',type='TH1F', title="L1AClusterTime_max_10", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_L1AClusterTime_accept',type='TH1F', title="L1AClusterTime_accept", xbins=2, xmin=-0.5, xmax=1.5),
# defineHistogram('EF_clustertime_5',type='TH1F', title="clustertime_5", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_clustertime_10',type='TH1F', title="clustertime_10", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_clustertime_10_sigma',type='TH1F', title="clustertimesigma_10", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_eta, EF_rpctime_phi',type='TH2F', title="RPCHIts ; eta; phi",xbins=20, xmin=-4.5, xmax=4.5, ybins=20, ymin=-3.15, ymax=3.15),
# defineHistogram('EF_rpceta_matched_intimeroi, EF_rpcphi_matched_intimeroi',type='TH2F', title="RPCHIts_INTIMEROI ; eta; phi",xbins=20, xmin=-4.5, xmax=4.5, ybins=20, ymin=-3.15, ymax=3.15),
# defineHistogram('EF_rpceta_matched_outtimeroi, EF_rpcphi_matched_outtimeroi',type='TH2F', title="RPCHIts_OUTTIMEROI ; eta; phi",xbins=20, xmin=-4.5, xmax=4.5, ybins=20, ymin=-3.15, ymax=3.15),
# defineHistogram('EF_rpctime_matched_intimeroi',type='TH1F', title="rpctime_matched_intimeroi", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_matched_outtimeroi',type='TH1F', title="rpctime_matched_outtimeroi", xbins=50, xmin=-35., xmax=35),
defineHistogram('EF_rpctime_matched_intimeroi_averaged',type='TH1F', title="rpctime_matched_intimeroi_averaged", xbins=50, xmin=-35., xmax=35),
defineHistogram('EF_rpctime_matched_outtimeroi_averaged',type='TH1F', title="rpctime_matched_outtimeroi_averaged", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_matched_intimeroi_averaged_NOL1BC',type='TH1F', title="rpctime_matched_intimeroi_averaged_NOL1BC", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_matched_outtimeroi_averaged_NOL1BC',type='TH1F', title="rpctime_matched_outtimeroi_averaged_NOL1BC", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_all',type='TH1F', title="rpctime_all", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_005',type='TH1F', title="rpctime_005", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_intime',type='TH1F', title="rpctime_intime", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_rpctime_other',type='TH1F', title="rpctime_other", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_clustertime_25',type='TH1F', title="clustertime_25", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_clustertime_50',type='TH1F', title="clustertime_50", xbins=50, xmin=-35., xmax=35),
# defineHistogram('EF_L1ACluster_eta, EF_L1ACluster_phi',type='TH2F', title="L1AClusterEtaPhi ; eta; phi",xbins=20, xmin=-4.5, xmax=4.5, ybins=20, ymin=-3.15, ymax=3.15),
# defineHistogram('EF_L1ACluster_eta_funnypeak, EF_L1ACluster_phi_funnypeak',type='TH2F', title="L1AClusterEtaPhi_funnypeak ; eta; phi",xbins=20, xmin=-4.5, xmax=4.5, ybins=20, ymin=-3.15, ymax=3.15),
# defineHistogram('EF_L1ACluster_eta, EF_L1ACluster_t',type='TH2F', title="L1AClusterEtaTime ; eta; t",xbins=20, xmin=-4.5, xmax=4.5, ybins=30, ymin=-30, ymax=30),
# defineHistogram('EF_L1ACluster_eta_funnypeak, EF_L1ACluster_t_funnypeak',type='TH2F', title="L1AClusterEtaTime_funnypeak ; eta; t",xbins=20, xmin=-4.5, xmax=4.5, ybins=30, ymin=-30, ymax=30),
# defineHistogram('EF_ootfrac_bc_10, EF_L1AClusterTime_weighted',type='TH2F', title="ootfrac_bc_10vsL1AClusterTime ; ootfrac; L1AClusterTime", xbins=50, xmin=0., xmax=1, ybins=50, ymin=-35., ymax=35),
################TriggerTowerStuff#####################
# defineHistogram('EF_TT_median', type='TH1F', title="TriggerTowerTiming_median", xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_TT_mean', type='TH1F', title="TriggerTowerTiming_mean", xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_TT_sigma', type='TH1F', title="TriggerTowerTiming_sigma", xbins=88, xmin=-2, xmax=20),
defineHistogram('EF_mu_mean', type='TH1F', title="MuTime_mean", xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_mu_sigma', type='TH1F', title="MuTime_sigma", xbins=88, xmin=-2, xmax=20),
defineHistogram('EF_mu_timings', type='TH1F', title="MuTiming",xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_mu_mean, EF_mu_sigma', type='TH2F', title="MuMean_vs_sigma ; mean; sigma", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=0, ymax=20.),
defineHistogram('EF_Obj_mean', type='TH1F', title="CombinedObjectsTime_mean", xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_Obj_sigma', type='TH1F', title="CombinedObjectsTime_sigma", xbins=88, xmin=-2, xmax=20),
defineHistogram('EF_Obj_timings', type='TH1F', title="combinedObjectsTiming",xbins=102, xmin=-52, xmax=50),
defineHistogram('EF_Obj_mean, EF_Obj_sigma', type='TH2F', title="combinedObjectsMean_vs_sigma ; mean; sigma", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=0, ymax=20.),
# defineHistogram('EF_TT_median_noFCAL', type='TH1F', title="TriggerTowerTiming_median_noFCAL", xbins=102, xmin=-52, xmax=50),
# defineHistogram('EF_TT_mean_noFCAL', type='TH1F', title="TriggerTowerTiming_mean_noFCAL", xbins=102, xmin=-52, xmax=50),
# defineHistogram('EF_TT_sigma_noFCAL', type='TH1F', title="TriggerTowerTiming_sigma_noFCAL", xbins=88, xmin=-2, xmax=20),
# defineHistogram('EF_TT_median_RoI', type='TH1F', title="TriggerTowerTiming_median_RoI", xbins=102, xmin=-52, xmax=50),
# defineHistogram('EF_TT_mean_RoI', type='TH1F', title="TriggerTowerTiming_mean_RoI", xbins=102, xmin=-52, xmax=50),
# defineHistogram('EF_TT_sigma_RoI', type='TH1F', title="TriggerTowerTiming_sigma_RoI", xbins=88, xmin=-2, xmax=20),
# defineHistogram('EF_TT_total',type='TH1F', title="TT_total", xbins=101, xmin=-0.5, xmax=100.5),
# defineHistogram('EF_TTAlg_accept',type='TH1F', title="ObjAlg_accept", xbins=2, xmin=-0.5, xmax=1.5),
defineHistogram('EF_ObjAlg_accept_symmetric',type='TH1F', title="ObjAlg_accept_symmetric", xbins=2, xmin=-0.5, xmax=1.5),
# defineHistogram('EF_TT_median, EF_TT_total', type='TH2F', title="TTMedian_vs_nTowers ; median; nTowers", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=-0.5, ymax=29.5),
# defineHistogram('EF_TT_median, EF_TT_nEM', type='TH2F', title="TTMedian_vs_nTowers_EM ; median; nTowers_EM", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=-0.5, ymax=29.5),
# defineHistogram('EF_TT_median, EF_TT_nHad', type='TH2F', title="TTMedian_vs_nTowers_Had ; median; nTowers_Had", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=-0.5, ymax=29.5),
defineHistogram('EF_TT_mean, EF_TT_sigma', type='TH2F', title="TTMean_vs_sigma ; mean; sigma", xbins=102, xmin=-52, xmax=50, ybins=30, ymin=0, ymax=20.),
defineHistogram('EF_TT_timings', type='TH1F', title="TriggerTowerTimings",xbins=102, xmin=-52, xmax=50),
#defineHistogram('EF_deltaR', type='TH1F', title="TT_RoI_deltaR",xbins=100, xmin=0, xmax=10),
]
#
# Job options to test ROBRequestAlgo
#
include('TriggerJobOpts/runHLT_standalone_run2.py')
from TrigGenericAlgs.test_roblist import robs
from TrigGenericAlgs.test_rosmap import ros_rob_map
rob_ros_map = {}
for ros,roblist in ros_rob_map.iteritems():
for rob in roblist:
rob_ros_map[rob] = ros
topSequence.TrigSteer_L2.DummyROBRequest.OutputLevel = DEBUG
topSequence.TrigSteer_L2.DummyROBRequest.enabledROBs = robs
topSequence.TrigSteer_L2.DummyROBRequest.RobRosMapping = rob_ros_map
topSequence.TrigSteer_L2.DummyROBRequest.ROBRequest = ['0x41#2',
'0x410000',
'ROS-0x1c01#2',
'ROS-0x1c93, ROS-0x1c65#4',
'ROS-0xffff']
...@@ -30,18 +30,18 @@ ...@@ -30,18 +30,18 @@
* The reasons for accepting an event are stored in the output as a * The reasons for accepting an event are stored in the output as a
* TrigComposite for offline debugging. * TrigComposite for offline debugging.
* *
* $Id: $
*/ */
#include "TrigInterfaces/AllTEAlgo.h" #include "TrigInterfaces/AllTEAlgo.h"
#include "GaudiKernel/HistoProperty.h" #include "GaudiKernel/HistoProperty.h"
#include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
#include "TrigConfInterfaces/IL1TopoConfigSvc.h"
#include <vector> #include <vector>
#include <map> #include <map>
class ITHistSvc; class ITHistSvc;
class IROBDataProviderSvc;
class TH1F; /// for monitoring purposes class TH1F; /// for monitoring purposes
class TH2F; /// for monitoring purposes class TH2F; /// for monitoring purposes
class TProfile;/// for monitoring purposes class TProfile;/// for monitoring purposes
...@@ -55,10 +55,6 @@ namespace HLT { ...@@ -55,10 +55,6 @@ namespace HLT {
class IScaler; class IScaler;
} }
namespace TrigConf {
class IL1TopoConfigSvc;
}
class AcceptL1TopoMonitor : public HLT::AllTEAlgo { class AcceptL1TopoMonitor : public HLT::AllTEAlgo {
public: public:
AcceptL1TopoMonitor(const std::string& name, ISvcLocator* pSvcLocator); AcceptL1TopoMonitor(const std::string& name, ISvcLocator* pSvcLocator);
......
This diff is collapsed.
This diff is collapsed.
/*
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
*/
/**
* @brief Algorithm to perform predefined ROB requests
* @author Frank Winklmeier
*
* $Id: $
*/
#include "ROBRequestAlgo.h"
#include "GaudiKernel/IJobOptionsSvc.h"
#include "Gaudi/Property.h"
#include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
#include <math.h>
#include <sstream>
#include <algorithm>
#include <boost/algorithm/string.hpp>
#include <boost/tokenizer.hpp>
using namespace std;
const short N_ROBID_BITS(24); // 3 bytes for ROB ID
ROBRequestAlgo::ROBRequestAlgo(const std::string& name, ISvcLocator* pSvcLocator)
: HLT::AllTEAlgo(name, pSvcLocator),
m_robDataProviderSvc("ROBDataProviderSvc", name)
{
declareProperty("ROBRequest", m_robRequest, "List of ROB requests");
/* Uncomment the following properties for testing purposes */
//declareProperty("enabledROBs", m_enabledROBs);
//declareProperty("RobRosMapping", m_rob_ros_map);
}
HLT::ErrorCode ROBRequestAlgo::hltInitialize()
{
ServiceHandle<IJobOptionsSvc> jobOptSvc("JobOptionsSvc", name());
// get the list of enabled ROBs
const Gaudi::Details::PropertyBase* p = Gaudi::Utils::getProperty(jobOptSvc->getProperties("DataFlowConfig"),
"DF_Enabled_ROB_IDs");
if (p) m_enabledROBs.assign(*p);
else ATH_MSG_DEBUG("Could not find property DataFlowConfig.DF_Enabled_ROB_IDs");
// get ROB/ROS mapping
p = Gaudi::Utils::getProperty(jobOptSvc->getProperties("DataFlowConfig"), "DF_ROB_ROS_Mapping");
if (p) m_rob_ros_map.assign(*p);
else ATH_MSG_DEBUG("Could not find property DataFlowConfig.DF_ROB_ROS_Mapping");
// fill the map of ROS -> list of assigned ROBs
for (std::map< int,int >::const_iterator it = m_rob_ros_map.value().begin();
it != m_rob_ros_map.value().end(); ++it) {
m_ros_rob_map[ (*it).second ].push_back( (*it).first ) ;
}
if (m_robDataProviderSvc.retrieve().isFailure()) {
ATH_MSG_ERROR("Cannot retrieve " << m_robDataProviderSvc);
return HLT::BAD_JOB_SETUP;
}
m_robRequest.declareUpdateHandler(&ROBRequestAlgo::updateHandler, this);
parseROBRequest();
return HLT::OK;
}
void ROBRequestAlgo::updateHandler(Gaudi::Details::PropertyBase&)
{
parseROBRequest();
}
/**
* Parse job property
*/
void ROBRequestAlgo::parseROBRequest()
{
m_requestList.clear();
for( const string& s : m_robRequest.value() ) {
boost::tokenizer<boost::char_separator<char> > w(s, boost::char_separator<char>(","));
vector<ROBRequest> req;
for( string spec : w ) { // e.g. 0x11#2
boost::trim(spec);
string robspec;
ROBRequest r;
boost::tokenizer<boost::char_separator<char> > tok(spec, boost::char_separator<char>("#"));
vector<string> v(tok.begin(), tok.end());
if ( v.size()==1 ) {
robspec = v[0];
}
else if ( v.size()==2 ) {
robspec = v[0];
char *p;
r.N = strtoul(v[1].c_str(), &p, 0);
if ( *p != 0) {
ATH_MSG_ERROR("Cannot convert " << v[1] << "to integer");
continue;
}
}
else {
ATH_MSG_ERROR("Invalid request specification " << spec);
continue;
}
boost::trim(robspec);
if (!getROBs(robspec, r)) {
ATH_MSG_ERROR("Error parsing " << robspec);
continue;
}
req.push_back(r);
}
m_requestList.push_back(req);
}
// Print
int i(1);
for( const vector<ROBRequest>& v : m_requestList ) {
ostringstream os;
os << "ROB request #" << i++ << ": ";
for( const ROBRequest& r : v ) {
if (r.N<0) os << "all of [";
else os << r.N << " of [";
os << hex;
for(uint32_t rob : r.robs) {
os << " 0x" << rob;
}
os << dec;
os << "] ";
}
ATH_MSG_INFO(os.str());
}
}
/**
* Get list of enabled ROBs matching robSpec
*/
bool ROBRequestAlgo::getROBs(const std::string& robSpec, ROBRequest& req)
{
req.robs.clear();
char *p;
// In case ROS ID is specified
if (robSpec.substr(0,4)=="ROS-") {
uint32_t rosid = strtoul(robSpec.substr(4,string::npos).c_str(), &p, 0);
if ( *p != 0 ) return false;
req.robs = m_ros_rob_map[rosid];
return true;
}
uint32_t rob_mask = strtoul(robSpec.c_str(), &p, 0); // Convert string to int (also does hex conversion)
if ( *p != 0 ) return false;
if (rob_mask==0) {
req.robs.assign(m_enabledROBs.value().begin(), m_enabledROBs.value().end());
return true;
}
// number of bits (in multiple of half-bytes) used by robSpec
short bits = 4*(int(log(rob_mask)/log(16))+1);
if (bits>N_ROBID_BITS) // invalid spec
return false;
else if (bits==N_ROBID_BITS) // full ROB ID given
req.robs.push_back(rob_mask);
else { // ROB mask given
for(uint32_t rob : m_enabledROBs.value()) {
if ((rob>>(N_ROBID_BITS-bits))==rob_mask) req.robs.push_back(rob);
}
}
return true;
}
HLT::ErrorCode ROBRequestAlgo::hltExecute(std::vector<HLT::TEVec>&, unsigned int)
{
beforeExecMonitors().ignore();
for( const vector<ROBRequest>& v : m_requestList ) {
// Prepare ROB list
ROBList roblist;
for( ROBRequest r : v ) r.select(roblist);
// Retrieve ROBs
std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> robFragments;
m_robDataProviderSvc->addROBData(roblist);
m_robDataProviderSvc->getROBData(roblist, robFragments);
if (msgLvl(MSG::DEBUG)) {
ostringstream os;
os << hex;
for(uint32_t rob : roblist) os << " 0x" << rob;
ATH_MSG_DEBUG(roblist.size() << "/" << robFragments.size()
<< " ROBs requested/retrieved:" << os.str());
}
}
afterExecMonitors().ignore();
return HLT::OK;
}
/**
* Select specified number of ROBs from list
*/
void ROBRequest::select(ROBList& roblist)
{
if (N>0) {
random_shuffle(robs.begin(), robs.end());
roblist.insert(roblist.end(), robs.begin(), robs.begin()+std::min(size_t(N),robs.size()));
}
else if (N<0) {
roblist.insert(roblist.end(), robs.begin(), robs.end());
}
}
/*
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
*/
#ifndef TRIGGENERICALGS_ROBREQUESTALGO_H
#define TRIGGENERICALGS_ROBREQUESTALGO_H
/**
* @brief Algorithm to perform predefined ROB requests
* @author Frank Winklmeier
*
* $Id: $
*/
#include "TrigInterfaces/Algo.h"
#include "TrigInterfaces/AllTEAlgo.h"
#include "GaudiKernel/ServiceHandle.h"
#include "Gaudi/Property.h"
#include <string>
#include <vector>
#include <map>
#include <stdint.h>
class IROBDataProviderSvc;
typedef std::vector<uint32_t> ROBList;
/**
* Helper class to hold ROB list
*/
struct ROBRequest {
ROBRequest() : N(-1) {}
void select(ROBList& roblist);
ROBList robs; //!< ROB list
int N; //!< select N ROBs from list (-1 = all)
};
/**
* Algorithm to perform predefined ROB requests.
*
* The ROBs to be requested are definined in the 'ROBRequest' property,
* which is a list of strings of the following format:
* SPEC[,SPEC]* with SPEC = ROBSPEC[#N]
*
* For each list entry, a separate ROB request is performed.
*
* ROBSPEC: (partial) ROB ID to be requested
* If less than 3 bytes, match highest bytes against enabled ROBs
* N : Randomly request N ROBs matching ROBSPEC
*
* Examples:
* '0x11' request all ROBs starting with 0x11
* '0x11, 0x12' ROBs starting with 0x11 or 0x12 within one ROB request
* '0x11a#2' 2 random ROBs out of 0x11a*
* '0x234234' this ROB
* 'ROS-0x1c36#3' 3 random ROBs from ROS with NodeID 0x1c36
* '0x11a#2,0x12#5' INVALID (cannot use more than one random selection per request)
*/
class ROBRequestAlgo : public HLT::AllTEAlgo {
public:
ROBRequestAlgo(const std::string& name, ISvcLocator* pSvcLocator);
HLT::ErrorCode hltInitialize();
HLT::ErrorCode hltFinalize() { return HLT::OK; }
/// Run once per event
HLT::ErrorCode hltExecute(std::vector<HLT::TEVec>&, unsigned int);
void updateHandler(Gaudi::Details::PropertyBase& p);
private:
void parseROBRequest();
bool getROBs(const std::string& robSpec, ROBRequest& req);
std::vector< std::vector<ROBRequest> > m_requestList;
SimpleProperty< ROBList > m_enabledROBs;
ServiceHandle<IROBDataProviderSvc> m_robDataProviderSvc;
std::map< int, ROBList > m_ros_rob_map; // ROS->ROB map
// Properties
StringArrayProperty m_robRequest;
SimpleProperty< std::map<int,int> > m_rob_ros_map ;
};
#endif
...@@ -8,16 +8,12 @@ ...@@ -8,16 +8,12 @@
#include "../AcceptWhenInputPresent.h" #include "../AcceptWhenInputPresent.h"
#include "TrigGenericAlgs/PrescaleAlgo.h" #include "TrigGenericAlgs/PrescaleAlgo.h"
#include "TrigGenericAlgs/SeededSuperRoiAllTEAlgo.h" #include "TrigGenericAlgs/SeededSuperRoiAllTEAlgo.h"
#include "TrigGenericAlgs/L1CorrelationAlgo.h"
#include "TrigGenericAlgs/DetectorTimingAlgo.h"
#include "../ROBRequestAlgo.h"
#include "../TimeBurner.h" #include "../TimeBurner.h"
#include "../AcceptAnyInput.h" #include "../AcceptAnyInput.h"
#include "../TrigRoiUpdater.h" #include "../TrigRoiUpdater.h"
#include "../MergeTopoStarts.h" #include "../MergeTopoStarts.h"
#include "../AcceptL1TopoMonitor.h" #include "../AcceptL1TopoMonitor.h"
DECLARE_COMPONENT( DummyFEX ) DECLARE_COMPONENT( DummyFEX )
DECLARE_COMPONENT( PESA::DummyUnseededAllTEAlgo ) DECLARE_COMPONENT( PESA::DummyUnseededAllTEAlgo )
DECLARE_COMPONENT( PESA::DummyCopyAllTEAlgo ) DECLARE_COMPONENT( PESA::DummyCopyAllTEAlgo )
...@@ -27,9 +23,6 @@ DECLARE_COMPONENT( ReverseRoI ) ...@@ -27,9 +23,6 @@ DECLARE_COMPONENT( ReverseRoI )
DECLARE_COMPONENT( AcceptWhenInputMissing ) DECLARE_COMPONENT( AcceptWhenInputMissing )
DECLARE_COMPONENT( AcceptWhenInputPresent ) DECLARE_COMPONENT( AcceptWhenInputPresent )
DECLARE_COMPONENT( PrescaleAlgo ) DECLARE_COMPONENT( PrescaleAlgo )
DECLARE_COMPONENT( ROBRequestAlgo )
DECLARE_COMPONENT( L1CorrelationAlgo )
DECLARE_COMPONENT( DetectorTimingAlgo )
DECLARE_COMPONENT( TimeBurner ) DECLARE_COMPONENT( TimeBurner )
DECLARE_COMPONENT( AcceptAnyInput ) DECLARE_COMPONENT( AcceptAnyInput )
DECLARE_COMPONENT( PESA::SeededSuperRoiAllTEAlgo ) DECLARE_COMPONENT( PESA::SeededSuperRoiAllTEAlgo )
......
...@@ -31,12 +31,7 @@ class L2EFChain_Monitoring(L2EFChainDef): ...@@ -31,12 +31,7 @@ class L2EFChain_Monitoring(L2EFChainDef):
self.L2InputTE = self.chainL1Item self.L2InputTE = self.chainL1Item
if ('robrequest' in self.monType): if ('timeburner' in self.monType):
self.setupROBRequestMonChains()
elif 'mistimemon' in self.chainName:
# ('mistimemonl1bccorr' in self.monType or 'mistimemonl1bccorrnomu' in self.monType or 'mistimemoncaltimenomu' in self.monType or 'mistimemoncaltime' in self.monType):
self.setupL1BCCorrMonChains(self.chainName)
elif ('timeburner' in self.monType):
self.setupTimeBurnerChain() self.setupTimeBurnerChain()
elif ('idmon' in self.monType): elif ('idmon' in self.monType):
self.setupIdmonTrkFS() self.setupIdmonTrkFS()
...@@ -71,114 +66,6 @@ class L2EFChain_Monitoring(L2EFChainDef): ...@@ -71,114 +66,6 @@ class L2EFChain_Monitoring(L2EFChainDef):
self.TErenamingMap=self.TErenamingDict self.TErenamingMap=self.TErenamingDict
####################################
####################################
def setupROBRequestMonChains(self):
from TrigGenericAlgs.TrigGenericAlgsConf import ROBRequestAlgo
ROBRequester = ROBRequestAlgo("DummyROBRequest")
self.L2sequenceList += [[ '' , [ROBRequester], 'L2_DummyROBRequest']]
self.L2signatureList += [ [['L2_DummyROBRequest']] ]
####################################
####################################
def setupL1BCCorrMonChains(self,chainname):
from TrigGenericAlgs.TrigGenericAlgsLegacyConfig import L1CorrelationAlgoConfig
l1correlation_output = ''
if 'mistimemonj400' in chainname:
L1CorrAlgo = L1CorrelationAlgoConfig("L1CorrAlgoNoMuonCBCIncl")
L1CorrAlgo.noMuon = True
# The following bool configures the chain to not look at the L1 decision in the current BCID.. only in the one before or after.
# useful only if configured e.g. with J400 alone
L1CorrAlgo.currentBCinclusive = True
L1CorrAlgo.m_l1itemlist = ["L1_J400"]
l1correlation_output='EF_DummyL1CorrAlgoNoMuonCBCIncl'
self.EFsequenceList += [[ '' , [L1CorrAlgo], l1correlation_output ]]
self.EFsignatureList += [ [[ l1correlation_output ]] ]
elif "nomu" in chainname:
L1CorrAlgo = L1CorrelationAlgoConfig("L1CorrAlgoNoMuon")
L1CorrAlgo.noMuon = True
L1CorrAlgo.currentBCinclusive = False
L1CorrAlgo.m_l1itemlist = ["L1_EM22VHI","L1_J120","L1_J400"]
l1correlation_output='EF_DummyL1CorrAlgoNoMuon'
self.EFsequenceList += [[ '' , [L1CorrAlgo], l1correlation_output ]]
self.EFsignatureList += [ [[l1correlation_output]] ]
else:
L1CorrAlgo = L1CorrelationAlgoConfig("L1CorrAlgo")
L1CorrAlgo.noMuon = False
L1CorrAlgo.currentBCinclusive = False
L1CorrAlgo.m_l1itemlist = ["L1_EM22VHI","L1_MU20","L1_J120","L1_J400"]
l1correlation_output='EF_DummyL1CorrAlgo'
self.EFsequenceList += [[ '' , [L1CorrAlgo], l1correlation_output ]]
self.EFsignatureList += [ [[l1correlation_output]] ]
if not ('caltime' in chainname) :
return
## Afterwards set up caloclustering to access timing information
### Stole that one here from MissingETDef.py it prepares the caloclustering
### In priniciple it should only be executed after the first algorithm fired.
### From some offline tests it seems that this is the case
# chain = ['j0', '', [], ["Main"], ['RATE:SingleJet', 'BW:Jet'], -1]
# from TriggerMenu.menu import DictFromChainName
# theDictFromChainName = DictFromChainName.DictFromChainName()
# jetChainDict = theDictFromChainName.getChainDict(chain)
# from TriggerMenu.jet.JetDef import generateHLTChainDef
# jetChainDict['chainCounter'] = 9151
# jetChainDef = generateHLTChainDef(jetChainDict)
# # obtaining DummyUnseededAllTEAlgo/RoiCreator
# input0=jetChainDef.sequenceList[0]['input']
# output0 =jetChainDef.sequenceList[0]['output']
# algo0 =jetChainDef.sequenceList[0]['algorithm']
# # obtaining TrigCaloCellMaker/FS, TrigCaloClusterMaker, TrigHLTEnergyDensity
# input1=jetChainDef.sequenceList[1]['input']
# output1 =jetChainDef.sequenceList[1]['output']
# algo1 =jetChainDef.sequenceList[1]['algorithm']
# self.EFsequenceList +=[[ input0,algo0, output0 ]]
# self.EFsequenceList +=[[ input0,algo0, output0 ]]
# self.EFsequenceList +=[[ input1,algo1, output1 ]]
# self.EFsignatureList += [ [[output0]] ]
# self.EFsignatureList += [ [[output1]] ]
from TrigGenericAlgs.TrigGenericAlgsLegacyConfig import DetectorTimingAlgoConfig
### Now also retrieve triggertowers
from TrigCaloRec.TrigCaloRecConf import TrigL1BSTowerMaker
theL1BS = TrigL1BSTowerMaker()
self.EFsequenceList += [[self.L2InputTE,
[theL1BS],
'L2_l1bs_step1_mistime']]
self.EFsignatureList += [ [['L2_l1bs_step1_mistime']] ]
### For matching the clusters to the L1 ROIs pass also hardcoded EM20VH and J120 ROIs into the algorithm at positions 1 and 2
if "nomu" in chainname:
DetectorTimingAlg = DetectorTimingAlgoConfig("ootmonitorDetTimeAlgNoMuon")
self.EFsequenceList +=[[ [ l1correlation_output, 'L2_l1bs_step1_mistime'] , [DetectorTimingAlg] , 'EF_ootimemon_detectortimeNoMuon' ]]
self.EFsignatureList += [ [['EF_ootimemon_detectortimeNoMuon']] ]
else:
DetectorTimingAlg = DetectorTimingAlgoConfig("ootmonitorDetTimeAlg")
self.EFsequenceList +=[[ [ l1correlation_output, 'L2_l1bs_step1_mistime'] , [DetectorTimingAlg] , 'EF_ootimemon_detectortime' ]]
self.EFsignatureList += [ [['EF_ootimemon_detectortime']] ]
#################################### ####################################
#################################### ####################################
def setupCSCMonChain(self): def setupCSCMonChain(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment