BmnRoot
Loading...
Searching...
No Matches
BmnZdcDigiScheme.cxx
Go to the documentation of this file.
1/*************************************************************************************
2 *
3 * Class BmnZdcDigiScheme
4 *
5 * Author: Elena Litvinenko
6 * e-mail: litvin@nf.jinr.ru
7 * Version: 18-11-2015
8 *
9 ************************************************************************************/
10
11#include "BmnZdcDigiScheme.h"
12#include "TGeoBBox.h"
13#include "TGeoManager.h"
14#include "TGeoNode.h"
15#include <iostream>
16
17using std::cout;
18using std::endl;
19
20
24
25static Int_t kZDC = 1; // // hard-coded basic ZDC detector number
26
27
28// -------------------------------------------------------------------------
29
31 Nx(0),Ny(0),Nz(0)
32{
33 fZdcDigiPar=0;
34}
35
36// -------------------------------------------------------------------------
37
39{
40 fRefcount--;
41 if(!fRefcount){
42 delete this;
43 fInstance = NULL;
44 }
45}
46// -------------------------------------------------------------------------
47
54
55// -------------------------------------------------------------------------
56
57Bool_t BmnZdcDigiScheme::Init (BmnZdcGeoPar* geoPar, BmnZdcDigiPar* digiPar, Int_t pVerbose)
58{
59 if (!fInitialized){
60
61 if ( ! geoPar ) {
62 cout << "-W- BmnZdcDigiScheme::Init: "
63 << "No geometry parameters available!" << endl;
64 return kFALSE;
65 }
66 if ( ! digiPar ) {
67 cout << "-W- BmnZdcDigiScheme::Init: "
68 << "No digitization parameters available!" << endl;
69 // return kFALSE;
70 }
71 fZdcDigiPar = digiPar;
72
73 TObjArray* sensNodes = geoPar->GetGeoSensitiveNodes();
74 if (!sensNodes) {
75 cout << "-W- BmnZdcDigiScheme::Init: "
76 << "No sensitive nodes available!" << endl;
77 return kFALSE;
78 }
79
80 fPasNodes = geoPar->GetGeoPassiveNodes();
81 if (!fPasNodes) {
82 cout << "-W- BmnZdcDigiScheme::Init: "
83 << "No passive nodes available!" << endl;
84 return kFALSE;
85 }
86
87 fInitialized = kTRUE;
88
89 AddNodes (sensNodes, pVerbose );
90 CalcDimensions (kZDC,Nx,Ny,Nz);
91
92 if (pVerbose)
93 cout << endl << "-W- BmnZdcDigiScheme::Init: finished." << endl;
94
95 }
96 return kTRUE;
97}
98
99// -------------------------------------------------------------------------
100
102{
103 if (!nod)
104 return NULL;
105
106 static TString root_name_copy1="";
107 static Double_t volData[6]={0,0,0,0,0,0};
108 Int_t i;
109
110 TString shape_name = nod->getShapePointer()->GetName();
111 TString root_name = nod->getRootVolume()->GetName();
112 TString tmp=" ";
113 TGeoBBox* shape=0;
114
115 FairGeoVector pos= nod->getLabTransform()->getTranslation();
116
117 for (i=0;i<3;i++)
118 volData[i]=pos.getValues(i); // [cm]
119
120 if (root_name!=root_name_copy1) {
121
122 root_name_copy1 = root_name;
123
124 shape = (TGeoBBox*) nod->getRootVolume()->GetShape();
125
126 if (shape_name.Contains("BOX")) {
127 volData[3]= shape->GetDX(); // [cm]
128 volData[4]= shape->GetDY(); // [cm]
129 volData[5]= shape->GetDZ(); // [cm]
130 }
131 else {
132 if (shape_name.Contains("PGON")) {
133 volData[3]= nod->getPoint(2)->getZ() /10.; // [cm]
134 volData[4]= volData[3];
135 volData[5]= shape->GetDZ(); // [cm]
136 }
137 }
138 }
139
140 BmnZdcVolInfo_t *volInfo = new BmnZdcVolInfo_t;
141 for (i=0;i<6;i++)
142 volInfo->push_back(volData[i]);
143
144 if (pVerbose>1) {
145 if (pVerbose>2)
146 tmp = " root: "+root_name + ", shape: " + shape_name;
147 tmp += "X,Y,Z, Dx,Dy,Dz: ";
148 cout << tmp <<
149 volData[0] << "," << volData[1] << "," << volData[2] << ", " <<
150 volData[3] << "," << volData[4] << "," << volData[5] << endl;
151 }
152 return volInfo;
153}
154
155
156// -------------------------------------------------------------------------
157
158BmnZdcVolId_t* BmnZdcDigiScheme::CreateVolElement (FairGeoNode* nod, Int_t nodeNumber,
159 BmnZdcDigiId_t* right, Int_t pVerbose)
160{
161 if (!nod)
162 return NULL;
163
164 //FairGeoNode *nod0, *nod1;
165 TString mother_name, tmp;
166
167 // FairGeoTransform *center;
168
169 TString nod_name=nod->GetName();
170 mother_name = nod->getMother();
171
172 // if (nod_name.Contains("boxs") {
173 if (1)
174 {
175
176 // (*right).push_back(nod->getRootVolume()->GetNumber()); // GroupID(now=box volume ID)
177 if (nod_name.Contains("boxs"))
178 (*right).push_back(1); // GroupID ("size" of small ZDC module)
179 else
180 (*right).push_back(2); // GroupID ("size" of big ZDC module)
181 (*right).push_back(nod->getCopyNo()); // ModuleID inside group
182 // center = nod->getLabTransform();
183 (*right).push_back(nodeNumber); // ChannelID
184
185 BmnZdcVolId_t* left = new BmnZdcVolId_t;
186 (*left).push_back(nod->getRootVolume()->GetNumber()+3); // sensitive volume ID
187 (*left).push_back(nod->getCopyNo()); // MotherMotherCopyNo
188
189 if (pVerbose>1) {
190 tmp = " mother: "+mother_name + ", me: " + (nod->getName()) +" ";
191 cout << tmp <<
192 (*left)[0] << "," << (*left)[1]<< " : " <<
193 (*right)[0] << "," << (*right)[1]<< "," << (*right)[2] << endl;
194 }
195
196 return left;
197
198 }
199 else {
200 cout << "-E- BmnZdcDigiScheme::CreateVolInfoElement: Strange for me node: "
201 << nod->GetName() << " Node number:" << nodeNumber << " Mother:" << mother_name << endl;
202 return NULL;
203 }
204
205}
206
207// -------------------------------------------------------------------------
208
209Bool_t BmnZdcDigiScheme::AddNodes (TObjArray* sensNodes, Int_t pVerbose)
210{
211 //Int_t nNodes = sensNodes->GetEntriesFast();
212 Int_t nPasNodes = fPasNodes->GetEntriesFast();
213 FairGeoNode *nod=0;
214 Int_t nodeNumber,/*nodeCopyNo,nodeVolumeId, chanId2=0, chanId1=0, */zdc_channel=0;
215 BmnZdcVolId_t *left1/*,*left2*/;
216 BmnZdcDigiId_t *right1/*,*right2*/;
217
218 // if (pVerbose) {
219 // cout << "-W- BmnZdcDigiScheme::AddNodes: started. nNodes:" << nNodes << endl;
220 // }
221
222 // for (nodeNumber=0;nodeNumber<nNodes;nodeNumber++) {
223
224 if (pVerbose) {
225 // cout << "-W- BmnZdcDigiScheme::AddNodes: started. nNodes:" << nNodes << endl;
226 cout << "-W- BmnZdcDigiScheme::AddNodes: started. nNodes:" << nPasNodes << endl;
227 }
228
229 TString nod_name;
230
231 for (nodeNumber=1;nodeNumber<nPasNodes;nodeNumber++) {
232 // nod = (FairGeoNode*)sensNodes->At(nodeNumber);
233 nod = (FairGeoNode*)fPasNodes->At(nodeNumber); // we will use boxes, not layers
234 if (nod) {
235
236 nod_name = nod->getName();
237 if (nod_name.Contains("box")) {
238
239 zdc_channel++;
240
241 right1 = new BmnZdcDigiId_t;
242 // left1 = CreateVolElement(nod, nodeNumber, right1, pVerbose);
243 left1 = CreateVolElement(nod, zdc_channel, right1, pVerbose);
244
245 fVolToDigiIdMap[*left1]=*right1;
246
247
249 // left2 = new BmnZdcVolId_t ((*left1).begin(),(*left1).end());
250 // (*left2)[0]=(*left1)[0]+1;
251 // right2 = new BmnZdcDigiId_t (right1->begin(),right1->end());
252 // (*right2)[0] = (*right1)[0]+1;
253
254 // fVolToDigiIdMap[*left2]=*right2;
255
256 // CreateVolCopyElements (left1, right1);
257 }
258
259 }
260 else {
261 cout << "-W- BmnZdcDigiScheme::AddNodes: "
262 // << "Node number "<< nodeNumber << " from " << nNodes << " not found!" << endl;
263 << "Node number "<< nodeNumber << " from " << nPasNodes << " not found!" << endl;
264 return kFALSE;
265 }
266 }
267 return kTRUE;
268}
269
270// -------------------------------------------------------------------------
271
273{
274 BmnZdcVolId_t *left1/*,*left2*/;
275 BmnZdcDigiId_t *right1/*,*right2*/;
276
277 if (!fPasNodes)
278 return kFALSE;
279
280 FairGeoNode *nod1 =(FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2);
281
282 if (!nod1)
283 return kFALSE;
284
285 Int_t moduleID,nModules; // {MotherMotherCopyNo, MotherCopyNo, VolumeId, CopyNo},{GroupID, ModuleID, ChannelID}
286
287 TString lm_name = nod1->getName();
288 TString last_module_number (&(lm_name[lm_name.Last('#')+1]));
289 nModules = last_module_number.Atoi();
290
291 for (moduleID=1; moduleID<nModules; moduleID++) {
292
293 left1 = new BmnZdcVolId_t ((*left).begin(),(*left).end());
294 (*left1)[1]=(*left)[1]+moduleID;
295 right1 = new BmnZdcDigiId_t (right->begin(),right->end());
296 (*right1)[1] = (*right)[1]+moduleID;
297
298 fVolToDigiIdMap[*left1]=*right1;
299
300 }
301
302 return kTRUE;
303}
304
305
306// -------------------------------------------------------------------------
307
309{
310
311
312 if (!fPasNodes)
313 return kFALSE;
314
315 FairGeoNode *nod1 =(FairGeoNode*)fPasNodes->At(fPasNodes->GetEntries()-2);
316
317 if (!nod1)
318 return kFALSE;
319
320 Int_t moduleID,nModules;
321
322 TString lm_name = nod1->getName();
323 TString last_module_number (&(lm_name[lm_name.Last('#')+1]));
324 nModules = last_module_number.Atoi();
325
326 for (moduleID=1; moduleID<nModules; moduleID++) {
327
328 nod1 = (FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2 - nModules+moduleID);
329
330 FairGeoVector pos= nod1->getLabTransform()->getTranslation();
331
332 BmnZdcVolInfo_t *volInfo1 = new BmnZdcVolInfo_t ((*volInfo).begin(),(*volInfo).end());
333 (*volInfo1)[0]=pos.getValues(0); // X [cm]
334 (*volInfo1)[1]=pos.getValues(1); // Y [cm]
335
336 BmnZdcDigiId_t *right1 = new BmnZdcDigiId_t (right->begin(),right->end());
337 (*right1)[1] = (*right)[1]+moduleID;
338
339 BmnZdcDigiId_t *right2 = new BmnZdcDigiId_t (right1->begin(),right1->end());
340 (*right2)[0] = (*right1)[0]+1;
341
342 BmnZdcVolInfo_t *volInfo2 = new BmnZdcVolInfo_t (*volInfo1);
343 (*volInfo2)[2]=-(*volInfo2)[2]; // Z [cm]
344
345 fDigiToVolInfoMap[*right1]=volInfo1;
346 fDigiToVolInfoMap[*right2]=volInfo2;
347 }
348
349 return kTRUE;
350}
351
352
353// -------------------------------------------------------------------------
354
355Bool_t BmnZdcDigiScheme::GetVolCenterXYZ (BmnZdcDigiId_t* pDigiID, Double_t &x, Double_t &y,Double_t &z)
356{
357 if (!pDigiID)
358 return kFALSE;
359 if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
360 return kFALSE;
361 else {
362 BmnZdcVolInfo_t* volInfo = fDigiToVolInfoMap[*pDigiID];
363 if (volInfo) {
364 x=(*volInfo)[0];
365 y=(*volInfo)[1];
366 z=(*volInfo)[2];
367 return kTRUE;
368 }
369 else
370 return kFALSE;
371 }
372}
373
374// -------------------------------------------------------------------------
375
376Bool_t BmnZdcDigiScheme::GetVolDxDyDz (BmnZdcDigiId_t* pDigiID, Double_t &Dx, Double_t &Dy, Double_t &Dz)
377{
378 if (!pDigiID)
379 return kFALSE;
380 if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
381 return kFALSE;
382 else {
383 BmnZdcVolInfo_t* volInfo = fDigiToVolInfoMap[*pDigiID];
384 if (volInfo) {
385 Dx=(*volInfo)[3];
386 Dy=(*volInfo)[4];
387 Dz=(*volInfo)[5];
388 return kTRUE;
389 }
390 else
391 return kFALSE;
392 }
393}
394
395// -------------------------------------------------------------------------
396
398{
399 if (!pVolId)
400 return kFALSE;
401 else
402 return (!(fVolToDigiIdMap.find(*pVolId)==fVolToDigiIdMap.end()));
403}
404
405// -------------------------------------------------------------------------
406
408{
409 static const BmnZdcDigiId_t not_found (4,-1);
410
411 if (IsVolumeExist(pVolId))
412 return fVolToDigiIdMap[*pVolId];
413 else
414 return not_found;
415}
416
417// -------------------------------------------------------------------------
418
420{
421 BmnZdcDigiId_t digiID = GetDigiId (pVolId);
422 // return digiID.first;
423 return digiID[0];
424}
425
426// -------------------------------------------------------------------------
427
429{
430 BmnZdcDigiId_t digiID = GetDigiId (pVolId);
431 // return digiID.second;
432 return digiID[2];
433}
434
435// -------------------------------------------------------------------------
436
438{
439 if (IsVolumeExist(pVolId)) {
440
441 BmnZdcDigiId_t pDigiID = GetDigiId(pVolId);
442
443 if (fDigiToVolInfoMap.find(pDigiID)==fDigiToVolInfoMap.end())
444 return NULL;
445 else
446 return fDigiToVolInfoMap[pDigiID];
447 }
448 else
449 return NULL;
450}
451
452
453// -------------------------------------------------------------------------
454
455void BmnZdcDigiScheme::PrintVolume (Int_t volID, Int_t copyNoMotherMother)
456{
457 Int_t content[]={volID,copyNoMotherMother};
458 BmnZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
459
460 BmnZdcDigiId_t pDigiID = GetDigiId(&pVolId);
461
462 cout << " BmnZdc Volume: " << volID<< "," << copyNoMotherMother <<
463 " DigiID: " << pDigiID[0] << "," << pDigiID[1]<< "," << pDigiID[2] ;
464
465 if (IsVolumeExist(&pVolId))
466 cout << " found ";
467
468 BmnZdcVolInfo_t* pVolInfo = GetVolInfo (&pVolId);
469
470 if (pVolInfo)
471 cout << " X,Y,Z [cm]: " << (*pVolInfo)[0]<< "," << (*pVolInfo)[1]<< "," << (*pVolInfo)[2]<<
472 " Dx,Dy,Dz [cm]: " << (*pVolInfo)[3]<< "," << (*pVolInfo)[4]<< "," << (*pVolInfo)[5] ;
473 else
474 cout << " (no VolInfo) ";
475
476 cout << endl;
477}
478
479
480
481// -------------------------------------------------------------------------
482
483Bool_t BmnZdcDigiScheme::CalcDimensions (Int_t pGlobalDetectorNumber, Int_t &nx, Int_t &ny, Int_t &nz)
484{
485
486 if (fDigiToVolInfoMap.empty())
487 return kFALSE;
488
489 Bool_t result = kFALSE;
490 std::map<BmnZdcDigiId_t,BmnZdcVolInfo_t*>::iterator it;
491 std::map<Double_t,Int_t> xmap, ymap, zmap;
492 Double_t x,y,z;
493 nx = ny = nz = 0;
494
495 for ( it=fDigiToVolInfoMap.begin() ; it != fDigiToVolInfoMap.end(); ++it ) {
496
497 // cout << ". ";
498
499 // if ((*it).first.first==pGlobalDetectorNumber) {
500 // if ((*it).first[0]==1) {
501 if (1) {
502
503 result = kTRUE;
504
505 x = (*((*it).second))[0];
506 if (xmap.count(x))
507 xmap[x]= xmap[x]+1;
508 else
509 xmap[x]= 1;
510
511 y = (*((*it).second))[1];
512 if (ymap.count(y))
513 ymap[y]= ymap[y]+1;
514 else
515 ymap[y]= 1;
516
517 z = (*((*it).second))[2];
518 if (zmap.count(z))
519 zmap[z]= zmap[z]+1;
520 else
521 zmap[z]= 1;
522 }
523 }
524
525 nx = xmap.size();
526 ny = ymap.size();
527 nz = zmap.size();
528
529 return result;
530}
531
532// -------------------------------------------------------------------------
533
534void BmnZdcDigiScheme::GetZdcDimensions (Int_t &nx, Int_t &ny, Int_t &nz)
535{
536 nx=Nx; ny=Ny; nz=Nz;
537}
538
539
540// -------------------------------------------------------------------------
541
542BmnZdcDigiId_t BmnZdcDigiScheme::GetDigiIdFromCoords (Double_t x, Double_t y, Double_t z)
543{
544 Int_t content[]={-1,-1};
545 BmnZdcVolId_t resultmc (content,content+sizeof(content)/sizeof(Int_t));
546
547 BmnZdcDigiId_t result (-1,-1);
548 if (gGeoManager) {
549 TGeoNode *tgn = gGeoManager->FindNode(x,y,z);
550 if (tgn) {
551 resultmc[0] = (gGeoManager->GetMother(2))->GetNumber();
552 resultmc[1] = (gGeoManager->GetMother(1))->GetMotherVolume()->GetNumber();
553 resultmc[2] = tgn->GetVolume()->GetNumber();
554 resultmc[3] = tgn->GetNumber();
555 if (fVolToDigiIdMap.find(resultmc)!=fVolToDigiIdMap.end())
556 result = fVolToDigiIdMap[resultmc];
557 }
558 }
559 return result;
560}
561
562
563// -------------------------------------------------------------------------
564
565BmnZdcDigiId_t BmnZdcDigiScheme::GetDigiIdFromVolumeData (Int_t pMcVolumeNumber, Int_t pMotherMotherCopyNumber)
566{
567 Int_t content[]={pMcVolumeNumber,pMotherMotherCopyNumber};
568 BmnZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
569 BmnZdcDigiId_t digiID = GetDigiId (&pVolId);
570 return digiID;
571}
572
573// -------------------------------------------------------------------------
574
575void BmnZdcDigiScheme::SplitDigiID (BmnZdcDigiId_t digiID, Int_t &module_groupID, Int_t &modID, Int_t &chanID)
576{
577 module_groupID = digiID[0];
578 modID = digiID[1];
579 chanID = digiID[2];
580}
581
582// -------------------------------------------------------------------------
583
585{
586 cout << "*********************************************" << endl;
587
588 cout << "*** BmnZdcDigiScheme:" << endl;
589 cout << " BmnZdc Nx,Ny,Nz: " << Nx << "," << Ny<< "," << Nz;
590
591 std::map<BmnZdcVolId_t,BmnZdcDigiId_t>::iterator it;
592
593 for ( it=fVolToDigiIdMap.begin() ; it != fVolToDigiIdMap.end(); ++it)
594 PrintVolume((*it).first[0],(*it).first[1]);
595
596 cout << "*********************************************" << endl;
597}
598
599// -------------------------------------------------------------------------
600
601Bool_t BmnZdcDigiScheme::GetGroupIdModIdChanId (Int_t pMcVolumeNumber, Int_t pMcCopyNumber, Int_t pMotherCopyNumber, Int_t pMotherMotherCopyNumber, Int_t &pGroupId, Int_t &pChanId, Int_t &pModId)
602{
603 Int_t content[]={pMotherMotherCopyNumber,pMotherCopyNumber,pMcVolumeNumber,pMcCopyNumber};
604 BmnZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
605 BmnZdcDigiId_t digiID = GetDigiId (&pVolId);
606 pGroupId = digiID[0];
607 pModId = digiID[1];
608 pChanId = digiID[2];
609
610 return kTRUE;
611}
int i
Definition P4_F32vec4.h:22
@ kZDC
Bool_t CreateVolCopyElements(BmnZdcVolId_t *left, BmnZdcDigiId_t *right)
static Int_t fRefcount
BmnZdcVolInfo_t * GetVolInfo(BmnZdcVolId_t *pVolId)
Bool_t GetVolCenterXYZ(BmnZdcDigiId_t *pDigiId, Double_t &x, Double_t &y, Double_t &z)
Bool_t AddNodes(TObjArray *sensNodes, Int_t pVerbose=0)
Bool_t Init(BmnZdcGeoPar *geoPar, BmnZdcDigiPar *digiPar, Int_t pVerbose=0)
void PrintVolume(Int_t volID, Int_t copyNoMotherMother=1)
void SplitDigiID(BmnZdcDigiId_t digiID, Int_t &module_groupID, Int_t &modID, Int_t &chanID)
static BmnZdcDigiScheme * fInstance
BmnZdcDigiId_t GetDigiId(BmnZdcVolId_t *pVolId)
Bool_t CreateVolInfoCopyElements(BmnZdcDigiId_t *right, BmnZdcVolInfo_t *volInfo)
Bool_t CalcDimensions(Int_t pGlobalDetectorNumber, Int_t &nx, Int_t &ny, Int_t &nz)
Bool_t GetVolDxDyDz(BmnZdcDigiId_t *pDigiId, Double_t &Dx, Double_t &Dy, Double_t &Dz)
BmnZdcDigiId_t GetDigiIdFromVolumeData(Int_t pMcVolumeNumber, Int_t pMotherMotherCopyNumber)
BmnZdcDigiId_t GetDigiIdFromCoords(Double_t x, Double_t y, Double_t z)
Bool_t IsVolumeExist(BmnZdcVolId_t *pVolId)
Int_t GetChannelID(BmnZdcVolId_t *pVolId)
BmnZdcVolInfo_t * CreateVolInfoElement(FairGeoNode *nod, Int_t pVerbose)
Int_t GetGroupID(BmnZdcVolId_t *pVolId)
Bool_t GetGroupIdModIdChanId(Int_t pMcVolumeNumber, Int_t pMcCopyNumber, Int_t pMotherCopyNumber, Int_t pMotherMotherCopyNumber, Int_t &pGroupId, Int_t &pChanId, Int_t &pModId)
void GetZdcDimensions(Int_t &nx, Int_t &ny, Int_t &nz)
static Bool_t fInitialized
BmnZdcVolId_t * CreateVolElement(FairGeoNode *nod, Int_t nodeNumber, BmnZdcDigiId_t *right, Int_t pVerbose)
static BmnZdcDigiScheme * Instance()
TObjArray * GetGeoPassiveNodes()
TObjArray * GetGeoSensitiveNodes()
std::vector< Double_t > BmnZdcVolInfo_t
std::vector< Int_t > BmnZdcVolId_t
std::vector< Int_t > BmnZdcDigiId_t