55 LOG(info) <<
"initializing track sink";
57 auto outputFileName = ic.
options().
get<std::string>(
"outfile");
58 mOutputFile.open(outputFileName, ios::out | ios::binary);
60 throw invalid_argument(
"Cannot open output file" + outputFileName);
63 auto stop = [
this]() {
65 LOG(info) <<
"stop track sink";
77 gsl::span<const ROFRecord> rofs{};
78 gsl::span<const TrackMCH> tracks{};
81 rofs = pc.
inputs().
get<gsl::span<ROFRecord>>(
"rofs");
82 tracks = pc.
inputs().
get<gsl::span<TrackMCH>>(
"tracks");
85 gsl::span<const char> tracksAtVtx{};
87 tracksAtVtx = pc.
inputs().
get<gsl::span<char>>(
"tracksAtVtx");
93 int tracksAtVtxOffset(0);
94 std::vector<TrackMCH> eventTracks{};
95 for (
const auto& rof : rofs) {
103 mOutputFile.write(
reinterpret_cast<char*
>(&nEventTracksAtVtx),
sizeof(
int));
104 int nEventTracks = eventTracks.size();
105 mOutputFile.write(
reinterpret_cast<char*
>(&nEventTracks),
sizeof(
int));
106 int nEventClusters = eventClusters.size();
107 mOutputFile.write(
reinterpret_cast<char*
>(&nEventClusters),
sizeof(
int));
110 mOutputFile.write(eventTracksAtVtx.data(), eventTracksAtVtx.size());
111 mOutputFile.write(
reinterpret_cast<const char*
>(eventTracks.data()), eventTracks.size() *
sizeof(
TrackMCH));
112 mOutputFile.write(
reinterpret_cast<const char*
>(eventClusters.data()), eventClusters.size_bytes());
116 if (tracksAtVtxOffset != tracksAtVtx.size()) {
117 throw length_error(
"inconsistent payload");
120 }
else if (!tracksAtVtx.empty()) {
122 int tracksAtVtxOffset(0);
124 while (tracksAtVtxOffset != tracksAtVtx.size()) {
131 mOutputFile.write(
reinterpret_cast<char*
>(&nEventTracksAtVtx),
sizeof(
int));
136 mOutputFile.write(eventTracksAtVtx.data(), eventTracksAtVtx.size());
142 mOutputFile.write(
reinterpret_cast<char*
>(&zero),
sizeof(
int));
143 mOutputFile.write(
reinterpret_cast<char*
>(&zero),
sizeof(
int));
144 mOutputFile.write(
reinterpret_cast<char*
>(&zero),
sizeof(
int));
151 std::vector<TrackMCH>& eventTracks)
const
164 throw length_error(
"missing tracks");
167 eventTracks.insert(eventTracks.end(), tracks.begin() + rof.
getFirstIdx(), tracks.begin() + rof.
getLastIdx() + 1);
169 int clusterIdxOffset = eventTracks.front().getFirstClusterIdx();
170 for (
auto& track : eventTracks) {
171 track.setClusterRef(track.getFirstClusterIdx() - clusterIdxOffset, track.getNClusters());
174 if (eventTracks.back().getLastClusterIdx() + clusterIdxOffset >=
clusters.size()) {
175 throw length_error(
"missing clusters");
178 return clusters.subspan(clusterIdxOffset, eventTracks.back().getLastClusterIdx() + 1);
182 gsl::span<const char>
getEventTracksAtVtx(gsl::span<const char> tracksAtVtx,
int& tracksAtVtxOffset)
const
187 if (tracksAtVtx.empty()) {
191 if (tracksAtVtx.size() - tracksAtVtxOffset <
sizeof(
int)) {
192 throw length_error(
"inconsistent payload");
195 int nEventTracksAtVtx = *
reinterpret_cast<const int*
>(&tracksAtVtx[tracksAtVtxOffset]);
196 tracksAtVtxOffset +=
sizeof(
int);
199 if (tracksAtVtx.size() - tracksAtVtxOffset < payloadSize) {
200 throw length_error(
"inconsistent payload");
203 tracksAtVtxOffset += payloadSize;
204 return tracksAtVtx.subspan(tracksAtVtxOffset - payloadSize, payloadSize);
215 inputs.emplace_back(
"rofs",
"MCH",
"TRACKROFS", 0, Lifetime::Timeframe);
216 inputs.emplace_back(
"tracks",
"MCH",
"TRACKS", 0, Lifetime::Timeframe);
217 inputs.emplace_back(
"clusters",
"MCH",
"TRACKCLUSTERS", 0, Lifetime::Timeframe);
220 inputs.emplace_back(
"tracksAtVtx",
"MCH",
"TRACKSATVERTEX", 0, Lifetime::Timeframe);
222 if (inputs.empty()) {
223 throw invalid_argument(
"nothing to write");
231 Options{{
"outfile", VariantType::String,
"AliESDs.out.dat", {
"output filename"}}}};
Definition of the MCH track parameters minimal structure.
Definition of the MCH track.
Definition of a data processor to print the tracks.
T get(const char *key) const
ServiceRegistryRef services()
ConfigParamRegistry const & options()
InputRecord & inputs()
The inputs associated with this processing context.
int getLastIdx() const
get the index of the last associated object
int getNEntries() const
get the number of associated objects
int getFirstIdx() const
get the index of the first associated object
MCH track external format.
std::ofstream mOutputFile
output file
void init(framework::InitContext &ic)
void run(framework::ProcessingContext &pc)
gsl::span< const Cluster > getEventTracksAndClusters(const ROFRecord &rof, gsl::span< const TrackMCH > tracks, gsl::span< const Cluster > clusters, std::vector< TrackMCH > &eventTracks) const
gsl::span< const char > getEventTracksAtVtx(gsl::span< const char > tracksAtVtx, int &tracksAtVtxOffset) const
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
std::vector< InputSpec > Inputs
std::vector< OutputSpec > Outputs
o2::framework::DataProcessorSpec getTrackSinkSpec(const char *specName, bool mchTracks, bool tracksAtVtx)
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters