Skip to content
Snippets Groups Projects
Commit 448ac6d2 authored by Catrin Bernius's avatar Catrin Bernius Committed by Atlas Nightlybuild
Browse files

Merge branch '21.1-dev-user' into '21.1-dev'

Add code to allow skimming of offline tracks to remove tracks not in an RoI

See merge request atlas/athena!15861

(cherry picked from commit fcdcfe26 [formerly d13a6e37b7c112f6e71d073d677dd895fd8797b3])

448e8428 Add code to allow skimming of offline tracks to remove tracks not in an RoI
52d39d3e Fix incorrect usage message

Former-commit-id: bb5ed1aa
parent 014a2148
No related branches found
No related tags found
No related merge requests found
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
......@@ -17,6 +17,8 @@
#include <set>
#include <string>
#include <regex>
#include <algorithm>
#include "TChain.h"
#include "TFile.h"
......@@ -27,15 +29,29 @@
#include "utils.h"
template<class T>
void remove_duplicates(std::vector<T>& vec) {
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
}
std::string time_str() {
time_t _t;
time(&_t);
std::string s(ctime(&_t));
return s.substr(0,s.find("\n"));
}
int usage(int e=0) {
std::cerr << "usage: skim <filename> -f <outfile> [-d|--delete] <chain1> <chain2> ... -f <outfile> -r <chain>" << std::endl;
std::cerr << "usage: skim <filename> [OPTIONS]" << std::endl;
std::cerr << "\nremoves chains from the ntple\n";
std::cerr << "\nOptions:\n";
std::cerr << "\t-d | --delete\tremoves specified chains\n";
std::cerr << "\t-f | --file\toutput filename (default tree.root)\n";
std::cerr << "\t-o | --output\toutput filename (default tree.root)\n";
std::cerr << "\t-r | --require\trequire that this chain has tracks\n";
std::cerr << "\t-f | --force\tforce processing even if no chains specified\n";
std::cerr << "\t --pt value\tremove offline tracks pt < value\n";
std::cerr << "\t --roi \tfilter offline tracks by roi phi\n";
std::cerr << "\nIf option -d is not given, the specified chains are retained and all others are removed" << std::endl;
std::cerr << "\nIf no chains are specifed simply all events with no L2 or EF chains are excluded" << std::endl;
return e;
......@@ -96,6 +112,12 @@ int main(int argc, char** argv) {
bool adding_chains = false;
bool deleting_chains = false;
bool force = false;
double ptmin = 0;
bool roi_filter = false;
bool verbose = false;
for ( int i=1 ; i<argc ; i++ ) {
......@@ -114,7 +136,7 @@ int main(int argc, char** argv) {
}
if ( arg=="-h" || arg=="--help" ) return usage(0);
else if ( arg=="-f" ) {
else if ( arg=="-o" || arg=="--output" ) {
if ( (i+1)<argc ) outfile = argv[++i];
else return usage(-1);
}
......@@ -134,7 +156,14 @@ int main(int argc, char** argv) {
deleting_chains = true;
deleting = true;
}
else if ( arg=="--pt" ) {
if ( (i+1)<argc ) ptmin = std::atof(argv[++i])*1000;
else return usage(-1);
force = true;
}
else if ( arg=="-v" || arg=="--verbose" ) verbose = true;
else if ( arg=="-f" || arg=="--force" ) force = true;
else if ( arg=="--roi" ) { force=true; roi_filter = true; }
else if ( infile=="" ) infile = arg;
else {
std::cerr << "more than one file specified: " << arg << std::endl;
......@@ -144,11 +173,14 @@ int main(int argc, char** argv) {
// std::cout << "required chains " << require_chains << std::endl;
if ( require_chains.size()==0 ) {
if ( !force && require_chains.size()==0 ) {
std::cout << "no chains requested - not doing anything" << std::endl;
return 0;
}
std::cout << "skim::start " << time_str() << std::endl;
// if ( require_chains.size()>0 ) require = true;
if ( require ) std::cout << "require chains " << require_chains << std::endl;
......@@ -270,6 +302,83 @@ int main(int argc, char** argv) {
if ( verbose ) std::cout << track_ev->size() << std::endl;
if ( roi_filter || ptmin>0 ) {
TIDA::Chain* offline = 0;
std::vector<std::string> chainnames = track_ev->chainnames();
/// get the offline chain
for ( size_t ic=chainnames.size() ; ic-- ; ) {
if ( chainnames[ic] == "Offline" ) {
offline = &(track_ev->chains()[ic]);
break;
}
}
if ( offline ) {
// track_ev->addChain( "Offline" );
std::vector<TIDA::Chain>& chains = track_ev->chains();
std::vector<TIDA::Chain>::iterator citr = chains.begin();
std::vector<std::pair<double,double> > philims;
for ( ; citr!=chains.end() ; citr++ ) {
if ( citr->name().find("HLT_")!=std::string::npos ) {
for ( size_t ir=0 ; ir<citr->size() ; ir++ ) {
TIDARoiDescriptor& roi = citr->rois()[ir].roi();
if ( roi.composite() ) {
for ( size_t isub=0 ; isub<roi.size() ; isub++ ) {
philims.push_back( std::pair<double,double>( roi[isub]->phiMinus(), roi[isub]->phiPlus() ) );
}
}
else philims.push_back( std::pair<double,double>( roi.phiMinus(), roi.phiPlus() ) );
}
}
}
remove_duplicates( philims );
for ( size_t iroi=0 ; iroi<offline->size() ; iroi++ ) {
std::vector<TIDA::Track>& tracks = offline->rois()[iroi].tracks();
for ( std::vector<TIDA::Track>::iterator it=tracks.begin() ; it<tracks.end() ; ) {
bool inc = true;
if ( ptmin>0 ) {
if ( std::fabs(it->pT())<ptmin ) { inc=false; tracks.erase( it ); }
}
if ( inc && roi_filter ) {
bool remove_track = true;
for ( size_t isub=0 ; isub<philims.size() ; isub++ ) {
if ( philims[isub].first < philims[isub].second ) {
if ( it->phi()>=philims[isub].first && it->phi()<=philims[isub].second ) {
remove_track = false;
break;
}
}
else {
if ( it->phi()>=philims[isub].first || it->phi()<=philims[isub].second ) {
remove_track = false;
break;
}
}
}
if ( remove_track ) { inc=false; tracks.erase( it ); }
}
if ( inc ) it++;
}
}
}
}
// std::cout << "writing event " << track_ev->event_number() << " <<<<<<<<<<<<<<<<<<<<" << std::endl;
tree->Fill();
......@@ -298,8 +407,10 @@ int main(int argc, char** argv) {
}
std::cout << "Events in: " << ev_in << std::endl;
std::cout << "Events out: " << ev_out << std::endl;
std::cout << "skim::done " << time_str() << std::endl;
std::cout << "skim::events in: " << ev_in << std::endl;
std::cout << "skim::events out: " << ev_out << std::endl;
fout.Write();
fout.Close();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment