9 vector<Int_t> outCodes,
10 Bool_t turnOffBaseDigits
19 Bool_t addMatch = kFALSE;
21 Bool_t isHitMakerEfficiencyMode = kFALSE;
22 Bool_t isRescale = kTRUE;
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"};
33 vector<TF1*> funcsRescale;
34 vector<TString> digiOutExpNames = (isExp == kTRUE) ? outExpNames : outMCNames;
36 vector<TClass*> digiClasses;
38 vector<TClass*> digiClassesOther;
39 vector<TString> matchNames = {
"BmnSiliconDigitMatch",
"BmnGemStripDigitMatch",
"BmnCSCDigitMatch"};
44 UInt_t fNArs = digiNames.size();
53 TFile* fSourceHits =
new TFile(inSourceName,
"READ");
54 if (fSourceHits->IsOpen() ==
false) {
55 printf(
"\n!!!!\ncannot open file %s !\n", inSourceName.Data());
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;
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);
73 fInTreeSource->SetBranchStatus(matchNames[
i] +
".*", 0);
76 mcTracks = digiSourceArs[3];
77 stsPoints = digiSourceArs[4];
78 silPoints = digiSourceArs[5];
79 cscPoints = digiSourceArs[6];
80 fInTreeSource->SetBranchAddress(EHMCName.Data(), &mcEH);
86 TString tempBaseName = inBaseName +
"-temp.root";
87 CloneSelected(inBaseName, tempBaseName);
92 TFile* fBaseHits =
new TFile(tempBaseName,
"READ");
93 if (fBaseHits->IsOpen() ==
false) {
94 printf(
"\n!!!!\ncannot open file %s !\n", tempBaseName.Data());
97 printf(
"\nINPUT BASE FILE: ");
98 printf(
"%s\n", tempBaseName.Data());
99 fInTreeBase = (TTree*)fBaseHits->Get(
"bmndata");
101 TObjArray* digiBaseBrsFull = fInTreeBase->GetListOfBranches();
102 TIterator* it = digiBaseBrsFull->MakeIterator();
105 while ((b = (TBranch*)it->Next())) {
107 Bool_t notOther = kFALSE;
108 for (UInt_t
i = 0;
i < fNArs;
i++) {
109 if (strcmp(b->GetName(), digiOutExpNames[
i].Data()) == 0) {
114 if (strcmp(b->GetName(), EHDigiName.Data()) == 0)
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());
125 for (UInt_t
i = 0;
i < fNArs;
i++) {
126 TClonesArray* arDigi =
nullptr;
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);
139 fInTreeBase->SetBranchAddress(EHDigiName.Data(), &baseEH);
149 for (
size_t i = 0;
i < digiSourceArs.size();
i++) {
153 funcsMC.push_back(mc);
154 funcsEx.push_back(ex);
155 funcsRescale.push_back(funcRescale);
157 printf(
"%s : xmin %f xmax %f\n", outExpNames[
i].Data(), mc->GetXmin(), mc->GetXmax());
160 TString name = TString(
"Rescale_") + digiSourceArs[
i]->GetName();
161 TCanvas*
can =
new TCanvas(name, name, 1600 * 2, 900 * 2);
163 TVirtualPad* padDistributions =
can->cd(2);
164 padDistributions->Divide(1, 2);
166 TVirtualPad* padMC = padDistributions->cd(1);
169 mc->SetTitle(
"MC Integral Distribution");
172 TVirtualPad* padEx = padDistributions->cd(2);
175 ex->SetTitle(
"Exp Integral Distribution");
178 TVirtualPad* padRescale =
can->cd(1);
179 padRescale->SetLogx();
180 padRescale->SetLogy();
182 can->Print(Form(
"%s.pdf",
can->GetName()));
188 TFile* fDestHitsFile =
new TFile(destName,
"RECREATE");
189 if (fDestHitsFile->IsOpen() ==
false) {
190 printf(
"\n!!!!\ncannot open file %s !\n", destName.Data());
193 printf(
"\n DEST FILE: ");
194 printf(
"%s\n", destName.Data());
195 fDestTree =
new TTree(
"bmndata",
"bmndata");
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);
209 for (
size_t i = 0;
i < digiBaseArsOther.size();
i++) {
210 TClonesArray* arDigi =
new TClonesArray(digiClassesOther[
i]);
212 fDestTree->Branch(digiNamesOther[
i], &arDigi);
213 digiDestArsOther.push_back(arDigi);
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());
220 TBranch* br = fDestTree->Branch(matchNames[
i], &ar);
222 matchDestArs.push_back(ar);
223 matchDestBrs.push_back(br);
232 for (UInt_t iEv = 0; iEv < fNEventSource; ++iEv) {
234 fInTreeBase->GetEntry(iEv);
236 fInTreeSource->GetEntry(iEv);
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");
243 for (UInt_t iBr = 0; iBr < digiDestArsOther.size(); iBr++) {
244 digiDestArsOther[iBr]->Clear(
"C");
251 for (UInt_t iBr = 0; iBr < fNArs; iBr++) {
265 if (turnOffBaseDigits == kFALSE)
266 digiDestArs[iBr]->AbsorbObjects(digiBaseArs[iBr]);
269 for (Int_t iSrcDig = 0; iSrcDig < digiSourceArs[iBr]->GetEntriesFast(); iSrcDig++) {
276 for (Int_t iDestDig = 0; iDestDig < digiDestArs[iBr]->GetEntriesFast(); iDestDig++) {
283 if (isHitMakerEfficiencyMode)
290 new ((*digiDestArs[iBr])[digiDestArs[iBr]->GetEntriesFast()])
BmnStripDigit(src);
296 if (iBr < matchNames.size()) {
301 matchDestArs[iBr]->AbsorbObjects(matchSourceArs[iBr]);
306 for (UInt_t iBr = 0; iBr < digiDestArsOther.size(); iBr++) {
307 if (turnOffBaseDigits == kFALSE)
308 digiDestArsOther[iBr]->AbsorbObjects(digiBaseArsOther[iBr]);
326 destEH->SetEventTime(baseEH->GetEventTime());
330 destEH->SetRunId(baseEH->GetRunId());
344 fDestHitsFile->WriteObject(rhBase, RHDigiName.Data());
345 fDestHitsFile->Write();
347 fSourceHits->Close();
351 fDestHitsFile->Close();
353 for (
size_t i = 0;
i < digiSourceArs.size();
i++) {
356 delete funcsRescale[
i];
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");