52 uint64_t activeSectors = 0;
53 for (
const auto& tpcsector : tpcsectors) {
54 activeSectors |= (uint64_t)0x1 << tpcsector;
59 auto& context = mgr.getDigitizationContext();
60 auto eventrecords = context.getEventRecords();
69 context.setDigitizerInteractionRate(
gIntRate);
71 for (
auto const& sector : tpcsectors) {
88 for (
int subchannel =
range.min; subchannel <
range.max; ++subchannel) {
89 LOG(info) <<
"SENDING SOMETHING TO OTHERS";
90 pc.outputs().snapshot(
94 pc.outputs().snapshot(
OutputRef{
"bunchFilling"}, mgr.getInteractionSampler().getBunchFilling());
102 auto initIt = [simprefixes, doit, withTrigger](
InitContext& ctx) {
108 auto triggerf = TFile(ctx.options().get<std::string>(
"triggerfile").c_str(),
"OPEN");
109 auto tr = (TTree*)triggerf.Get(
"o2sim");
111 LOG(fatal) <<
"Did not find CTP TTree";
113 auto br = tr->GetBranch(
"CTPDigits");
115 LOG(fatal) <<
"Did not find CTPDigit branch";
119 LOG(info) <<
" Read " <<
ctptrigger->size() <<
" CTP digits ";
123 gRandom->SetSeed(ctx.options().get<
int>(
"seed"));
125 if (simprefixes.size() == 0) {
126 LOG(error) <<
"No simulation prefix available";
128 LOG(info) <<
"adding " << simprefixes[0] <<
"\n";
129 mgr.addInputFile(simprefixes[0]);
130 for (
int part = 1; part < simprefixes.size(); ++part) {
131 mgr.addInputSignalFile(simprefixes[part]);
135 gIntRate = ctx.options().get<
float>(
"interactionRate");
140 auto incontextstring = ctx.options().get<std::string>(
"incontext");
141 LOG(info) <<
"INCONTEXTSTRING " << incontextstring;
142 if (incontextstring.size() > 0) {
143 auto success = mgr.setupRunFromExistingContext(incontextstring.c_str());
145 LOG(fatal) <<
"Could not read collision context from " << incontextstring;
148 LOG(info) <<
"Imposing hadronic interaction rate " <<
gIntRate <<
"Hz";
149 mgr.getInteractionSampler().setInteractionRate(
gIntRate);
155 auto setBCFillingHelper = [](
auto&
sampler,
auto& bcPatternString) {
156 if (bcPatternString ==
"ccdb") {
157 LOG(info) <<
"Fetch bcPattern information from CCDB";
162 sampler.setBunchFilling(grpLHC->getBunchFilling());
164 sampler.setBunchFilling(bcPatternString);
168 auto bcPatternFile = ctx.options().get<std::string>(
"bcPatternFile");
169 if (!bcPatternFile.empty()) {
170 setBCFillingHelper(mgr.getInteractionSampler(), bcPatternFile);
173 mgr.getInteractionSampler().init();
174 mgr.getInteractionSampler().print();
177 mgr.setRandomEventSequence(ctx.options().get<
int>(
"randomsample") > 0);
180 auto col = ctx.options().get<
int>(
"ncollisions");
189 auto qedprefix = ctx.options().get<std::string>(
"simPrefixQED");
190 if (qedprefix.size() > 0) {
192 if (!bcPatternFile.empty()) {
193 setBCFillingHelper(qedInteractionSampler, bcPatternFile);
199 auto first = mgr.getDigitizationContext().getEventRecords().front();
200 auto last = mgr.getDigitizationContext().getEventRecords().back();
204 const float ratio = ctx.options().get<
float>(
"qed-x-section-ratio");
206 throw std::runtime_error(
"no meaningful qed-x-section-ratio was provided");
208 const float hadronicrate = ctx.options().get<
float>(
"interactionRate");
209 const float qedrate = ratio * hadronicrate;
210 LOG(info) <<
"QED RATE " << qedrate;
213 qedInteractionSampler.
init();
214 qedInteractionSampler.
print();
215 std::vector<o2::InteractionTimeRecord> qedinteractionrecords;
217 LOG(info) <<
"GENERATING COL TIMES";
220 qedinteractionrecords.push_back(t);
222 LOG(info) <<
"DONE GENERATING COL TIMES";
225 mgr.getDigitizationContext().fillQED(qedprefix, qedinteractionrecords);
226 mgr.getDigitizationContext().printCollisionSummary(
true, 2000);
230 LOG(info) <<
"Initializing Spec ... have " << mgr.getDigitizationContext().getEventRecords().size() <<
" times ";
231 LOG(info) <<
"Serializing Context for later reuse";
232 mgr.writeDigitizationContext(ctx.options().get<std::string>(
"outcontext").c_str());
238 std::vector<OutputSpec> outputs;
239 for (
auto const& tpcsector : tpcsectors) {
240 outputs.emplace_back(
243 for (
int subchannel =
range.min; subchannel <
range.max; ++subchannel) {
244 outputs.emplace_back(
248 outputs.emplace_back(
OutputSpec{{
"bunchFilling"},
"SIM",
"BUNCHFILLING", 0, Lifetime::Timeframe});
257 {
"interactionRate", VariantType::Float, 50000.0f, {
"Total hadronic interaction rate (Hz)"}},
258 {
"bcPatternFile", VariantType::String,
"", {
"Interacting BC pattern file (e.g. from CreateBCPattern.C)"}},
259 {
"simPrefixQED", VariantType::String,
"", {
"Sim (QED) input prefix (example: path/o2qed). The prefix allows to find files like path/o2qed_Kine.root etc."}},
260 {
"qed-x-section-ratio", VariantType::Float, -1.f, {
"Ratio of cross sections QED/hadronic events. Determines QED interaction rate from hadronic interaction rate."}},
261 {
"outcontext", VariantType::String,
"collisioncontext.root", {
"Output file for collision context"}},
262 {
"incontext", VariantType::String,
"", {
"Take collision context from this file"}},
263 {
"triggerfile", VariantType::String,
"ctpdigits.root", {
"Name of the CTP trigger/digit file to use"}},
264 {
"seed", VariantType::Int, 0, {
"Random seed for collision context generation"}},
268 {
"number of collisions to sample (default is given by number of entries in chain"}},
269 {
"randomsample", VariantType::Int, 0, {
"Draw collisions random instead of linear sequence. (Default no = 0)"}}}};