ATLAS Offline Software
LArRawChannelBuilderToolTileInfo.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 #include "GaudiKernel/MsgStream.h"
9 
10 #include "LArRawEvent/LArDigit.h"
11 
12 // #include "LArRecUtils/LArOFPeakRecoTool.h"
13 
14 #include "CLHEP/Units/SystemOfUnits.h"
15 #include "CLHEP/Units/PhysicalConstants.h"
16 
17 #include "StoreGate/StoreGateSvc.h"
18 #include "StoreGate/DataHandle.h"
19 
21 #include "CaloDetDescr/CaloDetDescrElement.h"
22 
23 #include <cmath>
24 
25 using CLHEP::Hep3Vector;
26 using CLHEP::c_light;
27 using CLHEP::nanosecond;
28 using CLHEP::picosecond;
29 
30 #define MAXINT 2147483000
31 #define MAXINT2 -2147483000
32 
33 
35  const std::string& name,
36  const IInterface* parent) :
38  m_peakReco("LArOFPeakRecoTool"),
39  m_delayTile(0)
40 {
41  m_helper = new LArRawChannelBuilderStatistics( 3, // number of possible errors
42  0x06); // bit pattern special for this tool,
43  // to be stored in "uint16_t provenance"
44  m_helper->setErrorString(0, "no errors");
45  m_helper->setErrorString(1, "channel saturated");
46  m_helper->setErrorString(2, "OFC not valid");
47 
48  declareProperty("ComTimeKey",m_comTimeKey="ComTimeTileMuon");
49  declareProperty("GlobalTimeOffsetTop", m_globaltimeoffsettop=-23.7);
50  declareProperty("GlobalTimeOffsetBottom", m_globaltimeoffsetbottom=-19.2);
51  declareProperty("defaultPhase", m_defaultPhase=12);
52  declareProperty("ADCMax", m_AdcMax=4095);
54  declareProperty("ECut", m_Ecut=50);
55  declareProperty("doQual", m_doQual=true);
56  declareProperty("minSample", m_minSample=0);
57  declareProperty("maxSample", m_maxSample=31);
58 }
59 
61 {
62  MsgStream log(msgSvc(), name());
63 
64  StatusCode sc=m_peakReco.retrieve();
65  if( sc.isFailure() ) {
66  log << MSG::ERROR << "Unable to retrieve LArOFPeakRecoTool" <<endmsg;
67  return StatusCode::FAILURE;
68  }
69 
70  log << MSG::INFO << " DefaultPhase "<<m_defaultPhase <<endmsg;
71 
72 
74 
75  return StatusCode::SUCCESS;
76 }
77 
78 
80  float pedestal,
81  const std::vector<float>& ramps,
82  MsgStream* pLog)
83 {
84 
86  if(bool(pLog))
87  (*pLog) << MSG::DEBUG << "Start " <<MSG::hex<< chid<<MSG::dec<< endmsg;
89 
91  {
92  if(bool(pLog))
93  (*pLog) << MSG::DEBUG << "Saturation on channel 0x"
94  << MSG::hex << chid.get_compact() << MSG::dec << ". ";
96  {
97  if(bool(pLog))
98  (*pLog) << "Skipping channel." << endmsg;
100  return false;
101  }
102  if(bool(pLog))
103  (*pLog) << endmsg;
104  }
105 
106  const std::vector < short >& samples = digit->samples();
107  unsigned int sampsize = (unsigned int) samples.size();
108  //float peakval = -999.;
109  unsigned int ipeak = 0;
110  std::vector<float> signal ;
111  float currval = 0.;
112  for (unsigned int ii = 0; ii < sampsize; ii++) {
113  currval = (float)(samples[ii] - pedestal);
114  signal.push_back(currval);
115  //if ((ii >= m_minSample)&&(ii <= m_maxSample)&&(currval > peakval)) { ipeak = ii; peakval = currval; }
116  }
117 
118  ipeak = m_parent->curr_shiftTimeSamples + 2;
120  double globaltimeoffset = -25;
121 
122  //Retrieve TileMuonFitter ComTime object
123  const ComTime* comTime;
124  StatusCode sc = evtStore()->retrieve(comTime, m_comTimeKey);
125 
126  if (sc.isFailure()) {
127  if(bool(pLog))
128  (*pLog) << MSG::ERROR
129  << "Unable to retrieve ComTime from StoreGate" << endmsg;
130  return static_cast<bool>(sc);
131  }
132 
133  else {//TileComTime exists
135  const CaloDetDescrManager* caloDDMgr = *caloMgrHandle;
136 
137  Identifier id=currentID();
138  const CaloDetDescrElement* caloDDE = caloDDMgr->get_element(id);
139 
140  double tileComTime = comTime->getTime();
141  Hep3Vector muonpos = comTime->GetCounterPosition();
142  Hep3Vector muondir = comTime->GetcosThetaDirection();
143 
144  if(tileComTime!=0 || muonpos.x()!=0 || muonpos.z()!=0) {
145 
146  double timeTOF = 0.; //For time of flight correction from TileComTime Y=0 position to LAr cell position
147  double IPTOF = 0.; //For time of flight correction to Interaction Point
148  globaltimeoffset = 0.; //Determined from cosmic data (LArTime-TileComTime)
149 
150  if (caloDDE != nullptr) {
151 
152  double xpos=caloDDE->x();
153  double ypos=caloDDE->y();
154  double zpos=caloDDE->z();
155 
156  const double inv_c_light = 1. / c_light;
157  timeTOF = (sqrt((muonpos.x()-xpos)*(muonpos.x()-xpos) + (muonpos.y()-ypos)*(muonpos.y()-ypos) + (muonpos.z()-zpos)*(muonpos.z()-zpos))) * inv_c_light;
158  IPTOF = (sqrt(xpos*xpos+ypos*ypos+zpos*zpos)) * inv_c_light;
159  IPTOF = (-1)*IPTOF;
160 
161  if (ypos>0) {//top
162  globaltimeoffset = m_globaltimeoffsettop;
163  }
164  else {//bottom
165  globaltimeoffset = m_globaltimeoffsetbottom;
166  }
167 
168  if ((ypos>0 && muondir.y()<0) || (ypos<0 && muondir.y()>0)) timeTOF=timeTOF*(-1); //Correct TOF for downward going muons at top and upward going muons at bottom
169 
170  }
171 
172  double larTimeOffset = tileComTime + timeTOF + IPTOF + globaltimeoffset; //Predicted time at LAr cell from all time offsets and corrections
173  //peakSampleTile = int(((larTimeOffset*24./25. - 25.)/24. + 5) + 0.5) ;
174  //m_delayTile = int((24*(peakSampleTile-3) - larTimeOffset*24./25. + 25.) + 0.5) ;
175 
176  // adapt to current OFC timing, such that delay is between 0 ns and 25 ns
177  // assumes that larTimeOffset = 0 corresponds to peak exactly at the third sample (ipeak==2 and delay=0 ns)
178  // (delay = 25 means that the peak is 1 sample before the sample used to center OFC)
179  double peakSampleTile = int( (larTimeOffset*(1./25.)) + 2.);
180  m_delayTile = 25.*(peakSampleTile-2) - larTimeOffset;
181  // the following logic is suited to the regular case where OFC phases are between 0 and 25 ns
182  // for dedicated OFC sets where phase<0 are produced this is not optimal
183  if (m_delayTile<0) {
184  peakSampleTile += 1;
185  m_delayTile += 25.;
186  }
187 
188  m_parent->curr_shiftTimeSamples = peakSampleTile;
189  m_parent->curr_Phase = static_cast<int> (m_delayTile);
190  }
192  }
193 
194 
195  float delay = m_delayTile;
196 
197  if (ipeak < 2) ipeak = 2;
198  if (ipeak > sampsize - 3) ipeak = sampsize - 3 ;
199 
201 
202  unsigned int peak_min = ipeak - 1 ;
203  if (peak_min < 2) peak_min = 2;
204 
205  unsigned int peak_max = ipeak + 1 ;
206  if (peak_max > sampsize - 3) peak_max = sampsize - 3 ;
207 
208  float ADCPeak=0;
209  float time=0.;
210  results = m_peakReco->peak(signal, chid, gain, delay, 0, ipeak, peak_min, peak_max);
211 
212  if (results.getValid()) {
213  ADCPeak = results.getAmplitude();
214  // FIXME: this time definition still misses the tstart from the OFC to be absolutely computed
215  time = (25.*((int)(results.getPeakSample_final())-2-1)-(results.getDelay_final()-results.getTau()-25));
216  }
217  else {
218  if(bool(pLog))
219  (*pLog) << MSG::DEBUG << ". OFC not valid for channel 0x"
220  << MSG::hex << chid.get_compact() << MSG::dec
221  << " Gain = " << gain << ". Skipping channel." << endmsg;
223  return false;
224  }
225 
226  float power=1;
227  float energy=0;
228  for( unsigned int i=0; i<ramps.size(); i++)
229  {
230  energy += ramps[i] * power;
231  power *= ADCPeak;
232  }
233 
234  //(*pLog) << MSG::DEBUG << "ADCPeak = " << ADCPeak <<", time = "<< time<<
235  // " energy "<<energy <<endmsg;
236 
237  uint16_t iquality=0;
238  uint16_t iprovenance=0;
239  if ((m_doQual) && (energy>m_Ecut) && (results.getValid())) {
240  iquality = ((int)(results.getQuality())) & 0xFFFF;
241  iprovenance = iprovenance | 0x2000;
242  }
243 
244  iprovenance |= m_parent->qualityBitPattern;
245  iprovenance |= m_helper->returnBitPattern();
246  iprovenance = iprovenance & 0x3FFF;
247 
248  time=time*(nanosecond/picosecond); //Convert time to ps
249 
250  const float fMAXINT = static_cast<float>(MAXINT);
251  const float fMAXINT2 = static_cast<float>(MAXINT2);
252 
253  if (time>fMAXINT) time=fMAXINT;
254  if (time<fMAXINT2) time=fMAXINT2;
255 
256  if (energy>fMAXINT) energy=fMAXINT;
257  if (energy<fMAXINT2) energy=fMAXINT2;
258 
259  //Make LArRawChannel Object with new data
260  LArRawChannel larRawChannel(digit->channelID(),
261  (int)floor(energy+0.5),
262  int(time),
263  iquality,iprovenance,digit->gain());
264  m_larRawChannelContainer->add(larRawChannel);
265 
267 
268  return true;
269 }
270 
LArRawChannelBuilderToolTileInfo::m_minSample
unsigned int m_minSample
Definition: LArRawChannelBuilderToolTileInfo.h:51
LArRawChannelBuilderParams::curr_gain
CaloGain::CaloGain curr_gain
Definition: LArRawChannelBuilderParams.h:25
LArRawChannelBuilderToolTileInfo::m_skipSaturatedCells
bool m_skipSaturatedCells
Definition: LArRawChannelBuilderToolTileInfo.h:47
LArRawChannelBuilderToolTileInfo::m_caloMgrKey
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Definition: LArRawChannelBuilderToolTileInfo.h:56
ComTime.h
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
python.SystemOfUnits.nanosecond
int nanosecond
Definition: SystemOfUnits.py:119
CaloDetDescrElement::y
float y() const
cell y
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:365
ComTime::getTime
double getTime() const
Definition: ComTime.h:44
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
LArRawChannelBuilderToolTileInfo::m_delayTile
double m_delayTile
Definition: LArRawChannelBuilderToolTileInfo.h:64
LArRawChannelBuilderToolTileInfo::m_doQual
bool m_doQual
Definition: LArRawChannelBuilderToolTileInfo.h:49
LArRawChannelBuilderToolTileInfo::initTool
StatusCode initTool()
Definition: LArRawChannelBuilderToolTileInfo.cxx:60
CaloDetDescrElement
This class groups all DetDescr information related to a CaloCell. Provides a generic interface for al...
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:66
CaloDetDescrManager_Base::get_element
const CaloDetDescrElement * get_element(const Identifier &cellId) const
get element by its identifier
Definition: CaloDetDescrManager.cxx:159
LArRawChannelBuilderStatistics::setErrorString
void setErrorString(unsigned int nerr, const std::string &s)
Definition: LArRawChannelBuilderStatistics.cxx:69
LArRawChannelBuilderToolTileInfo::m_defaultPhase
unsigned int m_defaultPhase
Definition: LArRawChannelBuilderToolTileInfo.h:50
MAXINT2
#define MAXINT2
Definition: LArRawChannelBuilderToolTileInfo.cxx:31
checkRpcDigits.digit
digit
Definition: checkRpcDigits.py:186
LArRawChannelBuilderStatistics
Returns various counters from the LArRawChannel building.
Definition: LArRawChannelBuilderStatistics.h:21
HWIdentifier
Definition: HWIdentifier.h:13
ComTime
Definition: ComTime.h:17
DataHandle.h
LArRawChannelBuilderStatistics::incrementErrorCount
void incrementErrorCount(unsigned int nerr)
Definition: LArRawChannelBuilderStatistics.cxx:34
CaloDetDescrManager.h
Definition of CaloDetDescrManager.
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
LArRawChannelBuilderParams::curr_shiftTimeSamples
int curr_shiftTimeSamples
Definition: LArRawChannelBuilderParams.h:31
LArRawChannelBuilderToolTileInfo::m_AdcMax
unsigned short m_AdcMax
Definition: LArRawChannelBuilderToolTileInfo.h:48
LArRawChannelBuilderToolTileInfo.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ComTime::GetcosThetaDirection
CLHEP::Hep3Vector GetcosThetaDirection() const
Definition: ComTime.h:47
LArRawChannelBuilderToolTileInfo::m_comTimeKey
std::string m_comTimeKey
Definition: LArRawChannelBuilderToolTileInfo.h:59
LArDigit.h
xAOD::uint16_t
setWord1 uint16_t
Definition: eFexEMRoI_v1.cxx:88
StdJOSetup.msgSvc
msgSvc
Provide convenience handles for various services.
Definition: StdJOSetup.py:36
LArDigit
Liquid Argon digit base class.
Definition: LArDigit.h:25
LArRawChannelContainer::add
void add(const LArRawChannel &rc)
Definition: LArRawChannelContainer.h:35
lumiFormat.i
int i
Definition: lumiFormat.py:92
LArRawChannel
Liquid Argon ROD output object base class.
Definition: LArRawChannel.h:40
LArRawChannelBuilderToolBase::m_larRawChannelContainer
LArRawChannelContainer * m_larRawChannelContainer
Definition: LArRawChannelBuilderToolBase.h:64
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
LArRawChannelBuilderToolBase::energy
int energy()
Definition: LArRawChannelBuilderToolBase.h:46
LArRawChannelBuilderParams::curr_Phase
int curr_Phase
Definition: LArRawChannelBuilderParams.h:32
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
01SubmitToGrid.samples
samples
Definition: 01SubmitToGrid.py:58
LArRawChannelBuilderToolTileInfo::m_maxSample
unsigned int m_maxSample
Definition: LArRawChannelBuilderToolTileInfo.h:52
MAXINT
#define MAXINT
Definition: LArRawChannelBuilderToolTileInfo.cxx:30
test_pyathena.parent
parent
Definition: test_pyathena.py:15
LArRawChannelBuilderToolBase
Base tool to make the interface with the driver.
Definition: LArRawChannelBuilderToolBase.h:33
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
delay
double delay(std::size_t d)
Definition: JetTrigTimerTest.cxx:14
LArRawChannelBuilderToolBase::gain
CaloGain::CaloGain gain()
Definition: LArRawChannelBuilderToolBase.h:48
LArRawChannelBuilderToolBaseClass::m_helper
LArRawChannelBuilderStatistics * m_helper
Definition: LArRawChannelBuilderToolBaseClass.h:82
LArRawChannelBuilderToolTileInfo::m_Ecut
float m_Ecut
Definition: LArRawChannelBuilderToolTileInfo.h:46
LArRawChannelBuilderDriver.h
LArRawChannelBuilderToolTileInfo::buildRawChannel
bool buildRawChannel(const LArDigit *digit, float pedestal, const std::vector< float > &ramps, MsgStream *pLog)
Definition: LArRawChannelBuilderToolTileInfo.cxx:79
Cut::signal
@ signal
Definition: SUSYToolsAlg.cxx:64
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
python.ami.results
def results
Definition: ami.py:386
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
CaloGain::CaloGain
CaloGain
Definition: CaloGain.h:11
CaloDetDescrElement::x
float x() const
cell x
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:363
LArRawChannelBuilderToolTileInfo::m_globaltimeoffsetbottom
double m_globaltimeoffsetbottom
Definition: LArRawChannelBuilderToolTileInfo.h:54
LArRawChannelBuilderToolTileInfo::m_peakReco
ToolHandle< LArOFPeakRecoTool > m_peakReco
Definition: LArRawChannelBuilderToolTileInfo.h:62
LArRawChannelBuilderToolBaseClass::currentID
Identifier currentID()
Definition: LArRawChannelBuilderToolBaseClass.cxx:94
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
CaloDetDescrManager
This class provides the client interface for accessing the detector description information common to...
Definition: CaloDetDescrManager.h:473
CaloDetDescrElement::z
float z() const
cell z
Definition: Calorimeter/CaloDetDescr/CaloDetDescr/CaloDetDescrElement.h:367
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DEBUG
#define DEBUG
Definition: page_access.h:11
LArRawChannelBuilderToolTileInfo::LArRawChannelBuilderToolTileInfo
LArRawChannelBuilderToolTileInfo(const std::string &type, const std::string &name, const IInterface *parent)
Definition: LArRawChannelBuilderToolTileInfo.cxx:34
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
ComTime::GetCounterPosition
CLHEP::Hep3Vector GetCounterPosition() const
Definition: ComTime.h:46
LArRawChannelBuilderToolBase::time
int time()
Definition: LArRawChannelBuilderToolBase.h:47
LArRawChannelBuilderToolTileInfo::m_globaltimeoffsettop
double m_globaltimeoffsettop
Definition: LArRawChannelBuilderToolTileInfo.h:54
LArRawChannelBuilderStatistics::returnBitPattern
unsigned int returnBitPattern() const
Definition: LArRawChannelBuilderStatistics.cxx:85
LArRawChannelBuilderParams::curr_chid
HWIdentifier curr_chid
Definition: LArRawChannelBuilderParams.h:24
StoreGateSvc.h
LArRawChannelBuilderParams::qualityBitPattern
unsigned int qualityBitPattern
Definition: LArRawChannelBuilderParams.h:34
LArRawChannelBuilderToolBaseClass::m_parent
LArRawChannelBuilderParams * m_parent
Definition: LArRawChannelBuilderToolBaseClass.h:80
readCCLHist.float
float
Definition: readCCLHist.py:83
python.SystemOfUnits.picosecond
int picosecond
Definition: SystemOfUnits.py:123
LArRawChannelBuilderParams::curr_maximum
int curr_maximum
Definition: LArRawChannelBuilderParams.h:28
LArOFIterResults
Definition: LArOFIterResults.h:15