MpdFsaHitProducer.cxx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /////////////////////////////////////////////////////////////
  2. //
  3. // MpdFsaHitProducer
  4. //
  5. // Filler of MpdFsaHit
  6. //
  7. ///////////////////////////////////////////////////////////////
  8. #include "TClonesArray.h"
  9. #include "FairRootManager.h"
  10. #include "FairDetector.h"
  11. #include "TGeoManager.h"
  12. #include "TGeoVolume.h"
  13. #include "TGeoNode.h"
  14. #include "TGeoMatrix.h"
  15. #include "TVector3.h"
  16. #include "FairRun.h"
  17. #include "FairRuntimeDb.h"
  18. #include "TMath.h"
  19. #include "MpdFsaHitProducer.h"
  20. #include "MpdFsaHit.h"
  21. #include "MpdFsaPoint.h"
  22. #include "MpdFsaGeoPar.h"
  23. #include "FairRunAna.h"
  24. #include "TIterator.h"
  25. #include "TObjArray.h"
  26. #include "FairGeoNode.h"
  27. // ----- Default constructor -------------------------------------------
  28. MpdFsaHitProducer::MpdFsaHitProducer(const char* fileGeo) :
  29. FairTask("Ideal FSA hit Producer") {
  30. fFileGeo=fileGeo;
  31. eneThr = 0.001; // Energy threshold for FSA
  32. Int_t n = 200;
  33. xt = new Bool_t[n];
  34. yt = new Bool_t[n];
  35. for (Int_t i = 0; i < n; i++)
  36. {
  37. xt[i] = false;
  38. yt[i] = false;
  39. }
  40. }
  41. // ----- Destructor ----------------------------------------------------
  42. MpdFsaHitProducer::~MpdFsaHitProducer() { }
  43. // -------------------------------------------------------------------------
  44. // ----- Public method Init --------------------------------------------
  45. InitStatus MpdFsaHitProducer::Init() {
  46. cout << "******************* INITIALIZATION *********************" << endl;
  47. //FairDetector::Initialize();
  48. //FairRun* sim = FairRun::Instance();
  49. //FairRuntimeDb* rtdb=sim->GetRuntimeDb();
  50. // Get RootManager
  51. FairRootManager* ioman = FairRootManager::Instance();
  52. if ( ! ioman ) {
  53. cout << "-E- MpdFsaHitProducer::Init: "
  54. << "RootManager not instantiated!" << endl;
  55. return kFATAL;
  56. }
  57. // Get input array
  58. fPointArray = (TClonesArray*) ioman->GetObject("FSAPoint");
  59. if ( ! fPointArray ) {
  60. cout << "-W- MpdFsaHitProducer::Init: "
  61. << "No FsaPoint array!" << endl;
  62. return kERROR;
  63. }
  64. // Create and register output array
  65. fDigiArray = new TClonesArray("MpdFsaHit");
  66. ioman->Register("FsaHit","Fsa",fDigiArray,kTRUE);
  67. CreateStructure();
  68. hlist = new TList();
  69. MakeHists();
  70. cout << "-I- MpdFsaHitProducer: Intialization successfull" << endl;
  71. return kSUCCESS;
  72. }
  73. //__________________________________________________________________
  74. void MpdFsaHitProducer::FinishTask() {
  75. //---
  76. cout << "-I- MpdFsaHitProducer: FinishTask" << endl;
  77. // save histograms of corresponding list
  78. if (hlist!=0) {
  79. TObject *obj;
  80. TIter next(hlist);
  81. while((obj = (TObject*)next())) obj->Write();
  82. }
  83. }
  84. //__________________________________________________________________
  85. void MpdFsaHitProducer::Finish() {
  86. //---
  87. cout << "-I- MpdFsaHitProducer: Finish" << endl;
  88. }
  89. //__________________________________________________________________
  90. void MpdFsaHitProducer::MakeHists() {
  91. //---
  92. fZ = new TH1F("z","", 1000, 740., 1000.);
  93. hlist->Add(fZ);
  94. //
  95. // fR = new TH1F("r","", 230, 40., 270.);
  96. // hlist->Add(fR);
  97. //
  98. // fLoadXL1 = new TH1F("loadXLayer1","", 540, -270., 270.);
  99. // hlist->Add(fLoadXL1);
  100. // fLoadXL2 = new TH1F("loadXLayer2","", 540, -270., 270.);
  101. // hlist->Add(fLoadXL2);
  102. // fLoadXL3 = new TH1F("loadXLayer3","", 540, -270., 270.);
  103. // hlist->Add(fLoadXL3);
  104. // fLoadXL4 = new TH1F("loadXLayer4","", 540, -270., 270.);
  105. // hlist->Add(fLoadXL4);
  106. // fLoadXL5 = new TH1F("loadXLayer5","", 540, -270., 270.);
  107. // hlist->Add(fLoadXL5);
  108. //
  109. // fLoadYL1 = new TH1F("loadYLayer1","", 540, -270., 270.);
  110. // hlist->Add(fLoadYL1);
  111. // fLoadYL2 = new TH1F("loadYLayer2","", 540, -270., 270.);
  112. // hlist->Add(fLoadYL2);
  113. // fLoadYL3 = new TH1F("loadYLayer3","", 540, -270., 270.);
  114. // hlist->Add(fLoadYL3);
  115. // fLoadYL4 = new TH1F("loadYLayer4","", 540, -270., 270.);
  116. // hlist->Add(fLoadYL4);
  117. // fLoadYL5 = new TH1F("loadYLayer5","", 540, -270., 270.);
  118. // hlist->Add(fLoadYL5);
  119. //
  120. // fTime = new TH1F("Time","",500,0.0,500.0);
  121. // hlist->Add(fTime);
  122. //
  123. // fXY = new TH2F("xy","", 540, -270., 270., 540, -270., 270.);
  124. // hlist->Add(fXY);
  125. //
  126. // fRphi = new TH2F("rphi","", 360, 0., TMath::TwoPi(), 230, 40., 270.);
  127. // hlist->Add(fRphi);
  128. //
  129. // fLoadXYL1 = new TH2F("LoadXYLayer1","", 540, -270., 270., 540, -270., 270.);
  130. // hlist->Add(fLoadXYL1);
  131. ///////////////////////////
  132. fLoadX1 = new TH1F("loadXLayer1","", 540, -270., 270.);
  133. hlist->Add(fLoadX1);
  134. fLoadX1u = new TH1F("loadXLayer1u","", 540, -270., 270.);
  135. hlist->Add(fLoadX1u);
  136. fLoadX1d = new TH1F("loadXLayer1d","", 540, -270., 270.);
  137. hlist->Add(fLoadX1d);
  138. fLoadY1 = new TH1F("loadYLayer1","", 540, -270., 270.);
  139. hlist->Add(fLoadY1);
  140. fLoadY1u = new TH1F("loadYLayer1u","", 540, -270., 270.);
  141. hlist->Add(fLoadY1u);
  142. fLoadY1d = new TH1F("loadYLayer1d","", 540, -270., 270.);
  143. hlist->Add(fLoadY1d);
  144. fLoadX2 = new TH1F("loadXLayer2","", 540, -270., 270.);
  145. hlist->Add(fLoadX2);
  146. fLoadX2u = new TH1F("loadXLayer2u","", 540, -270., 270.);
  147. hlist->Add(fLoadX2u);
  148. fLoadX2d = new TH1F("loadXLayer2d","", 540, -270., 270.);
  149. hlist->Add(fLoadX2d);
  150. fLoadY2 = new TH1F("loadYLayer2","", 540, -270., 270.);
  151. hlist->Add(fLoadY2);
  152. fLoadY2u = new TH1F("loadYLayer2u","", 540, -270., 270.);
  153. hlist->Add(fLoadY2u);
  154. fLoadY2d = new TH1F("loadYLayer2d","", 540, -270., 270.);
  155. hlist->Add(fLoadY2d);
  156. fLoadX3 = new TH1F("loadXLayer3","", 540, -270., 270.);
  157. hlist->Add(fLoadX3);
  158. fLoadX3u = new TH1F("loadXLayer3u","", 540, -270., 270.);
  159. hlist->Add(fLoadX3u);
  160. fLoadX3d = new TH1F("loadXLayer3d","", 540, -270., 270.);
  161. hlist->Add(fLoadX3d);
  162. fLoadY3 = new TH1F("loadYLayer3","", 540, -270., 270.);
  163. hlist->Add(fLoadY3);
  164. fLoadY3u = new TH1F("loadYLayer3u","", 540, -270., 270.);
  165. hlist->Add(fLoadY3u);
  166. fLoadY3d = new TH1F("loadYLayer3d","", 540, -270., 270.);
  167. hlist->Add(fLoadY3d);
  168. fLoadX4 = new TH1F("loadXLayer4","", 540, -270., 270.);
  169. hlist->Add(fLoadX4);
  170. fLoadX4u = new TH1F("loadXLayer4u","", 540, -270., 270.);
  171. hlist->Add(fLoadX4u);
  172. fLoadX4d = new TH1F("loadXLayer4d","", 540, -270., 270.);
  173. hlist->Add(fLoadX4d);
  174. fLoadY4 = new TH1F("loadYLayer4","", 540, -270., 270.);
  175. hlist->Add(fLoadY4);
  176. fLoadY4u = new TH1F("loadYLayer4u","", 540, -270., 270.);
  177. hlist->Add(fLoadY4u);
  178. fLoadY4d = new TH1F("loadYLayer4d","", 540, -270., 270.);
  179. hlist->Add(fLoadY4d);
  180. fLoadX5 = new TH1F("loadXLayer5","", 540, -270., 270.);
  181. hlist->Add(fLoadX5);
  182. fLoadX5u = new TH1F("loadXLayer5u","", 540, -270., 270.);
  183. hlist->Add(fLoadX5u);
  184. fLoadX5d = new TH1F("loadXLayer5d","", 540, -270., 270.);
  185. hlist->Add(fLoadX5d);
  186. fLoadY5 = new TH1F("loadYLayer5","", 540, -270., 270.);
  187. hlist->Add(fLoadY5);
  188. fLoadY5u = new TH1F("loadYLayer5u","", 540, -270., 270.);
  189. hlist->Add(fLoadY5u);
  190. fLoadY5d = new TH1F("loadYLayer5d","", 540, -270., 270.);
  191. hlist->Add(fLoadY5d);
  192. fLoadXY1 = new TH2F("LoadXYLayer1","", 540, -270., 270., 540, -270., 270.);
  193. hlist->Add(fLoadXY1);
  194. fRealXY1 = new TH2F("RealXYLayer1","", 540, -270., 270., 540, -270., 270.);
  195. hlist->Add(fRealXY1);
  196. }
  197. // ----- Public method Exec --------------------------------------------
  198. void MpdFsaHitProducer::Exec(Option_t* opt) {
  199. //cout << " DIGI EXECUTION *********************" << endl;
  200. // Reset output array
  201. if ( ! fDigiArray ) Fatal("Exec", "No DigiArray");
  202. fDigiArray->Clear();
  203. // Declare some variables
  204. MpdFsaPoint* point = NULL;
  205. map<Int_t, Float_t> fTrackEnergy;
  206. fTrackEnergy.clear();
  207. map<Int_t, Float_t>::const_iterator p;
  208. // Loop over FsaPoints
  209. Int_t nPoints = fPointArray->GetEntriesFast();
  210. for (Int_t iPoint=0; iPoint < nPoints; iPoint++) {
  211. point = (MpdFsaPoint*) fPointArray->At(iPoint);
  212. // fTrackEnergy[point->GetDetectorID()] += point->GetEnergyLoss();
  213. fZ->Fill(point->GetZ());
  214. // fXY->Fill(point->GetX(), point->GetY());
  215. // TVector2 v = TVector2(point->GetX(), point->GetY());
  216. // fR->Fill(v.Mod());
  217. // fRphi->Fill(v.Phi(), v.Mod());
  218. //
  219. // if(point->GetZ()< 761.0 && point->GetZ()> 760.0){
  220. // fLoadXL1->Fill(point->GetX());
  221. // fLoadXYL1->Fill(point->GetX(), point->GetY());
  222. // fTime->Fill(point->GetTime());
  223. // }
  224. // if(point->GetZ()< 815.5 && point->GetZ()> 814.5)
  225. // fLoadXL2->Fill(point->GetX());
  226. // if(point->GetZ()< 870.0 && point->GetZ()> 869.0)
  227. // fLoadXL3->Fill(point->GetX());
  228. // if(point->GetZ()< 924.5 && point->GetZ()> 923.5)
  229. // fLoadXL4->Fill(point->GetX());
  230. // if(point->GetZ()< 979.0 && point->GetZ()> 978.0)
  231. // fLoadXL5->Fill(point->GetX());
  232. //
  233. // if(point->GetZ()< 762.0 && point->GetZ()> 761.0)
  234. // fLoadYL1->Fill(point->GetY());
  235. // if(point->GetZ()< 816.5 && point->GetZ()> 815.5)
  236. // fLoadYL2->Fill(point->GetY());
  237. // if(point->GetZ()< 871.0 && point->GetZ()> 870.0)
  238. // fLoadYL3->Fill(point->GetY());
  239. // if(point->GetZ()< 925.5 && point->GetZ()> 924.5)
  240. // fLoadYL4->Fill(point->GetY());
  241. // if(point->GetZ()< 980.0 && point->GetZ()> 979.0)
  242. // fLoadYL5->Fill(point->GetY());
  243. /////////////////////
  244. //layer1
  245. if(point->GetZ()< 761.0 && point->GetZ()> 760.0){
  246. fLoadX1->Fill(point->GetX());
  247. if(point->GetY()>=0.0) fLoadX1u->Fill(point->GetX());
  248. if(point->GetY()<0.0) fLoadX1d->Fill(point->GetX());
  249. }
  250. if(point->GetZ()< 762.0 && point->GetZ()> 761.0){
  251. fLoadY1->Fill(point->GetY());
  252. if(point->GetX()>=0.0) fLoadY1u->Fill(point->GetY());
  253. if(point->GetX()<0.0) fLoadY1d->Fill(point->GetY());
  254. }
  255. //layer2
  256. if(point->GetZ()< 815.5 && point->GetZ()> 814.5){
  257. fLoadX2->Fill(point->GetX());
  258. if(point->GetY()>=0.0) fLoadX2u->Fill(point->GetX());
  259. if(point->GetY()<0.0) fLoadX2d->Fill(point->GetX());
  260. }
  261. if(point->GetZ()< 816.5 && point->GetZ()> 815.5){
  262. fLoadY2->Fill(point->GetY());
  263. if(point->GetX()>=0.0) fLoadY2u->Fill(point->GetY());
  264. if(point->GetX()<0.0) fLoadY2d->Fill(point->GetY());
  265. }
  266. //layer3
  267. if(point->GetZ()< 870.0 && point->GetZ()> 869.0){
  268. fLoadX3->Fill(point->GetX());
  269. if(point->GetY()>=0.0) fLoadX3u->Fill(point->GetX());
  270. if(point->GetY()<0.0) fLoadX3d->Fill(point->GetX());
  271. }
  272. if(point->GetZ()< 871.0 && point->GetZ()> 870.0){
  273. fLoadY3->Fill(point->GetY());
  274. if(point->GetX()>=0.0) fLoadY3u->Fill(point->GetY());
  275. if(point->GetX()<0.0) fLoadY3d->Fill(point->GetY());
  276. }
  277. //layer4
  278. if(point->GetZ()< 924.5 && point->GetZ()> 923.5){
  279. fLoadX4->Fill(point->GetX());
  280. if(point->GetY()>=0.0) fLoadX4u->Fill(point->GetX());
  281. if(point->GetY()<0.0) fLoadX4d->Fill(point->GetX());
  282. }
  283. if(point->GetZ()< 925.5 && point->GetZ()> 924.5){
  284. fLoadY4->Fill(point->GetY());
  285. if(point->GetX()>=0.0) fLoadY4u->Fill(point->GetY());
  286. if(point->GetX()<0.0) fLoadY4d->Fill(point->GetY());
  287. }
  288. //layer5
  289. if(point->GetZ()< 979.0 && point->GetZ()> 978.0){
  290. fLoadX5->Fill(point->GetX());
  291. if(point->GetY()>=0.0) fLoadX5u->Fill(point->GetX());
  292. if(point->GetY()<0.0) fLoadX5d->Fill(point->GetX());
  293. }
  294. if(point->GetZ()< 980.0 && point->GetZ()> 979.0){
  295. fLoadY5->Fill(point->GetY());
  296. if(point->GetX()>=0.0) fLoadY5u->Fill(point->GetY());
  297. if(point->GetX()<0.0) fLoadY5d->Fill(point->GetY());
  298. }
  299. //layer1xy
  300. if(point->GetZ()< 761.0 && point->GetZ()> 760.0)
  301. {
  302. Int_t tx = (Int_t)floor(point->GetX());
  303. Int_t ty = (Int_t)floor(point->GetY());
  304. if (tx >= 0 && ty >= 0)
  305. {
  306. const Double_t initDistMin = 7600.0;
  307. const Double_t initDistMax = 9800.0;
  308. const Double_t layerThickness = 20.0;
  309. const Int_t numLayers = 5;
  310. Double_t distBetLayers = (initDistMax - initDistMin - layerThickness) / (numLayers - 1.0);
  311. const Double_t angleRMax = 14.0;
  312. const Double_t angleRMin = 5.0;
  313. const Double_t tubeRadius = 5.0;
  314. Double_t outerRadius = (initDistMin + 0 /*1 layer*/ * distBetLayers) * TMath::Tan(angleRMax * TMath::DegToRad());
  315. Double_t innerRadius = (initDistMin + 0 * distBetLayers) * TMath::Tan(angleRMin * TMath::DegToRad());
  316. Int_t numStrawsPerLayer = (Int_t)floor(outerRadius / (2 * tubeRadius));
  317. Double_t outR2 = outerRadius * outerRadius;
  318. Double_t inR2 = innerRadius * innerRadius;
  319. Double_t tubeDiameter = 2 * tubeRadius;
  320. if (xt[tx] == false)
  321. {
  322. //xt[tx] = true;
  323. Int_t curYu = (Int_t)floor((TMath::Sqrt(outR2 - TMath::Power(tubeDiameter * (tx + 1), 2))) / 10.0);
  324. Int_t curYd = 0;
  325. if (tubeDiameter * tx < innerRadius)
  326. {
  327. curYd = (Int_t)ceil((TMath::Sqrt(inR2 - TMath::Power(tubeDiameter * tx, 2))) / 10.0);
  328. }
  329. //Double_t movX = tubeDiameter * tx + tubeRadius;
  330. //cout << tx << " " << curYd << " " << curYu;
  331. for (Int_t i = curYd; i < curYu; i++)
  332. {
  333. if(yt[i] == true)
  334. {
  335. fLoadXY1->Fill(tx + 0.5, i + 0.5);
  336. //cout << i << " ";
  337. }
  338. }
  339. //cout << endl;
  340. }
  341. if (yt[ty] == false)
  342. {
  343. //yt[ty] = true;
  344. Int_t curXu = (Int_t)floor((TMath::Sqrt(outR2 - TMath::Power(tubeDiameter * (ty + 1), 2))) / 10.0);
  345. Int_t curXd = 0;
  346. if (tubeDiameter * ty < innerRadius)
  347. {
  348. curXd = (Int_t)ceil((TMath::Sqrt(inR2 - TMath::Power(tubeDiameter * ty, 2))) / 10.0);
  349. }
  350. //Double_t movX = tubeDiameter * tx + tubeRadius;
  351. for (Int_t i = curXd; i < curXu; i++)
  352. {
  353. if(xt[i] == true) fLoadXY1->Fill(i + 0.5, ty + 0.5);
  354. }
  355. }
  356. xt[tx] = true;
  357. yt[ty] = true;
  358. fLoadXY1->Fill(tx + 0.5, ty + 0.5);
  359. fRealXY1->Fill(tx + 0.5, ty + 0.5);
  360. }
  361. }
  362. /*FairRuntimeDb* rtdb = FairRun::Instance()->GetRuntimeDb();
  363. MpdFsaGeoPar *geoPar = (MpdFsaGeoPar*) rtdb->getContainer("MpdFsaGeoPar");
  364. TObjArray* sensNodes = geoPar->GetGeoSensitiveNodes();
  365. cout << sensNodes->LowerBound() << endl;
  366. TIterator* it = sensNodes->MakeIterator();
  367. Int_t k = 0;
  368. while (it->Next() != 0)
  369. {
  370. //TIterator* tmp = it;
  371. cout << k++ << ((FairGeoNode*)&it)->getName() << endl;
  372. }*/
  373. /*Int_t j = 0; //layer 1
  374. const Double_t initDistMin = 7600.0;
  375. const Double_t initDistMax = 9800.0;
  376. const Double_t layerThickness = 20.0;
  377. const Int_t numLayers = 5;
  378. Double_t distBetLayers = (initDistMax - initDistMin - layerThickness) / (numLayers - 1.0);
  379. const Double_t angleRMax = 14.0;
  380. const Double_t tubeRadius = 5.0;
  381. Int_t outerRadius = (initDistMin + j * distBetLayers) * TMath::Tan(angleRMax * TMath::DegToRad());
  382. Int_t numStrawsPerLayer = floor(outerRadius / (2 * tubeRadius));
  383. for (Int_t i = 0; i < numStrawsPerLayer; i++)
  384. {
  385. TString volName = "fsa01gas";
  386. volName += itoa(j);
  387. volName += itoa(i);
  388. volName += "#1";
  389. FairGeoNode* sensVol = (FairGeoNode*) (sensNodes->FindObject(volName));
  390. }*/
  391. }
  392. #if 0
  393. // Loop to register FsaHit
  394. for(p=fTrackEnergy.begin(); p!=fTrackEnergy.end(); ++p) {
  395. if ((*p).second>eneThr)
  396. AddHit(1, (*p).first, (*p).second);
  397. }
  398. #endif
  399. }
  400. // -------------------------------------------------------------------------
  401. // ----- Public method Create Structure --------------------------------
  402. void MpdFsaHitProducer::CreateStructure() {
  403. /*
  404. TString work = getenv("VMCWORKDIR");
  405. work = work + "/geometry/" + fFileGeo;
  406. cout << "-I- <MpdFsaHitProducer::CreateStructure> Fsa geometry loaded from: "
  407. << work << endl;
  408. Int_t detId = -1;
  409. MpdFsaReader read(work);
  410. for(Int_t module=1; module<=read.GetMaxModules(); module++)
  411. for(Int_t row=1; row<=read.GetMaxRows(module); row++)
  412. for(Int_t crystal=1; crystal<=read.GetMaxCrystals(module,row); crystal++) {
  413. DataG4 data = read.GetData(module,row,crystal);
  414. for(Int_t copy=1; copy<=20; copy++) {
  415. detId = module*100000000 + row*1000000 + copy*10000 + crystal;
  416. emcX[detId] = data.posX; emcY[detId] = data.posY; emcZ[detId] = data.posZ;
  417. emcTheta[detId] = data.theta; emcTau[detId] = data.tau;
  418. if (module==3)
  419. emcPhi[detId] = fmod(data.phi+90.*(copy-1),360);
  420. else
  421. emcPhi[detId] = fmod(data.phi+22.5*(copy-1),360);
  422. }
  423. }
  424. */
  425. }
  426. // ----- Private method AddDigi --------------------------------------------
  427. MpdFsaHit* MpdFsaHitProducer::AddHit(Int_t trackID,Int_t detID, Float_t energy){
  428. // It fills the MpdFsaHit category
  429. // cout << "MpdFsaHitProducer: track " << trackID << " evt " << eventID << " sec " << sec << " plane " << pla << " strip " << strip << "box " << box << " tube " << tub << endl;
  430. TClonesArray& clref = *fDigiArray;
  431. Int_t size = clref.GetEntriesFast();
  432. return new(clref[size]) MpdFsaHit(); // FIXME: real hit info needed here
  433. }
  434. // ----
  435. ClassImp(MpdFsaHitProducer)