ATLAS Offline Software
TileMuonFilterAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /*
6  * File: TileMuonFilterAlg.cxx
7  * Author: Carlos.Solans@cern.ch
8  * Author: Archil.Durglishvili@cern.ch
9  */
10 
12 #include "TileMuonFilterAlg.h"
13 #include "CaloGeoHelpers/CaloSampling.h"
16 
17 using namespace std;
18 using namespace xAOD;
19 
20 
21 //=======================================
22 TileMuonFilterAlg::TileMuonFilterAlg( const std::string& name, ISvcLocator* pSvcLocator ):
23  AthAlgorithm( name, pSvcLocator ), m_trackInCalo("TrackTools")
24 {
25 //=======================================
26  declareProperty("InputTracks", m_inputTracks = "inDetTrackParticles");
27  declareProperty("InputMuons", m_inputMuons = "Muons");
28  declareProperty("OutputMuons", m_outputMuons = "SelectedMuons");
29  declareProperty("OutputTracks", m_outputTracks = "SelectedTracks");
30  declareProperty("InputCells", m_inputCells = "AODCellContainer");
31  declareProperty("OutputCells", m_outputCells = "SelectedCells");
32  declareProperty("MuonCells", m_muonCells = "muonCells");
33  declareProperty("MuonPtCut", m_muonPt = 10000.);
34  declareProperty("MuonEtaCut", m_muonEta = 1.7);
35  declareProperty("MuonCellR", m_muonCellR = 1.0);
36  declareProperty("IsoCone", m_isoCone = 0.4);
37  declareProperty("ErelCut", m_ErelCut = 0.1);
38  declareProperty("DumpLArCells", m_dumpLarCells = false);
39  declareProperty("UseCuts", m_useCuts = false);
40  declareProperty("TrackTools", m_trackInCalo);
41  declareProperty("TrackType", m_trackType = 1);
42 }
43 
44 //=======================================
46 //=======================================
47  ATH_MSG_INFO("TileMuonFilterAlg::initialize()");
48 
49  CHECK(m_trackInCalo.retrieve());
50 
51  return StatusCode::SUCCESS;
52 }
53 
54 //=======================================
56 //=======================================
57  switch(m_trackType)
58  {
59  case 0: m_inputTracks = "CombinedMuonTrackParticles"; break;
60  case 1: m_inputTracks = "InDetTrackParticles" ; break;
61  case 2: m_inputTracks = "MuonSpectrometerTrackParticles" ; break;
62  default: m_inputTracks = "CombinedMuonTrackParticles"; break;
63  } // SWITCH
64 
65 
66  //Get the input tracks
67  const TRACKCONTAINER* inputTracks = 0;
69 
70  //Get the input Muons
71  const MUONCONTAINER* inputMuons = 0;
72  CHECK( evtStore()->retrieve( inputMuons, m_inputMuons ) );
73  ATH_MSG_DEBUG("Number of Muons: " << inputMuons->size());
74 
75  //Allocate the output Muons container
76  MUONCONTAINER* outputMuons = new MUONCONTAINER;
77  MUONAUXCONTAINER* outputAuxMuons = new MUONAUXCONTAINER;
78  outputMuons->setStore( outputAuxMuons );
79 
80 
81  //Allocate the output tracks container
82  TRACKCONTAINER * outputTracks = new TRACKCONTAINER;
83  TRACKAUXCONTAINER* outputAuxTracks = new TRACKAUXCONTAINER;
84  outputTracks->setStore( outputAuxTracks );
85 
86 
87  //Get input cells
88  const CELLCONTAINER* inputCells = 0;
89  CHECK( evtStore()->retrieve( inputCells, m_inputCells ) );
90 
91  //Allocate output cells container
93  CHECK( evtStore()->record( outputCells, m_outputCells ) );
94 
95  //Allocate cells container which will be refilled for every muon; temporary use only
97 
98  //===============================================
99  const int Ncut=7;
100  int cut[Ncut];
101  for( int i = 0; i < Ncut; ++i) cut[i] = 0;
102  //===============================================
103 
104  //Select Muons and corresponding tracks
105  MUONCONTAINER::const_iterator muonItr = inputMuons->begin();
106  MUONCONTAINER::const_iterator muonEnd = inputMuons->end();
107  for(; muonItr != muonEnd; ++muonItr ){
108  const MUON* muon = *muonItr;
109  if(!muon){ ATH_MSG_INFO("Not a valid muon"); continue; }
110  //Cut 0: combined muon // probably it is better to use this cut
111  if( m_useCuts && muon->muonType()!=xAOD::Muon::Combined ) continue;
112  cut[0]++;
113  //Cut 1: transverse momentum
114  if( m_useCuts && muon->pt() < m_muonPt ) continue;
115  cut[1]++;
116  //Cut 2: Eta
117  if( m_useCuts && fabs(muon->eta()) > m_muonEta ) continue;
118  cut[2]++;
119  if( m_useCuts )
120  {
121  //============Cut 3: Criteria for the associated inner detector track (all muon collections)=========
124  //if( !muon->passesIDCuts() ) continue; //it always returns flase when running on Muon Stream of data12 periodB
125  }
126  cut[3]++;
127  //=====================================================================================================
128 
129  //===============save only muons which have the xAOD::TrackParticle of given m_trackType===========
136  const TRACK* muon_track = 0;
137  switch(m_trackType)
138  {
139  case 0: muon_track = muon->trackParticle(xAOD::Muon::CombinedTrackParticle); break;
140  case 1: muon_track = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle); break;
141  case 2: muon_track = muon->trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle); break;
142  default: muon_track = muon->primaryTrackParticle(); break;
143  } // SWITCH
144  if(!muon_track) continue;
145  cut[4]++;
146  //====================================================================
147 
148  //Cut 5: Isolation
149  double Econe=0.;
150  TRACKCONTAINER::const_iterator trackItr = inputTracks->begin();
152  for(; trackItr != trackEnd; ++trackItr ){
153  const TRACK* track = *trackItr;
154  if(muon_track==track) continue;
155  double dif_eta = muon_track->eta() - track->eta();
156  double dif_phi = muon_track->phi() - track->phi();
157  if(dif_phi<0) dif_phi=-dif_phi;
158  if(dif_phi>M_PI){dif_phi=2*M_PI-dif_phi;}
159  double deltaR = sqrt(dif_eta*dif_eta+dif_phi*dif_phi);
160  if(deltaR<m_isoCone) Econe += track->e();
161  }
162  if( m_useCuts && Econe/muon_track->e() > m_ErelCut ) continue;
163  cut[5]++;
164 
165  //Fill the muon container
166  MUON* tmpMuon = new MUON();
167  tmpMuon->makePrivateStore( muon );
168  outputMuons->push_back(tmpMuon);
169  }// Muons loop
170 
171 
172  //Allocate output association between muons and cells
173  ASSOCCONTAINER* muonCells = new ASSOCCONTAINER_CONSTRUCTOR(outputMuons->size());
174  CHECK( evtStore()->record( muonCells, m_muonCells ) );
175  ASSOCCONTAINER::iterator assocItr = muonCells->begin();
176 
177 
178  muonItr = outputMuons->begin();
179  muonEnd = outputMuons->end();
180  for(; muonItr != muonEnd; ++muonItr ){
181  const MUON* muon = *muonItr;
182 
189  const TRACK* muon_track = 0;
190  switch(m_trackType)
191  {
192  case 0: muon_track = muon->trackParticle(xAOD::Muon::CombinedTrackParticle); break;
193  case 1: muon_track = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle); break;
194  case 2: muon_track = muon->trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle); break;
195  default: muon_track = muon->primaryTrackParticle(); break;
196  } // SWITCH
197  if(!muon_track) continue;
198 
199  //save the track associated to muon
200  TRACK* tmpTrack = new TRACK();
201  tmpTrack->makePrivateStore( muon_track );
202  outputTracks->push_back(tmpTrack);
203 
204  tmpCells->clear();
205  m_trackInCalo->getCellsWithinConeAroundTrack(muon_track, inputCells, tmpCells, m_muonCellR , m_dumpLarCells );
206 
207  //loop over the selected cells in order to associat to muon
208  CELLCONTAINER::const_iterator cellItr = tmpCells->begin();
209  CELLCONTAINER::const_iterator cellEnd = tmpCells->end();
210  for( ;cellItr != cellEnd; ++cellItr){
211  const CELL* cell = *cellItr;
212  unsigned int i=0;
213  while(i!=outputCells->size()){if(outputCells->at(i)==cell){break;}i++;}
214  if(i==outputCells->size()){
215  outputCells->push_back(cell);
216  }
217  assocItr->push_back(i);//FIXME
218  }
219  ++assocItr;
220  }// output Muons loop
221 
222  //for( int i = 0; i < Ncut; ++i) ATH_MSG_INFO(" cut["<<i<<"] = "<< cut[i] );
223 
224  ATH_MSG_DEBUG("Number of selected Muons: "<< outputMuons->size() );
225  ATH_MSG_DEBUG("Number of selected cells: " << outputCells->size());
226 
227  CHECK( evtStore()->record(outputMuons, m_outputMuons) );
228  CHECK( evtStore()->record(outputAuxMuons,m_outputMuons+"Aux.") );
229  CHECK( evtStore()->record(outputTracks, m_outputTracks) );
230  CHECK( evtStore()->record(outputAuxTracks,m_outputTracks+"Aux.") );
231 
232  delete tmpCells; // clean up memory
233  return StatusCode::SUCCESS;
234 }
235 
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:195
ConstDataVector::at
ElementProxy at(size_type n)
Access an element, as an lvalue.
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
TileMuonFilterAlg::m_muonCells
std::string m_muonCells
Definition: TileMuonFilterAlg.h:52
xAOD::TrackParticleAuxContainer_v5
Temporary container used until we have I/O for AuxStoreInternal.
Definition: TrackParticleAuxContainer_v5.h:35
TileMuonFilterAlg::m_trackType
short m_trackType
Definition: TileMuonFilterAlg.h:60
TileMuonFilterAlg::m_outputCells
std::string m_outputCells
Definition: TileMuonFilterAlg.h:51
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
TileMuonFilterAlg::m_dumpLarCells
bool m_dumpLarCells
Definition: TileMuonFilterAlg.h:58
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MUONCONTAINER
xAOD::MuonContainer MUONCONTAINER
Definition: TileCellFillerTool.h:38
SG::VIEW_ELEMENTS
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
Definition: OwnershipPolicy.h:18
ConstDataVector::end
iterator end() noexcept
Return an iterator pointing past the end of the collection.
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
AthCommonDataStore< AthCommonMsg< Algorithm > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
TileMuonFilterAlg::m_ErelCut
float m_ErelCut
Definition: TileMuonFilterAlg.h:57
TRACKCONTAINER
xAOD::TrackParticleContainer TRACKCONTAINER
Definition: D3PDMaker/TileD3PDMaker/src/ITrackTools.h:87
M_PI
#define M_PI
Definition: ActiveFraction.h:11
ASSOCCONTAINER_CONSTRUCTOR
#define ASSOCCONTAINER_CONSTRUCTOR(size)
Definition: TileAssocFillerTool.h:23
xAOD
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
Definition: ICaloAffectedTool.h:24
TileMuonFilterAlg::m_outputTracks
std::string m_outputTracks
Definition: TileMuonFilterAlg.h:47
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
TileMuonFilterAlg::execute
virtual StatusCode execute()
Definition: TileMuonFilterAlg.cxx:55
TileMuonFilterAlg::TileMuonFilterAlg
TileMuonFilterAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: TileMuonFilterAlg.cxx:22
TileMuonFilterAlg::m_trackInCalo
ToolHandle< ITrackTools > m_trackInCalo
Definition: TileMuonFilterAlg.h:63
TileMuonFilterAlg::m_inputTracks
std::string m_inputTracks
Definition: TileMuonFilterAlg.h:46
xAOD::MuonAuxContainer_v5
Temporary container used until we have I/O for AuxStoreInternal.
Definition: MuonAuxContainer_v5.h:31
GeoPrimitives.h
AthCommonDataStore< AthCommonMsg< Algorithm > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ConstDataVector::clear
void clear()
Erase all the elements in the collection.
TileMuonFilterAlg::m_muonEta
float m_muonEta
Definition: TileMuonFilterAlg.h:54
TileMuonFilterAlg::m_isoCone
float m_isoCone
Definition: TileMuonFilterAlg.h:56
python.TrigInDetConfig.inputTracks
inputTracks
Definition: TrigInDetConfig.py:168
lumiFormat.i
int i
Definition: lumiFormat.py:92
MUONAUXCONTAINER
xAOD::MuonAuxContainer MUONAUXCONTAINER
Definition: TileCosmicMuonFilterAlg.h:27
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
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
MUON
xAOD::Muon MUON
D3PD INCLUDES.
Definition: TileCellFillerTool.h:37
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
DataVector< xAOD::TrackParticle_v1 >
AthAlgorithm
Definition: AthAlgorithm.h:47
TileMuonFilterAlg::m_muonCellR
float m_muonCellR
Definition: TileMuonFilterAlg.h:55
TRACKAUXCONTAINER
xAOD::TrackParticleAuxContainer TRACKAUXCONTAINER
Definition: D3PDMaker/TileD3PDMaker/src/ITrackTools.h:88
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
TileMuonFilterAlg::m_muonPt
float m_muonPt
Definition: TileMuonFilterAlg.h:53
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ConstDataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
SG::AuxElement::makePrivateStore
void makePrivateStore()
Create a new (empty) private store for this object.
Definition: AuxElement.cxx:172
xAOD::TrackParticle_v1::e
virtual double e() const override final
The total energy of the particle.
Definition: TrackParticle_v1.cxx:109
CaloCellContainer
Container class for CaloCell.
Definition: CaloCellContainer.h:55
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
TileMuonFilterAlg::m_outputMuons
std::string m_outputMuons
Definition: TileMuonFilterAlg.h:49
ConstDataVector
DataVector adapter that acts like it holds const pointers.
Definition: ConstDataVector.h:76
TileMuonFilterAlg.h
TRACK
xAOD::TrackParticle TRACK
Definition: D3PDMaker/TileD3PDMaker/src/ITrackTools.h:86
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
TileMuonFilterAlg::initialize
virtual StatusCode initialize()
Definition: TileMuonFilterAlg.cxx:45
makeComparison.deltaR
float deltaR
Definition: makeComparison.py:36
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
TrackingPrimitives.h
ConstDataVector::begin
iterator begin() noexcept
Return an iterator pointing at the beginning of the collection.
TileMuonFilterAlg::m_inputCells
std::string m_inputCells
Definition: TileMuonFilterAlg.h:50
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
xAOD::TrackParticle_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
TileMuonFilterAlg::m_inputMuons
std::string m_inputMuons
Definition: TileMuonFilterAlg.h:48
ASSOCCONTAINER
std::vector< std::vector< int > > ASSOCCONTAINER
Definition: TileAssocFillerTool.h:22
TileMuonFilterAlg::m_useCuts
bool m_useCuts
Definition: TileMuonFilterAlg.h:59