101int main(
int argc,
char** argv) {
103 if ( argc<1 )
return usage(-1);
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";
113 std::string infile=
"";
119 bool roi_filter =
false;
123 for (
int i=1 ; i<argc ; i++ ) {
125 std::string arg(argv[i]);
129 if ( arg.find(
'-')!=0 ) {
130 if ( !deleting && infile!=
"" ) {
132 require_chains.insert(argv[i]);
133 rchains.push_back(argv[i]);
137 if ( infile==
"" ) infile = std::move(arg);
139 std::cerr <<
"more than one file specified: " << arg << std::endl;
145 if ( arg==
"-h" || arg==
"--help" )
return usage(0);
146 else if ( arg==
"-o" || arg==
"--output" ) {
147 if ( (i+1)<argc ) outfile = argv[++i];
148 else return usage(-1);
150 else if ( arg==
"-r" || arg==
"--require" ) {
152 std::cerr <<
"cannot require and delete chains" << std::endl;
157 else if ( arg==
"-d" || arg==
"--delete" ) {
159 std::cerr <<
"cannot require and delete chains" << std::endl;
164 else if ( arg==
"--pt" ) {
165 if ( (i+1)<argc ) ptmin = std::atof(argv[++i])*1000;
166 else return usage(-1);
169 else if ( arg==
"-v" || arg==
"--verbose" )
verbose =
true;
170 else if ( arg==
"-f" || arg==
"--force" ) force =
true;
171 else if ( arg==
"--roi" ) { force=
true; roi_filter =
true; }
172 else if ( infile==
"" ) infile = std::move(arg);
174 std::cerr <<
"more than one file specified: " << arg << std::endl;
180 std::cout <<
"required chains " << require_chains << std::endl;
182 if ( require_chains.size()>0 ) require =
true;
184 if ( !force && require_chains.size()==0 ) {
185 std::cout <<
"no chains requested - not doing anything" << std::endl;
189 std::cout <<
"chains: " << rchains << std::endl;
192 std::cout <<
"skim::start " <<
time_str() << std::endl;
195 if ( require ) std::cout <<
"require chains " << require_chains << std::endl;
196 if ( deleting ) std::cout <<
"delete chains " << require_chains << std::endl;
200 std::cerr <<
"no files specified" << std::endl;
204 std::cout <<
"reading from file: " << infile << std::endl;
205 std::cout <<
"writing to file: " << outfile << std::endl;
212 std::cout <<
"opening outfile: " << outfile << std::endl;
214 TFile
fout( outfile.c_str(),
"recreate");
220 TTree *
tree =
new TTree(
"tree",
"tree");
222 tree->Branch(
"TIDA::Event",
"TIDA::Event", &
h, 6400, 1);
234 TFile finput( infile.c_str() );
235 if (!finput.IsOpen()) {
236 std::cerr <<
"Error: could not open output file" << std::endl;
249 TTree*
data = (TTree*)finput.Get(
"tree");
253 data->SetBranchAddress(
"TIDA::Event",&track_iev);
259 std::cout <<
"input has " <<
entries <<
" events" << std::endl;
261 std::string cck =
"|/-\\";
267 std::cout <<
"processing ..." << std::endl;
269 for (
unsigned int i=0; i<
data->GetEntries() ; i++ ) {
271 if (
verbose ) std::cout <<
"event " << i;
281 if ( frac > 0 ) est = t/frac - t;
283 double eventsps = 1000*i/t;
285 std::printf(
"\r%c %6.2lf %% time: %6.2lf s remaining %6.2lf s (%u at %5.2lf ps) ",
286 cck[ii%4], (
static_cast<unsigned>((1000*(i+1)/
entries))*0.1), t*0.001, est*0.001, i, eventsps );
302 *track_ev = *track_iev;
309 if (
verbose ) std::cout <<
"----------------------------------------\n\tN chains " << track_ev->
size() <<
" -> ";
311 std::vector<TIDA::Chain>& chains = track_ev->
chains();
318 std::vector<TIDA::Chain>::iterator citr = chains.begin();
319 for ( ; citr!=chains.end() ; ++citr ) {
321 if ( citr->name().find(
"HLT")==std::string::npos )
continue;
324 for (
unsigned j=rchains.size() ; j-- ; ) {
325 if ( rchains[j].
find(
"HLT")==std::string::npos )
continue;
326 if ( citr->name().find(rchains[j])!=std::string::npos ) {
328 if (
verbose ) std::cout <<
"keepin' " << citr->name() <<
" " << rchains[j] << std::endl;
336 if (
skip )
continue;
344 std::vector<std::string> chainnames = track_ev->
chainnames();
346 for (
size_t ic=0 ; ic<chainnames.size() ; ic++ ) {
349 bool matched =
false;
350 for ( std::set<std::string>::iterator it=require_chains.begin() ; it!=require_chains.end() ; ++it ) {
352 matched |= std::regex_match( chainnames[ic], std::regex(*it+
".*") );
354 if (
verbose && matched ) std::cout <<
"chain: " << chainnames[ic] <<
"\t :: reg " << *it <<
"\tmatched: " << matched << std::endl;
358 if ( ( require && !matched ) ) track_ev->
erase( chainnames[ic] );
361 if (
verbose ) std::cout << track_ev->
size() << std::endl;
364 if ( roi_filter || ptmin>0 ) {
368 std::vector<std::string> chainnames = track_ev->
chainnames();
372 for (
size_t ic=chainnames.size() ; ic-- ; ) {
373 if ( chainnames[ic] ==
"Offline" ) {
382 std::vector<TIDA::Chain>& chains = track_ev->
chains();
383 std::vector<TIDA::Chain>::iterator citr = chains.begin();
385 std::vector<std::pair<double,double> > philims;
387 for ( ; citr!=chains.end() ; ++citr ) {
388 if ( citr->name().find(
"HLT_")!=std::string::npos ) {
389 for (
size_t ir=0 ;
ir<citr->size() ;
ir++ ) {
392 for (
size_t isub=0 ; isub<roi.
size() ; isub++ ) {
393 philims.push_back( std::pair<double,double>( roi[isub]->phiMinus(), roi[isub]->phiPlus() ) );
396 else philims.push_back( std::pair<double,double>( roi.
phiMinus(), roi.
phiPlus() ) );
403 for (
size_t iroi=0 ; iroi<
offline->size() ; iroi++ ) {
405 std::vector<TIDA::Track>& tracks =
offline->rois()[iroi].tracks();
407 for ( std::vector<TIDA::Track>::iterator it=tracks.begin() ; it<tracks.end() ; ) {
410 if ( std::fabs(it->pT())<ptmin ) { inc=
false; tracks.erase( it ); }
412 if ( inc && roi_filter ) {
413 bool remove_track =
true;
414 for (
size_t isub=0 ; isub<philims.size() ; isub++ ) {
416 if ( philims[isub].first < philims[isub].second ) {
417 if ( it->phi()>=philims[isub].first && it->phi()<=philims[isub].second ) {
418 remove_track =
false;
423 if ( it->phi()>=philims[isub].first || it->phi()<=philims[isub].second ) {
424 remove_track =
false;
429 if ( remove_track ) { inc=
false; tracks.erase( it ); }
442 if (
verbose ) std::cout <<
"writing event:\n" << *track_ev << std::endl;
449 for (
unsigned int ic=0 ; ic<chains.size() ; ic++ ) {
450 if ( chains[ic].name()==
"Offline" ) {
451 const std::vector<TIDA::Track>& tracks = chains[ic].rois()[0].tracks();
453 for (
unsigned it=0 ; it<tracks.size() ; it++ ) {
454 h->Fill( tracks[it].pT()*0.001 );
470 std::printf(
"\r%c %6.2lf %% time: %6.2lf s\n",
471 cck[ii%4], 100., t*0.001 );
478 std::cout <<
"skim::done " <<
time_str() << std::endl;
480 std::cout <<
"skim::events in: " << ev_in << std::endl;
481 std::cout <<
"skim::events out: " << ev_out << std::endl;