ATLAS Offline Software
Loading...
Searching...
No Matches
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
8#include "TBEvent/TBTrack.h"
10#include "CaloEvent/CaloClusterContainer.h"
12#include <fstream>
13#include <string>
14#include <math.h>
15
16
17TBBeamQualityMC::TBBeamQualityMC(const std::string & name, ISvcLocator * pSvcLocator) :
18 AthAlgorithm(name, pSvcLocator),
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;
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;
155 ATH_CHECK( evtStore()->retrieve(cc,m_clusterCollName) );
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
205StatusCode 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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
AthenaHitsVector< LArG4H6FrontHit > LArG4H6FrontHitCollection
#define y
#define x
AthAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
@ FIRST_ENG_DENS
First Moment in E/V.
@ CENTER_LAMBDA
Shower depth at Cluster Centroid.
Principal data class for CaloCell clusters.
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
StatusCode getXcryoYtable(float &x, float &y, float &eBeam)
std::vector< int > m_scint_prim
virtual StatusCode execute() override
bool m_readFileforXcryo
Get Xcryo and Ytable from a text file.
virtual StatusCode initialize() override
virtual StatusCode finalize() override
TBBeamQualityMC(const std::string &name, ISvcLocator *pSvcLocator)
std::string m_clusterCollName
float getBeamMomentum() const
Definition TBEventInfo.h:73
float getTableY() const
Definition TBEventInfo.h:77
float getCryoX() const
Definition TBEventInfo.h:75
unsigned int getRunNum() const
Definition TBEventInfo.h:72
double getVintercept() const
Definition TBTrack.h:60
double getChi2_u() const
Definition TBTrack.h:54
double getChi2_v() const
Definition TBTrack.h:55
double getUintercept() const
Definition TBTrack.h:59
double getVslope() const
Definition TBTrack.h:58
double getUslope() const
Definition TBTrack.h:57
double getCryoHitv() const
Definition TBTrack.h:72
double getCryoHitu() const
Definition TBTrack.h:71
double chi2(TH1 *h0, TH1 *h1)
Definition run.py:1