tracking_eff.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. float 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. auto& dRz_BPIX_L1_H1 = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L1_H1", TH1Params::lookup("dRz"));
  59. auto& dPhi_BPIX_L1_H1 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L1_H1", TH1Params::lookup("dPhi"));
  60. auto& dRz_BPIX_L1_H1_v_Et = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L1_H1_v_Et", TH2Params::lookup("dRz_v_Et"));
  61. auto& dPhi_BPIX_L1_H1_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L1_H1_v_Et", TH2Params::lookup("dPhi_v_Et"));
  62. auto& dRz_BPIX_L2_H2 = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L2_H2", TH1Params::lookup("dRz_outer_hits"));
  63. auto& dPhi_BPIX_L2_H2 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L2_H2", TH1Params::lookup("dPhi_outer_hits"));
  64. auto& dRz_BPIX_L2_H2_v_Et = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L2_H2_v_Et", TH2Params::lookup("dRz_v_Et_outer_hits"));
  65. auto& dPhi_BPIX_L2_H2_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L2_H2_v_Et", TH2Params::lookup("dPhi_v_Et_outer_hits"));
  66. auto& dRz_BPIX_L3_H3 = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L3_H3", TH1Params::lookup("dRz_outer_hits"));
  67. auto& dPhi_BPIX_L3_H3 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L3_H3", TH1Params::lookup("dPhi_outer_hits"));
  68. auto& dRz_BPIX_L3_H3_v_Et = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L3_H3_v_Et", TH2Params::lookup("dRz_v_Et_outer_hits"));
  69. auto& dPhi_BPIX_L3_H3_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L3_H3_v_Et", TH2Params::lookup("dPhi_v_Et_outer_hits"));
  70. auto& seed_eff_v_pt = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_pt", TH1Params::lookup("eff_v_pt"));
  71. auto& seed_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_eta", TH1Params::lookup("eff_v_eta"));
  72. auto& seed_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_phi", TH1Params::lookup("eff_v_phi"));
  73. auto& tracking_eff_v_pt = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt", TH1Params::lookup("eff_v_pt"));
  74. auto& tracking_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta", TH1Params::lookup("eff_v_eta"));
  75. auto& tracking_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi", TH1Params::lookup("eff_v_phi"));
  76. auto& seed_pur_v_pt = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_pt", TH1Params::lookup("pur_v_pt"));
  77. auto& seed_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_eta", TH1Params::lookup("pur_v_eta"));
  78. auto& seed_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_phi", TH1Params::lookup("pur_v_phi"));
  79. auto& tracking_pur_v_pt = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt", TH1Params::lookup("pur_v_pt"));
  80. auto& tracking_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta", TH1Params::lookup("pur_v_eta"));
  81. auto& tracking_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi", TH1Params::lookup("pur_v_phi"));
  82. auto& hit_vs_layer_barrel = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_barrel", TH2Params::lookup("hit_vs_layer"));
  83. auto& hit_vs_layer_forward = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_forward", TH2Params::lookup("hit_vs_layer"));
  84. while (tds.next(!silent)) {
  85. for (const auto& sim_track : sim_tracks) {
  86. if (!is_good_sim(sim_track)) continue;
  87. if (seeds.size() == 0) continue;
  88. bool matched = !sim_track.seedIdx().empty();
  89. if (abs(sim_track.eta()) < 2.4)
  90. seed_eff_v_pt.fill(sim_track.pt(), matched);
  91. if (abs(sim_track.pt()) > 20.0)
  92. seed_eff_v_eta.fill(sim_track.eta(), matched);
  93. if (abs(sim_track.eta()) < 2.4 and abs(sim_track.pt()) < 20)
  94. seed_eff_v_phi.fill(sim_track.phi(), matched);
  95. }
  96. for (const auto& sim_track : sim_tracks) {
  97. if (!is_good_sim(sim_track)) continue;
  98. if (gsf_tracks.size() == 0) continue;
  99. bool matched = !sim_track.trkIdx().empty();
  100. if (abs(sim_track.eta()) < 2.4)
  101. tracking_eff_v_pt.fill(sim_track.pt(), matched);
  102. if (sim_track.pt() > 20.0)
  103. tracking_eff_v_eta.fill(sim_track.eta(), matched);
  104. if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
  105. tracking_eff_v_phi.fill(sim_track.phi(), matched);
  106. }
  107. for (const auto& seed : seeds) {
  108. bool match = false;
  109. for (const auto& sim_track_idx : seed.simTrkIdx()) {
  110. if(is_good_sim(sim_tracks[sim_track_idx])) {
  111. match = true;
  112. break;
  113. }
  114. }
  115. if (abs(seed.eta()) < 2.4)
  116. seed_pur_v_pt.fill(seed.pt(), match);
  117. if (seed.pt() > 20)
  118. seed_pur_v_eta.fill(seed.eta(), match);
  119. if (abs(seed.eta()) < 2.4 and seed.pt() > 20)
  120. seed_pur_v_phi.fill(seed.phi(), match);
  121. }
  122. for (const auto& gsf_track : gsf_tracks) {
  123. bool match = false;
  124. for (const auto& sim_track_idx : gsf_track.simTrkIdx()) {
  125. if(is_good_sim(sim_tracks[sim_track_idx])) {
  126. match = true;
  127. break;
  128. }
  129. }
  130. if (abs(gsf_track.eta()) < 2.4)
  131. tracking_pur_v_pt.fill(gsf_track.pt(), match);
  132. if (gsf_track.pt() > 20)
  133. tracking_pur_v_eta.fill(gsf_track.eta(), match);
  134. if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
  135. tracking_pur_v_phi.fill(gsf_track.phi(), match);
  136. }
  137. for (const auto& seed : seeds) {
  138. if (seed.trkIdx() < 0) continue;
  139. const auto the_track = gsf_tracks[seed.trkIdx()];
  140. vector<int> hits_valid;
  141. vector<float> hits_dRz;
  142. vector<float> hits_dPhi;
  143. if (the_track.q() == 1) {
  144. hits_valid = seed.isValidPos();
  145. hits_dRz = seed.dRZPos();
  146. hits_dPhi = seed.dPhiPos();
  147. } else {
  148. hits_valid = seed.isValidNeg();
  149. hits_dRz = seed.dRZNeg();
  150. hits_dPhi = seed.dPhiNeg();
  151. }
  152. const vector<int>& hits_isBarrel = seed.isBarrel();
  153. const vector<int>& hits_layerOrDiskNr = seed.layerOrDiskNr();
  154. size_t nHits = hits_valid.size();
  155. for(size_t hit_idx=0; hit_idx<nHits; hit_idx++) {
  156. if (!hits_valid[hit_idx]) continue;
  157. bool isBarrel = hits_isBarrel[hit_idx] == 1;
  158. int layerOrDiskNr = hits_layerOrDiskNr[hit_idx];
  159. float dRz = abs(hits_dRz[hit_idx]);
  160. float dPhi = abs(hits_dPhi[hit_idx]);
  161. if (isBarrel and layerOrDiskNr == 1 and hit_idx == 0 ) {
  162. dRz_BPIX_L1_H1.fill(dRz);
  163. dPhi_BPIX_L1_H1.fill(dPhi);
  164. dRz_BPIX_L1_H1_v_Et.fill(dRz, seed.pt());
  165. dPhi_BPIX_L1_H1_v_Et.fill(dPhi, seed.pt());
  166. }
  167. if (isBarrel and layerOrDiskNr == 2 and hit_idx == 1 ) {
  168. dRz_BPIX_L2_H2.fill(dRz);
  169. dPhi_BPIX_L2_H2.fill(dPhi);
  170. dRz_BPIX_L2_H2_v_Et.fill(dRz, seed.pt());
  171. dPhi_BPIX_L2_H2_v_Et.fill(dPhi, seed.pt());
  172. }
  173. if (isBarrel and layerOrDiskNr == 3 and hit_idx == 2 ) {
  174. dRz_BPIX_L3_H3.fill(dRz);
  175. dPhi_BPIX_L3_H3.fill(dPhi);
  176. dRz_BPIX_L3_H3_v_Et.fill(dRz, seed.pt());
  177. dPhi_BPIX_L3_H3_v_Et.fill(dPhi, seed.pt());
  178. }
  179. if (isBarrel)
  180. hit_vs_layer_barrel.fill(layerOrDiskNr, static_cast<const int &>(hit_idx + 1));
  181. else
  182. hit_vs_layer_forward.fill(layerOrDiskNr, static_cast<const int &>(hit_idx + 1));
  183. }
  184. }
  185. }
  186. tds.save_all();
  187. }
  188. int main(int argc, char * argv[]){
  189. using namespace fv_util;
  190. ArgParser args(argc, argv);
  191. bool silent = args.cmdOptionExists("-s");
  192. if(args.cmdOptionExists("-c")) {
  193. init_config(args.getCmdOption("-c"));
  194. init_log(LogPriority::kLogInfo);
  195. // gSystem->Load("libfilval.so");
  196. run(silent);
  197. } else {
  198. cout << "Usage: ./" << argv[0] << " (-s) -c config_file.yaml" << endl;
  199. }
  200. return 0;
  201. }