35 std::sort(
vec.begin(),
vec.end());
36 vec.erase(std::unique(
vec.begin(),
vec.end()),
vec.end());
42 std::string
s(ctime(&
t));
43 return s.substr(0,
s.find(
'\n'));
47 std::cerr <<
"usage: skim <filename> [OPTIONS]" << std::endl;
48 std::cerr <<
"\nremoves chains from the ntple\n";
49 std::cerr <<
"\nOptions:\n";
50 std::cerr <<
"\t-d | --delete\tremoves specified chains\n";
51 std::cerr <<
"\t-o | --output\toutput filename (default tree.root)\n";
52 std::cerr <<
"\t-r | --require\trequire that this chain has tracks\n";
53 std::cerr <<
"\t-f | --force\tforce processing even if no chains specified\n";
54 std::cerr <<
"\t --pt value\tremove offline tracks pt < value\n";
55 std::cerr <<
"\t --roi \tfilter offline tracks by roi phi\n";
56 std::cerr <<
"\nIf option -d is not given, the specified chains are retained and all others are removed" << std::endl;
57 std::cerr <<
"\nIf no chains are specifed simply all events with no L2 or EF chains are excluded" << std::endl;
63 typename std::set<T>::const_iterator sitr =
s.begin();
65 while ( sitr!=
s.end() )
os << (*sitr++) <<
"\t";
72 std::ostream&
operator<<( std::ostream&
s,
const std::vector<T>& _s ) {
73 typename std::vector<T>::const_iterator sitr = _s.begin();
75 while ( sitr!=_s.end() )
s << (*sitr++) <<
"\t";
84 if ( finput && foutdir ) {
86 TTree*
tree = (TTree*)finput->Get(
"dataTree");
90 clone->Write(
"", TObject::kOverwrite);
105 std::set<std::string> require_chains;
106 std::vector<std::string> rchains;
108 bool require =
false;
109 bool deleting =
false;
111 std::string
outfile =
"tree.root";
115 bool adding_chains =
false;
116 bool deleting_chains =
false;
122 bool roi_filter =
false;
126 for (
int i=1 ;
i<
argc ;
i++ ) {
130 if (
arg.find(
'-')!=0 ) {
131 if ( adding_chains || deleting_chains ) {
132 require_chains.insert(
argv[
i]);
133 rchains.push_back(
argv[
i]);
138 adding_chains =
false;
139 deleting_chains =
false;
143 else if (
arg==
"-o" ||
arg==
"--output" ) {
145 else return usage(-1);
147 else if (
arg==
"-r" ||
arg==
"--require" ) {
149 std::cerr <<
"cannot require and delete chains" << std::endl;
152 adding_chains =
true;
155 else if (
arg==
"-d" ||
arg==
"--delete" ) {
157 std::cerr <<
"cannot require and delete chains" << std::endl;
160 deleting_chains =
true;
163 else if (
arg==
"--pt" ) {
165 else return usage(-1);
169 else if (
arg==
"-f" ||
arg==
"--force" )
force =
true;
170 else if (
arg==
"--roi" ) {
force=
true; roi_filter =
true; }
173 std::cerr <<
"more than one file specified: " <<
arg << std::endl;
180 if ( !
force && require_chains.size()==0 ) {
181 std::cout <<
"no chains requested - not doing anything" << std::endl;
186 std::cout <<
"skim::start " <<
time_str() << std::endl;
190 if ( require ) std::cout <<
"require chains " << require_chains << std::endl;
191 if ( deleting ) std::cout <<
"delete chains " << require_chains << std::endl;
195 std::cerr <<
"no files specified" << std::endl;
199 std::cout <<
"reading from file " <<
infile << std::endl;
200 std::cout <<
"writing to file " <<
outfile << std::endl;
207 std::cout <<
"opening outfile: " <<
outfile << std::endl;
215 TTree *
tree =
new TTree(
"tree",
"tree");
218 tree->Branch(
"TIDA::Event",
"TIDA::Event",&
h,6400, 1);
230 TFile finput(
infile.c_str() );
231 if (!finput.IsOpen()) {
232 std::cerr <<
"Error: could not open output file" << std::endl;
245 TTree*
data = (TTree*)finput.Get(
"tree");
249 data->SetBranchAddress(
"TIDA::Event",&track_iev);
255 std::cout <<
"input has " <<
entries <<
" events" << std::endl;
257 std::string cck =
"|/-\\";
263 std::cout <<
"processing ..." << std::endl;
265 for (
unsigned int i=0;
i<
data->GetEntries() ;
i++ ) {
267 if (
verbose ) std::cout <<
"event " <<
i;
279 double eventsps = 1000*
i/
t;
281 std::printf(
"\r%c %6.2lf %% time: %6.2lf s remaining %6.2lf s (%u at %5.2lf ps) ",
282 cck[ii%4], ((1000*(
i+1)/
entries)*0.1),
t*0.001, est*0.001,
i, eventsps );
298 *track_ev = *track_iev;
305 if (
verbose ) std::cout <<
"----------------------------------------\n\tN chains " << track_ev->
size() <<
" -> ";
315 for ( ; citr!=
chains.end() ; ++citr ) {
317 if ( citr->name().find(
"HLT")==std::string::npos )
continue;
320 for (
unsigned j=rchains.size() ; j-- ; ) {
321 if ( rchains[j].
find(
"HLT")==std::string::npos )
continue;
322 if ( citr->name().find(rchains[j])!=std::string::npos ) {
324 if (
verbose ) std::cout <<
"keepin' " << citr->name() <<
" " << rchains[j] << std::endl;
332 if (
skip )
continue;
341 std::vector<std::string> chainnames = track_ev->
chainnames();
343 for (
size_t ic=0 ;
ic<chainnames.size() ;
ic++ ) {
350 if (
verbose &&
matched ) std::cout <<
"chain: " << chainnames[
ic] <<
"\t :: reg " << *
it <<
"\tmatched: " <<
matched << std::endl;
357 if (
verbose ) std::cout << track_ev->
size() << std::endl;
360 if ( roi_filter ||
ptmin>0 ) {
364 std::vector<std::string> chainnames = track_ev->
chainnames();
368 for (
size_t ic=chainnames.size() ;
ic-- ; ) {
369 if ( chainnames[
ic] ==
"Offline" ) {
381 std::vector<std::pair<double,double> > philims;
383 for ( ; citr!=
chains.end() ; ++citr ) {
384 if ( citr->name().find(
"HLT_")!=std::string::npos ) {
385 for (
size_t ir=0 ;
ir<citr->size() ;
ir++ ) {
388 for (
size_t isub=0 ; isub<roi.
size() ; isub++ ) {
389 philims.push_back( std::pair<double,double>( roi[isub]->phiMinus(), roi[isub]->phiPlus() ) );
392 else philims.push_back( std::pair<double,double>( roi.
phiMinus(), roi.
phiPlus() ) );
399 for (
size_t iroi=0 ; iroi<
offline->size() ; iroi++ ) {
401 std::vector<TIDA::Track>& tracks =
offline->rois()[iroi].tracks();
406 if ( std::fabs(
it->pT())<
ptmin ) { inc=
false; tracks.erase(
it ); }
408 if ( inc && roi_filter ) {
409 bool remove_track =
true;
410 for (
size_t isub=0 ; isub<philims.size() ; isub++ ) {
412 if ( philims[isub].
first < philims[isub].
second ) {
413 if (
it->phi()>=philims[isub].first &&
it->phi()<=philims[isub].second ) {
414 remove_track =
false;
419 if (
it->phi()>=philims[isub].first ||
it->phi()<=philims[isub].second ) {
420 remove_track =
false;
425 if ( remove_track ) { inc=
false; tracks.erase(
it ); }
438 if (
verbose ) std::cout << *track_ev << std::endl;
448 const std::vector<TIDA::Track>& tracks =
chains[
ic].rois()[0].tracks();
450 for (
unsigned it=0 ;
it<tracks.size() ;
it++ ) {
451 h->Fill( tracks[
it].
pT()*0.001 );
467 std::printf(
"\r%c %6.2lf %% time: %6.2lf s\n",
468 cck[ii%4], 100.,
t*0.001 );
475 std::cout <<
"skim::done " <<
time_str() << std::endl;
477 std::cout <<
"skim::events in: " << ev_in << std::endl;
478 std::cout <<
"skim::events out: " << ev_out << std::endl;