MpdZdcDigiScheme.cxx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. /*************************************************************************************
  2. *
  3. * Class MpdZdcDigiScheme
  4. *
  5. * Author: Elena Litvinenko
  6. * e-mail: litvin@nf.jinr.ru
  7. * Version: 16-May-2008
  8. *
  9. ************************************************************************************/
  10. #include "MpdZdcDigiScheme.h"
  11. #include "TGeoBBox.h"
  12. #include "TGeoManager.h"
  13. #include "TGeoNode.h"
  14. #include <iostream>
  15. using std::cout;
  16. using std::endl;
  17. MpdZdcDigiScheme* MpdZdcDigiScheme::fInstance = 0;
  18. Bool_t MpdZdcDigiScheme::fInitialized = 0;
  19. Int_t MpdZdcDigiScheme::fRefcount = 0;
  20. Bool_t MpdZdcDigiScheme::fYesPsd = 0;
  21. static Int_t kZDC = 1; // // hard-coded basic ZDC detector number
  22. // -------------------------------------------------------------------------
  23. MpdZdcDigiScheme::MpdZdcDigiScheme() : Nx(0),Ny(0),Nz(0)
  24. {
  25. // Nx=0; Ny=0; Nz=0;
  26. Nx_psd=0; Ny_psd=0; Nz_psd=0;
  27. fZdcDigiPar=0;
  28. fZdcPsdDigiPar=0;
  29. }
  30. // -------------------------------------------------------------------------
  31. MpdZdcDigiScheme::~MpdZdcDigiScheme()
  32. {
  33. fRefcount--;
  34. if(!fRefcount){
  35. delete this;
  36. fInstance = nullptr;
  37. }
  38. }
  39. // -------------------------------------------------------------------------
  40. MpdZdcDigiScheme* MpdZdcDigiScheme::Instance()
  41. {
  42. if(!fInstance) fInstance = new MpdZdcDigiScheme();
  43. fRefcount++;
  44. return fInstance;
  45. }
  46. // -------------------------------------------------------------------------
  47. Bool_t MpdZdcDigiScheme::Init (MpdZdcGeoPar* geoPar, MpdZdcDigiPar* digiPar, Bool_t pAddPsd, Int_t pVerbose)
  48. {
  49. if (!fInitialized){
  50. if ( ! geoPar ) {
  51. cout << "-W- MpdZdcDigiScheme::Init: "
  52. << "No geometry parameters available!" << endl;
  53. return kFALSE;
  54. }
  55. if ( ! digiPar ) {
  56. cout << "-W- MpdZdcDigiScheme::Init: "
  57. << "No digitization parameters available!" << endl;
  58. // return kFALSE;
  59. }
  60. fZdcDigiPar = digiPar;
  61. TObjArray* sensNodes = geoPar->GetGeoSensitiveNodes();
  62. if (!sensNodes) {
  63. cout << "-W- MpdZdcDigiScheme::Init: "
  64. << "No sensitive nodes available!" << endl;
  65. return kFALSE;
  66. }
  67. fPasNodes = geoPar->GetGeoPassiveNodes();
  68. if (!fPasNodes) {
  69. cout << "-W- MpdZdcDigiScheme::Init: "
  70. << "No passive nodes available!" << endl;
  71. return kFALSE;
  72. }
  73. fInitialized = kTRUE;
  74. AddNodes (sensNodes,kZDC, pAddPsd,pVerbose );
  75. CalcDimensions (kZDC,Nx,Ny,Nz);
  76. if (pVerbose)
  77. cout << endl << "-W- MpdZdcDigiScheme::Init: finished." << endl;
  78. }
  79. return kTRUE;
  80. }
  81. // -------------------------------------------------------------------------
  82. MpdZdcVolInfo_t* MpdZdcDigiScheme::CreateVolInfoElement (FairGeoNode* nod, Int_t pVerbose)
  83. {
  84. if (!nod)
  85. return nullptr;
  86. static TString root_name_copy1="";
  87. static Double_t volData[6]={0,0,0,0,0,0};
  88. Int_t i;//,j;
  89. TString shape_name = nod->getShapePointer()->GetName();
  90. TString root_name = nod->getRootVolume()->GetName();
  91. TString tmp=" ";
  92. TGeoBBox* shape=0;
  93. FairGeoVector pos= nod->getLabTransform()->getTranslation();
  94. for (i=0;i<3;i++)
  95. volData[i]=pos.getValues(i); // [cm]
  96. if (root_name!=root_name_copy1) {
  97. root_name_copy1 = root_name;
  98. shape = (TGeoBBox*) nod->getRootVolume()->GetShape();
  99. if (shape_name.Contains("BOX")) {
  100. volData[3]= shape->GetDX(); // [cm]
  101. volData[4]= shape->GetDY(); // [cm]
  102. volData[5]= shape->GetDZ(); // [cm]
  103. }
  104. else {
  105. if (shape_name.Contains("PGON")) {
  106. volData[3]= nod->getPoint(2)->getZ() /10.; // [cm]
  107. volData[4]= volData[3];
  108. volData[5]= shape->GetDZ(); // [cm]
  109. }
  110. }
  111. }
  112. MpdZdcVolInfo_t *volInfo = new MpdZdcVolInfo_t;
  113. for (i=0;i<6;i++)
  114. volInfo->push_back(volData[i]);
  115. if (pVerbose>1) {
  116. if (pVerbose>2)
  117. tmp = " root: "+root_name + ", shape: " + shape_name;
  118. tmp += "X,Y,Z, Dx,Dy,Dz: ";
  119. cout << tmp <<
  120. volData[0] << "," << volData[1] << "," << volData[2] << ", " <<
  121. volData[3] << "," << volData[4] << "," << volData[5] << endl;
  122. }
  123. return volInfo;
  124. }
  125. // -------------------------------------------------------------------------
  126. MpdZdcVolId_t* MpdZdcDigiScheme::CreateVolElement (FairGeoNode* nod, Int_t nodeNumber,
  127. MpdZdcDigiId_t* right, Int_t pGlobalDetectorNumber, Int_t pVerbose)
  128. {
  129. if (!nod)
  130. return nullptr;
  131. FairGeoNode *nod0, *nod1;
  132. TString mother_name, tmp;
  133. if (!fPasNodes)
  134. return nullptr;
  135. nod0 = (FairGeoNode*)fPasNodes->At(0);
  136. nod1 = (FairGeoNode*)fPasNodes->At(1);
  137. if ((!nod0)||(!nod1))
  138. return nullptr;
  139. mother_name = nod->getMother();
  140. if (mother_name==nod1->GetName()) {
  141. (*right).push_back(nod0->getCopyNo()+pGlobalDetectorNumber-1);
  142. (*right).push_back(nod1->getCopyNo());
  143. (*right).push_back(nodeNumber);
  144. MpdZdcVolId_t* left = new MpdZdcVolId_t;
  145. (*left).push_back(nod0->getCopyNo());
  146. (*left).push_back(nod1->getCopyNo());
  147. (*left).push_back(nod->getMCid());
  148. (*left).push_back(nod->getCopyNo());
  149. if (pVerbose>1) {
  150. tmp = " mother: "+mother_name + ", me: " + (nod->getName()) +" ";
  151. cout << tmp <<
  152. (*left)[0] << "," << (*left)[1]<< "," << (*left)[2] << ","<< (*left)[3] << " : " <<
  153. (*right)[0] << "," << (*right)[1]<< "," << (*right)[2] << endl;
  154. }
  155. return left;
  156. }
  157. else {
  158. cout << "-E- MpdZdcDigiScheme::CreateVolInfoElement: Strange for me node: "
  159. << nod->GetName() << " Node number:" << nodeNumber << " Mother:" << mother_name << endl;
  160. return nullptr;
  161. }
  162. }
  163. // -------------------------------------------------------------------------
  164. Bool_t MpdZdcDigiScheme::AddNodes (TObjArray* sensNodes,Int_t pGlobalDetectorNumber, Bool_t pAddPsd, Int_t pVerbose)
  165. {
  166. Int_t nNodes = sensNodes->GetEntriesFast();
  167. FairGeoNode *nod=0;
  168. Int_t nodeNumber;//,nodeCopyNo,nodeVolumeId, chanId2=0, chanId1=0;
  169. MpdZdcVolId_t *left1,*left2;
  170. MpdZdcDigiId_t *right1,*right2;
  171. if (pVerbose) {
  172. cout << "-W- MpdZdcDigiScheme::AddNodes: started:"
  173. << "GlobalDetectorNumber:"<< pGlobalDetectorNumber << " nNodes:" << nNodes << endl;
  174. }
  175. for (nodeNumber=0;nodeNumber<nNodes;nodeNumber++) {
  176. nod = (FairGeoNode*)sensNodes->At(nodeNumber);
  177. if (nod) {
  178. right1 = new MpdZdcDigiId_t;
  179. left1 = CreateVolElement(nod, nodeNumber, right1, pGlobalDetectorNumber, pVerbose);
  180. fVolToDigiIdMap[*left1]=*right1;
  181. left2 = new MpdZdcDigiId_t ((*left1).begin(),(*left1).end());
  182. (*left2)[0]=(*left1)[0]+1;
  183. right2 = new MpdZdcDigiId_t (right1->begin(),right1->end());
  184. (*right2)[0] = (*right1)[0]+1;
  185. fVolToDigiIdMap[*left2]=*right2;
  186. CreateVolCopyElements (left1, right1);
  187. if (pAddPsd) {
  188. MpdZdcVolInfo_t *volInfo1 = CreateVolInfoElement(nod, pVerbose);
  189. if (volInfo1) {
  190. fDigiToVolInfoMap[*right1]=volInfo1;
  191. MpdZdcVolInfo_t *volInfo2 = new MpdZdcVolInfo_t (*volInfo1);
  192. (*volInfo2)[2]=-(*volInfo2)[2]; // Z
  193. fDigiToVolInfoMap[*right2]=volInfo2;
  194. CreateVolInfoCopyElements (right1, volInfo1);
  195. }
  196. }
  197. }
  198. else {
  199. cout << "-W- MpdZdcDigiScheme::AddNodes: "
  200. << "Node number "<< nodeNumber << " from " << nNodes << " not found!" << endl;
  201. return kFALSE;
  202. }
  203. }
  204. return kTRUE;
  205. }
  206. // -------------------------------------------------------------------------
  207. Bool_t MpdZdcDigiScheme::CreateVolCopyElements (MpdZdcVolId_t* left, MpdZdcDigiId_t* right)
  208. {
  209. MpdZdcVolId_t *left1,*left2;
  210. MpdZdcDigiId_t *right1,*right2;
  211. if (!fPasNodes)
  212. return kFALSE;
  213. FairGeoNode *nod1 =(FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2);
  214. if (!nod1)
  215. return kFALSE;
  216. Int_t moduleID,nModules; // {MotherMotherCopyNo, MotherCopyNo, VolumeId, CopyNo},{DetectorID, ModuleID, ChannelID}
  217. TString lm_name = nod1->getName();
  218. TString last_module_number (&(lm_name[lm_name.Last('#')+1]));
  219. nModules = last_module_number.Atoi();
  220. for (moduleID=1; moduleID<nModules; moduleID++) {
  221. left1 = new MpdZdcDigiId_t ((*left).begin(),(*left).end());
  222. (*left1)[1]=(*left)[1]+moduleID;
  223. right1 = new MpdZdcDigiId_t (right->begin(),right->end());
  224. (*right1)[1] = (*right)[1]+moduleID;
  225. left2 = new MpdZdcDigiId_t ((*left1).begin(),(*left1).end());
  226. (*left2)[0]=(*left1)[0]+1;
  227. right2 = new MpdZdcDigiId_t (right1->begin(),right1->end());
  228. (*right2)[0] = (*right1)[0]+1;
  229. fVolToDigiIdMap[*left1]=*right1;
  230. fVolToDigiIdMap[*left2]=*right2;
  231. }
  232. return kTRUE;
  233. }
  234. // -------------------------------------------------------------------------
  235. Bool_t MpdZdcDigiScheme::CreateVolInfoCopyElements (MpdZdcDigiId_t* right, MpdZdcVolInfo_t *volInfo )
  236. {
  237. if (!fPasNodes)
  238. return kFALSE;
  239. FairGeoNode *nod1 =(FairGeoNode*)fPasNodes->At(fPasNodes->GetEntries()-2);
  240. if (!nod1)
  241. return kFALSE;
  242. Int_t moduleID,nModules;
  243. TString lm_name = nod1->getName();
  244. TString last_module_number (&(lm_name[lm_name.Last('#')+1]));
  245. nModules = last_module_number.Atoi();
  246. for (moduleID=1; moduleID<nModules; moduleID++) {
  247. nod1 = (FairGeoNode*) fPasNodes->At(fPasNodes->GetEntries()-2 - nModules+moduleID);
  248. FairGeoVector pos= nod1->getLabTransform()->getTranslation();
  249. MpdZdcVolInfo_t *volInfo1 = new MpdZdcVolInfo_t ((*volInfo).begin(),(*volInfo).end());
  250. (*volInfo1)[0]=pos.getValues(0); // X [cm]
  251. (*volInfo1)[1]=pos.getValues(1); // Y [cm]
  252. MpdZdcDigiId_t *right1 = new MpdZdcDigiId_t (right->begin(),right->end());
  253. (*right1)[1] = (*right)[1]+moduleID;
  254. MpdZdcDigiId_t *right2 = new MpdZdcDigiId_t (right1->begin(),right1->end());
  255. (*right2)[0] = (*right1)[0]+1;
  256. MpdZdcVolInfo_t *volInfo2 = new MpdZdcVolInfo_t (*volInfo1);
  257. (*volInfo2)[2]=-(*volInfo2)[2]; // Z [cm]
  258. fDigiToVolInfoMap[*right1]=volInfo1;
  259. fDigiToVolInfoMap[*right2]=volInfo2;
  260. }
  261. return kTRUE;
  262. }
  263. // -------------------------------------------------------------------------
  264. Bool_t MpdZdcDigiScheme::InitPsd (MpdZdcPsdGeoPar* geoPar, MpdZdcPsdDigiPar* digiPar, Int_t pVerbose)
  265. {
  266. if (!fYesPsd) {
  267. if (!fInitialized) {
  268. cout << "-W- MpdZdcDigiScheme::InitPsd: "
  269. << "Init basic ZDC first!" << endl;
  270. return kFALSE;
  271. }
  272. fYesPsd=kTRUE;
  273. if ( ! geoPar ) {
  274. cout << "-W- MpdZdcDigiScheme::InitPsd: "
  275. << "No geometry parameters available!" << endl;
  276. return kFALSE;
  277. }
  278. if ( ! digiPar ) {
  279. cout << "-W- MpdZdcDigiScheme::InitPsd: "
  280. << "No digitization parameters available!" << endl;
  281. return kFALSE;
  282. }
  283. fZdcPsdDigiPar = digiPar;
  284. TObjArray* sensNodes;
  285. sensNodes = geoPar->GetGeoSensitiveNodes();
  286. if (!sensNodes) {
  287. cout << "-W- MpdZdcDigiScheme::InitPsd: "
  288. << "No sensitive nodes available!" << endl;
  289. return kFALSE;
  290. }
  291. AddNodes (sensNodes, kZDC+2, kTRUE, pVerbose); // kZDC+2 - hard-coded global ZDC_PSD detector number
  292. CalcDimensions (kZDC+2,Nx_psd,Ny_psd,Nz_psd);
  293. fYesPsd = kTRUE;
  294. }
  295. return kTRUE;
  296. }
  297. // -------------------------------------------------------------------------
  298. Bool_t MpdZdcDigiScheme::GetVolCenterXYZ (MpdZdcDigiId_t* pDigiID, Double_t &x, Double_t &y,Double_t &z)
  299. {
  300. if (!pDigiID)
  301. return kFALSE;
  302. if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
  303. return kFALSE;
  304. else {
  305. MpdZdcVolInfo_t* volInfo = fDigiToVolInfoMap[*pDigiID];
  306. if (volInfo) {
  307. x=(*volInfo)[0];
  308. y=(*volInfo)[1];
  309. z=(*volInfo)[2];
  310. return kTRUE;
  311. }
  312. else
  313. return kFALSE;
  314. }
  315. }
  316. // -------------------------------------------------------------------------
  317. Bool_t MpdZdcDigiScheme::GetVolDxDyDz (MpdZdcDigiId_t* pDigiID, Double_t &Dx, Double_t &Dy, Double_t &Dz)
  318. {
  319. if (!pDigiID)
  320. return kFALSE;
  321. if (fDigiToVolInfoMap.find(*pDigiID)==fDigiToVolInfoMap.end())
  322. return kFALSE;
  323. else {
  324. MpdZdcVolInfo_t* volInfo = fDigiToVolInfoMap[*pDigiID];
  325. if (volInfo) {
  326. Dx=(*volInfo)[3];
  327. Dy=(*volInfo)[4];
  328. Dz=(*volInfo)[5];
  329. return kTRUE;
  330. }
  331. else
  332. return kFALSE;
  333. }
  334. }
  335. // -------------------------------------------------------------------------
  336. Bool_t MpdZdcDigiScheme::IsVolumeExist (MpdZdcVolId_t* pVolId)
  337. {
  338. if (!pVolId)
  339. return kFALSE;
  340. else
  341. return (!(fVolToDigiIdMap.find(*pVolId)==fVolToDigiIdMap.end()));
  342. }
  343. // -------------------------------------------------------------------------
  344. MpdZdcDigiId_t MpdZdcDigiScheme::GetDigiId (MpdZdcVolId_t* pVolId)
  345. {
  346. static const MpdZdcDigiId_t not_found (4,-1);
  347. if (IsVolumeExist(pVolId))
  348. return fVolToDigiIdMap[*pVolId];
  349. else
  350. return not_found;
  351. }
  352. // -------------------------------------------------------------------------
  353. Int_t MpdZdcDigiScheme::GetDetectorID (MpdZdcVolId_t* pVolId)
  354. {
  355. MpdZdcDigiId_t digiID = GetDigiId (pVolId);
  356. // return digiID.first;
  357. return digiID[0];
  358. }
  359. // -------------------------------------------------------------------------
  360. Int_t MpdZdcDigiScheme::GetChannelID (MpdZdcVolId_t* pVolId)
  361. {
  362. MpdZdcDigiId_t digiID = GetDigiId (pVolId);
  363. // return digiID.second;
  364. return digiID[2];
  365. }
  366. // -------------------------------------------------------------------------
  367. MpdZdcVolInfo_t* MpdZdcDigiScheme::GetVolInfo(MpdZdcVolId_t* pVolId)
  368. {
  369. if (IsVolumeExist(pVolId)) {
  370. MpdZdcDigiId_t pDigiID = GetDigiId(pVolId);
  371. if (fDigiToVolInfoMap.find(pDigiID)==fDigiToVolInfoMap.end())
  372. return nullptr;
  373. else
  374. return fDigiToVolInfoMap[pDigiID];
  375. }
  376. else
  377. return nullptr;
  378. }
  379. // -------------------------------------------------------------------------
  380. void MpdZdcDigiScheme::PrintVolume (Int_t volID, Int_t copyNo, Int_t copyNoMother, Int_t copyNoMotherMother)
  381. {
  382. Int_t content[]={copyNoMotherMother,copyNoMother,volID,copyNo};
  383. MpdZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
  384. MpdZdcDigiId_t pDigiID = GetDigiId(&pVolId);
  385. cout << " MpdZdc Volume: " << copyNoMotherMother << "," << copyNoMother<< "," << volID<< "," << copyNo <<
  386. " DigiID: " << pDigiID[0] << "," << pDigiID[1]<< "," << pDigiID[2] ;
  387. MpdZdcVolInfo_t* pVolInfo = GetVolInfo (&pVolId);
  388. if (pVolInfo)
  389. cout << " X,Y,Z [cm]: " << (*pVolInfo)[0]<< "," << (*pVolInfo)[1]<< "," << (*pVolInfo)[2]<<
  390. " Dx,Dy,Dz [cm]: " << (*pVolInfo)[3]<< "," << (*pVolInfo)[4]<< "," << (*pVolInfo)[5] ;
  391. cout << endl;
  392. }
  393. // -------------------------------------------------------------------------
  394. Bool_t MpdZdcDigiScheme::CalcDimensions (Int_t pGlobalDetectorNumber, Int_t &nx, Int_t &ny, Int_t &nz)
  395. {
  396. if (fDigiToVolInfoMap.empty())
  397. return kFALSE;
  398. Bool_t result = kFALSE;
  399. std::map<MpdZdcDigiId_t,MpdZdcVolInfo_t*>::iterator it;
  400. std::map<Double_t,Int_t> xmap, ymap, zmap;
  401. Double_t x,y,z;
  402. nx = ny = nz = 0;
  403. for ( it=fDigiToVolInfoMap.begin() ; it != fDigiToVolInfoMap.end(); ++it ) {
  404. // cout << ". ";
  405. // if ((*it).first.first==pGlobalDetectorNumber) {
  406. if ((*it).first[0]==1) {
  407. result = kTRUE;
  408. x = (*((*it).second))[0];
  409. if (xmap.count(x))
  410. xmap[x]= xmap[x]+1;
  411. else
  412. xmap[x]= 1;
  413. y = (*((*it).second))[1];
  414. if (ymap.count(y))
  415. ymap[y]= ymap[y]+1;
  416. else
  417. ymap[y]= 1;
  418. z = (*((*it).second))[2];
  419. if (zmap.count(z))
  420. zmap[z]= zmap[z]+1;
  421. else
  422. zmap[z]= 1;
  423. }
  424. }
  425. nx = xmap.size();
  426. ny = ymap.size();
  427. nz = zmap.size();
  428. return result;
  429. }
  430. // -------------------------------------------------------------------------
  431. void MpdZdcDigiScheme::GetZdcDimensions (Int_t &nx, Int_t &ny, Int_t &nz)
  432. {
  433. nx=Nx; ny=Ny; nz=Nz;
  434. }
  435. // -------------------------------------------------------------------------
  436. void MpdZdcDigiScheme::GetZdcPsdDimensions (Int_t &nx_psd, Int_t &ny_psd, Int_t &nz_psd)
  437. {
  438. nx_psd=Nx_psd; ny_psd=Ny_psd; nz_psd=Nz_psd;
  439. }
  440. // -------------------------------------------------------------------------
  441. MpdZdcDigiId_t MpdZdcDigiScheme::GetDigiIdFromCoords (Double_t x, Double_t y, Double_t z)
  442. {
  443. Int_t content[]={-1,-1,-1,-1};
  444. MpdZdcVolId_t resultmc (content,content+sizeof(content)/sizeof(Int_t));
  445. MpdZdcDigiId_t result (-1,-1);
  446. if (gGeoManager) {
  447. TGeoNode *tgn = gGeoManager->FindNode(x,y,z);
  448. if (tgn) {
  449. resultmc[0] = 1*(z>0)+2*(z<0);
  450. resultmc[1] = tgn->GetMotherVolume()->GetNumber();
  451. resultmc[2] = tgn->GetVolume()->GetNumber();
  452. resultmc[3] = tgn->GetNumber();
  453. if (fVolToDigiIdMap.find(resultmc)!=fVolToDigiIdMap.end())
  454. result = fVolToDigiIdMap[resultmc];
  455. }
  456. }
  457. return result;
  458. }
  459. // -------------------------------------------------------------------------
  460. MpdZdcDigiId_t MpdZdcDigiScheme::GetDigiIdFromVolumeData (Int_t pMcVolumeNumber, Int_t pMcCopyNumber,
  461. Int_t pMotherCopyNumber, Int_t pMotherMotherCopyNumber)
  462. {
  463. Int_t content[]={pMotherMotherCopyNumber,pMotherCopyNumber,pMcVolumeNumber,pMcCopyNumber};
  464. MpdZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
  465. MpdZdcDigiId_t digiID = GetDigiId (&pVolId);
  466. return digiID;
  467. }
  468. // -------------------------------------------------------------------------
  469. void MpdZdcDigiScheme::SplitDigiID (MpdZdcDigiId_t digiID, Int_t &detID, Int_t &modID, Int_t &chanID)
  470. {
  471. detID = digiID[0];
  472. modID = digiID[1];
  473. chanID = digiID[2];
  474. }
  475. // -------------------------------------------------------------------------
  476. void MpdZdcDigiScheme::Print()
  477. {
  478. cout << "*********************************************" << endl;
  479. cout << "*** MpdZdcDigiScheme:" << endl;
  480. cout << " MpdZdc Nx,Ny,Nz: " << Nx << "," << Ny<< "," << Nz<< " YesPsd: " << fYesPsd;
  481. if (fYesPsd)
  482. cout << " MpdZdcPsd Nx_psd,Ny_psd,Nz_psd: " << Nx_psd << "," << Ny_psd<< "," << Nz_psd;
  483. cout << endl;
  484. std::map<MpdZdcVolId_t,MpdZdcDigiId_t>::iterator it;
  485. for ( it=fVolToDigiIdMap.begin() ; it != fVolToDigiIdMap.end(); ++it)
  486. PrintVolume((*it).first[2],(*it).first[3], (*it).first[1], (*it).first[0]);
  487. cout << "*********************************************" << endl;
  488. }
  489. // -------------------------------------------------------------------------
  490. Bool_t MpdZdcDigiScheme::GetDetIdModIdChanId (Int_t pMcVolumeNumber, Int_t pMcCopyNumber, Int_t pMotherCopyNumber, Int_t pMotherMotherCopyNumber, Int_t &pDetId, Int_t &pChanId, Int_t &pModId)
  491. {
  492. Int_t content[]={pMotherMotherCopyNumber,pMotherCopyNumber,pMcVolumeNumber,pMcCopyNumber};
  493. MpdZdcVolId_t pVolId (content,content+sizeof(content)/sizeof(Int_t));
  494. MpdZdcDigiId_t digiID = GetDigiId (&pVolId);
  495. pDetId = digiID[0];
  496. pModId = digiID[1];
  497. pChanId = digiID[2];
  498. return kTRUE;
  499. }
  500. // -------------------------------------------------------------------------
  501. ClassImp(MpdZdcDigiScheme)