BmnRoot
Loading...
Searching...
No Matches
BmnEmbedding.cxx
Go to the documentation of this file.
1#include "BmnEmbedding.h"
2
4
5BmnStatus BmnEmbedding::Embed(TString inSourceName,
6 TString inBaseName,
7 TString destName,
8 Int_t code,
9 vector<Int_t> outCodes,
10 Bool_t turnOffBaseDigits
11 // TString inDSTName
12)
13{
14
15 fCode = code;
16 fOutCodes = outCodes;
17 // UInt_t fPeriodId = 7;
18 // Int_t EmbeddedType = 1;
19 Bool_t addMatch = kFALSE;
20 Bool_t isExp = kTRUE;
21 Bool_t isHitMakerEfficiencyMode = kFALSE;
22 Bool_t isRescale = kTRUE;
23
24 /* Hits branches */
25 vector<TString> digiNames = {"BmnSiliconDigit", "BmnGemStripDigit", "BmnCSCDigit"};
26 vector<TString> digiNamesOther;
27 vector<TString> outMCNames = {"BmnSiliconDigit", "BmnGemStripDigit", "BmnCSCDigit", "StsPoint",
28 "SiliconPoint", "CSCPoint", "GeoTracks"};
29 vector<TString> outExpNames = {"SILICON", "GEM", "CSC"};
30 // vector<Double_t> stripDigitThreshold = {180, 15, 50};
31 vector<TF1*> funcsMC;
32 vector<TF1*> funcsEx;
33 vector<TF1*> funcsRescale;
34 vector<TString> digiOutExpNames = (isExp == kTRUE) ? outExpNames : outMCNames;
35
36 vector<TClass*> digiClasses; // = {
37 // BmnSiliconDigit::Class(), BmnGemStripDigit::Class(), BmnCSCDigit::Class()};
38 vector<TClass*> digiClassesOther;
39 vector<TString> matchNames = {"BmnSiliconDigitMatch", "BmnGemStripDigitMatch", "BmnCSCDigitMatch"};
40
41 // TList* fBranchList = new TList();
42 // BmnFieldPar *fieldPar = nullptr;
43 DigiRunHeader* rhBase = nullptr;
44 UInt_t fNArs = digiNames.size();
45
46 // Int_t retn = system(Form("cp %s %s", inBaseName.Data(), destName.Data()));
47 // printf("copy return %d\n", retn);
48 // RemoveBranches(destName, digiExpNames);
49
50 /*****************************/
52 /*****************************/
53 TFile* fSourceHits = new TFile(inSourceName, "READ");
54 if (fSourceHits->IsOpen() == false) {
55 printf("\n!!!!\ncannot open file %s !\n", inSourceName.Data());
56 return kBMNERROR;
57 }
58 printf("\nINPUT SOURCE FILE: ");
59 printf("%s\n", inSourceName.Data());
60 fInTreeSource = (TTree*)fSourceHits->Get("bmndata");
61 UInt_t fNEventSource = fInTreeSource->GetEntries();
62 for (UInt_t i = 0; i < fNArs; i++) {
63 TClonesArray* arDigi = nullptr; // new TClonesArray(BmnCSCHit::Class());
64 printf("digiNames[%d] %s \n", i, digiNames[i].Data());
65 fInTreeSource->SetBranchAddress(digiNames[i].Data(), &arDigi);
66 digiSourceArs.push_back(arDigi);
67 if (i < matchNames.size()) {
68 if (addMatch == kTRUE) {
69 TClonesArray* ar = nullptr;
70 fInTreeSource->SetBranchAddress(matchNames[i].Data(), &ar);
71 matchSourceArs.push_back(ar);
72 } else
73 fInTreeSource->SetBranchStatus(matchNames[i] + ".*", 0);
74 }
75 }
76 mcTracks = digiSourceArs[3];
77 stsPoints = digiSourceArs[4];
78 silPoints = digiSourceArs[5];
79 cscPoints = digiSourceArs[6];
80 fInTreeSource->SetBranchAddress(EHMCName.Data(), &mcEH);
81
82 // Int_t retn = system(Form("cp %s %s", inBaseName.Data(), destName.Data()));
83 // printf("ret %d\n", retn);
84 // fflush(stdout);
85
86 TString tempBaseName = inBaseName + "-temp.root";
87 CloneSelected(inBaseName, tempBaseName);
88
89 /*****************************/
91 /*****************************/
92 TFile* fBaseHits = new TFile(tempBaseName, "READ");
93 if (fBaseHits->IsOpen() == false) {
94 printf("\n!!!!\ncannot open file %s !\n", tempBaseName.Data());
95 return kBMNERROR;
96 }
97 printf("\nINPUT BASE FILE: ");
98 printf("%s\n", tempBaseName.Data());
99 fInTreeBase = (TTree*)fBaseHits->Get("bmndata");
100 rhBase = (DigiRunHeader*)fBaseHits->Get(RHDigiName.Data());
101 TObjArray* digiBaseBrsFull = fInTreeBase->GetListOfBranches();
102 TIterator* it = digiBaseBrsFull->MakeIterator();
103 it->Reset();
104 TBranch* b = NULL;
105 while ((b = (TBranch*)it->Next())) { // select other branches(not strip digits)
106 // TClass * cl = nullptr;
107 Bool_t notOther = kFALSE;
108 for (UInt_t i = 0; i < fNArs; i++) {
109 if (strcmp(b->GetName(), digiOutExpNames[i].Data()) == 0) {
110 notOther = kTRUE;
111 break;
112 }
113 }
114 if (strcmp(b->GetName(), EHDigiName.Data()) == 0)
115 notOther = kTRUE;
116 if (notOther)
117 continue;
118 TClonesArray* arDigi = nullptr;
119 fInTreeBase->SetBranchAddress(b->GetName(), &arDigi);
120 digiNamesOther.push_back(TString(b->GetName()));
121 digiBaseArsOther.push_back(arDigi);
122 digiClassesOther.push_back(arDigi->GetClass());
123 }
124 // UInt_t fNEventBase = fInTreeBase->GetEntries();
125 for (UInt_t i = 0; i < fNArs; i++) {
126 TClonesArray* arDigi = nullptr; // new TClonesArray(BmnCSCHit::Class());
127 fInTreeBase->SetBranchAddress(digiOutExpNames[i].Data(), &arDigi);
128 digiBaseArs.push_back(arDigi);
129 digiClasses.push_back(arDigi->GetClass());
130 if (addMatch == kTRUE)
131 if (i < matchNames.size()) {
132 TClonesArray* ar = nullptr;
133 fInTreeBase->SetBranchAddress(matchNames[i].Data(), &ar);
134 matchBaseArs.push_back(ar);
135 }
136 }
137 // fieldPar = (BmnFieldPar*) fBaseHits->Get(FieldParName.Data());
138 BmnEventHeader* baseEH = nullptr;
139 fInTreeBase->SetBranchAddress(EHDigiName.Data(), &baseEH);
140 // TObject * fhdr = fBaseHits->Get("FileHeader");
141 // TObject * cbmr = fBaseHits->Get("cbmroot");
142
143 // BmnRecoTools::GeSignalDistribution(fInTreeBase, "GEM");
144
147 // Double_t p = 0.0005;
148 // printf("inv h(%f) = %f\n", p, sig->GetX(p));
149 for (size_t i = 0; i < digiSourceArs.size(); i++) {
150 TF1* mc = BmnRecoTools::GetSignalDistribution(fInTreeSource, digiSourceArs[i]); //, 0, 1e6);
151 TF1* ex = BmnRecoTools::GetSignalDistribution(fInTreeBase, digiBaseArs[i]);
152 TF1* funcRescale = BmnRecoTools::GetRescaleFunc(TString("Rescale") + outExpNames[i], mc, ex);
153 funcsMC.push_back(mc);
154 funcsEx.push_back(ex);
155 funcsRescale.push_back(funcRescale);
156 // funcRescale->SetNpx(50000);
157 printf("%s : xmin %f xmax %f\n", outExpNames[i].Data(), mc->GetXmin(), mc->GetXmax());
158 // printf("h(%f) = %f r = %f\n", p, funcRescale->Eval(p), mc->Eval(p));
159
160 TString name = TString("Rescale_") + digiSourceArs[i]->GetName();
161 TCanvas* can = new TCanvas(name, name, 1600 * 2, 900 * 2);
162 can->Divide(2, 1);
163 TVirtualPad* padDistributions = can->cd(2);
164 padDistributions->Divide(1, 2);
165 // draw mc distr
166 TVirtualPad* padMC = padDistributions->cd(1);
167 padMC->SetLogx();
168 padMC->SetLogy();
169 mc->SetTitle("MC Integral Distribution");
170 mc->Draw();
171 // draw exp distr
172 TVirtualPad* padEx = padDistributions->cd(2);
173 padEx->SetLogx();
174 padEx->SetLogy();
175 ex->SetTitle("Exp Integral Distribution");
176 ex->Draw();
177 // draw Rescale func
178 TVirtualPad* padRescale = can->cd(1);
179 padRescale->SetLogx();
180 padRescale->SetLogy();
181 funcRescale->Draw();
182 can->Print(Form("%s.pdf", can->GetName()));
183 }
184
185 /*****************************/
187 /*****************************/
188 TFile* fDestHitsFile = new TFile(destName, "RECREATE");
189 if (fDestHitsFile->IsOpen() == false) {
190 printf("\n!!!!\ncannot open file %s !\n", destName.Data());
191 return kBMNERROR;
192 }
193 printf("\n DEST FILE: ");
194 printf("%s\n", destName.Data());
195 fDestTree = new TTree("bmndata", "bmndata");
196 // for (Int_t i = 0; i < fNArs; i++) {
197 // fDestTree->SetBranchStatus(digiNames[i].Data(), 1);
198 // if (addMatch == kTRUE)
199 // if (i < matchNames.size()) {
200 // fDestTree->SetBranchStatus(matchNames[i].Data(), 1);
201 // }
202 // }
203 for (UInt_t i = 0; i < fNArs; i++) {
204 TClonesArray* arDigi = new TClonesArray(digiClasses[i]);
205 TBranch* brDigi = fDestTree->Branch(digiOutExpNames[i], &arDigi);
206 digiDestArs.push_back(arDigi);
207 digiDestBrs.push_back(brDigi);
208 }
209 for (size_t i = 0; i < digiBaseArsOther.size(); i++) {
210 TClonesArray* arDigi = new TClonesArray(digiClassesOther[i]);
211 // printf("branch name %s class %s\n", digiNamesOther[i], digiClassesOther[i]->GetName());
212 fDestTree->Branch(digiNamesOther[i], &arDigi);
213 digiDestArsOther.push_back(arDigi);
214 }
215 BmnEventHeader* destEH = new BmnEventHeader();
216 fDestTree->Branch("BmnEventHeader.", &destEH);
217 if (addMatch == kTRUE)
218 for (size_t i = 0; i < matchNames.size(); i++) {
219 TClonesArray* ar = new TClonesArray(BmnMatch::Class()); // nullptr;
220 TBranch* br = fDestTree->Branch(matchNames[i], &ar); // nullptr;
221 // fDestTree->SetBranchAddress(matchNames[i], &ar, &br);
222 matchDestArs.push_back(ar);
223 matchDestBrs.push_back(br);
224 }
225
226 /*****************************/
228 /*****************************/
229 // UInt_t minEvents = Min(fNEventSource, fNEventDest);
230
231 // for (UInt_t iEv = 0; iEv < 10/*fNEventSource*/; ++iEv) {
232 for (UInt_t iEv = 0; iEv < fNEventSource; ++iEv) {
233 DrawBar(iEv, fNEventSource);
234 fInTreeBase->GetEntry(iEv);
235 // fDestTree->GetEntry(iEv);
236 fInTreeSource->GetEntry(iEv);
237 destEH->Clear();
238 for (UInt_t iBr = 0; iBr < fNArs; iBr++) {
239 digiDestArs[iBr]->Clear("C");
240 if (addMatch == kTRUE && iBr < matchNames.size())
241 matchDestArs[iBr]->Clear("C");
242 }
243 for (UInt_t iBr = 0; iBr < digiDestArsOther.size(); iBr++) {
244 digiDestArsOther[iBr]->Clear("C");
245 }
246 // if (GetNextValidSourceEvent() == kBMNERROR) {
247 // printf("Not enough source events!\n");
248 // break;
249 // }
250 // fDestTree->GetEntry(iEv);
251 for (UInt_t iBr = 0; iBr < fNArs; iBr++) {
252 // printf("iEv %u iBr %u \n", iEv, iBr);
253 // printf(" was %d entries source\n", digiSourceArs[iBr]->GetEntries());
254 // // printf(" was %d entries dest\n", digiDestArs[iBr]->GetEntries());
255 // printf(" was %d entries base\n", digiBaseArs[iBr]->GetEntries());
256
257 // if (turnOffBaseDigits == kTRUE) {
258 // for (Int_t i = 0; i < digiBaseArs[iBr]->GetEntriesFast(); i++) {
259 // BmnStripDigit * dig = (BmnStripDigit*) digiBaseArs[iBr]->At(i);
260 // dig->SetIsGoodDigit(kFALSE);
261 // }
262 // }
263
264 // Int_t fNDigiBase = digiBaseArs[iBr]->GetEntriesFast();
265 if (turnOffBaseDigits == kFALSE)
266 digiDestArs[iBr]->AbsorbObjects(digiBaseArs[iBr]);
267 // digiDestArs[iBr]->AbsorbObjects(digiSourceArs[iBr]);
269 for (Int_t iSrcDig = 0; iSrcDig < digiSourceArs[iBr]->GetEntriesFast(); iSrcDig++) {
270 BmnStripDigit* src = (BmnStripDigit*)digiSourceArs[iBr]->At(iSrcDig);
271 // if (src->GetStripSignal() < stripDigitThreshold[iBr])
272 // continue;
273 Double_t mc_signal = isRescale ? funcsRescale[iBr]->Eval(src->GetStripSignal()) : src->GetStripSignal();
274 src->SetStripSignal(mc_signal);
275 Int_t iSame = -1;
276 for (Int_t iDestDig = 0; iDestDig < digiDestArs[iBr]->GetEntriesFast(); iDestDig++) {
277 BmnStripDigit* des = (BmnStripDigit*)digiDestArs[iBr]->At(iDestDig);
278 if ((des->GetStation() == src->GetStation()) && (des->GetModule() == src->GetModule())
279 && (des->GetStripLayer() == src->GetStripLayer())
280 && (des->GetStripNumber() == src->GetStripNumber()))
281 {
282 iSame = iDestDig;
283 if (isHitMakerEfficiencyMode)
284 des->SetStripSignal(src->GetStripSignal());
285 else
286 des->SetStripSignal(des->GetStripSignal() + src->GetStripSignal());
287 }
288 }
289 if (iSame == -1) {
290 new ((*digiDestArs[iBr])[digiDestArs[iBr]->GetEntriesFast()]) BmnStripDigit(src);
291 }
292 }
293
294 // digiDestBrs[iBr]->Fill();
295 if (addMatch)
296 if (iBr < matchNames.size()) {
297 // for (UInt_t iMatch = 0; iMatch < fNDigiBase; iMatch++) {
298 // new ((*matchDestArs[iBr])[matchDestArs[iBr]->GetEntriesFast()])
299 // BmnMatch();
300 // }
301 matchDestArs[iBr]->AbsorbObjects(matchSourceArs[iBr]);
302 // matchDestBrs[iBr]->Fill();
303 }
304 // printf(" is %d entries dest\n", digiDestArs[iBr]->GetEntries());
305 }
306 for (UInt_t iBr = 0; iBr < digiDestArsOther.size(); iBr++) {
307 if (turnOffBaseDigits == kFALSE)
308 digiDestArsOther[iBr]->AbsorbObjects(digiBaseArsOther[iBr]);
309 }
310 // mcEHOut->Clear();
311 // mcEHOut->SetEventId(mcEH->GetEventId());
312 // mcEHOut->SetEventTime(mcEH->GetEventTime());
313 // mcEHOut->SetEventTimeTS(mcEH->GetEventTimeTS());
314 // mcEHOut->SetADCin(mcEH->GetADCin());
315 // mcEHOut->SetADCout(mcEH->GetADCout());
316 // mcEHOut->SetB(mcEH->GetB());
317 // mcEHOut->SetHeaderName(mcEH->GetHeaderName());
318 // mcEHOut->SetInputFileId(mcEH->GetInputFileId());
319 // mcEHOut->SetMCEntryNumber(mcEH->GetMCEntryNumber());
320 // // mcEHOut->SetRunId(mcEH->GetRunId());
321 // mcEHOut->SetTriggerType(mcEH->GetTriggerType());
322 // mcEHOut->SetZ2in(mcEH->GetZ2in());
323 // mcEHOut->SetZ2out(mcEH->GetZ2out());
324 destEH->Clear();
325 destEH->SetEventId(baseEH->GetEventId());
326 destEH->SetEventTime(baseEH->GetEventTime());
327 destEH->SetEventTimeTS(baseEH->GetEventTimeTS());
328 destEH->SetEventType(baseEH->GetEventType());
329 destEH->SetPeriodId(baseEH->GetPeriodId());
330 destEH->SetRunId(baseEH->GetRunId());
331 // BmnTrigUnion s = destEH->GetTrigState();
332 // BmnTrigStructPeriod7SetupBMN bs;
333 // bs.BC1 = true;
334 // bs.BC2 = true;
335 // bs.VETO = true;
336 // bs.ThrBD = 2;
337 // bs.ThrSI = 3;
338 // s.Period7BMN = bs;
339 // destEH->SetTrigState(s);
340 // EHBranch->Fill();
341 fDestTree->Fill();
342 }
343 fDestTree->Write();
344 fDestHitsFile->WriteObject(rhBase, RHDigiName.Data());
345 fDestHitsFile->Write();
346 if (fSourceHits)
347 fSourceHits->Close();
348 if (fBaseHits)
349 fBaseHits->Close();
350 if (fDestHitsFile)
351 fDestHitsFile->Close();
352
353 for (size_t i = 0; i < digiSourceArs.size(); i++) {
354 delete funcsMC[i];
355 delete funcsEx[i];
356 delete funcsRescale[i];
357 }
358
359 int32_t sr = system(Form("rm -f %s", tempBaseName.Data()));
360 printf("\nFinished! Search made over %d source events\n Temp removed: %s", iSourceEvent,
361 (sr == 0) ? "ok" : "error");
362
363 return kBMNSUCCESS;
364}
365
366BmnStatus BmnEmbedding::CloneSelected(TString BaseName, TString TempBaseName)
367{
368 printf("\nPreliminary clone selected exp events:");
369 TFile* BaseHits = new TFile(BaseName, "READ");
370 if (BaseHits->IsOpen() == false) {
371 printf("\n!!!!\ncannot open file %s !\n", BaseName.Data());
372 return kBMNERROR;
373 }
374 TTree* TreeBase = (TTree*)BaseHits->Get("bmndata");
375 DigiRunHeader* RHBase = (DigiRunHeader*)BaseHits->Get(RHDigiName.Data());
376 /*******************************/
378 /*******************************/
379 TFile* DestHitsFile = new TFile(TempBaseName, "RECREATE");
380 if (DestHitsFile->IsOpen() == false) {
381 printf("\n!!!!\ncannot open file %s !\n", TempBaseName.Data());
382 return kBMNERROR;
383 }
384 printf("\nOUT HITS FILE: ");
385 printf("%s\n", TempBaseName.Data());
386 TTree* DestTree = TreeBase->CloneTree(0); //-1, "fast");
387 BmnEventHeader* baseEH = nullptr;
388 TreeBase->SetBranchAddress(EHDigiName.Data(), &baseEH);
389 iSourceEvent = 0;
390 UInt_t iBaseEvent = 0;
391 UInt_t NSrcEvents = fInTreeSource->GetEntries();
392 UInt_t NBaseEvents = TreeBase->GetEntries();
393 for (UInt_t iEv = 0; iEv < NSrcEvents; iEv++) {
394 DrawBar(iEv, NSrcEvents);
395 if (GetNextValidSourceEvent() == kBMNERROR) {
396 printf("Not enough source events!\n");
397 break;
398 }
399 while (iBaseEvent < NBaseEvents) {
400 TreeBase->GetEntry(iBaseEvent++);
401 if (mcEH->GetEventID() == baseEH->GetEventId()) {
402 DestTree->Fill();
403 break;
404 }
405 }
406 }
407 DestTree->Write();
408 DestHitsFile->WriteObject(RHBase, RHDigiName.Data());
409 DestHitsFile->Write();
410 DestHitsFile->Close();
411 DestHitsFile = nullptr;
412 BaseHits->Close();
413 printf("\nPreliminary cloning finished!\n");
414 return kBMNSUCCESS;
415}
416
417BmnStatus BmnEmbedding::GetNextValidSourceEvent()
418{
419 do {
420 fInTreeSource->GetEntry(iSourceEvent++);
421 // if (IsReconstructable(mcTracks, stsPoints, silPoints, cscPoints, fCode, fOutCodes, fMinHits))
422 return kBMNSUCCESS;
423 } while (iSourceEvent < fInTreeSource->GetEntriesFast());
424 return kBMNERROR;
425}
426
void DrawBar(UInt_t iEv, UInt_t nEv)
Definition BmnMath.cxx:940
TCanvas * can(nullptr)
int i
Definition P4_F32vec4.h:22
BmnStatus
Definition BmnEnums.h:24
@ kBMNERROR
Definition BmnEnums.h:26
@ kBMNSUCCESS
Definition BmnEnums.h:25
virtual ~BmnEmbedding()
BmnStatus Embed(TString inSourceName="eve-lam-box.root", TString inBaseName="evetest-p.root", TString destName="merged-digi.root", Int_t code=3122, vector< Int_t > outCodes={2212, -211}, Bool_t turnOffBaseDigits=kFALSE)
UInt_t GetPeriodId()
void SetEventType(BmnEventType event_type)
UInt_t GetEventId()
TTimeStamp GetEventTimeTS()
void SetEventTimeTS(TTimeStamp event_time)
void SetPeriodId(UInt_t period_id)
BmnEventType GetEventType()
void SetEventId(UInt_t event_id)
static TF1 * GetSignalDistribution(TTree *tree, TClonesArray *ar, TTree *treeDST=nullptr, TClonesArray *gemHits=nullptr, TClonesArray *gemTracks=nullptr, TClonesArray *tracks=nullptr, Double_t lowThr=0, Int_t ClusterSizeThr=0, Int_t nBins=100000)
static TF1 * GetRescaleFunc(TString name, TF1 *mc, TF1 *ex)
Int_t GetStripNumber()
Int_t GetStripLayer()
Int_t GetStation()
void SetStripSignal(Double_t signal)
Double_t GetStripSignal()
Int_t GetModule()