51 std::vector<TrackTPC> mMIPTracks;
52 unsigned int mProcessEveryNthTF{1};
53 int mMaxTracksPerTF{-1};
54 uint32_t mTFCounter{0};
55 int mProcessNFirstTFs{0};
56 bool mSendDummy{
false};
61 const double minP = ic.
options().
get<
double>(
"min-momentum");
62 const double maxP = ic.
options().
get<
double>(
"max-momentum");
63 const double mindEdx = ic.
options().
get<
double>(
"min-dedx");
64 const double maxdEdx = ic.
options().
get<
double>(
"max-dedx");
65 const int minClusters = std::max(10, ic.
options().
get<
int>(
"min-clusters"));
66 const auto cutLoopers = !ic.
options().
get<
bool>(
"dont-cut-loopers");
67 mSendDummy = ic.
options().
get<
bool>(
"send-dummy-data");
68 mMaxTracksPerTF = ic.
options().
get<
int>(
"maxTracksPerTF");
69 if (mMaxTracksPerTF > 0) {
70 mMIPTracks.reserve(mMaxTracksPerTF);
73 mProcessEveryNthTF = ic.
options().
get<
int>(
"processEveryNthTF");
74 if (mProcessEveryNthTF <= 0) {
75 mProcessEveryNthTF = 1;
77 mProcessNFirstTFs = ic.
options().
get<
int>(
"process-first-n-TFs");
79 if (mProcessEveryNthTF > 1) {
80 std::mt19937 rng(std::time(
nullptr));
81 std::uniform_int_distribution<std::mt19937::result_type> dist(1, mProcessEveryNthTF);
82 mTFCounter = dist(rng);
83 LOGP(info,
"Skipping first {} TFs", mProcessEveryNthTF - mTFCounter);
97 if ((mTFCounter++ % mProcessEveryNthTF) && (currentTF >= mProcessNFirstTFs)) {
98 LOGP(info,
"Skipping TF {}", currentTF);
106 const auto tracks = pc.
inputs().
get<gsl::span<TrackTPC>>(
"tracks");
107 const auto nTracks = tracks.size();
109 if ((mMaxTracksPerTF != -1) && (nTracks > mMaxTracksPerTF)) {
113 for (
size_t i = 0;
i < nTracks; ++
i) {
129 std::minstd_rand rng(std::time(
nullptr));
133 const int loopEnd = (mMaxTracksPerTF >
indices.size()) ?
indices.size() : mMaxTracksPerTF;
134 for (
int i = 0;
i < loopEnd; ++
i) {
135 mMIPTracks.emplace_back(tracks[
indices[
i]]);
138 std::copy_if(tracks.begin(), tracks.end(), std::back_inserter(mMIPTracks), [
this](
const auto& track) { return mCuts.goodTrack(track); });
141 LOGP(info,
"Filtered {} MIP tracks out of {} total tpc tracks", mMIPTracks.size(), tracks.size());
150 LOG(info) <<
"Finalizig MIP Tracks filter";
155 std::vector<OutputSpec> outputs;
159 "tpc-miptrack-filter",
164 adaptFromTask<MIPTrackFilterDevice>(),
166 {
"min-momentum", VariantType::Double, 0.35, {
"minimum momentum cut"}},
167 {
"max-momentum", VariantType::Double, 0.55, {
"maximum momentum cut"}},
168 {
"min-dedx", VariantType::Double, 10., {
"minimum dEdx cut"}},
169 {
"max-dedx", VariantType::Double, 200., {
"maximum dEdx cut"}},
170 {
"min-clusters", VariantType::Int, 60, {
"minimum number of clusters in a track"}},
171 {
"processEveryNthTF", VariantType::Int, 1, {
"Using only a fraction of the data: 1: Use every TF, 10: Process only every tenth TF."}},
172 {
"maxTracksPerTF", VariantType::Int, -1, {
"Maximum number of processed tracks per TF (-1 for processing all tracks)"}},
173 {
"process-first-n-TFs", VariantType::Int, 1, {
"Number of first TFs which are not sampled"}},
174 {
"send-dummy-data", VariantType::Bool,
false, {
"Send empty data in case TF is skipped"}},
175 {
"dont-cut-loopers", VariantType::Bool,
false, {
"Do not cut loopers by comparing zout-zin"}}}};
Utils and constants for calibration and related workflows.
Workflow to filter MIP tracks and streams them to other devices.
T get(const char *key) const
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.
void endOfStream(EndOfStreamContext &eos) final
void run(ProcessingContext &pc) final
void init(framework::InitContext &ic) final
void setCutLooper(bool cut)
try to remove looper cutting on (abs(z_out) - abs(z_in)) < -10), not very precise
void setdEdxMax(float dEdxMax)
void setNClusMin(float NClusMin)
void setdEdxMin(float dEdxMin)
bool goodTrack(o2::tpc::TrackTPC const &track)
GLsizei GLenum const void * indices
constexpr o2::header::DataOrigin gDataOriginTPC
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
std::vector< InputSpec > Inputs
uint32_t getCurrentTF(o2::framework::ProcessingContext &pc)
Global TPC definitions and constants.
o2::framework::DataProcessorSpec getMIPTrackFilterSpec()
create a processor spec
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"