tracking_validation.cpp 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <utility>
  5. #include <numeric>
  6. #include <limits>
  7. #include <TSystem.h>
  8. #include "filval/filval.hpp"
  9. #include "filval/root/filval.hpp"
  10. #include <boost/range/combine.hpp>
  11. #include <boost/format.hpp>
  12. #include "analysis/TrackingNtuple.h"
  13. #include "analysis/obj_types.cpp"
  14. #include "analysis/common.hpp"
  15. using namespace std;
  16. using namespace fv;
  17. using namespace fv::root;
  18. typedef std::pair<std::vector<float>,std::vector<float>> pair_vec;
  19. #define HIT_TYPE_PIXEL 0
  20. #define HIT_TYPE_GLUED 1
  21. #define HIT_TYPE_STRIP 2
  22. enum PixSubDet{
  23. Void = 0,
  24. Barrel = 1,
  25. EndCap = 2
  26. };
  27. struct PixDetElem{
  28. PixSubDet subdet;
  29. unsigned char lay;
  30. PixDetElem():subdet(PixSubDet::Void), lay(0) {}
  31. PixDetElem(const PixSubDet& subdet, const unsigned char& lay){
  32. this->subdet = subdet;
  33. this->lay = lay;
  34. }
  35. template<typename T>
  36. bool contains(const T& obj) const{
  37. return obj.det == subdet && obj.lay == lay;
  38. }
  39. bool contains(const PixSubDet& subdet, const unsigned char& lay) const{
  40. return subdet == this->subdet && lay == this->lay;
  41. }
  42. };
  43. std::map<PixSubDet,string> subdet_names = {{PixSubDet::Barrel, "BPIX"}, {PixSubDet::EndCap, "FPIX"}};
  44. typedef std::tuple<PixRecHit, SimHit> HitPair;
  45. vector<string> seedTypes =
  46. {"initialStepSeeds",
  47. "highPtTripletStepSeeds",
  48. "mixedTripletStepSeeds",
  49. "pixelLessStepSeeds",
  50. "tripletElectronSeeds",
  51. "pixelPairElectronSeeds",
  52. "stripPairElectronSeeds"};
  53. Value<vector<SuperCluster>>* super_clusters;
  54. Value<vector<Seed>>* seeds;
  55. Value<vector<PixRecHit>>* pixrec_hits;
  56. Value<vector<Track>>* tracks;
  57. Value<vector<SimHit>>* sim_hits;
  58. Value<vector<SimTrack>>* sim_tracks;
  59. void setup_hit_pair_functions(){
  60. func<pair_vec(vector<HitPair>)>("calc_dphi_v_eta",
  61. FUNC(([](const vector<HitPair>& hit_pairs){
  62. vector<float> dphis;
  63. vector<float> etas;
  64. for(auto hit_pair : hit_pairs){
  65. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  66. auto& sim_hit = std::get<SimHit>(hit_pair);
  67. dphis.push_back(atan2(sim_hit.x, sim_hit.y) - atan2(pixrec_hit.x, pixrec_hit.y));
  68. etas.push_back(pseudorapidity(pixrec_hit));
  69. }
  70. return std::make_pair(etas, dphis);
  71. })));
  72. func<pair_vec(vector<HitPair>)>("calc_dr_v_eta",
  73. FUNC(([](const vector<HitPair>& hit_pairs){
  74. vector<float> drs;
  75. vector<float> etas;
  76. for(auto hit_pair : hit_pairs){
  77. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  78. auto& sim_hit = std::get<SimHit>(hit_pair);
  79. drs.push_back(displacement(pixrec_hit, sim_hit));
  80. etas.push_back(pseudorapidity(pixrec_hit));
  81. }
  82. return std::make_pair(etas, drs);
  83. })));
  84. func<pair_vec(vector<HitPair>)>("calc_dz_v_eta",
  85. FUNC(([](const vector<HitPair>& hit_pairs){
  86. vector<float> dzs;
  87. vector<float> etas;
  88. for(auto hit_pair : hit_pairs){
  89. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  90. auto& sim_hit = std::get<SimHit>(hit_pair);
  91. dzs.push_back(sim_hit.z - pixrec_hit.z);
  92. etas.push_back(pseudorapidity(pixrec_hit));
  93. }
  94. return std::make_pair(etas, dzs);
  95. })));
  96. func<pair_vec(vector<HitPair>)>("calc_drho_v_eta",
  97. FUNC(([](const vector<HitPair>& hit_pairs){
  98. vector<float> drhos;
  99. vector<float> etas;
  100. for(auto hit_pair : hit_pairs){
  101. auto& pixrec_hit = std::get<PixRecHit>(hit_pair);
  102. auto& sim_hit = std::get<SimHit>(hit_pair);
  103. drhos.push_back(rho(sim_hit) - rho(pixrec_hit));
  104. etas.push_back(pseudorapidity(pixrec_hit));
  105. }
  106. return std::make_pair(etas, drhos);
  107. })));
  108. }
  109. void register_objects(TrackingDataSet& tds){
  110. super_clusters = register_super_clusters(tds);
  111. seeds = register_seeds(tds);
  112. pixrec_hits = register_pixrec_hits(tds);
  113. tracks = register_tracks(tds);
  114. sim_hits = register_sim_hits(tds);
  115. sim_tracks = register_sim_tracks(tds);
  116. }
  117. void setup_skipped_layer_hit_pairs(TrackingDataSet& tds){
  118. /* Finds SimHit/RecHit pairs
  119. */
  120. auto find_matched_nth_hit_in_layer_with_skip =
  121. func<vector<HitPair>(vector<Seed>,
  122. vector<PixRecHit>,
  123. vector<SimHit>,
  124. vector<Track>,
  125. vector<SimTrack>,
  126. PixDetElem, int, bool)>("find_matched_nth_hit_in_layer_with_skip",
  127. FUNC(([](const vector<Seed>& seeds,
  128. const vector<PixRecHit>& pixrec_hits,
  129. const vector<SimHit>& sim_hits,
  130. const vector<Track>& tracks,
  131. const vector<SimTrack>& sim_tracks,
  132. const PixDetElem&& pixdet,
  133. const unsigned int&& skip,
  134. const bool&& first){
  135. vector<HitPair> matched_hits;
  136. for(const Track &trk : tracks){ // loop over all tracks
  137. const Seed &seed = seeds[trk.seedIdx];
  138. // Require seed's source algorithm is one of those in seedTypes
  139. if(seed.algoOriginal < 0 || seed.algoOriginal >= seedTypes.size()) continue;
  140. // Require seed w/ at least 2 hits
  141. if(seed.hitIdx.size() < 2) continue;
  142. // take only pixel hits for now
  143. if(seed.hitType[0] != HIT_TYPE_PIXEL || seed.hitType[1] != HIT_TYPE_PIXEL) continue;
  144. const PixRecHit &rec_hit1 = pixrec_hits[seed.hitIdx[0]];
  145. const PixRecHit &rec_hit2 = pixrec_hits[seed.hitIdx[1]];
  146. if(first){ // Looking at first hit in the pair
  147. if(pixdet.contains(rec_hit1) && pixdet.contains((PixSubDet)rec_hit2.det, rec_hit2.lay-1-skip)){
  148. // We have the RecHit we want to work with, now find a properly* matched SimHit
  149. if(rec_hit1.simHitIdx.size() == 0) continue; // if rechit is matched to no simhits, give up.
  150. if(trk.simTrkIdx.size() == 0) continue; // if track is matched to no simtracks, give up.
  151. const int &simTrkIdx = trk.simTrkIdx[0]; // get first matched track
  152. for(const int& simHitIdx : sim_tracks[simTrkIdx].simHitIdx){ // loop over SimHits from SimTrack
  153. if(simHitIdx == rec_hit1.simHitIdx[0]) // take first matched simhit (should be the closest one)
  154. matched_hits.push_back({rec_hit1, sim_hits[rec_hit1.simHitIdx[0]]});
  155. }
  156. }
  157. }else{ // Looking at second hit in the pair
  158. if(pixdet.contains(rec_hit2) && pixdet.contains((PixSubDet)rec_hit1.det, rec_hit2.lay+1+skip)){
  159. // We have the RecHit we want to work with, now find a properly* matched SimHit
  160. if(rec_hit2.simHitIdx.size() == 0) continue; // if rechit is matched to no simhits, give up.
  161. if(trk.simTrkIdx.size() == 0) continue; // if track is matched to no simtracks, give up.
  162. const int &simTrkIdx = trk.simTrkIdx[0]; // get first matched track
  163. for(const int& simHitIdx : sim_tracks[simTrkIdx].simHitIdx){ // loop over SimHits from SimTrack
  164. if(simHitIdx == rec_hit1.simHitIdx[0]) // take first matched simhit (should be the closest one)
  165. matched_hits.push_back({rec_hit2, sim_hits[rec_hit2.simHitIdx[0]]});
  166. }
  167. }
  168. }
  169. }
  170. return matched_hits;
  171. })));
  172. auto BPIX_L1 = constant("BPIX_L1", PixDetElem(PixSubDet::Barrel, 1));
  173. auto BPIX_L2 = constant("BPIX_L2", PixDetElem(PixSubDet::Barrel, 2));
  174. auto FPIX_L1 = constant("FPIX_L1", PixDetElem(PixSubDet::EndCap, 1));
  175. auto FPIX_L2 = constant("FPIX_L2", PixDetElem(PixSubDet::EndCap, 2));
  176. auto skip_zero = constant("skip_zero", 0);
  177. auto skip_one = constant("skip_one", 1);
  178. auto first = constant("first", true);
  179. auto second = constant("second", false);
  180. // First hit on 1st/2nd bpix layers and second hit in 2nd/3rd
  181. auto first_hits_in_B1_skip_zero = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  182. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L1, skip_zero, first), "first_hits_in_B1_skip_zero");
  183. auto first_hits_in_B2_skip_zero = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  184. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L2, skip_zero, first), "first_hits_in_B2_skip_zero");
  185. // First hit on 1st/2nd fpix layers and second hit in 2nd/3rd
  186. auto first_hits_in_F1_skip_zero = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  187. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L1, skip_zero, first), "first_hits_in_F1_skip_zero");
  188. auto first_hits_in_F2_skip_zero = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  189. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L2, skip_zero, first), "first_hits_in_F2_skip_zero");
  190. // First hit on 1st/2nd fpix layers and second hit in 3rd/4th
  191. auto first_hits_in_B1_skip_one = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  192. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L1, skip_one, first), "first_hits_in_B1_skip_one");
  193. auto first_hits_in_B2_skip_one = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  194. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L2, skip_one, first), "first_hits_in_B2_skip_one");
  195. // First hit on 1st fpix layer and second hit in 3rd layer
  196. auto first_hits_in_F1_skip_one = fv::tup_apply(find_matched_nth_hit_in_layer_with_skip,
  197. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L1, skip_one, first), "first_hits_in_F1_skip_one");
  198. TH2Params params_dz = {"$\\eta$", 100, -4, 4,
  199. "$\\Delta z$(rad)", 50, -.01, .01};
  200. auto calc_dz_v_eta = lookup_function<pair_vec(vector<HitPair>)>("calc_dz_v_eta");
  201. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_skip_zero",
  202. fv::apply(calc_dz_v_eta, first_hits_in_B1_skip_zero),
  203. "First Hit in BPIX-L1 - Skip 0", params_dz);
  204. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_skip_zero",
  205. fv::apply(calc_dz_v_eta, first_hits_in_B2_skip_zero),
  206. "First Hit in BPIX-L2 - Skip 0", params_dz);
  207. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_F1_skip_zero",
  208. fv::apply(calc_dz_v_eta, first_hits_in_F1_skip_zero),
  209. "First Hit in FPIX-L1 - Skip 0", params_dz);
  210. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_F2_skip_zero",
  211. fv::apply(calc_dz_v_eta, first_hits_in_F2_skip_zero),
  212. "First Hit in FPIX-L2 - Skip 0", params_dz);
  213. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_skip_one",
  214. fv::apply(calc_dz_v_eta, first_hits_in_B1_skip_one),
  215. "First Hit in BPIX-L1 - Skip 1", params_dz);
  216. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_skip_one",
  217. fv::apply(calc_dz_v_eta, first_hits_in_B2_skip_one),
  218. "First Hit in BPIX-L2 - Skip 1", params_dz);
  219. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_F1_skip_one",
  220. fv::apply(calc_dz_v_eta, first_hits_in_F1_skip_one),
  221. "First Hit in FPIX-L1 - Skip 1", params_dz);
  222. }
  223. void setup_first_hit_pairs(TrackingDataSet& tds){
  224. auto find_matched_nth_hit_in_layer =
  225. func<vector<HitPair>(vector<Seed>,
  226. vector<PixRecHit>,
  227. vector<SimHit>,
  228. vector<Track>,
  229. vector<SimTrack>,
  230. PixDetElem, int)>("find_matched_nth_hit_in_layer",
  231. FUNC(([](const vector<Seed>& seeds,
  232. const vector<PixRecHit>& pixrec_hits,
  233. const vector<SimHit>& sim_hits,
  234. const vector<Track>& tracks,
  235. const vector<SimTrack>& sim_tracks,
  236. const PixDetElem&& pixdet,
  237. const unsigned int&& hit_number){
  238. vector<HitPair> matched_hits;
  239. for(const Track &trk : tracks){ // loop over all tracks
  240. const Seed &seed = seeds[trk.seedIdx];
  241. if(seed.hitIdx.size() <= hit_number) continue; // looking for hit_number'th hit
  242. if(seed.algoOriginal < 0 || seed.algoOriginal >= seedTypes.size()) continue;
  243. if(seed.hitType[hit_number] != HIT_TYPE_PIXEL) continue; // take only pixel hits for now
  244. const PixRecHit &rec_hit = pixrec_hits[seed.hitIdx[hit_number]];
  245. if(pixdet.contains(rec_hit)){
  246. // We have the RecHit we want to work with, now find a properly* matched SimHit
  247. if(rec_hit.simHitIdx.size() == 0) continue; // if rechit is matched to no simhits, give up.
  248. if(trk.simTrkIdx.size() == 0) continue; // if rechit is matched to no simhits, give up.
  249. const int &simTrkIdx = trk.simTrkIdx[0]; // get first matched track
  250. for(const int& simHitIdx : sim_tracks[simTrkIdx].simHitIdx){ // loop over SimHits from SimTrack
  251. if(simHitIdx == rec_hit.simHitIdx[0]) // take first matched simhit (should be the closest one)
  252. matched_hits.push_back({rec_hit, sim_hits[rec_hit.simHitIdx[0]]});
  253. }
  254. }
  255. }
  256. return matched_hits;
  257. })));
  258. auto BPIX_L1 = constant("BPIX_L1", PixDetElem(PixSubDet::Barrel, 1));
  259. auto BPIX_L2 = constant("BPIX_L2", PixDetElem(PixSubDet::Barrel, 2));
  260. auto BPIX_L3 = constant("BPIX_L3", PixDetElem(PixSubDet::Barrel, 3));
  261. auto BPIX_L4 = constant("BPIX_L4", PixDetElem(PixSubDet::Barrel, 4));
  262. auto FPIX_L1 = constant("FPIX_L1", PixDetElem(PixSubDet::EndCap, 1));
  263. auto FPIX_L2 = constant("FPIX_L2", PixDetElem(PixSubDet::EndCap, 2));
  264. auto FPIX_L3 = constant("FPIX_L3", PixDetElem(PixSubDet::EndCap, 3));
  265. auto first_hit = constant("1st", 0);
  266. auto second_hit = constant("2nd", 1);
  267. // First hits on inner two bpix layers
  268. auto first_hits_in_B1 = fv::tup_apply(find_matched_nth_hit_in_layer,
  269. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L1, first_hit), "first_hits_in_B1");
  270. auto first_hits_in_B2 = fv::tup_apply(find_matched_nth_hit_in_layer,
  271. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L2, first_hit), "first_hits_in_B2");
  272. // Second hits on outer three bpix layers
  273. auto second_hits_in_B2 = fv::tup_apply(find_matched_nth_hit_in_layer,
  274. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L2, second_hit), "second_hits_in_B2");
  275. auto second_hits_in_B3 = fv::tup_apply(find_matched_nth_hit_in_layer,
  276. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L3, second_hit), "second_hits_in_B3");
  277. auto second_hits_in_B4 = fv::tup_apply(find_matched_nth_hit_in_layer,
  278. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, BPIX_L4, second_hit), "second_hits_in_B4");
  279. auto first_hits_in_F1 = fv::tup_apply(find_matched_nth_hit_in_layer,
  280. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L1, first_hit), "first_hits_in_F1");
  281. auto first_hits_in_F2 = fv::tup_apply(find_matched_nth_hit_in_layer,
  282. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L2, first_hit), "first_hits_in_F2");
  283. auto second_hits_in_F2 = fv::tup_apply(find_matched_nth_hit_in_layer,
  284. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L2, second_hit), "second_hits_in_F2");
  285. auto second_hits_in_F3 = fv::tup_apply(find_matched_nth_hit_in_layer,
  286. fv::tuple(seeds, pixrec_hits, sim_hits, tracks, sim_tracks, FPIX_L3, second_hit), "second_hits_in_F3");
  287. // Even vs Odd Ladders
  288. auto even = constant("even", false);
  289. auto odd = constant("odd", true);
  290. auto select_even_odd_ladder_blade_hit_pairs =
  291. func<vector<HitPair>(vector<HitPair>, bool)>("select_even_odd_ladder_blade_hit_pairs",
  292. FUNC(([](const vector<HitPair>& hit_pairs,
  293. const bool &&odd){
  294. vector<HitPair> even_pairs;
  295. for(const HitPair &hit_pair : hit_pairs){ // loop over all seeds
  296. if(std::get<PixRecHit>(hit_pair).ladder_blade % 2 == odd){
  297. even_pairs.push_back(hit_pair);
  298. }
  299. }
  300. return even_pairs;
  301. })));
  302. auto first_hits_in_B1_even_ladder = fv::tup_apply(select_even_odd_ladder_blade_hit_pairs,
  303. fv::tuple(first_hits_in_B1, even), "first_hits_in_B1_even_ladder");
  304. auto first_hits_in_B1_odd_ladder = fv::tup_apply(select_even_odd_ladder_blade_hit_pairs,
  305. fv::tuple(first_hits_in_B1, odd), "first_hits_in_B1_odd_ladder");
  306. auto first_hits_in_B2_even_ladder = fv::tup_apply(select_even_odd_ladder_blade_hit_pairs,
  307. fv::tuple(first_hits_in_B2, even), "first_hits_in_B2_even_ladder");
  308. auto first_hits_in_B2_odd_ladder = fv::tup_apply(select_even_odd_ladder_blade_hit_pairs,
  309. fv::tuple(first_hits_in_B2, odd), "first_hits_in_B2_odd_ladder");
  310. //Plots for dPhi of collections defined above
  311. auto calc_dphi_v_eta = lookup_function<pair_vec(vector<HitPair>)>("calc_dphi_v_eta");
  312. TH2Params params_dphi = {"$\\eta$", 100, -4, 4,
  313. "$\\Delta \\phi$(rad)", 150, -.0015, .0015};
  314. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1",
  315. fv::apply(calc_dphi_v_eta, first_hits_in_B1),
  316. "First Hit in BPIX-L1", params_dphi);
  317. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2",
  318. fv::apply(calc_dphi_v_eta, first_hits_in_B2),
  319. "First Hit in BPIX-L2", params_dphi);
  320. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1_even_ladder",
  321. fv::apply(calc_dphi_v_eta, first_hits_in_B1_even_ladder),
  322. "First Hit in BPIX-L1 - Even Ladders", params_dphi);
  323. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B1_odd_ladder",
  324. fv::apply(calc_dphi_v_eta, first_hits_in_B1_odd_ladder),
  325. "First Hit in BPIX-L1 - Odd Ladders", params_dphi);
  326. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2_even_ladder",
  327. fv::apply(calc_dphi_v_eta, first_hits_in_B2_even_ladder),
  328. "First Hit in BPIX-L2 - Even Ladders", params_dphi);
  329. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_B2_odd_ladder",
  330. fv::apply(calc_dphi_v_eta, first_hits_in_B2_odd_ladder),
  331. "First Hit in BPIX-L2 - Odd Ladders", params_dphi);
  332. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B2",
  333. fv::apply(calc_dphi_v_eta, second_hits_in_B2),
  334. "Second Hit in BPIX-L2", params_dphi);
  335. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B3",
  336. fv::apply(calc_dphi_v_eta, second_hits_in_B3),
  337. "Second Hit in BPIX-L3", params_dphi);
  338. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_B4",
  339. fv::apply(calc_dphi_v_eta, second_hits_in_B4),
  340. "Second Hit in BPIX-L4", params_dphi);
  341. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_F1",
  342. fv::apply(calc_dphi_v_eta, first_hits_in_F1),
  343. "First Hit in FPIX-L1", params_dphi);
  344. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_first_hits_in_F2",
  345. fv::apply(calc_dphi_v_eta, first_hits_in_F2),
  346. "First Hit in FPIX-L2", params_dphi);
  347. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_F2",
  348. fv::apply(calc_dphi_v_eta, second_hits_in_F2),
  349. "Second Hit in FPIX-L2", params_dphi);
  350. tds.register_container<ContainerTH2Many<float>>("dphi_v_eta_second_hits_in_F3",
  351. fv::apply(calc_dphi_v_eta, second_hits_in_F3),
  352. "Second Hit in FPIX-L3", params_dphi);
  353. //Plots for dr of collections defined above
  354. auto calc_dr_v_eta = lookup_function<pair_vec(vector<HitPair>)>("calc_dr_v_eta");
  355. TH2Params params_dr = {"$\\eta$", 100, -4, 4,
  356. "$\\Delta \\r$(rad)", 50, 0, .006};
  357. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1",
  358. fv::apply(calc_dr_v_eta, first_hits_in_B1),
  359. "First Hit in BPIX-L1", params_dr);
  360. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2",
  361. fv::apply(calc_dr_v_eta, first_hits_in_B2),
  362. "First Hit in BPIX-L2", params_dr);
  363. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1_even_ladder",
  364. fv::apply(calc_dr_v_eta, first_hits_in_B1_even_ladder),
  365. "First Hit in BPIX-L1 - Even Ladders", params_dr);
  366. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B1_odd_ladder",
  367. fv::apply(calc_dr_v_eta, first_hits_in_B1_odd_ladder),
  368. "First Hit in BPIX-L1 - Odd Ladders", params_dr);
  369. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2_even_ladder",
  370. fv::apply(calc_dr_v_eta, first_hits_in_B2_even_ladder),
  371. "First Hit in BPIX-L2 - Even Ladders", params_dr);
  372. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_B2_odd_ladder",
  373. fv::apply(calc_dr_v_eta, first_hits_in_B2_odd_ladder),
  374. "First Hit in BPIX-L2 - Odd Ladders", params_dr);
  375. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B2",
  376. fv::apply(calc_dr_v_eta, second_hits_in_B2),
  377. "Second Hit in BPIX-L2", params_dr);
  378. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B3",
  379. fv::apply(calc_dr_v_eta, second_hits_in_B3),
  380. "Second Hit in BPIX-L3", params_dr);
  381. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_B4",
  382. fv::apply(calc_dr_v_eta, second_hits_in_B4),
  383. "Second Hit in BPIX-L4", params_dr);
  384. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_F1",
  385. fv::apply(calc_dr_v_eta, first_hits_in_F1),
  386. "First Hit in FPIX-L1", params_dr);
  387. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_first_hits_in_F2",
  388. fv::apply(calc_dr_v_eta, first_hits_in_F2),
  389. "First Hit in FPIX-L2", params_dr);
  390. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_F2",
  391. fv::apply(calc_dr_v_eta, second_hits_in_F2),
  392. "Second Hit in FPIX-L2", params_dr);
  393. tds.register_container<ContainerTH2Many<float>>("dr_v_eta_second_hits_in_F3",
  394. fv::apply(calc_dr_v_eta, second_hits_in_F3),
  395. "Second Hit in FPIX-L3", params_dr);
  396. //Plots for dz of collections defined above
  397. auto calc_dz_v_eta = lookup_function<pair_vec(vector<HitPair>)>("calc_dz_v_eta");
  398. TH2Params params_dz = {"$\\eta$", 100, -4, 4,
  399. "$\\Delta z$(rad)", 50, -.01, .01};
  400. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1",
  401. fv::apply(calc_dz_v_eta, first_hits_in_B1),
  402. "First Hit in BPIX-L1", params_dz);
  403. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2",
  404. fv::apply(calc_dz_v_eta, first_hits_in_B2),
  405. "First Hit in BPIX-L2", params_dz);
  406. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_even_ladder",
  407. fv::apply(calc_dz_v_eta, first_hits_in_B1_even_ladder),
  408. "First Hit in BPIX-L1 - Even Ladders", params_dz);
  409. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B1_odd_ladder",
  410. fv::apply(calc_dz_v_eta, first_hits_in_B1_odd_ladder),
  411. "First Hit in BPIX-L1 - Odd Ladders", params_dz);
  412. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_even_ladder",
  413. fv::apply(calc_dz_v_eta, first_hits_in_B2_even_ladder),
  414. "First Hit in BPIX-L2 - Even Ladders", params_dz);
  415. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_first_hits_in_B2_odd_ladder",
  416. fv::apply(calc_dz_v_eta, first_hits_in_B2_odd_ladder),
  417. "First Hit in BPIX-L2 - Odd Ladders", params_dz);
  418. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B2",
  419. fv::apply(calc_dz_v_eta, second_hits_in_B2),
  420. "Second Hit in BPIX-L2", params_dz);
  421. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B3",
  422. fv::apply(calc_dz_v_eta, second_hits_in_B3),
  423. "Second Hit in BPIX-L3", params_dz);
  424. tds.register_container<ContainerTH2Many<float>>("dz_v_eta_second_hits_in_B4",
  425. fv::apply(calc_dz_v_eta, second_hits_in_B4),
  426. "Second Hit in BPIX-L4", params_dz);
  427. //Plots for drho of collections defined above
  428. auto calc_drho_v_eta = lookup_function<pair_vec(vector<HitPair>)>("calc_drho_v_eta");
  429. TH2Params params_drho = {"$\\eta$", 100, -4, 4,
  430. "$\\Delta \\rho$(cm)", 50, -.01, .01};
  431. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_first_hits_in_F1",
  432. fv::apply(calc_drho_v_eta, first_hits_in_F1),
  433. "First Hit in FPIX-L1", params_drho);
  434. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_first_hits_in_F2",
  435. fv::apply(calc_drho_v_eta, first_hits_in_F2),
  436. "First Hit in FPIX-L2", params_drho);
  437. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_second_hits_in_F2",
  438. fv::apply(calc_drho_v_eta, second_hits_in_F2),
  439. "Second Hit in FPIX-L2", params_drho);
  440. tds.register_container<ContainerTH2Many<float>>("drho_v_eta_second_hits_in_F3",
  441. fv::apply(calc_drho_v_eta, second_hits_in_F3),
  442. "Second Hit in FPIX-L3", params_drho);
  443. }
  444. void sc_value_hists_for_lb(TrackingDataSet& tds, std::function<bool(int)>& parity_check,
  445. const std::string& label){
  446. auto relabel = [label](const std::string&& base){
  447. return base + "_" + label;
  448. };
  449. auto BPIX_L1 = constant("BPIX_L1", PixDetElem(PixSubDet::Barrel, 1));
  450. auto FPIX_L1 = constant("FPIX_L1", PixDetElem(PixSubDet::EndCap, 1));
  451. auto BPIX_L2 = constant("BPIX_L2", PixDetElem(PixSubDet::Barrel, 2));
  452. auto FPIX_L2 = constant("FPIX_L2", PixDetElem(PixSubDet::EndCap, 2));
  453. auto BPIX_L3 = constant("BPIX_L3", PixDetElem(PixSubDet::Barrel, 3));
  454. auto FPIX_L3 = constant("FPIX_L2", PixDetElem(PixSubDet::EndCap, 3));
  455. auto BPIX_L4 = constant("BPIX_L4", PixDetElem(PixSubDet::Barrel, 4));
  456. auto first_hit = constant("1st", 0);
  457. auto second_hit = constant("2nd", 1);
  458. auto dRz = constant("dRz", true);
  459. auto dPhi = constant("dPhi", false);
  460. auto pcheck = constant(label, parity_check);
  461. auto sc_hit_residuals = lookup_function<
  462. pair_vec(vector<SuperCluster>, PixDetElem, int, bool, std::function<bool(int)>)>("sc_hit_residuals");
  463. // First hits on inner three bpix layers
  464. auto sc_first_hits_in_B1_dz = fv::tup_apply(sc_hit_residuals,
  465. fv::tuple(super_clusters, BPIX_L1, first_hit, dRz, pcheck), relabel("sc_first_hits_in_B1_dz"));
  466. auto sc_first_hits_in_B2_dz = fv::tup_apply(sc_hit_residuals,
  467. fv::tuple(super_clusters, BPIX_L2, first_hit, dRz, pcheck), relabel("sc_first_hits_in_B2_dz"));
  468. auto sc_first_hits_in_B3_dz = fv::tup_apply(sc_hit_residuals,
  469. fv::tuple(super_clusters, BPIX_L3, first_hit, dRz, pcheck), relabel("sc_first_hits_in_B3_dz"));
  470. auto sc_first_hits_in_B1_dphi = fv::tup_apply(sc_hit_residuals,
  471. fv::tuple(super_clusters, BPIX_L1, first_hit, dPhi, pcheck), relabel("sc_first_hits_in_B1_dphi"));
  472. auto sc_first_hits_in_B2_dphi = fv::tup_apply(sc_hit_residuals,
  473. fv::tuple(super_clusters, BPIX_L2, first_hit, dPhi, pcheck), relabel("sc_first_hits_in_B2_dphi"));
  474. auto sc_first_hits_in_B3_dphi = fv::tup_apply(sc_hit_residuals,
  475. fv::tuple(super_clusters, BPIX_L3, first_hit, dPhi, pcheck), relabel("sc_first_hits_in_B3_dphi"));
  476. // Second hits on outer three bpix layers
  477. auto sc_second_hits_in_B2_dz = fv::tup_apply(sc_hit_residuals,
  478. fv::tuple(super_clusters, BPIX_L2, second_hit, dRz, pcheck), relabel("sc_second_hits_in_B2_dz"));
  479. auto sc_second_hits_in_B3_dz = fv::tup_apply(sc_hit_residuals,
  480. fv::tuple(super_clusters, BPIX_L3, second_hit, dRz, pcheck), relabel("sc_second_hits_in_B3_dz"));
  481. auto sc_second_hits_in_B4_dz = fv::tup_apply(sc_hit_residuals,
  482. fv::tuple(super_clusters, BPIX_L4, second_hit, dRz, pcheck), relabel("sc_second_hits_in_B4_dz"));
  483. auto sc_second_hits_in_B2_dphi = fv::tup_apply(sc_hit_residuals,
  484. fv::tuple(super_clusters, BPIX_L2, second_hit, dPhi, pcheck), relabel("sc_second_hits_in_B2_dphi"));
  485. auto sc_second_hits_in_B3_dphi = fv::tup_apply(sc_hit_residuals,
  486. fv::tuple(super_clusters, BPIX_L3, second_hit, dPhi, pcheck), relabel("sc_second_hits_in_B3_dphi"));
  487. auto sc_second_hits_in_B4_dphi = fv::tup_apply(sc_hit_residuals,
  488. fv::tuple(super_clusters, BPIX_L4, second_hit, dPhi, pcheck), relabel("sc_second_hits_in_B4_dphi"));
  489. TH2Params params_dz = {"$\\eta$", 100, -4, 4,
  490. "$\\delta z$(cm)", 100, -0.7, 0.7};
  491. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B1_dz"),
  492. sc_first_hits_in_B1_dz,
  493. "First Hit in BPIX-L1", params_dz);
  494. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B2_dz"),
  495. sc_first_hits_in_B2_dz,
  496. "First Hit in BPIX-L2", params_dz);
  497. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B3_dz"),
  498. sc_first_hits_in_B3_dz,
  499. "First Hit in BPIX-L3", params_dz);
  500. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B2_dz"),
  501. sc_second_hits_in_B2_dz,
  502. "Second Hit in BPIX-L2", params_dz);
  503. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B3_dz"),
  504. sc_second_hits_in_B3_dz,
  505. "Second Hit in BPIX-L3", params_dz);
  506. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B4_dz"),
  507. sc_second_hits_in_B4_dz,
  508. "Second Hit in BPIX-L4", params_dz);
  509. TH2Params params_dphi = {"$\\eta$", 100, -4, 4,
  510. "$\\delta \\phi$(rad)", 1500, -0.7, 0.7};
  511. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B1_dphi"),
  512. sc_first_hits_in_B1_dphi,
  513. "First Hit in BPIX-L1", params_dphi);
  514. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B2_dphi"),
  515. sc_first_hits_in_B2_dphi,
  516. "First Hit in BPIX-L2", params_dphi);
  517. tds.register_container<ContainerTH2Many<float>>(relabel("sc_first_hits_in_B3_dphi"),
  518. sc_first_hits_in_B3_dphi,
  519. "First Hit in BPIX-L3", params_dphi);
  520. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B2_dphi"),
  521. sc_second_hits_in_B2_dphi,
  522. "Second Hit in BPIX-L2", params_dphi);
  523. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B3_dphi"),
  524. sc_second_hits_in_B3_dphi,
  525. "Second Hit in BPIX-L3", params_dphi);
  526. tds.register_container<ContainerTH2Many<float>>(relabel("sc_second_hits_in_B4_dphi"),
  527. sc_second_hits_in_B4_dphi,
  528. "Second Hit in BPIX-L4", params_dphi);
  529. }
  530. void setup_sc_residuals(TrackingDataSet& tds){
  531. /* sc_hit_residuals looks through all the super clusters in the event and
  532. * examins the matched pixel hits. It calculates a residual based on the
  533. * extrapolated position of the SC track and the position of the matched
  534. * hit.
  535. * det: 1 for barrel, 2 for endcap
  536. * pix_layer: 1-4 for barrel, 1-3 for endcap
  537. * hit_number: examin either the first or second matched hit
  538. * sel_dRz: True: calculate dR, False: calculate dz
  539. * pcheck: a boolean function that filters residuals based on
  540. * ladder/blade. Normally used to select either even or odd ladders.
  541. */
  542. func<pair_vec(vector<SuperCluster>,
  543. PixDetElem, int, bool, std::function<bool(int)>)>("sc_hit_residuals",
  544. FUNC(([](const vector<SuperCluster>& super_clusters,
  545. const PixDetElem&& pixdet,
  546. const int&& hit_number,
  547. const bool&& sel_dRz,
  548. const std::function<bool(int)>& pcheck){
  549. vector<float> residuals;
  550. vector<float> etas;
  551. for(const SuperCluster& super_cluster : super_clusters){ // loop over all super-clusters
  552. float dRz, dPhi;
  553. int ladder_blade;
  554. unsigned int nSeeds = super_cluster.charge.size();
  555. for(unsigned int seedIdx=0; seedIdx<nSeeds; seedIdx++){ // loop over all seeds associated w/ sc
  556. if(hit_number == 0){
  557. if(!pixdet.contains((PixSubDet)super_cluster.subDet1[seedIdx], super_cluster.lay1[seedIdx])) continue;
  558. dRz = super_cluster.dRz1[seedIdx];
  559. dPhi = super_cluster.dPhi1[seedIdx];
  560. ladder_blade = super_cluster.ladder_blade1[seedIdx];
  561. }else{
  562. if(!pixdet.contains((PixSubDet)super_cluster.subDet2[seedIdx], super_cluster.lay2[seedIdx])) continue;
  563. dRz = super_cluster.dRz2[seedIdx];
  564. dPhi = super_cluster.dPhi2[seedIdx];
  565. ladder_blade = super_cluster.ladder_blade2[seedIdx];
  566. }
  567. DEBUG("New Seed, Idx: " << seedIdx << endl
  568. << "\tdRz: " << dRz << endl
  569. << "\tdPhi: " << dPhi << endl);
  570. if(!pcheck(ladder_blade)) continue;
  571. if(sel_dRz)
  572. residuals.push_back(dRz);
  573. else
  574. residuals.push_back(dPhi);
  575. etas.push_back(pseudorapidityP(super_cluster));
  576. }
  577. }
  578. return std::make_pair(etas,residuals);
  579. })));
  580. std::function<bool(int)> even = [](const int& t){ return !(t%2); };
  581. std::function<bool(int)> odd = [](const int& t){ return (t%2); };
  582. sc_value_hists_for_lb(tds, even, "even");
  583. sc_value_hists_for_lb(tds, odd, "odd");
  584. }
  585. void setup_residual_cross_corrolations(TrackingDataSet& tds){
  586. /*
  587. * Interesting cross-corrolations
  588. * for hit1 in L1 or L2
  589. * dphi2 v dz1
  590. * dz2 v dz1
  591. * dphi2 v dphi1
  592. * dz2 v dphi1
  593. */
  594. enum Res{
  595. dz1,
  596. dz2,
  597. dPhi1,
  598. dPhi2
  599. };
  600. auto sc_cross_correlations = func<pair_vec(vector<SuperCluster>,
  601. PixDetElem, PixDetElem, Res, Res)>("sc_cross_correlations",
  602. FUNC(([](const vector<SuperCluster>& super_clusters,
  603. const PixDetElem&& subdet1,
  604. const PixDetElem&& subdet2,
  605. const Res&& res1,
  606. const Res&& res2){
  607. vector<float> residuals1;
  608. vector<float> residuals2;
  609. for(const SuperCluster& super_cluster : super_clusters){ // loop over all supser-clusters
  610. unsigned int nSeeds = super_cluster.charge.size();
  611. for(unsigned int seedIdx=0; seedIdx<nSeeds; seedIdx++){ // loop over all seeds associated w/ sc
  612. if (!subdet1.contains((PixSubDet)super_cluster.subDet1[seedIdx],super_cluster.lay1[seedIdx]) ||
  613. !subdet2.contains((PixSubDet)super_cluster.subDet2[seedIdx],super_cluster.lay2[seedIdx]))
  614. continue;
  615. switch(res1){
  616. case Res::dz1:
  617. residuals1.push_back(super_cluster.dRz1[seedIdx]);
  618. break;
  619. case Res::dz2:
  620. residuals1.push_back(super_cluster.dRz2[seedIdx]);
  621. break;
  622. case Res::dPhi1:
  623. residuals1.push_back(super_cluster.dPhi1[seedIdx]);
  624. break;
  625. case Res::dPhi2:
  626. residuals1.push_back(super_cluster.dPhi2[seedIdx]);
  627. break;
  628. }
  629. switch(res2){
  630. case Res::dz1:
  631. residuals2.push_back(super_cluster.dRz1[seedIdx]);
  632. break;
  633. case Res::dz2:
  634. residuals2.push_back(super_cluster.dRz2[seedIdx]);
  635. break;
  636. case Res::dPhi1:
  637. residuals2.push_back(super_cluster.dPhi1[seedIdx]);
  638. break;
  639. case Res::dPhi2:
  640. residuals2.push_back(super_cluster.dPhi2[seedIdx]);
  641. break;
  642. }
  643. }
  644. }
  645. return std::make_pair(residuals1,residuals2);
  646. })));
  647. auto BPIX_L1 = constant("BPIX_L1", PixDetElem(PixSubDet::Barrel, 1));
  648. auto BPIX_L2 = constant("BPIX_L2", PixDetElem(PixSubDet::Barrel, 2));
  649. auto BPIX_L3 = constant("BPIX_L3", PixDetElem(PixSubDet::Barrel, 3));
  650. auto BPIX_L4 = constant("BPIX_L4", PixDetElem(PixSubDet::Barrel, 4));
  651. auto v_dz1 = constant("dz1", Res::dz1);
  652. auto v_dz2 = constant("dz2", Res::dz2);
  653. auto v_dPhi1 = constant("dPhi1", Res::dPhi1);
  654. auto v_dPhi2 = constant("dPhi2", Res::dPhi2);
  655. auto sc_dphi2_v_dz1_L1_L2 = fv::tup_apply(sc_cross_correlations,
  656. fv::tuple(super_clusters, BPIX_L1, BPIX_L2, v_dPhi2, v_dz1), "sc_dphi1_v_dz1_L1_L2");
  657. auto sc_dz2_v_dz1_L1_L2 = fv::tup_apply(sc_cross_correlations,
  658. fv::tuple(super_clusters, BPIX_L1, BPIX_L2, v_dz2, v_dz1), "sc_dz2_v_dz1_L1_L2");
  659. auto sc_dphi2_v_dphi1_L1_L2 = fv::tup_apply(sc_cross_correlations,
  660. fv::tuple(super_clusters, BPIX_L1, BPIX_L2, v_dPhi2, v_dPhi1), "sc_dphi1_v_dphi1_L1_L2");
  661. auto sc_dz2_v_dphi1_L1_L2 = fv::tup_apply(sc_cross_correlations,
  662. fv::tuple(super_clusters, BPIX_L1, BPIX_L2, v_dz2, v_dPhi1), "sc_dz2_v_dphi1_L1_L2");
  663. TH2Params hist_params = TH2Params::lookup("sc_dphi2_v_dz1_L1_L2");
  664. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dz1_L1_L2",
  665. sc_dphi2_v_dz1_L1_L2,
  666. "sc_dphi2_v_dz1_L1_L2", hist_params);
  667. hist_params = TH2Params::lookup("sc_dz2_v_dz1_L1_L2");
  668. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dz1_L1_L2",
  669. sc_dz2_v_dz1_L1_L2,
  670. "sc_dz2_v_dz1_L1_L2", hist_params);
  671. hist_params = TH2Params::lookup("sc_dphi2_v_dphi1_L1_L2");
  672. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dphi1_L1_L2",
  673. sc_dphi2_v_dphi1_L1_L2,
  674. "sc_dphi2_v_dphi1_L1_L2", hist_params);
  675. hist_params = TH2Params::lookup("sc_dz2_v_dphi1_L1_L2");
  676. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dphi1_L1_L2",
  677. sc_dz2_v_dphi1_L1_L2,
  678. "sc_dz2_v_dphi1_L1_L2", hist_params);
  679. hist_params = TH2Params::lookup("sc_dz2_v_dz1_L1_L2_zoom");
  680. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dz1_L1_L2_zoom",
  681. sc_dz2_v_dz1_L1_L2,
  682. "sc_dz2_v_dz1_L1_L2_zoom", hist_params);
  683. hist_params = TH2Params::lookup("sc_dz2_v_dphi1_L1_L2_zoom");
  684. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dphi1_L1_L2_zoom",
  685. sc_dz2_v_dphi1_L1_L2,
  686. "sc_dz2_v_dphi1_L1_L2_zoom", hist_params);
  687. hist_params = TH2Params::lookup("sc_dphi2_v_dphi1_L1_L2_zoom");
  688. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dphi1_L1_L2_zoom",
  689. sc_dphi2_v_dphi1_L1_L2,
  690. "sc_dphi2_v_dphi1_L1_L2_zoom", hist_params);
  691. auto sc_dphi2_v_dz1_L1_L3 = fv::tup_apply(sc_cross_correlations,
  692. fv::tuple(super_clusters, BPIX_L1, BPIX_L3, v_dPhi2, v_dz1), "sc_dphi1_v_dz1_L1_L3");
  693. auto sc_dz2_v_dz1_L1_L3 = fv::tup_apply(sc_cross_correlations,
  694. fv::tuple(super_clusters, BPIX_L1, BPIX_L3, v_dz2, v_dz1), "sc_dz2_v_dz1_L1_L3");
  695. auto sc_dphi2_v_dphi1_L1_L3 = fv::tup_apply(sc_cross_correlations,
  696. fv::tuple(super_clusters, BPIX_L1, BPIX_L3, v_dPhi2, v_dPhi1), "sc_dphi1_v_dphi1_L1_L3");
  697. auto sc_dz2_v_dphi1_L1_L3 = fv::tup_apply(sc_cross_correlations,
  698. fv::tuple(super_clusters, BPIX_L1, BPIX_L3, v_dz2, v_dPhi1), "sc_dz2_v_dphi1_L1_L3");
  699. hist_params = TH2Params::lookup("sc_dphi2_v_dz1_L1_L2");
  700. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dz1_L1_L3",
  701. sc_dphi2_v_dz1_L1_L3,
  702. "sc_dphi2_v_dz1_L1_L3", hist_params);
  703. hist_params = TH2Params::lookup("sc_dz2_v_dz1_L1_L2");
  704. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dz1_L1_L3",
  705. sc_dz2_v_dz1_L1_L3,
  706. "sc_dz2_v_dz1_L1_L3", hist_params);
  707. hist_params = TH2Params::lookup("sc_dphi2_v_dphi1_L1_L2");
  708. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dphi1_L1_L3",
  709. sc_dphi2_v_dphi1_L1_L3,
  710. "sc_dphi2_v_dphi1_L1_L3", hist_params);
  711. hist_params = TH2Params::lookup("sc_dz2_v_dphi1_L1_L2");
  712. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dphi1_L1_L3",
  713. sc_dz2_v_dphi1_L1_L3,
  714. "sc_dz2_v_dphi1_L1_L3", hist_params);
  715. hist_params = TH2Params::lookup("sc_dz2_v_dz1_L1_L2_zoom");
  716. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dz1_L1_L3_zoom",
  717. sc_dz2_v_dz1_L1_L3,
  718. "sc_dz2_v_dz1_L1_L3_zoom", hist_params);
  719. hist_params = TH2Params::lookup("sc_dz2_v_dphi1_L1_L2_zoom");
  720. tds.register_container<ContainerTH2Many<float>>("sc_dz2_v_dphi1_L1_L3_zoom",
  721. sc_dz2_v_dphi1_L1_L3,
  722. "sc_dz2_v_dphi1_L1_L3_zoom", hist_params);
  723. hist_params = TH2Params::lookup("sc_dphi2_v_dphi1_L1_L2_zoom");
  724. tds.register_container<ContainerTH2Many<float>>("sc_dphi2_v_dphi1_L1_L3_zoom",
  725. sc_dphi2_v_dphi1_L1_L3,
  726. "sc_dphi2_v_dphi1_L1_L3_zoom", hist_params);
  727. }
  728. void run_analysis(const vector<fv::util::DataFileDescriptor>& dfds, const string output_filename, bool silent){
  729. gSystem->Load("libfilval.so");
  730. auto replace_suffix = [](const std::string& input, const std::string& new_suffix){
  731. return input.substr(0, input.find_last_of(".")) + new_suffix;
  732. };
  733. string log_filename = replace_suffix(output_filename, ".log");
  734. fv::util::Log::init_logger(log_filename, fv::util::LogPriority::kLogInfo);
  735. TrackingDataSet tds(output_filename, dfds, "trackingNtuple/tree");
  736. /* tds.set_max_events(10); */
  737. register_objects(tds);
  738. setup_hit_pair_functions();
  739. setup_first_hit_pairs(tds);
  740. setup_skipped_layer_hit_pairs(tds);
  741. setup_sc_residuals(tds);
  742. setup_residual_cross_corrolations(tds);
  743. tds.process(silent);
  744. tds.save_all();
  745. }
  746. int main(int argc, char * argv[]){
  747. fv::util::ArgParser args(argc, argv);
  748. bool silent = args.cmdOptionExists("-s");
  749. string output_filename = args.cmdOptionExists("-o") ? args.getCmdOption("-o") : "output.root";
  750. if(args.cmdOptionExists("-c")){
  751. fv::util::init_config(args.getCmdOption("-c"));
  752. }
  753. if(args.cmdOptionExists("-F")){
  754. auto file_list = fv::util::read_input_list(args.getCmdOption("-F"));
  755. run_analysis(file_list, output_filename, silent);
  756. }else if(args.cmdOptionExists("-f")){
  757. string input_filename = args.getCmdOption("-f");
  758. string data_label = args.cmdOptionExists("-l") ? args.getCmdOption("-l") : "";
  759. string data_category = args.cmdOptionExists("-c") ? args.getCmdOption("-c") : "";
  760. fv::util::DataFileDescriptor dfd(input_filename, data_label, data_category);
  761. run_analysis(std::vector<fv::util::DataFileDescriptor>({dfd}), output_filename, silent);
  762. }else {
  763. cout << "Usage: ./tracking_validation (-s) {-o output_filename} -F datafiles.txt" << endl;
  764. cout << " ./tracking_validation (-s) {-l DATA_LABEL} {-c DATA_CATEGORY} {-o output_filename} -f treefile.root" << endl;
  765. }
  766. return 0;
  767. }
  768. /* int main(int argc, char * argv[]){ */
  769. /* using namespace fv::util; */
  770. /* init_config(argv[1]); */
  771. /* int max_events = the_config.get("max-events").as<int>(); */
  772. /* cout << max_events << endl; */
  773. /* } */