CMS 3D CMS Logo

EcalTBReadout.cc
Go to the documentation of this file.
1 #include <algorithm>
2 #include <iostream>
3 
8 
9 EcalTBReadout::EcalTBReadout(const std::string theEcalTBInfoLabel) :
10  ecalTBInfoLabel_(theEcalTBInfoLabel)
11 {
12  theTargetCrystal_ = -1 ;
13  theTTlist_.reserve(1) ;
14 }
15 
16 void
17 EcalTBReadout::findTTlist( const int& crysId,
18  const EcalTrigTowerConstituentsMap& etmap )
19 {
20 
21  // search for the TT involved in the NCRYMATRIX x NCRYMATRIX
22  // around the target crystal if a new target, otherwise use
23  // the list already filled
24 
25  if ( crysId == theTargetCrystal_ ) { return; }
26 
27  theTTlist_.clear();
28 
32 
33  EBDetId theTargetId;
34  std::vector<DetId>::const_iterator idItr = theDetIds->begin();
35  unsigned int ncount = 0;
36  bool found = false;
37 
38  while ( (ncount < theDetIds->size()) && !found )
39  {
40  EBDetId thisEBdetid(idItr->rawId());
41  if (thisEBdetid.ic() == crysId) {
42  theTargetId = thisEBdetid;
43  found = true;
44  }
45  ++idItr;
46  ++ncount;
47  }
48  if ( !found ) {
49  throw cms::Exception("ObjectNotFound", "Ecal TB target crystal not found in geometry");
50  return;
51  }
52  theTargetCrystal_ = theTargetId.ic();
53 
56 
57  int myEta = theTargetId.ieta();
58  int myPhi = theTargetId.iphi();
59 
60 
61  for ( int icrysEta = (myEta-(NCRYMATRIX-1)/2) ; icrysEta <= (myEta+(NCRYMATRIX-1)/2) ; ++icrysEta ) {
62  for ( int icrysPhi = (myPhi-(NCRYMATRIX-1)/2) ; icrysPhi <= (myPhi+(NCRYMATRIX-1)/2) ; ++icrysPhi ) {
63 
65 
66  EBDetId thisEBdetid;
67 
68  idItr = theDetIds->begin();
69  ncount = 0;
70  found = false;
71 
72  while ( (ncount < theDetIds->size()) && !found )
73  {
74  EBDetId myEBdetid(idItr->rawId());
75  if ( (myEBdetid.ieta() == icrysEta) && (myEBdetid.iphi() == icrysPhi) ) {
76  thisEBdetid = myEBdetid;
77  found = true;
78  }
79  ++idItr;
80  ++ncount;
81  }
82 
83  if ( found ) {
84 
85  EcalTrigTowerDetId thisTTdetId=etmap.towerOf(thisEBdetid);
86 
87  LogDebug("EcalDigi") << "Crystal to be readout: sequential id = " << thisEBdetid.ic() << " eta = " << icrysEta << " phi = " << icrysPhi << " from TT = " << thisTTdetId;
88 
89  if ( theTTlist_.empty() || ( theTTlist_.size() == 1 && theTTlist_[0] != thisTTdetId )) {
90  theTTlist_.push_back(thisTTdetId);
91  }
92  else {
93  std::vector<EcalTrigTowerDetId>::iterator ttFound = find(theTTlist_.begin(), theTTlist_.end(), thisTTdetId);
94  if ( theTTlist_.size() > 1 && ttFound == theTTlist_.end() && *(theTTlist_.end()) != thisTTdetId ) {
95  theTTlist_.push_back(thisTTdetId);
96  }
97  }
98  }
99  }
100  }
101 
102  edm::LogInfo("EcalDigi") << " TT to be read: ";
103  for ( unsigned int i = 0 ; i < theTTlist_.size() ; ++i ) {
104  edm::LogInfo("EcalDigi") << " TT " << i << " " << theTTlist_[i];
105  }
106 }
107 
108 void
111  const EcalTrigTowerConstituentsMap& etmap )
112 {
113  /*
114  for(EBDigiCollection::const_iterator digiItr = input.begin();
115  digiItr != input.end(); ++digiItr)
116  {
117  EcalTrigTowerDetId thisTTdetId=etmap.towerOf(digiItr->id());
118  std::vector<EcalTrigTowerDetId>::iterator ttFound = find(theTTlist_.begin(), theTTlist_.end(), thisTTdetId);
119  if ((ttFound != theTTlist_.end()) || *(theTTlist_.end()) == thisTTdetId) {
120  output.push_back(*digiItr);
121  }
122  }
123  edm::LogInfo("EcalDigi") << "Read EB Digis: " << output.size();
124  */
125 
126  std::cout<<"%%%%%%% In readOut(), size="<< input.size() <<std::endl ;
127 
128  for( unsigned int digis=0; digis<input.size(); ++digis )
129  {
130  EBDataFrame ebdf = input[digis];
131 
132  EcalTrigTowerDetId thisTTdetId=etmap.towerOf(ebdf.id());
133  std::vector<EcalTrigTowerDetId>::iterator ttFound = find(theTTlist_.begin(), theTTlist_.end(), thisTTdetId);
134 
135  if ((ttFound != theTTlist_.end()) || *(theTTlist_.end()) == thisTTdetId) {
136  output.push_back( ebdf.id() ) ;
137  EBDataFrame ebdf2( output.back() );
138  std::copy( ebdf.frame().begin(),
139  ebdf.frame().end(),
140  ebdf2.frame().begin() );
141  }
142  }
143 }
144 
145 void
148  const EcalTrigTowerConstituentsMap& etmap )
149 {
150  for (unsigned int digis=0; digis<input.size(); ++digis)
151  {
152  EEDataFrame eedf ( input[digis] ) ;
153 
154  EcalTrigTowerDetId thisTTdetId ( etmap.towerOf( eedf.id() ) ) ;
155 
156  std::vector<EcalTrigTowerDetId>::iterator ttFound
157  ( find(theTTlist_.begin(), theTTlist_.end(), thisTTdetId ) ) ;
158 
159  if( ( ttFound != theTTlist_.end() ) ||
160  *(theTTlist_.end()) == thisTTdetId )
161  {
162  output.push_back( eedf.id() ) ;
163  EEDataFrame eedf2( output.back() ) ;
164  std::copy( eedf.frame().begin(),
165  eedf.frame().end(),
166  eedf2.frame().begin() );
167  }
168  }
169 }
170 
171 void
173  const EcalTrigTowerConstituentsMap& theTTmap ,
174  const EBDigiCollection& input ,
176 {
177  // TB readout
178  // step 1: get the target crystal index
179 
180  edm::Handle<PEcalTBInfo> theEcalTBInfo;
181  event.getByLabel(ecalTBInfoLabel_,theEcalTBInfo);
182 
183  int crysId = theEcalTBInfo->nCrystal();
184 
185  // step 2: update (if needed) the TT list to be read
186 
187  findTTlist(crysId, theTTmap);
188 
189  // step 3: perform the readout
190 
191  readOut( input, output, theTTmap ) ;
192 }
193 
194 void
196  const EcalTrigTowerConstituentsMap& theTTmap ,
197  const EEDigiCollection& input ,
199 {
200 
201  // TB readout
202  // step 1: get the target crystal index
203 
204  edm::Handle<PEcalTBInfo> theEcalTBInfo;
205  event.getByLabel(ecalTBInfoLabel_,theEcalTBInfo);
206 
207  int crysId = theEcalTBInfo->nCrystal();
208 
209  // step 2: update (if needed) the TT list to be read
210 
211  findTTlist(crysId, theTTmap);
212 
213  // step 3: perform the readout
214 
215  readOut( input, output, theTTmap) ;
216 }
#define LogDebug(id)
void push_back(const Digi &digi)
size
Write out results.
key_type id() const
Definition: EBDataFrame.h:31
constexpr iterator end()
Definition: DataFrame.h:51
def copy(args, dbName)
std::vector< EcalTrigTowerDetId > theTTlist_
Definition: EcalTBReadout.h:59
static const int NCRYMATRIX
Definition: EcalTBReadout.h:61
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
EcalTrigTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
static std::string const input
Definition: EdmProvDump.cc:44
int iphi() const
get the crystal iphi
Definition: EBDetId.h:53
EcalTBReadout(const std::string theEcalTBInfoLabel)
Definition: EcalTBReadout.cc:9
void readOut(const EBDigiCollection &input, EBDigiCollection &output, const EcalTrigTowerConstituentsMap &etmap)
read only the digis from the selected TT
int nCrystal() const
Definition: PEcalTBInfo.h:28
int ieta() const
get the crystal ieta
Definition: EBDetId.h:51
void performReadout(edm::Event &event, const EcalTrigTowerConstituentsMap &theTTmap, const EBDigiCollection &input, EBDigiCollection &output)
master function to be called once per event
int ic() const
get ECAL/crystal number inside SM
Definition: EBDetId.cc:46
key_type id() const
Definition: EEDataFrame.h:28
constexpr iterator begin()
Definition: DataFrame.h:48
edm::DataFrame const & frame() const
Definition: EcalDataFrame.h:50
void push_back(const Digi &digi)
const std::vector< DetId > * theDetIds
Definition: EcalTBReadout.h:63
void findTTlist(const int &crysId, const EcalTrigTowerConstituentsMap &etmap)
search for the TT to be read
std::string ecalTBInfoLabel_
Definition: EcalTBReadout.h:65
Definition: event.py:1