RPCEventBuilder.cc
Go to the documentation of this file.
1 #include "RPCEventBuilder.h"
2 using namespace RPCEventBuilderLX;
3 
4 #include <evt/Event.h>
5 using namespace evt;
6 
7 #include <fwk/RunController.h>
8 using namespace fwk;
9 
10 #include <cevt/CEvent.h>
11 #include <cevt/Station.h>
12 #include <cevt/Pad.h>
13 #include <cevt/PadRecData.h>
14 #include <cevt/PadSimData.h>
15 #include <cevt/StationSimData.h>
16 #include <cevt/StationRecData.h>
17 using namespace cevt;
18 
19 #include <utl/config.h>
20 #include <utl/TimeStamp.h>
21 #include <utl/ErrorLogger.h>
22 #include <utl/MultiTimeDistribution.h>
23 #include <utl/TimeDistributionAlgorithm.h>
24 #include <utl/Accumulator.h>
25 using namespace utl;
26 
27 #include <sstream>
28 
29 using namespace std;
30 
32 {;}
33 
35 {;}
36 
38 {
39  INFO("RPCEventBuilder::Init()");
40  return eSuccess;
41 }
42 
43 
45 {
46  INFO("RPCEventBuilder::Finish()");
47  return eSuccess;
48 }
49 
50 
52 
53  INFO("RPCEventBuilder::Run()");
54 
55  if (!event.HasCEvent()) {
56  ERROR("No CEvent found.");
57  return eFailure;
58  }
59 
60  CEvent &rpcEvent = event.GetCEvent();
61 
62  // Loop over MARTA stations
63  for (CEvent::StationIterator sIt = rpcEvent.StationsBegin();
64  sIt != rpcEvent.StationsEnd(); ++sIt) {
65 
66  Station & station = *sIt;
67  station.ClearHits();
68  const int sId = station.GetId();
69 
70  if (!station.HasSimData()) {
71  ostringstream info;
72  info << "station " << sId << " does not have RPC sim data";
73  INFO(info);
74  continue;
75  }
76 
77  // Station trigger time is defined as (cf. TankTriggerSimulatorOG)
78  // const TimeStamp triggerTime =
79  // eventTime + TimeInterval(stop * sdet::Station::GetFADCBinSize()),
80  // For the momment the Pad signals are refered to the event time,
81  // the time of the core impact at ground.
82  // This is the reference time in the simulation that best resembles a GPS time stamp.
83 
84  // Find time of first hit in station
85 
86  Accumulator::Safe<Accumulator::Min<double> > minTime;
87  for(Station::ConstPadIterator pIt = station.PadsBegin();
88  pIt != station.PadsEnd(); ++pIt) {
89 
90  const PadSimData& padSim = pIt->GetSimData();
91 
92  if (padSim.HasHitsTimeDistribution()) {
93 
94  const TimeDistributionI& simDigits = padSim.GetHitsTimeDistribution();
95  minTime(simDigits.GetStart()*simDigits.GetBinning());
96  }
97  }
98 
99  const double stationT0 = minTime.GetMin();
100 
101  // Loop over pads with signal for this station
102  for(Station::PadIterator pIt = station.PadsBegin();
103  pIt != station.PadsEnd(); ++pIt) {
104 
105  Pad & pad = *pIt;
106 
107  pad.ClearHits();
108  const PadSimData& padSimData = pad.GetSimData();
109 
110  // Loop over components of the hitsized signal time distribution
111 
113  padSimData.HitsTimeDistributionsBegin();
114  tIt != padSimData.HitsTimeDistributionsEnd(); ++tIt) {
115 
116  const Station::SignalComponent component =
117  static_cast<Station::SignalComponent>(tIt->GetLabel());
118 
119  if (!pad.HasHits(component))
120  pad.MakeHits(component);
121 
122  if (!station.HasHits(component))
123  station.MakeHits(component);
124 
125  const TimeDistributionI & simDigitTimeDist = tIt->GetTimeDistribution();
126 
127  TimeDistributionI & padHits = pad.GetHits(component);
128  TimeDistributionI & stationHits = station.GetHits(component);
129 
130  const double timeBin = simDigitTimeDist.GetBinning();
131 
132  for (TimeDistributionI::SparseIterator it = simDigitTimeDist.SparseBegin();
133  it != simDigitTimeDist.SparseEnd(); ++it) {
134 
135  padHits.AddTime(it->get<0>()*timeBin-stationT0,it->get<1>());
136  stationHits.AddTime(it->get<0>()*timeBin-stationT0,it->get<1>());
137  }
138  }
139 
140  } // end loop over pads
141 
142  if (station.HasHits())
143  station.SetHitsStartTime(event.GetHeader().GetTime()+TimeInterval(stationT0));
144  else
145  station.SetHitsStartTime(TimeStamp(0));
146 
147  } // end loop over stations
148 
149  return eSuccess;
150 }
151 
152 
fwk::VModule::ResultFlag Init(void)
Initialize: invoked at beginning of run (NOT beginning of event)
int GetStart() const
First slot with data.
bool HasHits(const StationConstants::SignalComponent source=StationConstants::eTotal) const
Check if a digitized signal exists. Source may be specified.
Definition: Pad.h:74
HitsTimeDistributionsIterator HitsTimeDistributionsEnd()
End iterator over available digitized PAD signal sources.
Definition: PadSimData.h:162
bool HasSimData() const
Check whether station simulated data exists.
evt::Header & GetHeader()
StationIterator StationsEnd()
End of all stations.
Definition: CEvent.h:67
void MakeHits(const SignalComponent source=eTotal)
Make a time distribution. Source may be specified.
utl::TimeDistributionI & GetHitsTimeDistribution(const StationConstants::SignalComponent source=StationConstants::eTotal)
Definition: PadSimData.h:134
Histogram class for time distributions with suppressed empty bins.
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
bool HasHitsTimeDistribution(const StationConstants::SignalComponent source=StationConstants::eTotal) const
Check if the digitized PAD signal (optionally for a given source)
Definition: PadSimData.h:146
Class to hold simulated data at Pad level.
Definition: PadSimData.h:39
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
const utl::TimeStamp & GetTime() const
Definition: Event/Header.h:33
class to hold data at Pad level
Definition: Pad.h:27
fwk::VModule::ResultFlag Run(evt::Event &theEvent)
Run: invoked once per event.
double GetBinning() const
Size of one slot.
utl::TimeDistributionI & GetHits(const StationConstants::SignalComponent source=StationConstants::eTotal)
Get time distribution of hits, optionally specifying the source.
Definition: Pad.h:64
void SetHitsStartTime(const utl::TimeStamp &Time)
Set absolute start time of the hits time distribution.
int GetId() const
Get the station Id.
HitsTimeDistributionsIterator HitsTimeDistributionsBegin()
Begin iterator over available digitized PAD signal sources.
Definition: PadSimData.h:156
utl::MultiTimeDistributionI::ConstIterator ConstHitsTimeDistributionsIterator
Const iterator over available digitized PAD signal sources.
Definition: PadSimData.h:153
bool HasHits(const SignalComponent source=eTotal) const
Check if a digitized signal exists. Source may be specified.
utl::TimeDistributionI & GetHits(const SignalComponent source=eTotal)
Time distribution of hits.
fwk::VModule::ResultFlag Finish(void)
Finish: invoked at end of the run (NOT end of the event)
SparseIterator SparseEnd() const
void MakeHits(const StationConstants::SignalComponent source=StationConstants::eTotal)
Make a time distribution. Source may be specified.
Definition: Pad.cc:59
class to hold data at Station level
PadIterator PadsEnd()
end Pad iterator for read/write
A TimeInterval is used to represent time elapsed between two events.
Definition: TimeInterval.h:43
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
StationIterator StationsBegin()
Beginning of all stations.
Definition: CEvent.h:64
PadSimData & GetSimData()
Get object containing Pad simulated data.
Definition: Pad.h:41
bool HasCEvent() const
SparseIterator SparseBegin() const
Iterator over time slots with data in them (skips empty slots).
boost::indirect_iterator< InternalStationIterator, Station & > StationIterator
Iterator over all stations.
Definition: CEvent.h:59
void ClearHits()
Definition: Pad.h:60
PadIterator PadsBegin()
begin Pad iterator for read/write
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
void AddTime(const double time, const T weight=T(1))
Add an entry (optionally weighted) for the given time. Slot will be computed.
boost::transform_iterator< InternalMapFunctor, InternalConstIterator, Tuple > SparseIterator
Interface class to access to the SD part of an event.
Definition: CEvent.h:46

, generated on Tue Sep 26 2023.