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