13#include "TGeoManager.h"
62 cout <<
"-W- BmnZdcDigiScheme::Init: "
63 <<
"No geometry parameters available!" << endl;
67 cout <<
"-W- BmnZdcDigiScheme::Init: "
68 <<
"No digitization parameters available!" << endl;
71 fZdcDigiPar = digiPar;
75 cout <<
"-W- BmnZdcDigiScheme::Init: "
76 <<
"No sensitive nodes available!" << endl;
82 cout <<
"-W- BmnZdcDigiScheme::Init: "
83 <<
"No passive nodes available!" << endl;
93 cout << endl <<
"-W- BmnZdcDigiScheme::Init: finished." << endl;
106 static TString root_name_copy1=
"";
107 static Double_t volData[6]={0,0,0,0,0,0};
110 TString shape_name = nod->getShapePointer()->GetName();
111 TString root_name = nod->getRootVolume()->GetName();
115 FairGeoVector pos= nod->getLabTransform()->getTranslation();
118 volData[
i]=pos.getValues(
i);
120 if (root_name!=root_name_copy1) {
122 root_name_copy1 = root_name;
124 shape = (TGeoBBox*) nod->getRootVolume()->GetShape();
126 if (shape_name.Contains(
"BOX")) {
127 volData[3]= shape->GetDX();
128 volData[4]= shape->GetDY();
129 volData[5]= shape->GetDZ();
132 if (shape_name.Contains(
"PGON")) {
133 volData[3]= nod->getPoint(2)->getZ() /10.;
134 volData[4]= volData[3];
135 volData[5]= shape->GetDZ();
142 volInfo->push_back(volData[
i]);
146 tmp =
" root: "+root_name +
", shape: " + shape_name;
147 tmp +=
"X,Y,Z, Dx,Dy,Dz: ";
149 volData[0] <<
"," << volData[1] <<
"," << volData[2] <<
", " <<
150 volData[3] <<
"," << volData[4] <<
"," << volData[5] << endl;
165 TString mother_name, tmp;
169 TString nod_name=nod->GetName();
170 mother_name = nod->getMother();
177 if (nod_name.Contains(
"boxs"))
178 (*right).push_back(1);
180 (*right).push_back(2);
181 (*right).push_back(nod->getCopyNo());
183 (*right).push_back(nodeNumber);
186 (*left).push_back(nod->getRootVolume()->GetNumber()+3);
187 (*left).push_back(nod->getCopyNo());
190 tmp =
" mother: "+mother_name +
", me: " + (nod->getName()) +
" ";
192 (*left)[0] <<
"," << (*left)[1]<<
" : " <<
193 (*right)[0] <<
"," << (*right)[1]<<
"," << (*right)[2] << endl;
200 cout <<
"-E- BmnZdcDigiScheme::CreateVolInfoElement: Strange for me node: "
201 << nod->GetName() <<
" Node number:" << nodeNumber <<
" Mother:" << mother_name << endl;
212 Int_t nPasNodes = fPasNodes->GetEntriesFast();
214 Int_t nodeNumber,zdc_channel=0;
226 cout <<
"-W- BmnZdcDigiScheme::AddNodes: started. nNodes:" << nPasNodes << endl;
231 for (nodeNumber=1;nodeNumber<nPasNodes;nodeNumber++) {
233 nod = (FairGeoNode*)fPasNodes->At(nodeNumber);
236 nod_name = nod->getName();
237 if (nod_name.Contains(
"box")) {
245 fVolToDigiIdMap[*left1]=*right1;
261 cout <<
"-W- BmnZdcDigiScheme::AddNodes: "
263 <<
"Node number "<< nodeNumber <<
" from " << nPasNodes <<
" not found!" << endl;
280 FairGeoNode *nod1 =(FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2);
285 Int_t moduleID,nModules;
287 TString lm_name = nod1->getName();
288 TString last_module_number (&(lm_name[lm_name.Last(
'#')+1]));
289 nModules = last_module_number.Atoi();
291 for (moduleID=1; moduleID<nModules; moduleID++) {
294 (*left1)[1]=(*left)[1]+moduleID;
296 (*right1)[1] = (*right)[1]+moduleID;
298 fVolToDigiIdMap[*left1]=*right1;
315 FairGeoNode *nod1 =(FairGeoNode*)fPasNodes->At(fPasNodes->GetEntries()-2);
320 Int_t moduleID,nModules;
322 TString lm_name = nod1->getName();
323 TString last_module_number (&(lm_name[lm_name.Last(
'#')+1]));
324 nModules = last_module_number.Atoi();
326 for (moduleID=1; moduleID<nModules; moduleID++) {
328 nod1 = (FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2 - nModules+moduleID);
330 FairGeoVector pos= nod1->getLabTransform()->getTranslation();
333 (*volInfo1)[0]=pos.getValues(0);
334 (*volInfo1)[1]=pos.getValues(1);
337 (*right1)[1] = (*right)[1]+moduleID;
340 (*right2)[0] = (*right1)[0]+1;
343 (*volInfo2)[2]=-(*volInfo2)[2];
345 fDigiToVolInfoMap[*right1]=volInfo1;
346 fDigiToVolInfoMap[*right2]=volInfo2;
359 if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
380 if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
402 return (!(fVolToDigiIdMap.find(*pVolId)==fVolToDigiIdMap.end()));
412 return fVolToDigiIdMap[*pVolId];
443 if (fDigiToVolInfoMap.find(pDigiID)==fDigiToVolInfoMap.end())
446 return fDigiToVolInfoMap[pDigiID];
457 Int_t content[]={volID,copyNoMotherMother};
458 BmnZdcVolId_t pVolId (content,content+
sizeof(content)/
sizeof(Int_t));
462 cout <<
" BmnZdc Volume: " << volID<<
"," << copyNoMotherMother <<
463 " DigiID: " << pDigiID[0] <<
"," << pDigiID[1]<<
"," << pDigiID[2] ;
471 cout <<
" X,Y,Z [cm]: " << (*pVolInfo)[0]<<
"," << (*pVolInfo)[1]<<
"," << (*pVolInfo)[2]<<
472 " Dx,Dy,Dz [cm]: " << (*pVolInfo)[3]<<
"," << (*pVolInfo)[4]<<
"," << (*pVolInfo)[5] ;
474 cout <<
" (no VolInfo) ";
486 if (fDigiToVolInfoMap.empty())
489 Bool_t result = kFALSE;
490 std::map<BmnZdcDigiId_t,BmnZdcVolInfo_t*>::iterator it;
491 std::map<Double_t,Int_t> xmap, ymap, zmap;
495 for ( it=fDigiToVolInfoMap.begin() ; it != fDigiToVolInfoMap.end(); ++it ) {
505 x = (*((*it).second))[0];
511 y = (*((*it).second))[1];
517 z = (*((*it).second))[2];
544 Int_t content[]={-1,-1};
545 BmnZdcVolId_t resultmc (content,content+
sizeof(content)/
sizeof(Int_t));
549 TGeoNode *tgn = gGeoManager->FindNode(x,y,z);
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];
567 Int_t content[]={pMcVolumeNumber,pMotherMotherCopyNumber};
568 BmnZdcVolId_t pVolId (content,content+
sizeof(content)/
sizeof(Int_t));
577 module_groupID = digiID[0];
586 cout <<
"*********************************************" << endl;
588 cout <<
"*** BmnZdcDigiScheme:" << endl;
589 cout <<
" BmnZdc Nx,Ny,Nz: " << Nx <<
"," << Ny<<
"," << Nz;
591 std::map<BmnZdcVolId_t,BmnZdcDigiId_t>::iterator it;
593 for ( it=fVolToDigiIdMap.begin() ; it != fVolToDigiIdMap.end(); ++it)
596 cout <<
"*********************************************" << endl;
603 Int_t content[]={pMotherMotherCopyNumber,pMotherCopyNumber,pMcVolumeNumber,pMcCopyNumber};
604 BmnZdcVolId_t pVolId (content,content+
sizeof(content)/
sizeof(Int_t));
606 pGroupId = digiID[0];
Bool_t CreateVolCopyElements(BmnZdcVolId_t *left, BmnZdcDigiId_t *right)
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)
virtual ~BmnZdcDigiScheme()
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