ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/L1RpcTriggerAnalysis/src/PatternManager.cc
Revision: 1.8
Committed: Fri May 24 16:47:50 2013 UTC (11 years, 11 months ago) by konec
Content type: text/plain
Branch: MAIN
Changes since 1.7: +16 -7 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "UserCode/L1RpcTriggerAnalysis/interface/PatternManager.h"
2
3 #include "UserCode/L1RpcTriggerAnalysis/interface/EventObj.h"
4 #include "UserCode/L1RpcTriggerAnalysis/interface/TrackObj.h"
5 #include "UserCode/L1RpcTriggerAnalysis/interface/HitSpecObj.h"
6
7 #include "UserCode/L1RpcTriggerAnalysis/interface/RPCDetIdUtil.h"
8 #include "UserCode/L1RpcTriggerAnalysis/interface/DTphDigiSpec.h"
9 #include "UserCode/L1RpcTriggerAnalysis/interface/CSCDigiSpec.h"
10 #include "UserCode/L1RpcTriggerAnalysis/interface/RPCDigiSpec.h"
11 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
12
13 #include "UserCode/L1RpcTriggerAnalysis/interface/Pattern.h"
14 #include "UserCode/L1RpcTriggerAnalysis/interface/GoldenPattern.h"
15
16 #include "TFile.h"
17 #include "TTree.h"
18
19 namespace {
20 typedef struct {
21 UInt_t key_det;
22 unsigned int key_pt;
23 unsigned int key_phi;
24 int key_ch;
25 unsigned int pat_Case;
26 UInt_t patDet;
27 int posOrBend;
28 unsigned int freq;
29 } ENTRY;
30 }
31
32 PatternManager::PatternManager(const edm::ParameterSet &cfg)
33 : theConfig(cfg), theEvForPatCounter(0), theEvUsePatCounter(0)
34
35 {}
36
37 PatternManager::~PatternManager()
38 {
39 std::cout <<" Events checked for pattenrs: " << theEvForPatCounter << std::endl;
40 std::cout <<" Events used for pattenrs: " << theEvUsePatCounter << std::endl;
41 std::cout <<" Size of GoldenPatterns: " << theGPs.size() << std::endl;
42 if (theConfig.getUntrackedParameter<bool>("dump",false)) {
43 for (std::map< GoldenPattern::Key, GoldenPattern>::const_iterator
44 im = theGPs.begin(); im!= theGPs.end(); ++im) {
45 std::cout <<" GP: "<< (*im).second << std::endl;
46 }
47 }
48
49 }
50
51 void PatternManager::run(const EventObj* ev, const TrackObj * simu, const HitSpecObj * hitSpec, const VDigiSpec & vDigi)
52 {
53 if (!hitSpec) return;
54 if (hitSpec->rawId() == 0 ) return;
55 double phiref = hitSpec->position().phi();
56 double ptref = simu->pt();
57 int chargeref = simu->charge();
58 unsigned int detref = hitSpec->rawId();
59 /*
60 if (detref != 637602109 && detref != 637634877 &&
61 detref != 637599914 && detref != 637632682 ) return;
62
63 bool precisePos = ( fabs(hitSpec->position().phi()-1.025) < 0.001);
64 if (!precisePos) return;
65 if ( simu->pt() < 16.) return;
66 */
67
68
69 GoldenPattern::Key key( detref, ptref, chargeref, phiref);
70
71 Pattern pattern;
72 theEvForPatCounter++;
73 for (VDigiSpec::const_iterator is= vDigi.begin(); is!=vDigi.end(); is++) {
74 bool isOK = pattern.add(*is);
75 if (!isOK) return;
76 }
77 if (pattern.size() == 0) return;
78 theEvUsePatCounter++;
79
80 if (theGPs.find(key)==theGPs.end()) theGPs[key]=GoldenPattern(key);
81 theGPs[key].add(pattern);
82
83 }
84
85 L1Obj PatternManager::check(const EventObj* ev, const TrackObj * simu, const HitSpecObj * hitSpec, const VDigiSpec & vDigi)
86 {
87 L1Obj candidate;
88 if (!hitSpec) return candidate;
89 if (hitSpec->rawId() == 0 ) return candidate;
90 double phiref = hitSpec->position().phi();
91 double ptref = simu->pt();
92 int chargeref = simu->charge();
93 unsigned int detref = hitSpec->rawId();
94 /*
95 if (detref != 637602109 && detref != 637634877 &&
96 detref != 637599914 && detref != 637632682 ) return candidate;
97
98 bool precisePos = ( fabs(hitSpec->position().phi()-1.025) < 0.001);
99 if (!precisePos) return candidate;
100 if ( simu->pt() < 26. || simu->pt() > 27. ) return candidate;
101
102 */
103 // std::cout <<" ------------------ EVENT: " << std::endl;
104 std::vector<Pattern> vpattern(1);
105 theEvForPatCounter++;
106 static bool skipRpcData = theConfig.getUntrackedParameter<bool>("skipRpcData", false);
107 static bool skipDtCscData = theConfig.getUntrackedParameter<bool>("skipDtCscData",false);
108 for (VDigiSpec::const_iterator is= vDigi.begin(); is!=vDigi.end(); is++) {
109 DetId detId( is->first);
110 if (skipRpcData && detId.subdetId()==MuonSubdetId::RPC) continue;
111 if (skipDtCscData && (detId.subdetId()==MuonSubdetId::DT || detId.subdetId()==MuonSubdetId::CSC) ) continue;
112 Pattern::add(vpattern,*is);
113 }
114 if (vpattern[0].size() == 0) return candidate;
115 // std::cout <<" ------------------ END EVENT, NOW COMPARE, has #patterns: "<<vpattern.size()<<" vpattern[0].size="<<vpattern[0].size() << std::endl;
116
117 GoldenPattern::Key thisKey(detref, ptref, chargeref, phiref );
118 // std::cout << thisKey << std::endl;
119
120 GoldenPattern::Result bestMatching;
121 GoldenPattern::Key bestKey;
122 for (auto ip=vpattern.begin(); ip!= vpattern.end();++ip) {
123 const Pattern & pattern = *ip;
124 // std::cout << " HAS PATTERN "<<pattern << std::endl;
125 for (std::map< GoldenPattern::Key, GoldenPattern>::iterator igps = theGPs.begin(); igps != theGPs.end(); igps++) {
126 // if (!(thisKey==igps->first)) continue;
127 GoldenPattern & gp = igps->second;
128 GoldenPattern::Result result = gp.compare(pattern);
129 // if (!result.hasRpcDet(637602109) && !result.hasRpcDet(637634877) && !result.hasRpcDet(637599914) && !result.hasRpcDet(637632682)) continue;
130 // if (!result.hasRpcDet(igps->first.theDet)) continue;
131 // if (result.nMatchedTot() < 5 )continue;
132 // if (!result) continue;
133 // std::cout <<"PATT KEY: "<<igps->first<<" "<<result ; //<<std::endl;
134 if (bestMatching < result) {
135 bestMatching = result;
136 bestKey = igps->first;
137 // std::cout <<" ----"<<" pt: "<< bestKey.ptValue()<<std::endl;
138 }
139 //else std::cout <<std::endl;
140 }
141 }
142
143 // std::cout <<" ------------------ END COMPARE: " << std::endl;
144 // std::cout <<"BEST KEY: "<<bestKey<<" "<< bestMatching<<std::cout <<" ######"<<" pt: "<< bestKey.ptValue()<<std::endl;
145 // abort();
146 if (bestMatching) {
147 candidate.pt = bestKey.ptValue();
148 candidate.eta = 1.;
149 candidate.phi = bestKey.phiValue();
150 candidate.q = bestMatching.nMatchedTot();
151 candidate.type = L1Obj::OTF;
152 }
153 return candidate;
154
155 }
156
157
158 void PatternManager::beginJob()
159 {
160 if ( !theConfig.exists("patternInpFile") ) return;
161 std::string patternInpFileName = theConfig.getParameter<std::string>("patternInpFile");
162 TFile patternInpFile( patternInpFileName.c_str());
163 TTree * tree = (TTree*) patternInpFile.Get("FlatPatterns");
164 static ENTRY entry;
165 tree->SetBranchAddress("entry",&entry);
166 Int_t nentries = (Int_t) tree->GetEntries();
167 for (Int_t i=0; i<nentries; i++) {
168 tree->GetEntry(i);
169 GoldenPattern::Key key;
170 key.theDet = entry.key_det;
171 key.thePtCode = entry.key_pt;
172 key.thePhiCode = entry.key_phi;
173 key.theCharge = entry.key_ch;
174 GoldenPattern::PosBenCase pat_Case = static_cast<GoldenPattern::PosBenCase>(entry.pat_Case);
175 if (theGPs.find(key)==theGPs.end()) theGPs[key]=GoldenPattern(key);
176 theGPs[key].add(pat_Case, entry.patDet, entry.posOrBend, entry.freq);
177 }
178 delete tree;
179 patternInpFile.Close();
180 }
181
182 void PatternManager::endJob()
183 {
184 for (std::map< GoldenPattern::Key, GoldenPattern>::iterator igps = theGPs.begin(); igps != theGPs.end(); igps++) {
185 GoldenPattern & gp = igps->second;
186 gp.purge();
187 }
188
189 if ( !theConfig.exists("patternOutFile") ) return;
190 std::string patternOutFileName = theConfig.getParameter<std::string>("patternOutFile");
191 TFile patternOutFile( patternOutFileName.c_str(),"RECREATE");
192
193 static ENTRY entry;
194 TTree *tree = new TTree("FlatPatterns","FlatPatterns");
195 tree->Branch("entry",&entry,"key_det/i:key_pt/i:key_phi/i:key_ch/I:pat_Case/i:patDet/i:posOrBend/I:freq/i");
196
197 for (std::map< GoldenPattern::Key, GoldenPattern>::const_iterator igps = theGPs.begin(); igps != theGPs.end(); igps++) {
198 const GoldenPattern & gp = igps->second;
199 entry.key_det = gp.theKey.theDet;
200 entry.key_pt = gp.theKey.thePtCode;
201 entry.key_phi = gp.theKey.thePhiCode;
202 entry.key_ch = gp.theKey.theCharge;
203 for (unsigned int iCase =1; iCase <=5; ++iCase) {
204 entry.pat_Case = iCase;
205 const GoldenPattern::DetFreq * detFreq = 0;
206 if (iCase==GoldenPattern::POSRPC) detFreq = &gp.posRpc;
207 if (iCase==GoldenPattern::POSCSC) detFreq = &gp.posCsc;
208 if (iCase==GoldenPattern::BENCSC) detFreq = &gp.bendingCsc;
209 if (iCase==GoldenPattern::POSDT ) detFreq = &gp.posDt;
210 if (iCase==GoldenPattern::BENDT ) detFreq = &gp.bendingDt;
211 for (GoldenPattern::DetFreq::const_iterator idf = detFreq->begin(); idf != detFreq->end(); idf++) {
212 entry.patDet = idf->first;
213 for (GoldenPattern::MFreq::const_iterator imf = idf->second.begin(); imf != idf->second.end(); imf++) {
214 entry.posOrBend = imf->first;
215 entry.freq = imf->second;
216 tree->Fill();
217 }
218 }
219 }
220 }
221 patternOutFile.Write();
222 patternOutFile.Close();
223 // delete tree;
224 }
225