MarlinTrkProcessors  2.4.1
MCPMap.h
1 #ifndef __MCPMAP__h
2 #define __MCPMAP__h 1
3 
4 #include "lcio.h"
5 #include <vector>
6 #include <map>
7 #include <EVENT/SimTrackerHit.h>
8 #include <EVENT/MCParticle.h>
9 
10  typedef std::vector<SimTrackerHit*> SimTrackerHitVec;
11  typedef std::multimap< MCParticle* , SimTrackerHit* > SegmentMap;
12  typedef SegmentMap::iterator segIter;
13  typedef std::map< MCParticle* , SimTrackerHitVec > MCPMap;
14  typedef std::pair< MCParticle* , SimTrackerHitVec > MCPMapPair;
15 
16 
17  //以下のクラスはメソッドしかない。namespaceをクラス内で定義しちゃいけないらしく仕方なくこうした。
18  //主な使用用途は、MCParticleとSimTrackerHitのLCRelationを作りたい場合などに有効である。
19  //
20  class moriUTIL{
21  public :
22  moriUTIL(){;}
23  //もしこのクラスの外で以下のtypedefしてないならコメント外す
24 
25  /***以下は内部処理用の関数。ユーザーはMakeSegmentMap(Mが大文字なのに注意)を使えばそれで済む。*****/
26  /***MakeSegmentMapの定義は一番下にある。**********************************************************/
27  //内部処理用
28  SegmentMap makeSegmentMap(SimTrackerHitVec simthits){
29  int nsth = simthits.size();
30  SegmentMap map;
31  for(int i = 0 ; i < nsth ; i++){
32  SimTrackerHit* sth = simthits[i];
33  map.insert( std::make_pair( sth->getMCParticle() , sth ) );
34  }
35  return map;
36  }
37 
38  //for inner process
39  MCParticleVec getMCParticlesFromSegmentMap(SegmentMap map){
40  segIter it = map.begin();
41  MCParticleVec mcps;
42  mcps.push_back(it->first);
43  it++;
44  while(it != map.end()){
45  if(mcps.back() != it->first){
46  mcps.push_back(it->first);
47  }
48  it++;
49  }
50  return mcps;
51  }
52 
53  //for inner process
54  SimTrackerHitVec getSimTrackerHitVecFromSegmentMap(MCParticle* mcp, SegmentMap map ){
55  SimTrackerHitVec simthits;
56  simthits.reserve(10);//だいたい1MCPにつき10個以内のヒットがあると予想。
57  //push_backによるcapacityの自動調整を少なくする目的でつけた。
58  typedef std::pair<segIter,segIter> EqualRange;
59  EqualRange ret = map.equal_range( mcp );
60  for(segIter it = ret.first; it != ret.second; it++){
61  simthits.push_back(it->second);
62  }
63  return simthits;
64  }
65 
66  //for inner process
67  MCPMap makeMCPMap(SegmentMap map){
68  MCParticleVec mcps = getMCParticlesFromSegmentMap(map);
69  int size = mcps.size();
70  MCPMap mcpmap;
71  for(int i = 0; i < size; i++){
72  SimTrackerHitVec simthits = getSimTrackerHitVecFromSegmentMap(mcps[i], map );
73  mcpmap.insert( std::make_pair( mcps[i], simthits ) );
74  }
75  return mcpmap;
76  }
77 
79  //This is the tool for users.
81  MCPMap MakeMCPMap(SimTrackerHitVec simthits){
82  if(simthits.size() == 0){
83  std::cout << "Fatal Error!! (MakeMCPMap cannot do with SimTrackerHitVec with size = 0 )" << std::endl;
84  MCPMap empty;
85  empty.clear();
86  return empty;
87  }
88  SegmentMap segmap = makeSegmentMap(simthits);
89  MCPMap mcpmap = makeMCPMap(segmap);
90  return mcpmap;
91  }
92  //例えば、SimTrackerHit Collectionにある全ヒットをここにぶち込めばMCPMapができあがる。
93  //あるいは、Trackにアサインされたヒットのsimtrackerhitだけをぶち込めばtrackのヒットpurityや
94  //picking efficiencyなんかも計算できるようになる。
95  //あとは、LCRelationを作るのもいいし、ROOT解析のために使っても良い。
96  };//moriUtil ends
97 
98 
99 
100 #endif
101 
102 
103 
Definition: MCPMap.h:20