CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Classes | Public Member Functions | Private Member Functions | Private Attributes
CTPPSProtonReconstructionEfficiencyEstimatorMC Class Reference
Inheritance diagram for CTPPSProtonReconstructionEfficiencyEstimatorMC:
edm::one::EDAnalyzer<> edm::one::EDAnalyzerBase edm::EDConsumerBase

Classes

struct  PlotGroup
 

Public Member Functions

 CTPPSProtonReconstructionEfficiencyEstimatorMC (const edm::ParameterSet &)
 
- Public Member Functions inherited from edm::one::EDAnalyzer<>
 EDAnalyzer ()=default
 
 EDAnalyzer (const EDAnalyzer &)=delete
 
SerialTaskQueueglobalLuminosityBlocksQueue () final
 
SerialTaskQueueglobalRunsQueue () final
 
const EDAnalyzeroperator= (const EDAnalyzer &)=delete
 
bool wantsGlobalLuminosityBlocks () const final
 
bool wantsGlobalRuns () const final
 
bool wantsInputProcessBlocks () const final
 
bool wantsProcessBlocks () const final
 
- Public Member Functions inherited from edm::one::EDAnalyzerBase
void callWhenNewProductsRegistered (std::function< void(BranchDescription const &)> const &func)
 
 EDAnalyzerBase ()
 
ModuleDescription const & moduleDescription () const
 
bool wantsStreamLuminosityBlocks () const
 
bool wantsStreamRuns () const
 
 ~EDAnalyzerBase () override
 
- Public Member Functions inherited from edm::EDConsumerBase
std::vector< ConsumesInfoconsumesInfo () const
 
void convertCurrentProcessAlias (std::string const &processName)
 Convert "@currentProcess" in InputTag process names to the actual current process name. More...
 
 EDConsumerBase ()
 
 EDConsumerBase (EDConsumerBase const &)=delete
 
 EDConsumerBase (EDConsumerBase &&)=default
 
ESProxyIndex const * esGetTokenIndices (edm::Transition iTrans) const
 
std::vector< ESProxyIndex > const & esGetTokenIndicesVector (edm::Transition iTrans) const
 
std::vector< ESRecordIndex >
const & 
esGetTokenRecordIndicesVector (edm::Transition iTrans) const
 
ProductResolverIndexAndSkipBit indexFrom (EDGetToken, BranchType, TypeID const &) const
 
void itemsMayGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
void itemsToGet (BranchType, std::vector< ProductResolverIndexAndSkipBit > &) const
 
std::vector
< ProductResolverIndexAndSkipBit >
const & 
itemsToGetFrom (BranchType iType) const
 
void labelsForToken (EDGetToken iToken, Labels &oLabels) const
 
void modulesWhoseProductsAreConsumed (std::array< std::vector< ModuleDescription const * > *, NumBranchTypes > &modulesAll, std::vector< ModuleProcessName > &modulesInPreviousProcesses, ProductRegistry const &preg, std::map< std::string, ModuleDescription const * > const &labelsToDesc, std::string const &processName) const
 
EDConsumerBase const & operator= (EDConsumerBase const &)=delete
 
EDConsumerBaseoperator= (EDConsumerBase &&)=default
 
bool registeredToConsume (ProductResolverIndex, bool, BranchType) const
 
bool registeredToConsumeMany (TypeID const &, BranchType) const
 
void selectInputProcessBlocks (ProductRegistry const &productRegistry, ProcessBlockHelperBase const &processBlockHelperBase)
 
ProductResolverIndexAndSkipBit uncheckedIndexFrom (EDGetToken) const
 
void updateLookup (BranchType iBranchType, ProductResolverIndexHelper const &, bool iPrefetchMayGet)
 
void updateLookup (eventsetup::ESRecordsToProxyIndices const &)
 
virtual ~EDConsumerBase () noexcept(false)
 

Private Member Functions

void analyze (const edm::Event &, const edm::EventSetup &) override
 
void endJob () override
 

Private Attributes

edm::ESGetToken< LHCInfo,
LHCInfoRcd
lhcInfoESToken_
 
std::string outputFile_
 
std::map< unsigned int,
std::map< unsigned int,
PlotGroup > > 
plots_
 
std::map< unsigned int,
unsigned int > 
rpDecId_far_
 
std::map< unsigned int,
unsigned int > 
rpDecId_near_
 
unsigned int rpId_45_F_
 
unsigned int rpId_45_N_
 
unsigned int rpId_56_F_
 
unsigned int rpId_56_N_
 
edm::EDGetTokenT
< edm::HepMCProduct
tokenHepMCAfterSmearing_
 
edm::EDGetTokenT< std::map
< int, edm::DetSetVector
< CTPPSPixelRecHit > > > 
tokenPixelRecHitsPerParticle_
 
edm::EDGetTokenT
< reco::ForwardProtonCollection
tokenRecoProtonsMultiRP_
 
edm::EDGetTokenT< std::map
< int, edm::DetSetVector
< TotemRPRecHit > > > 
tokenStripRecHitsPerParticle_
 
edm::EDGetTokenT
< CTPPSLocalTrackLiteCollection
tracksToken_
 
unsigned int verbosity_
 

Additional Inherited Members

- Public Types inherited from edm::one::EDAnalyzerBase
typedef EDAnalyzerBase ModuleType
 
- Public Types inherited from edm::EDConsumerBase
typedef ProductLabels Labels
 
- Static Public Member Functions inherited from edm::one::EDAnalyzerBase
static const std::string & baseType ()
 
static void fillDescriptions (ConfigurationDescriptions &descriptions)
 
static void prevalidate (ConfigurationDescriptions &descriptions)
 
- Protected Member Functions inherited from edm::EDConsumerBase
template<typename ProductType , BranchType B = InEvent>
EDGetTokenT< ProductType > consumes (edm::InputTag const &tag)
 
template<BranchType B = InEvent>
EDConsumerBaseAdaptor< Bconsumes (edm::InputTag tag) noexcept
 
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 ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes ()
 
template<typename ESProduct , typename ESRecord , Transition Tr = Transition::Event>
auto esConsumes (ESInputTag const &tag)
 
template<Transition Tr = Transition::Event>
constexpr auto esConsumes ()
 
template<Transition Tr = Transition::Event>
auto esConsumes (ESInputTag tag)
 
template<Transition Tr = Transition::Event>
ESGetTokenGeneric esConsumes (eventsetup::EventSetupRecordKey const &iRecord, eventsetup::DataKey const &iKey)
 Used with EventSetupRecord::doGet. More...
 
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)
 
void resetItemsToGetFrom (BranchType iType)
 

Detailed Description

Definition at line 39 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Constructor & Destructor Documentation

CTPPSProtonReconstructionEfficiencyEstimatorMC::CTPPSProtonReconstructionEfficiencyEstimatorMC ( const edm::ParameterSet iConfig)
explicit

Definition at line 95 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

References np, plots_, rpDecId_far_, rpDecId_near_, rpId_45_F_, rpId_45_N_, rpId_56_F_, and rpId_56_N_.

98  consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("tagHepMCAfterSmearing"))),
100  iConfig.getParameter<edm::InputTag>("tagStripRecHitsPerParticle"))),
102  iConfig.getParameter<edm::InputTag>("tagPixelRecHitsPerParticle"))),
103  tracksToken_(consumes<CTPPSLocalTrackLiteCollection>(iConfig.getParameter<edm::InputTag>("tagTracks"))),
105  consumes<reco::ForwardProtonCollection>(iConfig.getParameter<InputTag>("tagRecoProtonsMultiRP"))),
106  lhcInfoESToken_(esConsumes(ESInputTag("", iConfig.getParameter<std::string>("lhcInfoLabel")))),
107 
108  rpId_45_N_(iConfig.getParameter<unsigned int>("rpId_45_N")),
109  rpId_45_F_(iConfig.getParameter<unsigned int>("rpId_45_F")),
110  rpId_56_N_(iConfig.getParameter<unsigned int>("rpId_56_N")),
111  rpId_56_F_(iConfig.getParameter<unsigned int>("rpId_56_F")),
112 
113  outputFile_(iConfig.getParameter<string>("outputFile")),
114 
115  verbosity_(iConfig.getUntrackedParameter<unsigned int>("verbosity", 0)) {
118 
121 
122  // book plots
123  for (unsigned int arm = 0; arm < 2; ++arm) {
124  for (unsigned int np = 1; np <= 5; ++np)
125  plots_[arm][np] = PlotGroup();
126  }
127 }
T getUntrackedParameter(std::string const &, T const &) const
std::map< unsigned int, std::map< unsigned int, PlotGroup > > plots_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
edm::EDGetTokenT< reco::ForwardProtonCollection > tokenRecoProtonsMultiRP_
edm::EDGetTokenT< std::map< int, edm::DetSetVector< CTPPSPixelRecHit > > > tokenPixelRecHitsPerParticle_
int np
Definition: AMPTWrapper.h:43
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
edm::EDGetTokenT< std::map< int, edm::DetSetVector< TotemRPRecHit > > > tokenStripRecHitsPerParticle_

Member Function Documentation

void CTPPSProtonReconstructionEfficiencyEstimatorMC::analyze ( const edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivatevirtual

Implements edm::one::EDAnalyzerBase.

Definition at line 131 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

References CTPPSDetId::arm(), counter, edm::Event::getByToken(), edm::EventSetup::getData(), if(), info(), lhcInfoESToken_, eostools::move(), AlCaHLTBitMon_ParallelJobs::p, plots_, createTree::pp, CTPPSDetId::rp(), rpDecId_far_, rpDecId_near_, CTPPSDetId::rpId(), CTPPSDetId::sdTrackingPixel, CTPPSDetId::sdTrackingStrip, reco::ForwardProton::sector45, reco::ForwardProton::sector56, CTPPSDetId::station(), DetId::subdetId(), tokenHepMCAfterSmearing_, tokenPixelRecHitsPerParticle_, tokenRecoProtonsMultiRP_, tokenStripRecHitsPerParticle_, tracks, tracksToken_, and verbosity_.

131  {
132  std::ostringstream os;
133 
134  // get conditions
135  const auto &lhcInfo = iSetup.getData(lhcInfoESToken_);
136 
137  // get input
138  edm::Handle<edm::HepMCProduct> hHepMCAfterSmearing;
139  iEvent.getByToken(tokenHepMCAfterSmearing_, hHepMCAfterSmearing);
140  HepMC::GenEvent *hepMCEventAfterSmearing = (HepMC::GenEvent *)hHepMCAfterSmearing->GetEvent();
141 
143  iEvent.getByToken(tokenStripRecHitsPerParticle_, hStripRecHitsPerParticle);
144 
146  iEvent.getByToken(tokenPixelRecHitsPerParticle_, hPixelRecHitsPerParticle);
147 
149  iEvent.getByToken(tracksToken_, tracks);
150 
151  Handle<reco::ForwardProtonCollection> hRecoProtonsMultiRP;
152  iEvent.getByToken(tokenRecoProtonsMultiRP_, hRecoProtonsMultiRP);
153 
154  // buffer for particle information
155  struct ParticleInfo {
156  unsigned int arm = 2;
157  double xi = 0.;
158  std::map<unsigned int, unsigned int> recHitsPerRP;
159  bool inAcceptanceNear = false, inAcceptanceFar = false, inAcceptance = false;
160  };
161 
162  std::map<int, ParticleInfo> particleInfo; // barcode --> info
163 
164  // process HepMC
165  for (auto it = hepMCEventAfterSmearing->particles_begin(); it != hepMCEventAfterSmearing->particles_end(); ++it) {
166  const auto &part = *it;
167 
168  // accept only stable non-beam protons
169  if (part->pdg_id() != 2212)
170  continue;
171 
172  if (part->status() != 1)
173  continue;
174 
175  if (part->is_beam())
176  continue;
177 
178  const auto &mom = part->momentum();
179 
180  if (mom.e() < 4500.)
181  continue;
182 
183  ParticleInfo info;
184 
185  info.arm = (mom.z() > 0.) ? 0 : 1;
186 
187  const double p_nom = lhcInfo.energy();
188  info.xi = (p_nom - mom.rho()) / p_nom;
189 
190  particleInfo[part->barcode()] = std::move(info);
191  }
192 
193  // check acceptance
194  for (const auto &pp : *hStripRecHitsPerParticle) {
195  const auto barcode = pp.first;
196 
197  for (const auto &ds : pp.second) {
198  CTPPSDetId detId(ds.detId());
199  CTPPSDetId rpId = detId.rpId();
200  particleInfo[barcode].recHitsPerRP[rpId] += ds.size();
201  }
202  }
203 
204  for (const auto &pp : *hPixelRecHitsPerParticle) {
205  const auto barcode = pp.first;
206 
207  for (const auto &ds : pp.second) {
208  CTPPSDetId detId(ds.detId());
209  CTPPSDetId rpId = detId.rpId();
210  particleInfo[barcode].recHitsPerRP[rpId] += ds.size();
211  }
212  }
213 
214  std::map<unsigned int, bool> isStripRPNear, isStripRPFar;
215 
216  for (auto &pp : particleInfo) {
217  if (verbosity_)
218  os << "* barcode=" << pp.first << ", arm=" << pp.second.arm << ", xi=" << pp.second.xi << std::endl;
219 
220  for (const auto &rpp : pp.second.recHitsPerRP) {
221  CTPPSDetId rpId(rpp.first);
222  unsigned int needed_rec_hits = 1000;
223  if (rpId.subdetId() == CTPPSDetId::sdTrackingStrip)
224  needed_rec_hits = 6;
225  if (rpId.subdetId() == CTPPSDetId::sdTrackingPixel)
226  needed_rec_hits = 3;
227 
228  unsigned int rpDecId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
229 
230  if (rpId.subdetId() == CTPPSDetId::sdTrackingStrip) {
231  if (rpDecId == rpDecId_near_[rpId.arm()])
232  isStripRPNear[rpId.arm()] = true;
233  if (rpDecId == rpDecId_far_[rpId.arm()])
234  isStripRPFar[rpId.arm()] = true;
235  }
236 
237  if (rpp.second >= needed_rec_hits) {
238  if (rpDecId == rpDecId_near_[rpId.arm()])
239  pp.second.inAcceptanceNear = true;
240  if (rpDecId == rpDecId_far_[rpId.arm()])
241  pp.second.inAcceptanceFar = true;
242  }
243 
244  if (verbosity_)
245  os << " RP " << rpDecId << ": " << rpp.second << " hits" << std::endl;
246  }
247 
248  pp.second.inAcceptance = pp.second.inAcceptanceNear && pp.second.inAcceptanceFar;
249 
250  if (verbosity_)
251  os << " inAcceptance: near=" << pp.second.inAcceptanceNear << ", far=" << pp.second.inAcceptanceFar
252  << ", global=" << pp.second.inAcceptance << std::endl;
253  }
254 
255  // count particles in acceptance
256  struct ArmCounter {
257  unsigned int near = 0, far = 0, global = 0;
258  };
259  std::map<unsigned int, ArmCounter> nParticlesInAcceptance;
260  for (auto &pp : particleInfo) {
261  auto &counter = nParticlesInAcceptance[pp.second.arm];
262  if (pp.second.inAcceptanceNear)
263  counter.near++;
264  if (pp.second.inAcceptanceFar)
265  counter.far++;
266  if (pp.second.inAcceptance)
267  counter.global++;
268  }
269 
270  // count reconstructed tracks
271  std::map<unsigned int, ArmCounter> nReconstructedTracks;
272  for (const auto &tr : *tracks) {
273  CTPPSDetId rpId(tr.rpId());
274  unsigned int rpDecId = rpId.arm() * 100 + rpId.station() * 10 + rpId.rp();
275 
276  if (rpDecId == rpDecId_near_[rpId.arm()])
277  nReconstructedTracks[rpId.arm()].near++;
278  if (rpDecId == rpDecId_far_[rpId.arm()])
279  nReconstructedTracks[rpId.arm()].far++;
280  }
281 
282  // count reconstructed protons
283  std::map<unsigned int, unsigned int> nReconstructedProtons;
284  for (const auto &pr : *hRecoProtonsMultiRP) {
285  if (!pr.validFit())
286  continue;
287 
288  unsigned int arm = 2;
289  if (pr.lhcSector() == reco::ForwardProton::LHCSector::sector45)
290  arm = 0;
291  if (pr.lhcSector() == reco::ForwardProton::LHCSector::sector56)
292  arm = 1;
293 
294  nReconstructedProtons[arm]++;
295  }
296 
297  // fill plots
298  for (unsigned int arm = 0; arm < 2; arm++) {
299  const auto &npa = nParticlesInAcceptance[arm];
300  const auto &nrt = nReconstructedTracks[arm];
301 
302  if (verbosity_)
303  os << "* arm " << arm << ": nRecoProtons=" << nReconstructedProtons[arm]
304  << " (tracks near=" << nReconstructedTracks[arm].near << ", far=" << nReconstructedTracks[arm].far
305  << "), nAcc=" << npa.global << " (near=" << npa.near << ", far=" << npa.far << ")" << std::endl;
306 
307  // skip event if no track in global acceptance
308  if (npa.global < 1)
309  continue;
310 
311  const auto &p = plots_[arm][npa.global];
312 
313  p.h_n_part_acc_nr->Fill(npa.near);
314  p.h_n_part_acc_fr->Fill(npa.far);
315 
316  // skip events with some local reconstruction inefficiency
317  if (nrt.near != npa.near || nrt.far != npa.far)
318  continue;
319 
320  const double eff = double(nReconstructedProtons[arm]) / npa.global;
321 
322  if (verbosity_)
323  os << " eff=" << eff << std::endl;
324 
325  for (auto &pp : particleInfo) {
326  if (pp.second.arm != arm || !pp.second.inAcceptance)
327  continue;
328 
329  p.p_eff_vs_xi->Fill(pp.second.xi, eff);
330  }
331  }
332 
333  if (verbosity_)
334  edm::LogInfo("CTPPSProtonReconstructionEfficiencyEstimatorMC") << os.str();
335 }
static const TGPicture * info(bool iBackgroundIsBlack)
tuple pp
Definition: createTree.py:17
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
std::map< unsigned int, std::map< unsigned int, PlotGroup > > plots_
auto const & tracks
cannot be loose
CTPPSDetId rpId() const
Definition: CTPPSDetId.h:78
edm::EDGetTokenT< reco::ForwardProtonCollection > tokenRecoProtonsMultiRP_
bool getData(T &iHolder) const
Definition: EventSetup.h:122
edm::EDGetTokenT< std::map< int, edm::DetSetVector< CTPPSPixelRecHit > > > tokenPixelRecHitsPerParticle_
if(conf_.getParameter< bool >("UseStripCablingDB"))
def move
Definition: eostools.py:511
uint32_t arm() const
Definition: CTPPSDetId.h:51
Log< level::Info, false > LogInfo
part
Definition: HCALResponse.h:20
Base class for CTPPS detector IDs.
Definition: CTPPSDetId.h:32
static std::atomic< unsigned int > counter
edm::EDGetTokenT< std::map< int, edm::DetSetVector< TotemRPRecHit > > > tokenStripRecHitsPerParticle_
void CTPPSProtonReconstructionEfficiencyEstimatorMC::endJob ( void  )
overrideprivatevirtual

Reimplemented from edm::one::EDAnalyzerBase.

Definition at line 339 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

References visDQMUpload::buf, outputFile_, and plots_.

339  {
340  auto f_out = std::make_unique<TFile>(outputFile_.c_str(), "recreate");
341 
342  for (const auto &ait : plots_) {
343  char buf[100];
344  sprintf(buf, "arm%u", ait.first);
345  TDirectory *d_arm = f_out->mkdir(buf);
346 
347  for (const auto &npit : ait.second) {
348  sprintf(buf, "%u", npit.first);
349  TDirectory *d_np = d_arm->mkdir(buf);
350  gDirectory = d_np;
351 
352  npit.second.write();
353  }
354  }
355 }
std::map< unsigned int, std::map< unsigned int, PlotGroup > > plots_

Member Data Documentation

edm::ESGetToken<LHCInfo, LHCInfoRcd> CTPPSProtonReconstructionEfficiencyEstimatorMC::lhcInfoESToken_
private

Definition at line 56 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

std::string CTPPSProtonReconstructionEfficiencyEstimatorMC::outputFile_
private

Definition at line 63 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by endJob().

std::map<unsigned int, std::map<unsigned int, PlotGroup> > CTPPSProtonReconstructionEfficiencyEstimatorMC::plots_
private
std::map<unsigned int, unsigned int> CTPPSProtonReconstructionEfficiencyEstimatorMC::rpDecId_far_
private
std::map<unsigned int, unsigned int> CTPPSProtonReconstructionEfficiencyEstimatorMC::rpDecId_near_
private
unsigned int CTPPSProtonReconstructionEfficiencyEstimatorMC::rpId_45_F_
private
unsigned int CTPPSProtonReconstructionEfficiencyEstimatorMC::rpId_45_N_
private
unsigned int CTPPSProtonReconstructionEfficiencyEstimatorMC::rpId_56_F_
private
unsigned int CTPPSProtonReconstructionEfficiencyEstimatorMC::rpId_56_N_
private
edm::EDGetTokenT<edm::HepMCProduct> CTPPSProtonReconstructionEfficiencyEstimatorMC::tokenHepMCAfterSmearing_
private

Definition at line 47 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

edm::EDGetTokenT<std::map<int, edm::DetSetVector<CTPPSPixelRecHit> > > CTPPSProtonReconstructionEfficiencyEstimatorMC::tokenPixelRecHitsPerParticle_
private

Definition at line 50 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

edm::EDGetTokenT<reco::ForwardProtonCollection> CTPPSProtonReconstructionEfficiencyEstimatorMC::tokenRecoProtonsMultiRP_
private

Definition at line 54 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

edm::EDGetTokenT<std::map<int, edm::DetSetVector<TotemRPRecHit> > > CTPPSProtonReconstructionEfficiencyEstimatorMC::tokenStripRecHitsPerParticle_
private

Definition at line 49 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

edm::EDGetTokenT<CTPPSLocalTrackLiteCollection> CTPPSProtonReconstructionEfficiencyEstimatorMC::tracksToken_
private

Definition at line 52 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().

unsigned int CTPPSProtonReconstructionEfficiencyEstimatorMC::verbosity_
private

Definition at line 65 of file CTPPSProtonReconstructionEfficiencyEstimatorMC.cc.

Referenced by analyze().