38 std::vector<TString> suffixes;
40 void *dirp = gSystem->OpenDirectory(sol_dir);
42 std::cerr <<
"DiscoverSolRunSuffixesFromBase: cannot open " << sol_dir
47 TString prefix = Form(
"music_exp1915_%03d_00_66222_", run);
49 while ((name = gSystem->GetDirEntry(dirp))) {
51 if (!fname.BeginsWith(prefix))
53 if (!fname.EndsWith(
".sol"))
56 TString rest = fname(prefix.Length(), fname.Length() - prefix.Length() - 4);
60 Int_t seq = rest.Atoi();
62 suffixes.push_back(
"");
64 suffixes.push_back(Form(
"_%d", seq));
67 gSystem->FreeDirectory(dirp);
69 std::sort(suffixes.begin(), suffixes.end(),
70 [](
const TString &a,
const TString &b) {
75 return a.Atoi() < b.Atoi();
94 const char *outputDir, Double_t chunkSeconds) {
101 std::mutex log_mutex;
106 std::lock_guard<std::mutex> lk(work_mutex);
118 if (gSystem->AccessPathName(solPath)) {
120 std::lock_guard<std::mutex> lk(log_mutex);
121 std::cerr <<
" [missing] " << solPath.Data() << std::endl;
127 TString baseName = solPath;
128 Int_t lastSlash = baseName.Last(
'/');
129 if (lastSlash >= 0) {
130 baseName = baseName(lastSlash + 1, baseName.Length() - lastSlash - 1);
134 TString chunk0Path = TString(outputDir) +
"/" + baseName +
"_chunk000.sol";
135 if (!gSystem->AccessPathName(chunk0Path)) {
137 std::lock_guard<std::mutex> lk(log_mutex);
138 std::cout <<
" [exists] " << baseName << std::endl;
147 std::lock_guard<std::mutex> lk(log_mutex);
148 std::cerr <<
" [skip] Not Minimum format: " << baseName << std::endl;
155 std::lock_guard<std::mutex> lk(log_mutex);
156 std::cout <<
" [split] " << baseName << std::endl;
159 Int_t totalBlocks = 0;
160 Int_t totalChunks = 0;
161 std::vector<TString> outputFiles = SOLReader::SplitSolFileByTime(
162 solPath.Data(), outputDir, chunkSeconds, totalBlocks, totalChunks);
164 if (outputFiles.empty()) {
166 std::lock_guard<std::mutex> lk(log_mutex);
167 std::cerr <<
" [error] Failed to split: " << solPath.Data()
175 std::lock_guard<std::mutex> lk(log_mutex);
176 std::cout <<
" " << totalBlocks <<
" blocks -> " << totalChunks
177 <<
" chunks" << std::endl;
185int main(
int argc,
char *argv[]) {
190 chunkSeconds = std::stod(argv[1]);
193 nWorkers = std::stoi(argv[2]);
196 std::cout <<
"SOLARIS preprocessing: splitting Minimum files into "
197 << chunkSeconds <<
"s chunks (" << nWorkers <<
" workers)"
201 std::cout <<
"Output dir: " <<
Constants::cfg.SOL_SPLIT_DIR.Data()
203 std::cout << std::endl;
211 std::vector<Int_t> runs;
219 for (Int_t r = 0; r < Int_t(ep.
runs.size()); r++)
220 runs.push_back(ep.
runs[r]);
222 std::sort(runs.begin(), runs.end());
223 runs.erase(std::unique(runs.begin(), runs.end()), runs.end());
226 std::queue<WorkItem> work;
227 Int_t nRuns = runs.size();
228 for (Int_t r = 0; r < nRuns; r++) {
231 for (Int_t k = 0; k < Int_t(suffixes.size()); k++) {
234 item.
suffix = suffixes[k];
239 std::cout <<
"Total files to process: " << work.size() << std::endl;
242 std::mutex work_mutex;
243 std::vector<std::thread> workers;
244 std::vector<SplitResult> results(nWorkers);
246 for (Int_t w = 0; w < nWorkers; w++) {
247 workers.emplace_back([&work, &work_mutex, &results, w, chunkSeconds]() {
249 work, work_mutex,
Constants::cfg.SOL_SPLIT_DIR.Data(), chunkSeconds);
253 for (Int_t w = 0; w < nWorkers; w++) {
257 Int_t totalSplit = 0;
258 Int_t totalSkipped = 0;
259 Int_t totalMissing = 0;
260 Int_t totalAlreadySplit = 0;
261 for (Int_t w = 0; w < nWorkers; w++) {
262 totalSplit += results[w].nSplit;
263 totalSkipped += results[w].nSkipped;
264 totalMissing += results[w].nMissing;
265 totalAlreadySplit += results[w].nAlreadySplit;
268 std::cout << std::endl;
269 std::cout <<
"Preprocessing complete:" << std::endl;
270 std::cout <<
" Split: " << totalSplit << std::endl;
271 std::cout <<
" Already split:" << totalAlreadySplit << std::endl;
272 std::cout <<
" Skipped: " << totalSkipped << std::endl;
273 std::cout <<
" Missing: " << totalMissing << std::endl;
275 return (totalMissing > 0) ? 1 : 0;
SplitResult SplitWorker(std::queue< WorkItem > &work, std::mutex &work_mutex, const char *outputDir, Double_t chunkSeconds)
std::vector< TString > DiscoverSolRunSuffixesFromBase(Int_t run)
Bool_t IsMinimumFormat(const char *filePath)