37#include <TStopwatch.h>
48 std::vector<OutputSpec> outputs;
49 outputs.emplace_back(detOrig,
"DIGITS", 0, Lifetime::Timeframe);
50 outputs.emplace_back(detOrig,
"DIGITSROF", 0, Lifetime::Timeframe);
52 outputs.emplace_back(detOrig,
"DIGITSMC2ROF", 0, Lifetime::Timeframe);
53 outputs.emplace_back(detOrig,
"DIGITSMCTR", 0, Lifetime::Timeframe);
55 outputs.emplace_back(detOrig,
"ROMode", 0, Lifetime::Timeframe);
72 mDisableQED = ic.
options().
get<
bool>(
"disable-qed");
83 LOGP(info,
"Applying misalignment to ITS3 Hits");
90 const bool withQED = context->isQEDProvided() && !mDisableQED;
91 auto& timesview = context->getEventRecords(withQED);
92 LOG(info) <<
"GOT " << timesview.size() <<
" COLLISSION TIMES";
93 LOG(info) <<
"SIMCHAINS " << mSimChains.size();
96 if (timesview.empty()) {
101 LOG(info) <<
" CALLING ITS3 DIGITIZATION ";
108 auto& digitsAccum = pc.
outputs().
make<std::vector<itsmft::Digit>>(
Output{mOrigin,
"DIGITS", 0});
110 auto accumulate = [
this, &digitsAccum]() {
113 if (mDigits.empty()) {
116 auto ndigAcc = digitsAccum.size();
117 std::copy(mDigits.begin(), mDigits.end(), std::back_inserter(digitsAccum));
120 auto nROFRecsOld = mROFRecordsAccum.size();
122 for (
int i = 0;
i < mROFRecords.size();
i++) {
123 auto& rof = mROFRecords[
i];
124 rof.setFirstEntry(ndigAcc + rof.getFirstEntry());
127 if (mFixMC2ROF < mMC2ROFRecordsAccum.size()) {
128 for (
int m2rid = mFixMC2ROF; m2rid < mMC2ROFRecordsAccum.size(); m2rid++) {
130 auto& mc2rof = mMC2ROFRecordsAccum[m2rid];
131 if (rof.getROFrame() == mc2rof.minROF) {
133 mc2rof.rofRecordID = nROFRecsOld +
i;
140 std::copy(mROFRecords.begin(), mROFRecords.end(), std::back_inserter(mROFRecordsAccum));
144 LOG(info) <<
"Added " << mDigits.size() <<
" digits ";
151 auto& eventParts = context->getEventParts(withQED);
155 for (
size_t collID = 0; collID < timesview.size(); ++collID) {
156 auto irt = timesview[collID];
157 if (irt.toLong() < bcShift) {
166 for (
auto& part : eventParts[collID]) {
172 if (!mHits.empty()) {
173 LOG(
debug) <<
"For collision " << collID <<
" eventID " << part.entryID
174 <<
" found " << mHits.size() <<
" hits ";
175 mDigitizer.
process(&mHits, part.entryID, part.sourceID);
195 LOG(info) << mID.
getName() <<
": Sending ROMode= " << mROMode <<
" to GRPUpdater";
199 LOG(info) <<
"Digitization took " << timer.CpuTime() <<
"s";
209 static bool initOnce{
false};
223 digipar.setContinuous(dopt.continuous);
225 if (dopt.continuous) {
228 digipar.setROFrameLength(frameNS);
237 digipar.getSignalShape().setParameters(dopt.strobeFlatTop, dopt.strobeMaxRiseTime, dopt.strobeQRiseTime0);
238 digipar.setChargeThreshold(dopt.chargeThreshold);
239 digipar.setNoisePerPixel(dopt.noisePerPixel);
240 digipar.setTimeOffset(dopt.timeOffset);
241 digipar.setNSimSteps(dopt.nSimSteps);
244 digipar.setIBChargeThreshold(doptIB.IBChargeThreshold);
245 digipar.setIBNSimSteps(doptIB.nIBSimSteps);
246 digipar.setIBNoisePerPixel(doptIB.IBNoisePerPixel);
249 LOG(info) << mID.
getName() <<
" simulated in "
266 LOG(info) << mID.
getName() <<
" Alpide param updated";
268 par.printKeyValues();
272 LOG(info) << mID.
getName() <<
" static dead map updated";
279 bool mWithMCTruth{
true};
280 bool mFinished{
false};
281 bool mDisableQED{
false};
285 std::vector<o2::itsmft::Digit> mDigits{};
286 std::vector<o2::itsmft::ROFRecord> mROFRecords{};
287 std::vector<o2::itsmft::ROFRecord> mROFRecordsAccum{};
288 std::vector<o2::itsmft::Hit> mHits{};
289 std::vector<o2::itsmft::Hit>* mHitsP{&mHits};
292 std::vector<o2::itsmft::MC2ROFRecord> mMC2ROFRecordsAccum{};
293 std::vector<TChain*> mSimChains{};
303 std::vector<InputSpec> inputs;
304 inputs.emplace_back(
"collisioncontext",
"SIM",
"COLLISIONCONTEXT",
static_cast<SubSpecificationType>(channel), Lifetime::Timeframe);
305 inputs.emplace_back(
"ITS_alppar",
"ITS",
"ALPIDEPARAM", 0, Lifetime::Condition,
ccdbParamSpec(
"ITS/Config/AlpideParam"));
307 inputs.emplace_back(
"IT3_dead",
"IT3",
"DEADMAP", 0, Lifetime::Condition,
ccdbParamSpec(
"IT3/Calib/DeadMap"));
311 inputs, makeOutChannels(detOrig, mctruth),
Definition of the base digitizer task class.
A const (ready only) version of MCTruthContainer.
o2::framework::DataAllocator::SubSpecificationType SubSpecificationType
Header of the General Run Parameters object.
Definition of the GeometryTGeo class.
Definition of the ITS digitizer.
virtual void init(o2::framework::InitContext &) final
static const ITS3Params & Instance()
Static class with identifiers, bitmasks and names for ALICE detectors.
static constexpr const char * getName(ID id)
names of defined detectors
static const std::array< std::vector< std::string >, DetID::nDetectors > DETECTORBRANCHNAMES
T get(const char *key) const
void snapshot(const Output &spec, T const &object)
o2::header::DataHeader::SubSpecificationType SubSpecificationType
decltype(auto) make(const Output &spec, Args... args)
ConfigParamRegistry const & options()
DataAllocator & outputs()
The data allocator is used to allocate memory for the output data.
InputRecord & inputs()
The inputs associated with this processing context.
ServiceRegistryRef services()
The services registry associated with this processing context.
uint32_t getEventROFrameMax() const
void setEventTime(const o2::InteractionTimeRecord &irt)
void setDeadChannelsMap(const o2::itsmft::NoiseMap *mp)
void setROFRecords(std::vector< o2::itsmft::ROFRecord > *rec)
uint32_t getEventROFrameMin() const
void setDigits(std::vector< o2::itsmft::Digit > *dig)
void setGeometry(const o2::its::GeometryTGeo *gm)
void process(const std::vector< itsmft::Hit > *hits, int evID, int srcID)
Steer conversion of hits to digits.
o2::its3::DigiParams & getParams()
void fillOutputContainer(uint32_t maxFrame=0xffffffff)
void resetEventROFrames()
void setMCLabels(o2::dataformats::MCTruthContainer< o2::MCCompLabel > *mclb)
void run(framework::ProcessingContext &pc)
void finaliseCCDB(ConcreteDataMatcher &matcher, void *obj)
ITS3DPLDigitizerTask(bool mctruth=true)
void initDigitizerTask(framework::InitContext &ic) override
void updateTimeDependentParams(ProcessingContext &pc)
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
int getROFrameBiasInBC() const
NoiseMap class for the ITS and MFT.
bool initSimChains(o2::detectors::DetID detid, std::vector< TChain * > &simchains) const
constexpr o2::header::DataOrigin gDataOriginIT3
constexpr double LHCBunchSpacingNS
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > ccdbParamSpec(std::string const &path, int runDependent, std::vector< CCDBMetadata > metadata={}, int qrate=0)
std::vector< ConfigParamSpec > Options
header::DataHeader::SubSpecificationType SubSpecificationType
DataProcessorSpec getITS3DigitizerSpec(int channel, bool mctruth)
class listing possible services
static void misalignHits()
int roFrameBiasInBC
bias of the start of ROF wrt orbit start: t_irof = (irof*roFrameLengthInBC + roFrameBiasInBC)*BClengt...
float strobeDelay
strobe start (in ns) wrt ROF start
int roFrameLengthInBC
ROF length in BC for continuos mode.
float strobeLengthCont
if < 0, full ROF length - delay
float strobeLengthTrig
length of the strobe in ns (sig. over threshold checked in this window only)
float roFrameLengthTrig
length of RO frame in ns for triggered mode
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"