tracking_eff.cpp 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <TSystem.h>
  5. #include "filval.hpp"
  6. #include "root_filval.hpp"
  7. #include <boost/range/combine.hpp>
  8. #include "analysis/TrackingNtupleObjs.hpp"
  9. SeedCollection seeds;
  10. SimTrackCollection sim_tracks;
  11. SimVertexCollection sim_vertices;
  12. TrackCollection gsf_tracks;
  13. void register_objects(TrackingDataSet& tds){
  14. seeds.init(tds);
  15. sim_tracks.init(tds);
  16. sim_vertices.init(tds);
  17. gsf_tracks.init(tds);
  18. }
  19. struct {
  20. Value<float>* x;
  21. Value<float>* y;
  22. Value<float>* z;
  23. Value<float>* sigma_x;
  24. Value<float>* sigma_y;
  25. Value<float>* sigma_z;
  26. } bs;
  27. bool in_lum_region(const SimVertex& vertex) {
  28. /* Here approximate the luminous region as a cylinder with length 5*\sigma_z and radius
  29. * sqrt(\simga_x^2 + \sigma_y^2) centered as beamspot position.
  30. */
  31. float dx = vertex.x() - bs.x->get();
  32. float dy = vertex.y() - bs.y->get();
  33. float dz = vertex.z() - bs.z->get();
  34. auto radius = static_cast<float>(5 * sqrt(pow(bs.sigma_x->get(), 2) + pow(bs.sigma_y->get(), 2)));
  35. float half_len = 5*bs.sigma_z->get();
  36. return sqrt(dx*dx + dy*dy) < radius and abs(dz) < half_len;
  37. };
  38. bool is_good_sim(const SimTrack& sim_track) {
  39. const auto& vertex = sim_vertices[sim_track.parentVtxIdx()];
  40. return abs(sim_track.pdgId()) == 11 and in_lum_region(vertex);
  41. };
  42. void run(bool silent){
  43. using namespace std;
  44. using namespace fv;
  45. using namespace fv_root;
  46. auto file_list = the_config->get_source_files();
  47. string output_filename = the_config->get_output_filename();
  48. TrackingDataSet tds(output_filename, file_list, "trackingNtuple/tree");
  49. register_objects(tds);
  50. bs = {
  51. tds.track_branch<float>("bsp_x"),
  52. tds.track_branch<float>("bsp_y"),
  53. tds.track_branch<float>("bsp_z"),
  54. tds.track_branch<float>("bsp_sigmax"),
  55. tds.track_branch<float>("bsp_sigmay"),
  56. tds.track_branch<float>("bsp_sigmaz")
  57. };
  58. std::map<std::pair<int, int>, ContainerTH2<float>*> BPIX_residuals_dRz;
  59. std::map<std::pair<int, int>, ContainerTH2<float>*> BPIX_residuals_dPhi;
  60. std::map<std::pair<int, int>, ContainerTH2<float>*> FPIX_residuals_dRz;
  61. std::map<std::pair<int, int>, ContainerTH2<float>*> FPIX_residuals_dPhi;
  62. stringstream name;
  63. TH2Params hist_params;
  64. for (int layer=1; layer<=4; layer++) {
  65. for (int hit=1; hit<=3; hit++) {
  66. hist_params = (hit==1) ? TH2Params::lookup("dRz_v_Et") : TH2Params::lookup("dRz_v_Et_outer_hits");
  67. name.str("");
  68. name << "dRz_BPIX_L" << layer << "_H" << hit << "_v_Et";
  69. BPIX_residuals_dRz[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
  70. name.str("");
  71. name << "dRz_FPIX_L" << layer << "_H" << hit << "_v_Et";
  72. FPIX_residuals_dRz[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
  73. hist_params = (hit==1) ? TH2Params::lookup("dPhi_v_Et") : TH2Params::lookup("dPhi_v_Et_outer_hits");
  74. name.str("");
  75. name << "dPhi_BPIX_L" << layer << "_H" << hit << "_v_Et";
  76. BPIX_residuals_dPhi[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
  77. name.str("");
  78. name << "dPhi_FPIX_L" << layer << "_H" << hit << "_v_Et";
  79. FPIX_residuals_dPhi[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
  80. }
  81. }
  82. auto& seed_eff_v_pt = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_pt", TH1Params::lookup("eff_v_pt"));
  83. auto& seed_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_eta", TH1Params::lookup("eff_v_eta"));
  84. auto& seed_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_phi", TH1Params::lookup("eff_v_phi"));
  85. auto& tracking_eff_v_pt = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt", TH1Params::lookup("eff_v_pt"));
  86. auto& tracking_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta", TH1Params::lookup("eff_v_eta"));
  87. auto& tracking_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi", TH1Params::lookup("eff_v_phi"));
  88. auto& seed_pur_v_pt = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_pt", TH1Params::lookup("pur_v_pt"));
  89. auto& seed_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_eta", TH1Params::lookup("pur_v_eta"));
  90. auto& seed_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_phi", TH1Params::lookup("pur_v_phi"));
  91. auto& tracking_pur_v_pt = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt", TH1Params::lookup("pur_v_pt"));
  92. auto& tracking_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta", TH1Params::lookup("pur_v_eta"));
  93. auto& tracking_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi", TH1Params::lookup("pur_v_phi"));
  94. auto& hit_vs_layer_barrel = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_barrel", TH2Params::lookup("hit_vs_layer"));
  95. auto& hit_vs_layer_forward = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_forward", TH2Params::lookup("hit_vs_layer"));
  96. while (tds.next(!silent)) {
  97. for (const auto& sim_track : sim_tracks) {
  98. if (!is_good_sim(sim_track)) continue;
  99. if (seeds.size() == 0) continue;
  100. bool matched = !sim_track.seedIdx().empty();
  101. if (abs(sim_track.eta()) < 2.4)
  102. seed_eff_v_pt.fill(sim_track.pt(), matched);
  103. if (sim_track.pt() > 20.0)
  104. seed_eff_v_eta.fill(sim_track.eta(), matched);
  105. if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
  106. seed_eff_v_phi.fill(sim_track.phi(), matched);
  107. }
  108. for (const auto& sim_track : sim_tracks) {
  109. if (!is_good_sim(sim_track)) continue;
  110. if (gsf_tracks.size() == 0) continue;
  111. bool matched = !sim_track.trkIdx().empty();
  112. if (abs(sim_track.eta()) < 2.4)
  113. tracking_eff_v_pt.fill(sim_track.pt(), matched);
  114. if (sim_track.pt() > 20.0)
  115. tracking_eff_v_eta.fill(sim_track.eta(), matched);
  116. if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
  117. tracking_eff_v_phi.fill(sim_track.phi(), matched);
  118. }
  119. for (const auto& seed : seeds) {
  120. if (!seed.isECALDriven()) continue;
  121. bool match = false;
  122. for (const auto& sim_track_idx : seed.simTrkIdx()) {
  123. if(is_good_sim(sim_tracks[sim_track_idx])) {
  124. match = true;
  125. break;
  126. }
  127. }
  128. if (abs(seed.eta()) < 2.4)
  129. seed_pur_v_pt.fill(seed.pt(), match);
  130. if (seed.pt() > 20)
  131. seed_pur_v_eta.fill(seed.eta(), match);
  132. if (abs(seed.eta()) < 2.4 and seed.pt() > 20)
  133. seed_pur_v_phi.fill(seed.phi(), match);
  134. }
  135. for (const auto& gsf_track : gsf_tracks) {
  136. bool match = false;
  137. for (const auto& sim_track_idx : gsf_track.simTrkIdx()) {
  138. if(is_good_sim(sim_tracks[sim_track_idx])) {
  139. match = true;
  140. break;
  141. }
  142. }
  143. if (abs(gsf_track.eta()) < 2.4)
  144. tracking_pur_v_pt.fill(gsf_track.pt(), match);
  145. if (gsf_track.pt() > 20)
  146. tracking_pur_v_eta.fill(gsf_track.eta(), match);
  147. if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
  148. tracking_pur_v_phi.fill(gsf_track.phi(), match);
  149. }
  150. for (const auto& seed : seeds) {
  151. if (seed.trkIdx() < 0) continue;
  152. if (!seed.isECALDriven()) continue;
  153. const auto the_track = gsf_tracks[seed.trkIdx()];
  154. vector<int> hits_valid;
  155. vector<float> hits_dRz;
  156. vector<float> hits_dPhi;
  157. if (the_track.q() == 1) {
  158. hits_valid = seed.isValidPos();
  159. hits_dRz = seed.dRZPos();
  160. hits_dPhi = seed.dPhiPos();
  161. } else {
  162. hits_valid = seed.isValidNeg();
  163. hits_dRz = seed.dRZNeg();
  164. hits_dPhi = seed.dPhiNeg();
  165. }
  166. const vector<int>& hits_isBarrel = seed.isBarrel();
  167. const vector<int>& hits_layerOrDiskNr = seed.layerOrDiskNr();
  168. size_t nHits = hits_valid.size();
  169. for(size_t hit_idx=0; hit_idx<nHits; hit_idx++) {
  170. if (!hits_valid[hit_idx]) continue;
  171. bool isBarrel = hits_isBarrel[hit_idx] == 1;
  172. int layerOrDiskNr = hits_layerOrDiskNr[hit_idx];
  173. float dRz = abs(hits_dRz[hit_idx]);
  174. float dPhi = abs(hits_dPhi[hit_idx]);
  175. if (isBarrel) {
  176. BPIX_residuals_dRz[{layerOrDiskNr, hit_idx+1}]->fill(dRz, seed.Et());
  177. BPIX_residuals_dPhi[{layerOrDiskNr, hit_idx+1}]->fill(dPhi, seed.Et());
  178. } else {
  179. FPIX_residuals_dRz[{layerOrDiskNr, hit_idx+1}]->fill(dRz, seed.Et());
  180. FPIX_residuals_dPhi[{layerOrDiskNr, hit_idx+1}]->fill(dPhi, seed.Et());
  181. }
  182. if (isBarrel)
  183. hit_vs_layer_barrel.fill(layerOrDiskNr, static_cast<const int &>(hit_idx + 1));
  184. else
  185. hit_vs_layer_forward.fill(layerOrDiskNr, static_cast<const int &>(hit_idx + 1));
  186. }
  187. }
  188. }
  189. tds.save_all();
  190. }
  191. int main(int argc, char * argv[]){
  192. using namespace fv_util;
  193. ArgParser args(argc, argv);
  194. bool silent = args.cmdOptionExists("-s");
  195. if(args.cmdOptionExists("-c")) {
  196. init_config(args.getCmdOption("-c"));
  197. init_log(LogPriority::kLogInfo);
  198. // gSystem->Load("libfilval.so");
  199. run(silent);
  200. } else {
  201. cout << "Usage: ./" << argv[0] << " (-s) -c config_file.yaml" << endl;
  202. }
  203. return 0;
  204. }