21 void ParseDatasets(TString inFilename,
int nfiles,
int nbatch, vector<TString> &yes_trig, vector<TString> &no_trig,
22 vector<TString> &
files, TString &outname);
24 int main(
int argc,
char *argv[]){
25 time_t startTime, curTime;
28 std::string inFilename(
"");
29 std::string masspoint(
"");
30 int c(0), Nentries(-1), nfiles(-1), nbatch(-1), total_entries_override(-1);
31 string type =
"quick";
32 while((c=getopt(argc, argv,
"n:t:i:m:f:b:s:"))!=-1){
35 Nentries=atoi(optarg);
38 total_entries_override = atoi(optarg);
60 TString inFilename_s(inFilename);
61 int len(inFilename_s.Length());
62 if(inFilename_s[len-1] ==
'/') inFilename_s.Remove(len-1, len);
63 inFilename = inFilename_s;
64 TString outFilename(inFilename_s), folder(inFilename_s);
66 TString prefix =
"small_"+type+
"_";
68 vector<TString>
files, yes_trig, no_trig;
69 int ini(nfiles*(nbatch-1)), end(nfiles*nbatch), ntotfiles(-1), Ntotentries(-1);
74 outFilename.Remove(0,outFilename.Last(
'/')+1);
75 enum Mode{dir_full, dir_part, one_file, txt_part, unknown};
77 std::string all_sample_files = inFilename +
"/*.root";
79 if(nfiles < 0 ) cout<<
"Txt file input method in one go not implemented yet. Try with -f -b"<<endl;
83 ParseDatasets(inFilename, nfiles, nbatch, yes_trig, no_trig, files, outname);
85 cout<<
"No files for file "<<inFilename<<
". Exiting"<<endl<<endl;
88 cout<<
"Sending job with "<<files.size()<<
" files. First is "<<files[0]<<
" with "<<files.size()<<
" files, " 89 <<yes_trig.size()<<
" yes_trig, and "<<no_trig.size()<<
" no_trig"<<endl;
90 for(
unsigned ind(0); ind<yes_trig.size(); ind++)
91 cout<<
"Yes: "<<yes_trig[ind]<<endl;
92 for(
unsigned ind(0); ind<no_trig.size(); ind++)
93 cout<<
"No: "<<no_trig[ind]<<endl;
95 inFilename = files[0];
96 outFilename = outfolder+prefix+outname+
"_files"; outFilename += nfiles;
97 outFilename +=
"_batch"; outFilename += nbatch; outFilename +=
".root";
99 }
else if(!
Contains(inFilename,
".root")){
102 files =
dirlist(inFilename,
".root");
103 ntotfiles =
static_cast<int>(files.size());
104 if(ini > ntotfiles) {
105 cout<<
"Trying to start at file "<<ini<<
" but there are only "<<ntotfiles<<
". Exiting."<<endl;
108 inFilename = folder +
"/" + files[ini];
109 outFilename = outfolder+prefix+outFilename+
"_files"; outFilename += nfiles;
110 outFilename +=
"_batch"; outFilename += nbatch; outFilename +=
".root";
112 if(end > ntotfiles) end = ntotfiles;
115 inFilename = inFilename +
"/*.root";
116 outFilename = outfolder+prefix+outFilename+
".root";
120 outFilename = outfolder+prefix+outFilename;
124 cout<<
"Opening "<<inFilename<<endl;
126 TChain chain(
"cfA/eventB");
129 chain.Add(all_sample_files.c_str());
138 chain.Add(inFilename.c_str());
145 cout<<endl<<
"Doing files "<<ini+1<<
" to "<<end<<
" from a total of "<<ntotfiles<<
" files."<<endl;
146 for(
int ifile(ini+1); ifile < end; ifile++){
147 tHandler.
AddFiles((folder +
"/" + files[ifile]).Data());
151 for(
unsigned ifile(1); ifile < files.size(); ifile++){
152 tHandler.
AddFiles(files[ifile].Data());
156 if((mode==one_file || mode==dir_full) && Nentries != tHandler.
TotalEntries()){
157 Ntotentries = Nentries;
159 Ntotentries = chain.GetEntries(
"weight>0")-chain.GetEntries(
"weight<0");
161 if(total_entries_override > 0) Ntotentries = total_entries_override;
163 cout<<
"Getting started takes "<<difftime(curTime,startTime)<<
" seconds. " 164 <<
"Making reduced tree with "<<Nentries<<
" entries out of "<<tHandler.
TotalEntries()
165 <<
". "<<Ntotentries<<
" entries in the full sample."<<endl;
166 tHandler.
ReduceTree(Nentries, outFilename, Ntotentries);
168 cout<<
"Wrote "<<outFilename<<endl<<endl;
170 cout<<Nentries<<
" events took "<<difftime(curTime,startTime)<<
" seconds"<<endl<<endl;
176 void ParseDatasets(TString inFilename,
int nfiles,
int nbatch, vector<TString> &yes_trig, vector<TString> &no_trig,
177 vector<TString> &
files, TString &outname){
179 ifstream file(inFilename);
182 yes_trig.clear(); no_trig.clear();
185 outname =
"Run2015B_";
187 if(!dataset.Contains(
"MINIAOD"))
continue;
188 TString name(dataset);
189 int len(name.Length());
190 if(name[len-2] ==
'/') name.Remove(len-2, len-1);
191 name.Remove(0,name.Last(
'/')+1);
192 name.Remove(name.First(
'_'), len);
193 outname += (
"_"+name);
194 vector<TString> setfiles =
dirlist(dataset,
".root");
197 if(setfiles.size()==0) {
199 for(
int ind(0); ind<maxretry; ind++){
200 cout<<
"No root files found at "<<dataset<<
". Retrying "<<ind+1<<
"/"<<maxretry<<endl;
201 setfiles =
dirlist(dataset,
".root");
202 if(setfiles.size()>0)
break;
204 if(setfiles.size()==0) {
205 cout<<
"Giving up. No root files found at "<<dataset<<endl;
209 int nfilesdir(static_cast<int>(setfiles.size())), ibatch(-1);
210 int njobs(nfilesdir/nfiles+1);
211 bool sendjob(nbatch>=ifile && nbatch<(ifile+njobs));
212 if(sendjob) ibatch = nbatch - ifile;
213 int ini(nfiles*ibatch), end(nfiles*(ibatch+1));
214 cout<<
"Adding "<<dataset<<
". nbatch "<<nbatch<<
", ifile "<<ifile<<
", njobs "<<njobs<<
", sendjob "<<sendjob
215 <<
", nfilesdir "<<nfilesdir<<
", ini "<<ini<<
", end "<<end;
217 for(
int fil(0); fil < nfilesdir; fil++){
218 filename = dataset+
"/"+setfiles[fil];
219 if(fil>=ini && fil<end && sendjob) files.push_back(filename);
223 while(!dataset.Contains(
"MINIAOD") && file){
224 if(dataset.Contains(
"_v")){
225 if(sendjob) yes_trig.push_back(dataset);
226 else if(files.size()==0) no_trig.push_back(dataset);
230 cout<<
". It has "<<yes_trig.size()<<
" yes_trig and "<<no_trig.size()<<
" no_trig"<<endl;
233 cout<<
"No files for file "<<inFilename<<
" and batch job "<<nbatch<<
". Max batch number "<<ifile-1<<endl;
std::vector< TString > yes_trig
long TotalEntries() const
bool Contains(const std::string &text, const std::string &pattern)
void ParseDatasets(TString inFilename, int nfiles, int nbatch, vector< TString > &yes_trig, vector< TString > &no_trig, vector< TString > &files, TString &outname)
int main(int argc, char *argv[])
std::vector< TString > no_trig
void AddFiles(const std::string &file)
void ReduceTree(int num_entries, const TString &out_file_name, int num_total_entries)
std::vector< TString > dirlist(const TString &folder, const TString &inname="dir", const TString &tag="")