Advertisement
Hunyadix

Untitled

Jun 23rd, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.50 KB | None | 0 0
  1. // ROC efficiency differences compared to the mean of  the containing
  2. //    - module       -o                                                                     |
  3. //    - sector         \                                                                    |
  4. //    - side            o---- Barrel                                                        |
  5. //    - halfshell      /                                                                    |
  6. //    - quarter      -o                                                                     |
  7.  
  8.  
  9. // Filtering helper, creates predicates about the placements of the ROCs
  10. std::mutex stupidLock;
  11. auto transformToROCPredicate = [&layersROCIndexToPlacementMaps, layerIndex, &stupidLock] (const std::function<bool(const ROCPlacement&)>& pred)
  12. {
  13.    return [&layersROCIndexToPlacementMaps, layerIndex, &pred, &stupidLock] (auto e)
  14.    {
  15.       int otherROCIndex;
  16.       const char* histogramName = e -> GetName();
  17.       {
  18.          std::lock_guard<std::mutex> stupidLockGuard(stupidLock);
  19.          otherROCIndex = getROCIndexByName(histogramName);
  20.       }
  21.       ROCPlacement otherROCPlacement = layersROCIndexToPlacementMaps[layerIndex][otherROCIndex];
  22.       return pred(otherROCPlacement);
  23.    };
  24. };
  25. // Comparison helper
  26. std::mutex writeLock;
  27. auto writeComparisonPlots = [&, layerIndex]
  28.    (const std::string& histogramName, const std::string& histogramTitle, std::initializer_list<const char*> directoryPath, const std::function<bool(const ROCPlacement&)>& pred)
  29. {
  30.    assert(directoryPath.size());
  31.    std::vector<TH1F*> passedROCFiltering = filter(efficiencyVsDelayHistogramsToFit[layerIndex], transformToROCPredicate(pred));
  32.    TH1F* rocEfficiencyDifferencesModuleAvg = getROCefficiencyDifferencesPlot(rocEfficiencyHistogram, passedROCFiltering, histogramName.c_str(), histogramTitle.c_str());
  33.    std::lock_guard<std::mutex> writeLockGuard(writeLock);
  34.    outputFile -> cd(*directoryPath.begin());
  35.    std::for_each(directoryPath.begin() + 1, directoryPath.end(), [] (const char* e)
  36.    {
  37.       gDirectory -> cd(e);
  38.    });
  39.    rocEfficiencyDifferencesModuleAvg -> Write();
  40. };
  41. // Module
  42. auto sameModule = [module, ladder] (const ROCPlacement& rp) { return rp.module == module && rp.ladder == ladder; };
  43. std::future<void> moduleComparisonThread = std::async(std::launch::async, [&] { writeComparisonPlots("ROC:" + std::to_string(rocIndex) + "_module_comparison", "ROC: " + std::to_string(rocIndex) + " - module comparison",
  44. {
  45.    "ROC_efficiency_module_level_comparison", layerDirName, moduleLadderDirname
  46. }, sameModule); });
  47. // Sector
  48. auto sameSector = [side, module, sec] (const ROCPlacement& rp) { return rp.side == side && std::signbit(rp.module) == std::signbit(module) && rp.sec == sec; };
  49. std::future<void> sectorComparisonThread = std::async(std::launch::async, [&] { writeComparisonPlots("ROC:" + std::to_string(rocIndex) + "_sector_comparison", "ROC: " + std::to_string(rocIndex) + " - sector comparison",
  50. {
  51.    "ROC_efficiency_sector_level_comparison", layerDirName, sideDirName, halfshellDirName, sectorDirName
  52. }, sameSector); });
  53. // Side
  54. auto sameSide = [side] (const ROCPlacement& rp) { return rp.side == side; };
  55. std::future<void> sideComparisonThread = std::async(std::launch::async, [&] { writeComparisonPlots("ROC:" + std::to_string(rocIndex) + "_side_comparison", "ROC: " + std::to_string(rocIndex) + " - side comparison",
  56. {
  57.    "ROC_efficiency_side_level_comparison", layerDirName, sideDirName
  58. }, sameSide); });
  59. // Halfshell
  60. auto sameHalfshell = [module] (const ROCPlacement& rp) { return std::signbit(rp.module) == std::signbit(module); };
  61. std::future<void> halfshellComparisonThread = std::async(std::launch::async, [&] { writeComparisonPlots("ROC:" + std::to_string(rocIndex) + "_halfshell_comparison", "ROC: " + std::to_string(rocIndex) + " - halfshell comparison",
  62. {
  63.    "ROC_efficiency_halfshell_level_comparison", layerDirName, halfshellDirName
  64. }, sameHalfshell); });
  65. // Quarter
  66. auto sameQuarter = [side, module] (const ROCPlacement& rp) { return rp.side == side && std::signbit(rp.module) == std::signbit(module); };
  67. // The last thread should be run synchronously
  68. std::async(std::launch::async, [&] { writeComparisonPlots("ROC:" + std::to_string(rocIndex) + "_quarter_comparison", "ROC: " + std::to_string(rocIndex) + " - quarter comparison",
  69. {
  70.    "ROC_efficiency_quarter_level_comparison", layerDirName, sideDirName, halfshellDirName
  71. }, sameQuarter); });
  72. moduleComparisonThread.get();
  73. sectorComparisonThread.get();
  74. sideComparisonThread.get();
  75. halfshellComparisonThread.get();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement