tracking_validation.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <utility>
  5. #include <numeric>
  6. #include <limits>
  7. #include <cmath>
  8. #include <TSystem.h>
  9. #include "filval/filval.hpp"
  10. #include "filval/root/filval.hpp"
  11. #include <boost/range/combine.hpp>
  12. #include <boost/format.hpp>
  13. #include "TrackingNtuple.h"
  14. #include "analysis/obj_types.cpp"
  15. using namespace std;
  16. using namespace fv;
  17. using namespace fv::root;
  18. typedef std::tuple<Seed, PixRecHit, Track, SimHit, SimTrack> MatchedTrack;
  19. typedef std::pair<std::vector<float>,std::vector<float>> pair_vec;
  20. #define HIT_TYPE_PIXEL 0
  21. #define HIT_TYPE_GLUED 1
  22. #define HIT_TYPE_STRIP 2
  23. #define PIXEL_BARREL 1
  24. #define PIXEL_ENDCAP 2
  25. std::map<int,string> subdet_names = {{1, "BPIX"}, {2, "FPIX"}};
  26. template<typename A, typename B>
  27. float displacement(const A& a, const B& b){
  28. return std::sqrt(pow(a.x-b.x, 2) +
  29. pow(a.y-b.y, 2) +
  30. pow(a.z-b.z, 2));
  31. }
  32. template<typename T>
  33. float rho(const T& t){
  34. return std::sqrt(pow(t.x,2)+pow(t.y,2));
  35. }
  36. bool in_det(const MatchedTrack &mt, int &&det, int &&layer){
  37. auto& hit = std::get<PixRecHit>(mt);
  38. return hit.det == det && hit.lay == layer;
  39. };
  40. float pseudorapidity(float z, float r){
  41. float theta = atan2(r, z);
  42. return -log(tan(theta/2.0));
  43. }
  44. float pseudorapidity(float x, float y, float z){
  45. float r = sqrt(x*x + y*y);
  46. return pseudorapidity(z, r);
  47. }
  48. template<typename T>
  49. float pseudorapidity(const T &t){
  50. return pseudorapidity(t.x, t.y, t.z);
  51. }
  52. vector<string> seedTypes =
  53. {"initialStepSeeds",
  54. "highPtTripletStepSeeds",
  55. "mixedTripletStepSeeds",
  56. "pixelLessStepSeeds",
  57. "tripletElectronSeeds",
  58. "pixelPairElectronSeeds",
  59. "stripPairElectronSeeds"};
  60. Value<vector<Seed>>* seeds;
  61. Value<vector<PixRecHit>>* pixrec_hits;
  62. Value<vector<Track>>* tracks;
  63. Value<vector<SimHit>>* sim_hits;
  64. Value<vector<SimTrack>>* sim_tracks;
  65. void register_objects(TrackingDataSet& tds){
  66. seeds = register_seeds(tds);
  67. pixrec_hits = register_pixrec_hits(tds);
  68. tracks = register_tracks(tds);
  69. sim_hits = register_sim_hits(tds);
  70. sim_tracks = register_sim_tracks(tds);
  71. }
  72. void setup_first_hit_pairs(TrackingDataSet& tds){
  73. typedef std::tuple<PixRecHit, SimHit> HitPair;
  74. auto& find_matched_nth_hit_in_layer =
  75. func<vector<HitPair>(vector<Seed>,
  76. vector<PixRecHit>,
  77. vector<SimHit>,
  78. vector<Track>,
  79. vector<SimTrack>,
  80. int, int, int)>("find_matched_nth_hit_in_layer",
  81. FUNC(([](const vector<Seed>& seeds,
  82. const vector<PixRecHit>& pixrec_hits,
  83. const vector<SimHit>& sim_hits,
  84. const vector<Track>& tracks,
  85. const vector<SimTrack>& sim_tracks,
  86. const int&& det,
  87. const int&& pix_layer,
  88. const int&& hit_number){
  89. vector<HitPair> matched_hits;
  90. for(const Track &trk : tracks){ // loop over all tracks
  91. const Seed &seed = seeds[trk.seedIdx];
  92. if(seed.hitIdx.size() <= hit_number) continue; // looking for hit_number'th hit, which this seed doesn't have
  93. if(seed.algoOriginal < 0 || seed.algoOriginal >= seedTypes.size()) continue;
  94. if(seed.hitType[hit_number] != HIT_TYPE_PIXEL) continue; // take only pixel hits for now
  95. const PixRecHit &rec_hit = pixrec_hits[seed.hitIdx[hit_number]];
  96. if(rec_hit.det == det && rec_hit.lay == pix_layer){
  97. // We have the RecHit we want to work with, now find a properly* matched SimHit
  98. if(rec_hit.simHitIdx.size() == 0) continue; // if rechit is matched to no simhits, give up.
  99. for(const int &simTrkIdx : trk.simTrkIdx){ // loop over SimTracks matched to Track
  100. for(const int& simHitIdx : sim_tracks[simTrkIdx].simHitIdx){ // loop over SimHits from SimTrack
  101. if(simHitIdx == rec_hit.simHitIdx[0]) // take first matched simhit (should be the closest one)
  102. matched_hits.push_back({rec_hit, sim_hits[rec_hit.simHitIdx[0]]});
  103. }
  104. }
  105. }
  106. }
  107. return matched_hits;
  108. })));
  109. auto barrel_val = constant("PIXEL_BARREL", PIXEL_BARREL);
  110. auto endcap_val = constant("PIXEL_ENDCAP", PIXEL_ENDCAP);
  111. auto first_hit = constant("1st", 0);
  112. auto second_hit = constant("2nd", 1);
  113. // First hits on inner three bpix layers
  114. auto first_hits_in_B1 = fv::apply(find_matched_nth_hit_in_layer,
  115. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, barrel_val, constant("L1", 1), first_hit), "first_hits_in_B1");
  116. auto first_hits_in_B2 = fv::apply(find_matched_nth_hit_in_layer,
  117. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, barrel_val, constant("L2", 2), first_hit), "first_hits_in_B2");
  118. // Second hits on outer three bpix layers
  119. auto second_hits_in_B2 = fv::apply(find_matched_nth_hit_in_layer,
  120. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, barrel_val, constant("L2", 2), second_hit), "second_hits_in_B2");
  121. auto second_hits_in_B3 = fv::apply(find_matched_nth_hit_in_layer,
  122. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, barrel_val, constant("L3", 3), second_hit), "second_hits_in_B3");
  123. auto second_hits_in_B4 = fv::apply(find_matched_nth_hit_in_layer,
  124. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, barrel_val, constant("L4", 4), second_hit), "second_hits_in_B4");
  125. auto first_hits_in_F1 = fv::apply(find_matched_nth_hit_in_layer,
  126. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, endcap_val, constant("L1", 1), first_hit), "first_hits_in_F1");
  127. auto first_hits_in_F2 = fv::apply(find_matched_nth_hit_in_layer,
  128. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, endcap_val, constant("L2", 2), first_hit), "first_hits_in_F2");
  129. auto second_hits_in_F2 = fv::apply(find_matched_nth_hit_in_layer,
  130. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, endcap_val, constant("L2", 2), second_hit), "second_hits_in_F2");
  131. auto second_hits_in_F3 = fv::apply(find_matched_nth_hit_in_layer,
  132. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, endcap_val, constant("L3", 3), second_hit), "second_hits_in_F3");
  133. // Even vs Odd Ladders
  134. auto even = constant("even", false);
  135. auto odd = constant("odd", true);
  136. auto& select_even_odd_ladder_blade_hit_pairs =
  137. func<vector<HitPair>(vector<HitPair>, bool)>("select_even_odd_ladder_blade_hit_pairs",
  138. FUNC(([](const vector<HitPair>& hit_pairs,
  139. const bool &&odd){
  140. vector<HitPair> even_pairs;
  141. for(const HitPair &hit_pair : hit_pairs){ // loop over all seeds
  142. if(std::get<PixRecHit>(hit_pair).ladder_blade % 2 == odd){
  143. even_pairs.push_back(hit_pair);
  144. }
  145. }
  146. return even_pairs;
  147. })));
  148. auto first_hits_in_B1_even_ladder = fv::apply(select_even_odd_ladder_blade_hit_pairs,
  149. fv::tuple(first_hits_in_B1, even), "first_hits_in_B1_even_ladder");
  150. auto first_hits_in_B1_odd_ladder = fv::apply(select_even_odd_ladder_blade_hit_pairs,
  151. fv::tuple(first_hits_in_B1, odd), "first_hits_in_B1_odd_ladder");
  152. auto first_hits_in_B2_even_ladder = fv::apply(select_even_odd_ladder_blade_hit_pairs,
  153. fv::tuple(first_hits_in_B2, even), "first_hits_in_B2_even_ladder");
  154. auto first_hits_in_B2_odd_ladder = fv::apply(select_even_odd_ladder_blade_hit_pairs,
  155. fv::tuple(first_hits_in_B2, odd), "first_hits_in_B2_odd_ladder");
  156. //Plots for dPhi of collections defined above
  157. auto& calc_dphi_v_eta = func<pair_vec(vector<HitPair>)>("calc_dphi_v_eta",
  158. FUNC(([](const vector<HitPair>& hit_pairs){
  159. vector<float> dphis;
  160. vector<float> etas;
  161. for(auto hit_pair : hit_pairs){
  162. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  163. auto& sim_hit = std::get<SimHit>(hit_pair);
  164. dphis.push_back(atan2(sim_hit.x, sim_hit.y) - atan2(pixrec_hit.x, pixrec_hit.y));
  165. etas.push_back(pseudorapidity(pixrec_hit));
  166. }
  167. return std::make_pair(etas, dphis);
  168. })));
  169. TH2Params params_dphi = {"$\\eta$", 100, -4, 4,
  170. "$\\Delta \\phi$(rad)", 50, -.0015, .0015};
  171. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1",
  172. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B1)),
  173. "First Hit in BPIX-L1", params_dphi);
  174. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2",
  175. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B2)),
  176. "First Hit in BPIX-L2", params_dphi);
  177. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1_even_ladder",
  178. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B1_even_ladder)),
  179. "First Hit in BPIX-L1 - Even Ladders", params_dphi);
  180. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1_odd_ladder",
  181. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B1_odd_ladder)),
  182. "First Hit in BPIX-L1 - Odd Ladders", params_dphi);
  183. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2_even_ladder",
  184. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B2_even_ladder)),
  185. "First Hit in BPIX-L2 - Even Ladders", params_dphi);
  186. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2_odd_ladder",
  187. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_B2_odd_ladder)),
  188. "First Hit in BPIX-L2 - Odd Ladders", params_dphi);
  189. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B2",
  190. fv::apply(calc_dphi_v_eta, fv::tuple(second_hits_in_B2)),
  191. "Second Hit in BPIX-L2", params_dphi);
  192. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B3",
  193. fv::apply(calc_dphi_v_eta, fv::tuple(second_hits_in_B3)),
  194. "Second Hit in BPIX-L3", params_dphi);
  195. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B4",
  196. fv::apply(calc_dphi_v_eta, fv::tuple(second_hits_in_B4)),
  197. "Second Hit in BPIX-L4", params_dphi);
  198. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_F1",
  199. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_F1)),
  200. "First Hit in FPIX-L1", params_dphi);
  201. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_F2",
  202. fv::apply(calc_dphi_v_eta, fv::tuple(first_hits_in_F2)),
  203. "First Hit in FPIX-L2", params_dphi);
  204. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_F2",
  205. fv::apply(calc_dphi_v_eta, fv::tuple(second_hits_in_F2)),
  206. "Second Hit in FPIX-L2", params_dphi);
  207. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_F3",
  208. fv::apply(calc_dphi_v_eta, fv::tuple(second_hits_in_F3)),
  209. "Second Hit in FPIX-L3", params_dphi);
  210. //Plots for dr of collections defined above
  211. auto& calc_dr_v_eta = func<pair_vec(vector<HitPair>)>("calc_dr_v_eta",
  212. FUNC(([](const vector<HitPair>& hit_pairs){
  213. vector<float> drs;
  214. vector<float> etas;
  215. for(auto hit_pair : hit_pairs){
  216. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  217. auto& sim_hit = std::get<SimHit>(hit_pair);
  218. drs.push_back(displacement(pixrec_hit, sim_hit));
  219. etas.push_back(pseudorapidity(pixrec_hit));
  220. }
  221. return std::make_pair(etas, drs);
  222. })));
  223. TH2Params params_dr = {"$\\eta$", 100, -4, 4,
  224. "$\\Delta \\r$(rad)", 50, 0, .006};
  225. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1",
  226. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B1)),
  227. "First Hit in BPIX-L1", params_dr);
  228. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2",
  229. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B2)),
  230. "First Hit in BPIX-L2", params_dr);
  231. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1_even_ladder",
  232. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B1_even_ladder)),
  233. "First Hit in BPIX-L1 - Even Ladders", params_dr);
  234. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1_odd_ladder",
  235. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B1_odd_ladder)),
  236. "First Hit in BPIX-L1 - Odd Ladders", params_dr);
  237. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2_even_ladder",
  238. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B2_even_ladder)),
  239. "First Hit in BPIX-L2 - Even Ladders", params_dr);
  240. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2_odd_ladder",
  241. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_B2_odd_ladder)),
  242. "First Hit in BPIX-L2 - Odd Ladders", params_dr);
  243. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B2",
  244. fv::apply(calc_dr_v_eta, fv::tuple(second_hits_in_B2)),
  245. "Second Hit in BPIX-L2", params_dr);
  246. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B3",
  247. fv::apply(calc_dr_v_eta, fv::tuple(second_hits_in_B3)),
  248. "Second Hit in BPIX-L3", params_dr);
  249. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B4",
  250. fv::apply(calc_dr_v_eta, fv::tuple(second_hits_in_B4)),
  251. "Second Hit in BPIX-L4", params_dr);
  252. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_F1",
  253. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_F1)),
  254. "First Hit in FPIX-L1", params_dr);
  255. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_F2",
  256. fv::apply(calc_dr_v_eta, fv::tuple(first_hits_in_F2)),
  257. "First Hit in FPIX-L2", params_dr);
  258. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_F2",
  259. fv::apply(calc_dr_v_eta, fv::tuple(second_hits_in_F2)),
  260. "Second Hit in FPIX-L2", params_dr);
  261. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_F3",
  262. fv::apply(calc_dr_v_eta, fv::tuple(second_hits_in_F3)),
  263. "Second Hit in FPIX-L3", params_dr);
  264. //Plots for dz of collections defined above
  265. auto& calc_dz_v_eta = func<pair_vec(vector<HitPair>)>("calc_dz_v_eta",
  266. FUNC(([](const vector<HitPair>& hit_pairs){
  267. vector<float> dzs;
  268. vector<float> etas;
  269. for(auto hit_pair : hit_pairs){
  270. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  271. auto& sim_hit = std::get<SimHit>(hit_pair);
  272. dzs.push_back(sim_hit.z - pixrec_hit.z);
  273. etas.push_back(pseudorapidity(pixrec_hit));
  274. }
  275. return std::make_pair(etas, dzs);
  276. })));
  277. TH2Params params_dz = {"$\\eta$", 100, -4, 4,
  278. "$\\Delta z$(rad)", 50, -.01, .01};
  279. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1",
  280. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B1)),
  281. "First Hit in BPIX-L1", params_dz);
  282. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2",
  283. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B2)),
  284. "First Hit in BPIX-L2", params_dz);
  285. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_even_ladder",
  286. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B1_even_ladder)),
  287. "First Hit in BPIX-L1 - Even Ladders", params_dz);
  288. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_odd_ladder",
  289. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B1_odd_ladder)),
  290. "First Hit in BPIX-L1 - Odd Ladders", params_dz);
  291. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_even_ladder",
  292. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B2_even_ladder)),
  293. "First Hit in BPIX-L2 - Even Ladders", params_dz);
  294. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_odd_ladder",
  295. fv::apply(calc_dz_v_eta, fv::tuple(first_hits_in_B2_odd_ladder)),
  296. "First Hit in BPIX-L2 - Odd Ladders", params_dz);
  297. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B2",
  298. fv::apply(calc_dz_v_eta, fv::tuple(second_hits_in_B2)),
  299. "Second Hit in BPIX-L2", params_dz);
  300. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B3",
  301. fv::apply(calc_dz_v_eta, fv::tuple(second_hits_in_B3)),
  302. "Second Hit in BPIX-L3", params_dz);
  303. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B4",
  304. fv::apply(calc_dz_v_eta, fv::tuple(second_hits_in_B4)),
  305. "Second Hit in BPIX-L4", params_dz);
  306. //Plots for drho of collections defined above
  307. auto& calc_drho_v_eta = func<pair_vec(vector<HitPair>)>("calc_drho_v_eta",
  308. FUNC(([](const vector<HitPair>& hit_pairs){
  309. vector<float> drhos;
  310. vector<float> etas;
  311. for(auto hit_pair : hit_pairs){
  312. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  313. auto& sim_hit = std::get<SimHit>(hit_pair);
  314. drhos.push_back(rho(sim_hit) - rho(pixrec_hit));
  315. etas.push_back(pseudorapidity(pixrec_hit));
  316. }
  317. return std::make_pair(etas, drhos);
  318. })));
  319. TH2Params params_drho = {"$\\eta$", 100, -4, 4,
  320. "$\\Delta \\rho$(cm)", 50, -.01, .01};
  321. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_first_hits_in_F1",
  322. fv::apply(calc_drho_v_eta, fv::tuple(first_hits_in_F1)),
  323. "First Hit in FPIX-L1", params_drho);
  324. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_first_hits_in_F2",
  325. fv::apply(calc_drho_v_eta, fv::tuple(first_hits_in_F2)),
  326. "First Hit in FPIX-L2", params_drho);
  327. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_second_hits_in_F2",
  328. fv::apply(calc_drho_v_eta, fv::tuple(second_hits_in_F2)),
  329. "Second Hit in FPIX-L2", params_drho);
  330. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_second_hits_in_F3",
  331. fv::apply(calc_drho_v_eta, fv::tuple(second_hits_in_F3)),
  332. "Second Hit in FPIX-L3", params_drho);
  333. }
  334. void run_analysis(const vector<fv::util::DataFileDescriptor>& dfds, const string output_filename, bool silent){
  335. gSystem->Load("libfilval.so");
  336. auto replace_suffix = [](const std::string& input, const std::string& new_suffix){
  337. return input.substr(0, input.find_last_of(".")) + new_suffix;
  338. };
  339. string log_filename = replace_suffix(output_filename, ".log");
  340. fv::util::Log::init_logger(log_filename, fv::util::LogPriority::kLogInfo);
  341. TrackingDataSet tds(output_filename, dfds, "trackingNtuple/tree");
  342. /* tds.set_max_events(10); */
  343. register_objects(tds);
  344. setup_first_hit_pairs(tds);
  345. tds.process(silent);
  346. tds.save_all();
  347. }
  348. int main(int argc, char * argv[]){
  349. fv::util::ArgParser args(argc, argv);
  350. bool silent = args.cmdOptionExists("-s");
  351. string output_filename = args.cmdOptionExists("-o") ? args.getCmdOption("-o") : "output.root";
  352. if(args.cmdOptionExists("-F")){
  353. auto file_list = fv::util::read_input_list(args.getCmdOption("-F"));
  354. run_analysis(file_list, output_filename, silent);
  355. }else if(args.cmdOptionExists("-f")){
  356. string input_filename = args.getCmdOption("-f");
  357. string data_label = args.cmdOptionExists("-l") ? args.getCmdOption("-l") : "";
  358. fv::util::DataFileDescriptor dfd(input_filename, data_label);
  359. run_analysis(std::vector<fv::util::DataFileDescriptor>({dfd}), output_filename, silent);
  360. }else {
  361. cout << "Usage: ./tracking_validation (-s) {-o output_filename} -F datafiles.txt" << endl;
  362. cout << " ./tracking_validation (-s) {-l DATA_LABEL} {-o output_filename} -f treefile.root" << endl;
  363. }
  364. return 0;
  365. }