CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Types | Private Member Functions | Private Attributes
PileupInformation Class Reference

#include <PileupInformation.h>

Inheritance diagram for PileupInformation:
edm::EDProducer edm::ProducerBase edm::EDConsumerBase edm::ProductRegistryHelper

Public Member Functions

 PileupInformation (const edm::ParameterSet &)
 
- Public Member Functions inherited from edm::EDProducer
 EDProducer ()
 
ModuleDescription const & moduleDescription () const
 
virtual ~EDProducer ()
 
- Public Member Functions inherited from edm::ProducerBase
 ProducerBase ()
 
void registerProducts (ProducerBase *, ProductRegistry *, ModuleDescription const &)
 
std::function< void(BranchDescription
const &)> 
registrationCallback () const
 used by the fwk to register list of products More...
 
virtual ~ProducerBase ()
 
- Public Member Functions inherited from edm::EDConsumerBase
 EDConsumerBase ()
 
ProductHolderIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductHolderIndexAndSkipBit > &) const
 
std::vector
< ProductHolderIndexAndSkipBit >
const & 
itemsToGetFromEvent () const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesDependentUpon (const std::string &iProcessName, std::vector< const char * > &oModuleLabels) const
 
bool registeredToConsume (ProductHolderIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void updateLookup (BranchType iBranchType, ProductHolderIndexHelper const &)
 
virtual ~EDConsumerBase ()
 

Private Types

typedef std::map
< EncodedEventId, unsigned int > 
EncodedEventIdToIndex
 
typedef std::map< int, int > myindex
 

Private Member Functions

void produce (edm::Event &, const edm::EventSetup &)
 

Private Attributes

edm::ParameterSet conf_
 
double distanceCut_
 
myindex event_index_
 
bool LookAtTrackingTruth_
 
std::string MessageCategory_
 
std::vector< int > ntrks_highpT
 
std::vector< int > ntrks_lowpT
 
edm::EDGetTokenT
< PileupMixingContent
PileupInfoLabel_
 
double pTcut_1_
 
double pTcut_2_
 
std::vector< float > sumpT_highpT
 
std::vector< float > sumpT_lowpT
 
edm::EDGetTokenT
< TrackingParticleCollection
trackingTruthT_
 
edm::EDGetTokenT
< TrackingVertexCollection
trackingTruthV_
 
double volumeRadius_
 
double volumeZ_
 
std::vector< float > zpositions
 

Additional Inherited Members

- Public Types inherited from edm::EDProducer
typedef EDProducer ModuleType
 
- Public Types inherited from edm::ProducerBase
typedef
ProductRegistryHelper::TypeLabelList 
TypeLabelList
 
- Static Public Member Functions inherited from edm::EDProducer
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::ProducerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
EDGetToken consumes (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken consumes (TypeToGet const &id, edm::InputTag const &tag)
 
ConsumesCollector consumesCollector ()
 Use a ConsumesCollector to gather consumes information from helper functions. More...
 
template<typename ProductType , BranchType B = InEvent>
void consumesMany ()
 
void consumesMany (const TypeToGet &id)
 
template<BranchType B>
void consumesMany (const TypeToGet &id)
 
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > mayConsume (edm::InputTag const &tag)
 
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 
template<BranchType B>
EDGetToken mayConsume (const TypeToGet &id, edm::InputTag const &tag)
 

Detailed Description

Definition at line 30 of file PileupInformation.h.

Member Typedef Documentation

typedef std::map<EncodedEventId, unsigned int> PileupInformation::EncodedEventIdToIndex
private

Definition at line 43 of file PileupInformation.h.

typedef std::map< int, int > PileupInformation::myindex
private

Definition at line 44 of file PileupInformation.h.

Constructor & Destructor Documentation

PileupInformation::PileupInformation ( const edm::ParameterSet config)
explicit

Definition at line 21 of file PileupInformation.cc.

References distanceCut_, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), LookAtTrackingTruth_, MessageCategory_, PileupInfoLabel_, pTcut_1_, pTcut_2_, trackingTruthT_, trackingTruthV_, volumeRadius_, and volumeZ_.

22 {
23  // Initialize global parameters
24 
25  pTcut_1_ = 0.1;
26  pTcut_2_ = 0.5; // defaults
27  distanceCut_ = config.getParameter<double>("vertexDistanceCut");
28  volumeRadius_ = config.getParameter<double>("volumeRadius");
29  volumeZ_ = config.getParameter<double>("volumeZ");
30  pTcut_1_ = config.getParameter<double>("pTcut_1");
31  pTcut_2_ = config.getParameter<double>("pTcut_2");
32 
33  PileupInfoLabel_ = consumes<PileupMixingContent>(config.getParameter<edm::InputTag>("PileupMixingLabel"));
34 
35  LookAtTrackingTruth_ = config.getUntrackedParameter<bool>("doTrackTruth");
36 
37  trackingTruthT_ = mayConsume<TrackingParticleCollection>(config.getParameter<edm::InputTag>("TrackingParticlesLabel"));
38  trackingTruthV_ = mayConsume<TrackingVertexCollection>(config.getParameter<edm::InputTag>("TrackingParticlesLabel"));
39 
40  MessageCategory_ = "PileupInformation";
41 
42  edm::LogInfo (MessageCategory_) << "Setting up PileupInformation";
43  edm::LogInfo (MessageCategory_) << "Vertex distance cut set to " << distanceCut_ << " mm";
44  edm::LogInfo (MessageCategory_) << "Volume radius set to " << volumeRadius_ << " mm";
45  edm::LogInfo (MessageCategory_) << "Volume Z set to " << volumeZ_ << " mm";
46  edm::LogInfo (MessageCategory_) << "Lower pT Threshold set to " << pTcut_1_ << " GeV";
47  edm::LogInfo (MessageCategory_) << "Upper pT Threshold set to " << pTcut_2_ << " GeV";
48 
49 
50  produces< std::vector<PileupSummaryInfo> >();
51  //produces<PileupSummaryInfo>();
52 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< PileupMixingContent > PileupInfoLabel_
std::string MessageCategory_
edm::EDGetTokenT< TrackingParticleCollection > trackingTruthT_
edm::EDGetTokenT< TrackingVertexCollection > trackingTruthV_

Member Function Documentation

void PileupInformation::produce ( edm::Event event,
const edm::EventSetup setup 
)
privatevirtual
     The following code is not valid when there are no Crossing Frames, since all of the vertices 
    will not be in memory at the same time

Collect all the simvertex from the crossing frame edm::Handle<CrossingFrame<SimVertex> > cfSimVertexes; if( event.getByToken(simHitToken_, cfSimVertexes) ) {

Create a mix collection from one simvertex collection simVertexes_ = std::auto_ptr<MixCollection<SimVertex> >( new MixCollection<SimVertex>(cfSimVertexes.product()) );

int index = 0; Solution to the problem of not having vertexId bool FirstL = true; EncodedEventIdToIndex vertexId; EncodedEventId oldEventId; int oldBX = -1000;

std::vector<int> BunchCrossings2; std::list<int> Interactions_Xing2;

Loop for finding repeated vertexId (vertexId problem hack) for (MixCollection<SimVertex>::MixItr iterator = simVertexes_->begin(); iterator != simVertexes_->end(); ++iterator, ++index) { std::cout << " SimVtx eventid, vertexid " << iterator->eventId().event() << " " << iterator->eventId().bunchCrossing() << std::endl; if (!index || iterator->eventId() != oldEventId) { if(iterator->eventId().bunchCrossing()==0 && iterator->eventId().event()==0){ continue; } if(iterator->eventId().bunchCrossing() != oldBX) { BunchCrossings2.push_back(iterator->eventId().bunchCrossing()); Interactions_Xing2.push_back(iterator->eventId().event()); oldBX = iterator->eventId().bunchCrossing(); } else { Interactions_Xing2.pop_back(); Interactions_Xing2.push_back(iterator->eventId().event()); }

      oldEventId = iterator->eventId();
      continue;
    }

}

  std::vector<int>::iterator viter;
  std::list<int>::iterator liter = Interactions_Xing2.begin();

  for(viter = BunchCrossings2.begin(); viter != BunchCrossings2.end(); ++viter, ++liter){

std::cout << " bcr, nint from VTX " << (*viter) << " " << (*liter) << std::endl; BunchCrossings.push_back((*viter)); Interactions_Xing.push_back((*liter)); TrueInteractions_Xing.push_back(-1.); // no idea what the true number is }

} // end of "did we find vertices?" end of look at SimVertices

Implements edm::EDProducer.

Definition at line 55 of file PileupInformation.cc.

References event_index_, edm::hlt::Exception, edm::Event::getByToken(), PileupMixingContent::getMix_bunchCrossing(), PileupMixingContent::getMix_Ninteractions(), PileupMixingContent::getMix_TrueInteractions(), cuy::ib, LookAtTrackingTruth_, ntrks_highpT, ntrks_lowpT, PileupInfoLabel_, edm::Handle< T >::product(), pTcut_1_, pTcut_2_, mathSSE::sqrt(), sumpT_highpT, sumpT_lowpT, trackingTruthT_, trackingTruthV_, and zpositions.

56 {
57 
58  std::auto_ptr<std::vector<PileupSummaryInfo> > PSIVector(new std::vector<PileupSummaryInfo>);
59 
60  edm::Handle< PileupMixingContent > MixingPileup; // Get True pileup information from MixingModule
61  event.getByToken(PileupInfoLabel_, MixingPileup);
62 
63  std::vector<int> BunchCrossings;
64  std::vector<int> Interactions_Xing;
65  std::vector<float> TrueInteractions_Xing;
66 
67  const PileupMixingContent* MixInfo = MixingPileup.product();
68 
69  if(MixInfo) { // extract information - way easier than counting vertices
70 
71  const std::vector<int> bunchCrossing = MixInfo->getMix_bunchCrossing();
72  const std::vector<int> interactions = MixInfo->getMix_Ninteractions();
73  const std::vector<float> TrueInteractions = MixInfo->getMix_TrueInteractions();
74 
75 
76  for(int ib=0; ib<(int)bunchCrossing.size(); ++ib){
77  // std::cout << " bcr, nint " << bunchCrossing[ib] << " " << interactions[ib] << std::endl;
78  BunchCrossings.push_back(bunchCrossing[ib]);
79  Interactions_Xing.push_back(interactions[ib]);
80  TrueInteractions_Xing.push_back(TrueInteractions[ib]);
81  }
82  }
83  else{ // have to throw an exception..
84 
85  throw cms::Exception("PileupInformation") << " PileupMixingContent is missing from the event.\n"
86  "There must be some breakdown in the Simulation Chain.\n"
87  "You must run the MixingModule before calling this routine.";
88  // end of cut
147  }
148 
149  //Now, get information on valid particles that look like they could be in the tracking volume
150 
151 
152  zpositions.clear();
153  sumpT_lowpT.clear();
154  sumpT_highpT.clear();
155  ntrks_lowpT.clear();
156  ntrks_highpT.clear();
157  event_index_.clear();
158 
159  int lastEvent = 0; // zero is the true MC hard-scatter event
160 
161  // int lastBunchCrossing = 0; // 0 is the true bunch crossing, should always come first.
162 
163  bool HaveTrackingParticles = false;
164 
167 
168  TrackingVertexCollection::const_iterator iVtx;
169  TrackingVertexCollection::const_iterator iVtxTest;
170  TrackingParticleCollection::const_iterator iTrackTest;
171 
172  if( LookAtTrackingTruth_ ){
173 
174  if(event.getByToken(trackingTruthT_, mergedPH) && event.getByToken(trackingTruthV_, mergedVH)) {
175 
176  HaveTrackingParticles = true;
177 
178  iVtxTest = mergedVH->begin();
179  iTrackTest = mergedPH->begin();
180  }
181 
182  }
183 
184  int nminb_vtx = 0;
185  // bool First = true;
186  // bool flag_new = false;
187 
188  std::vector<int>::iterator BXIter;
189  std::vector<int>::iterator InteractionsIter = Interactions_Xing.begin();
190  std::vector<float>::iterator TInteractionsIter = TrueInteractions_Xing.begin();
191 
192  // loop over the bunch crossings and interactions we have extracted
193 
194  for( BXIter = BunchCrossings.begin(); BXIter != BunchCrossings.end(); ++BXIter, ++InteractionsIter, ++TInteractionsIter) {
195 
196  //std::cout << "looking for BX: " << (*BXIter) << std::endl;
197 
198  if(HaveTrackingParticles) { // leave open the option of not producing TrackingParticles and just keeping # interactions
199 
200  for (iVtx = iVtxTest; iVtx != mergedVH->end(); ++iVtx) {
201 
202  if(iVtx->eventId().bunchCrossing() == (*BXIter) ) { // found first vertex in this bunch crossing
203 
204  if(iVtx->eventId().event() != lastEvent) {
205 
206  //std::cout << "BX,event " << iVtx->eventId().bunchCrossing() << " " << iVtx->eventId().event() << std::endl;
207 
208  float zpos = 0.;
209  zpos = iVtx->position().z();
210  zpositions.push_back(zpos); //save z position of each vertex
211  sumpT_lowpT.push_back(0.);
212  sumpT_highpT.push_back(0.);
213  ntrks_lowpT.push_back(0);
214  ntrks_highpT.push_back(0);
215 
216  lastEvent = iVtx->eventId().event();
217  iVtxTest = --iVtx; // just for security
218 
219  // turns out events aren't sequential... save map of indices
220 
221  event_index_.insert(myindex::value_type(lastEvent,nminb_vtx));
222 
223  ++nminb_vtx;
224 
225  continue;
226  }
227  }
228  }
229 
230  // next loop over tracks to get information
231 
232  for (TrackingParticleCollection::const_iterator iTrack = iTrackTest; iTrack != mergedPH->end(); ++iTrack)
233  {
234  bool FoundTrk = false;
235 
236  float zpos=0.;
237 
238  if(iTrack->eventId().bunchCrossing() == (*BXIter) && iTrack->eventId().event() > 0 )
239  {
240  FoundTrk = true;
241  int correct_index = event_index_[iTrack->eventId().event()];
242 
243  //std::cout << " track index, correct index " << iTrack->eventId().event() << " " << correct_index << std::endl;
244 
245  zpos = zpositions[correct_index];
246  if(iTrack->matchedHit()>0) {
247  if(fabs(iTrack->parentVertex()->position().z()-zpos)<0.1) { //make sure track really comes from this vertex
248  //std::cout << *iTrack << std::endl;
249  float Tpx = iTrack->p4().px();
250  float Tpy = iTrack->p4().py();
251  float TpT = sqrt(Tpx*Tpx + Tpy*Tpy);
252  if( TpT>pTcut_1_ ) {
253  sumpT_lowpT[correct_index]+=TpT;
254  ++ntrks_lowpT[correct_index];
255  }
256  if( TpT>pTcut_2_ ){
257  sumpT_highpT[correct_index]+=TpT;
258  ++ntrks_highpT[correct_index];
259  }
260  }
261  }
262  }
263  else{
264  if(FoundTrk) {
265 
266  iTrackTest = --iTrack; // reset so we can start over next time
267  --iTrackTest; // just to be sure
268  break;
269  }
270 
271  }
272 
273  } // end of track loop
274 
275  } // end of check that we have TrackingParticles to begin with...
276 
277 
278  // now that we have all of the track information for a given bunch crossing,
279  // make PileupSummary for this one and move on
280 
281  // std::cout << "Making PSI for bunch " << lastBunchCrossing << std::endl;
282 
283  if(!HaveTrackingParticles) { // stick in one value so we don't have empty vectors
284 
285  zpositions.push_back(-999.);
286  sumpT_lowpT.push_back(0.);
287  sumpT_highpT.push_back(0.);
288  ntrks_lowpT.push_back(0);
289  ntrks_highpT.push_back(0);
290 
291  }
292 
294  (*InteractionsIter),
295  zpositions,
296  sumpT_lowpT,
297  sumpT_highpT,
298  ntrks_lowpT,
299  ntrks_highpT,
300  (*BXIter),
301  (*TInteractionsIter)
302  );
303 
304  //std::cout << " " << std::endl;
305  //std::cout << "Adding Bunch Crossing, nint " << (*BXIter) << " " << (*InteractionsIter) << std::endl;
306 
307  //for(int iv = 0; iv<(*InteractionsIter); ++iv){
308 
309  // std::cout << "Z position " << zpositions[iv] << std::endl;
310  // std::cout << "ntrks_lowpT " << ntrks_lowpT[iv] << std::endl;
311  // std::cout << "sumpT_lowpT " << sumpT_lowpT[iv] << std::endl;
312  // std::cout << "ntrks_highpT " << ntrks_highpT[iv] << std::endl;
313  // std::cout << "sumpT_highpT " << sumpT_highpT[iv] << std::endl;
314  //}
315 
316  PSIVector->push_back(PSI_bunch);
317 
318  // if(HaveTrackingParticles) lastBunchCrossing = iVtx->eventId().bunchCrossing();
319 
320  event_index_.clear();
321  zpositions.clear();
322  sumpT_lowpT.clear();
323  sumpT_highpT.clear();
324  ntrks_lowpT.clear();
325  ntrks_highpT.clear();
326  nminb_vtx = 0;
327  lastEvent=0;
328 
329 
330  } // end of loop over bunch crossings
331 
332  // put our vector of PileupSummaryInfo objects into the event.
333 
334  event.put(PSIVector);
335 
336 
337 }
edm::EDGetTokenT< PileupMixingContent > PileupInfoLabel_
int ib
Definition: cuy.py:660
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
const std::vector< float > & getMix_TrueInteractions() const
const std::vector< int > & getMix_bunchCrossing() const
const std::vector< int > & getMix_Ninteractions() const
T sqrt(T t)
Definition: SSEVec.h:48
std::vector< float > sumpT_highpT
Container::value_type value_type
std::vector< float > zpositions
std::vector< int > ntrks_lowpT
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< TrackingParticleCollection > trackingTruthT_
std::vector< float > sumpT_lowpT
edm::EDGetTokenT< TrackingVertexCollection > trackingTruthV_
std::vector< int > ntrks_highpT

Member Data Documentation

edm::ParameterSet PileupInformation::conf_
private

Definition at line 41 of file PileupInformation.h.

double PileupInformation::distanceCut_
private

Definition at line 54 of file PileupInformation.h.

Referenced by PileupInformation().

myindex PileupInformation::event_index_
private

Definition at line 45 of file PileupInformation.h.

Referenced by produce().

bool PileupInformation::LookAtTrackingTruth_
private

Definition at line 64 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

std::string PileupInformation::MessageCategory_
private

Definition at line 66 of file PileupInformation.h.

Referenced by PileupInformation().

std::vector<int> PileupInformation::ntrks_highpT
private

Definition at line 51 of file PileupInformation.h.

Referenced by produce().

std::vector<int> PileupInformation::ntrks_lowpT
private

Definition at line 50 of file PileupInformation.h.

Referenced by produce().

edm::EDGetTokenT<PileupMixingContent> PileupInformation::PileupInfoLabel_
private

Definition at line 62 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

double PileupInformation::pTcut_1_
private

Definition at line 57 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

double PileupInformation::pTcut_2_
private

Definition at line 58 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

std::vector<float> PileupInformation::sumpT_highpT
private

Definition at line 49 of file PileupInformation.h.

Referenced by produce().

std::vector<float> PileupInformation::sumpT_lowpT
private

Definition at line 48 of file PileupInformation.h.

Referenced by produce().

edm::EDGetTokenT<TrackingParticleCollection> PileupInformation::trackingTruthT_
private

Definition at line 60 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

edm::EDGetTokenT<TrackingVertexCollection> PileupInformation::trackingTruthV_
private

Definition at line 61 of file PileupInformation.h.

Referenced by PileupInformation(), and produce().

double PileupInformation::volumeRadius_
private

Definition at line 55 of file PileupInformation.h.

Referenced by PileupInformation().

double PileupInformation::volumeZ_
private

Definition at line 56 of file PileupInformation.h.

Referenced by PileupInformation().

std::vector<float> PileupInformation::zpositions
private

Definition at line 47 of file PileupInformation.h.

Referenced by produce().