ATLAS Offline Software
TBBeamQualityMC.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TBBeamQualityMC.h"
6 
7 #include "TBEvent/TBEventInfo.h"
8 #include "TBEvent/TBTrack.h"
10 #include "CaloEvent/CaloClusterContainer.h"
12 #include <fstream>
13 #include <string>
14 #include <math.h>
15 
16 
17 TBBeamQualityMC::TBBeamQualityMC(const std::string & name, ISvcLocator * pSvcLocator) :
18  AthAlgorithm(name, pSvcLocator),
19  m_readFileforXcryo(true),
20  m_nRun(0)
21 {
22  declareProperty("ReadFileforXcryo", m_readFileforXcryo);
23  declareProperty("CheckTrackParams",m_check_trackpar=false);
24  declareProperty("TrackCutX",m_bm_cut_x=35.);
25  declareProperty("TrackCutY",m_bm_cut_y=35.);
26  declareProperty("CheckPrimaryTrack",m_check_primary=true);
27  declareProperty("ScintForPrimaryTrack",m_scint_prim);
28  declareProperty("CheckVetoScint",m_check_veto=true);
29  declareProperty("CheckClusters",m_check_clus=false);
30  declareProperty("CheckTrackReco",m_check_trackreco=false);
31  declareProperty("ClusterCollectionName",m_clusterCollName="CaloTopoClusters");
32 }
33 
35  ATH_MSG_DEBUG ( "in initialize()" );
36  return StatusCode::SUCCESS;
37 }
38 
41  ATH_MSG_DEBUG ( "in execute()" );
42 
43  // Retrieve Event Info
44  const TBEventInfo* theEventInfo = nullptr;
45  ATH_CHECK( evtStore()->retrieve(theEventInfo,"TBEventInfo") );
46 
47  // Fill run header
48  m_nRun = theEventInfo->getRunNum();
49  float beamMom = theEventInfo->getBeamMomentum();
50  float xCryo = -9999;
51  float yTable = -9999;
52  if(m_readFileforXcryo) {
53  if (!this->getXcryoYtable(xCryo, yTable, beamMom)) {
54  ATH_MSG_ERROR ( "xCryo and yTable are not found" );
55  return StatusCode::FAILURE;
56  }
57  } else {
58  xCryo = theEventInfo->getCryoX();
59  yTable = theEventInfo->getTableY();
60  }
61  ATH_MSG_VERBOSE ( "xCryo = " << xCryo );
62  ATH_MSG_VERBOSE ( "yTable = " << yTable );
63  ATH_MSG_VERBOSE ( "nRun = " << m_nRun );
64  ATH_MSG_VERBOSE ( "beamMom = " << beamMom );
65 
66 
67  if(m_check_trackpar) { // check for track parameters
68 
69  TBTrack *track = nullptr;
70  ATH_CHECK( evtStore()->retrieve(track,"Track") );
71 
72  const float zCalo = 30000.;
73  float beam_coor_x = track->getUslope()*zCalo + track->getUintercept() + xCryo;
74  float beam_coor_y = track->getVslope()*zCalo + track->getVintercept();
75 
76  bool sx1 = (beam_coor_x > xCryo - m_bm_cut_x) && (beam_coor_x < xCryo + m_bm_cut_x);
77  bool sx2 = (std::log(track->getChi2_u())>-10 && track->getChi2_u()!=1000);
78  bool sx3 = (beam_coor_x!=0 || track->getUintercept()!=0 || track->getUslope()!=0 );
79 
80  bool sy1 = (beam_coor_y > yTable - m_bm_cut_y) && (beam_coor_y < yTable + m_bm_cut_y);
81  bool sy2 = (std::log(track->getChi2_v())>-10 && track->getChi2_v()!=1000);
82  bool sy3 = (beam_coor_y!=0 || track->getVintercept()!=0 || track->getVslope()!=0 );
83 
84  if(! (sx1 && sx2 && sx3 && sy1 && sy2 && sy3)) {
85  ATH_MSG_DEBUG ( "CheckTrackParams failed: "<<sx1<<" "<<sx2<<" "<<sx3<<" / "<<sy1<<" "<<sy2<<" "<<sy3);
86  //return StatusCode::FAILURE;
87  //return StatusCode::RECOVERABLE;
88  setFilterPassed(false);
89  return StatusCode::SUCCESS;
90  }
91  }
92 
93  if(m_check_primary) { // check for primary energy deposition in vector of scintilators
94 
95  std::vector<bool> has_energy (m_scint_prim.size());
96  for(int ll=0; ll<(int)m_scint_prim.size(); ++ll) has_energy[ll]=false;
97 
98  const LArG4H6FrontHitCollection *frontcoll = nullptr;
99  ATH_CHECK( evtStore()->retrieve(frontcoll,"Front::Hits") );
100 
101  int scnum;
102  unsigned i;
103  for (const LArG4H6FrontHit* hit : *frontcoll) {
104  scnum = hit->GetSC();
105  if(scnum <= 0) continue; // not a scintilator hit
106  for(i=0; i<m_scint_prim.size(); ++i) {
107  ATH_MSG_DEBUG ( "Scint: "<<scnum<<", track: "<<hit->GetTrackID()<<", energy: "<<hit->GetEdep());
108  if( (scnum==m_scint_prim[i]) && (hit->GetTrackID() == 1) && (hit->GetEdep() > 0.)) {
109  has_energy[i] = true;
110  }
111  }
112  }
113 
114  const LArG4H6FrontHitCollection *movecoll = nullptr;
115  ATH_CHECK( evtStore()->retrieve(movecoll,"Movable::Hits") );
116  for (const LArG4H6FrontHit* hit : *movecoll) {
117  scnum = hit->GetSC();
118  if(scnum <= 0) continue; // not a scintilator hit
119  for(i=0; i<m_scint_prim.size(); ++i) {
120  ATH_MSG_DEBUG ( "Scint: "<<scnum<<", track: "<<hit->GetTrackID()<<", energy: "<<hit->GetEdep());
121  if( (scnum==m_scint_prim[i]) && (hit->GetTrackID() == 1) && (hit->GetEdep() > 0.)) {
122  has_energy[i] = true;
123  }
124  }
125  }
126  for(int ll=0; ll<(int)m_scint_prim.size(); ++ll) has_energy[0] = has_energy[0] && has_energy[ll];
127  if(!has_energy[0]) {
128  ATH_MSG_DEBUG ( "CheckPrimaryTrack failed, no energy deposit in all asked scint." );
129  //return StatusCode::FAILURE;
130  //return StatusCode::RECOVERABLE;
131  setFilterPassed(false);
132  return StatusCode::SUCCESS;
133  }
134  }
135 
136  if(m_check_veto) { // check if there is a hit in veto scint.
137  int scnum;
138  const LArG4H6FrontHitCollection *movecoll = nullptr;
139  ATH_CHECK( evtStore()->retrieve(movecoll,"Movable::Hits") );
140  for (const LArG4H6FrontHit* hit : *movecoll) {
141  scnum = hit->GetSC();
142  if(scnum <= 0) continue;
143  if(hit->GetSC() == 5 && (hit->GetTrackID() == 1)) {
144  ATH_MSG_DEBUG ( "CheckVeto failed ");
145  //return StatusCode::FAILURE;
146  //return StatusCode::RECOVERABLE;
147  setFilterPassed(false);
148  return StatusCode::SUCCESS;
149  }
150  }
151  }
152 
153  if(m_check_clus) { // Rejected if no good cluster
154  const CaloClusterContainer* cc = nullptr;
156  bool haveit=false;
157  for (const CaloCluster * theCluster : *cc) {
158  double cL = theCluster->getMomentValue(CaloClusterMoment::CENTER_LAMBDA);
159  double eD = theCluster->getMomentValue(CaloClusterMoment::FIRST_ENG_DENS);
160  unsigned int cSize = theCluster->getClusterSize();
161  if(cL != 0 && eD > 0. && cSize > 1) {
162  haveit = true;
163  break;
164  }
165  }
166  if (!haveit) {
167  ATH_MSG_DEBUG ( "CheckClusters failed ");
168  setFilterPassed(false);
169  return StatusCode::SUCCESS;
170  }
171  }
172 
173 
174  if(m_check_trackreco) { // Rejected if bad track reco
175  const TBTrack* mytrack = nullptr;
176  const TBEventInfo* mytbeinfo = nullptr;
177  ATH_CHECK( evtStore()->retrieve(mytrack,"Track" ) );
178  ATH_CHECK( evtStore()->retrieve(mytbeinfo,"TBEventInfo" ) );
179  double chi2 = mytrack->getChi2_u();
180  if(chi2 <= 0 || std::log(chi2)<=-10 || chi2 == 1000 || mytrack->getUslope() == 0 || mytrack->getUintercept() == 0 || mytbeinfo->getCryoX() == mytrack->getCryoHitu()) {
181  ATH_MSG_DEBUG ( "CheckTrackReco in X failed ");
182  ATH_MSG_DEBUG ( chi2 << " / " << std::log(chi2) << " :: " << mytrack->getUslope() << " / " << mytrack->getUintercept() << " / " << mytbeinfo->getCryoX() << " / " << mytrack->getCryoHitu() );
183  setFilterPassed(false);
184  return StatusCode::SUCCESS;
185  }
186  chi2 = mytrack->getChi2_v();
187  if(chi2 <= 0 || std::log(chi2)<=-10 || chi2 == 1000 || mytrack->getVslope() == 0 || mytrack->getVintercept() == 0 || mytbeinfo->getTableY() == mytrack->getCryoHitv()) {
188  ATH_MSG_DEBUG ( "CheckTrackReco in Y failed ");
189  ATH_MSG_DEBUG ( chi2 << " / " << std::log(chi2) << " :: " << mytrack->getVslope() << " / " << mytrack->getVintercept() << " / " << mytbeinfo->getTableY() << " / " << mytrack->getCryoHitv() );
190  setFilterPassed(false);
191  return StatusCode::SUCCESS;
192  }
193 
194  }
195  setFilterPassed(true);
196  return StatusCode::SUCCESS;
197 }
198 
200  ATH_MSG_DEBUG ( "in finalize()" );
201  return StatusCode::SUCCESS;
202 }
203 
204 
205 StatusCode TBBeamQualityMC::getXcryoYtable(float &x, float &y, float &e) {
206 
207  // not good to put here (just a workaround) - joh
208  std::string m_txtFileWithXY = "xcryo_ytable.txt";
209 
210  ATH_MSG_DEBUG ( "in getXcryoYtable(float x, float y)" );
211  std::ifstream xyFile;
212  std::string line;
213  std::string filename = PathResolver::find_file(m_txtFileWithXY, "DATAPATH");
214  xyFile.open(filename.c_str());
215  if (!xyFile.is_open()) {
216  ATH_MSG_ERROR ( "File " << m_txtFileWithXY << " fail to open in $DATAPATH");
217  return StatusCode::FAILURE;
218  }
219  while ( getline(xyFile, line, '\n') ) {
220  int run;
221  std::istringstream buf(line);
222  e = 0;
223  buf >> run >> x >> y >> e;
224  ATH_MSG_DEBUG ( "m_nRun,run,x,y,e= "<<m_nRun<<" "<<run<<" "<<x<<" "<<y<<" "<<e);
225  if (run==m_nRun && xyFile.good()) return StatusCode::SUCCESS;
226  }
227  return StatusCode::FAILURE;
228 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
TBBeamQualityMC::m_scint_prim
std::vector< int > m_scint_prim
Definition: TBBeamQualityMC.h:33
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
TBTrack::getUslope
double getUslope() const
Definition: TBTrack.h:52
TBBeamQualityMC::m_check_clus
bool m_check_clus
Definition: TBBeamQualityMC.h:37
checkFileSG.line
line
Definition: checkFileSG.py:75
TBBeamQualityMC::m_check_trackpar
bool m_check_trackpar
Definition: TBBeamQualityMC.h:30
TBTrack
Definition: TBTrack.h:20
TBBeamQualityMC.h
detail::ll
long long ll
Definition: PrimitiveHelpers.h:47
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TBTrack::getUintercept
double getUintercept() const
Definition: TBTrack.h:54
CaloClusterContainer
Storable container for CaloCluster.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloClusterContainer.h:37
TBEventInfo::getRunNum
unsigned int getRunNum() const
Definition: TBEventInfo.h:67
TBBeamQualityMC::m_bm_cut_x
float m_bm_cut_x
Definition: TBBeamQualityMC.h:28
TBTrack::getCryoHitv
double getCryoHitv() const
Definition: TBTrack.h:67
run
int run(int argc, char *argv[])
Definition: ttree2hdf5.cxx:28
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
CaloClusterMoment::FIRST_ENG_DENS
@ FIRST_ENG_DENS
First Moment in E/V.
Definition: CaloClusterMoment.h:56
x
#define x
TBBeamQualityMC::TBBeamQualityMC
TBBeamQualityMC(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TBBeamQualityMC.cxx:17
TBEventInfo::getTableY
float getTableY() const
Definition: TBEventInfo.h:72
TBBeamQualityMC::m_check_trackreco
bool m_check_trackreco
Definition: TBBeamQualityMC.h:38
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
TBTrack::getChi2_u
double getChi2_u() const
Definition: TBTrack.h:49
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
TBTrack::getVslope
double getVslope() const
Definition: TBTrack.h:53
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
TBBeamQualityMC::initialize
virtual StatusCode initialize() override
Definition: TBBeamQualityMC.cxx:34
TBTrack::getCryoHitu
double getCryoHitu() const
Definition: TBTrack.h:66
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:523
CaloCluster
Principal data class for CaloCell clusters.
Definition: Calorimeter/CaloEvent/CaloEvent/CaloCluster.h:79
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TBTrack.h
TBTrack::getChi2_v
double getChi2_v() const
Definition: TBTrack.h:50
run
Definition: run.py:1
TBBeamQualityMC::m_clusterCollName
std::string m_clusterCollName
Definition: TBBeamQualityMC.h:40
fitman.sy2
sy2
Definition: fitman.py:540
TBBeamQualityMC::finalize
virtual StatusCode finalize() override
Definition: TBBeamQualityMC.cxx:199
LArG4H6FrontHitCollection.h
AthAlgorithm
Definition: AthAlgorithm.h:47
TBBeamQualityMC::m_check_veto
bool m_check_veto
Definition: TBBeamQualityMC.h:35
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
TBBeamQualityMC::getXcryoYtable
StatusCode getXcryoYtable(float &x, float &y, float &eBeam)
Definition: TBBeamQualityMC.cxx:205
TBTrack::getVintercept
double getVintercept() const
Definition: TBTrack.h:55
TBBeamQualityMC::m_readFileforXcryo
bool m_readFileforXcryo
Get Xcryo and Ytable from a text file.
Definition: TBBeamQualityMC.h:24
fitman.sx2
sx2
Definition: fitman.py:537
y
#define y
TBEventInfo
Definition: TBEventInfo.h:27
CaloClusterMoment::CENTER_LAMBDA
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
Definition: CaloClusterMoment.h:50
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
TBEventInfo::getBeamMomentum
float getBeamMomentum() const
Definition: TBEventInfo.h:68
TBBeamQualityMC::m_bm_cut_y
float m_bm_cut_y
Definition: TBBeamQualityMC.h:29
TBEventInfo.h
LArG4H6FrontHit
Definition: LArG4H6FrontHit.h:23
TBBeamQualityMC::m_check_primary
bool m_check_primary
Definition: TBBeamQualityMC.h:32
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
TBEventInfo::getCryoX
float getCryoX() const
Definition: TBEventInfo.h:70
AthenaHitsVector
Definition: AthenaHitsVector.h:39
python.handimod.cc
int cc
Definition: handimod.py:523
TBBeamQualityMC::m_nRun
int m_nRun
Definition: TBBeamQualityMC.h:26
TBBeamQualityMC::execute
virtual StatusCode execute() override
Definition: TBBeamQualityMC.cxx:39