@@ -56,44 +56,40 @@ Detector::Detector(bool active)
5656 mGeometryTGeo(nullptr ),
5757 mTrackData()
5858{
59- mNumberOfRingsC = Constants::nringsC;
59+ mNumberOfRings = Constants::nrings;
60+ mNumberOfRings_extra = Constants::nrings_extra;
6061 mNumberOfSectors = Constants::nsect;
6162
62- mEtaMinA = Constants::etaMin;
63- mEtaMaxA = Constants::etaMax;
64- mEtaMinC = - Constants::etaMax ;
65- mEtaMaxC = - Constants::etaMin ;
63+ mEtaMin = Constants::etaMin;
64+ mEtaMax = Constants::etaMax;
65+ mEtaMin_extra = Constants::etaMax_extra ;
66+ mEtaMax_extra = Constants::etaMin_extra ;
6667
6768 auto & baseParam = FD3BaseParam::Instance ();
6869
69- if (baseParam.withMG ) {
70- mNumberOfRingsA = Constants::nringsA_withMG;
71- mEtaMinA = Constants::etaMinA_withMG;
72- } else {
73- mNumberOfRingsA = Constants::nringsA;
74- mEtaMinA = Constants::etaMin;
75- }
70+ mExtra = baseParam.modules_extra ;
7671
7772 mDzScint = baseParam.dzscint / 2 ;
7873 mDzPlate = baseParam.dzplate ;
7974
8075 mPlateBehindA = baseParam.plateBehindA ;
8176 mFullContainer = baseParam.fullContainer ;
8277
83- mZA = baseParam.zmodA ;
84- mZC = baseParam.zmodC ;
78+ mZAC = baseParam.zmodAC ;
79+ mZAC_extra = baseParam.zmodAC_extra ;
8580
86- for (int i = 0 ; i <= mNumberOfRingsA + 1 ; i++) {
87- float eta = mEtaMaxA - i * (mEtaMaxA - mEtaMinA ) / mNumberOfRingsA ;
88- float r = ringSize (mZA , eta);
89- mRingSizesA .emplace_back (r);
81+ for (int i = 0 ; i <= mNumberOfRings + 1 ; i++) {
82+ float eta = mEtaMax - i * (mEtaMax - mEtaMin ) / mNumberOfRings ;
83+ float r = ringSize (mZAC , eta);
84+ mRingSizes .emplace_back (r);
9085 }
9186
92- for (int i = 0 ; i <= mNumberOfRingsC + 1 ; i++) {
93- float eta = mEtaMinC + i * (mEtaMaxC - mEtaMinC ) / mNumberOfRingsC ;
94- float r = ringSize (mZC , eta);
95- mRingSizesC .emplace_back (r);
87+ for (int i = 0 ; i <= mNumberOfRings_extra + 1 ; i++) {
88+ float eta = mEtaMax - i * (mEtaMax_extra - mEtaMin_extra ) / mNumberOfRings_extra ;
89+ float r = ringSize (mZAC_extra , eta);
90+ mRingSizes_extra .emplace_back (r);
9691 }
92+
9793}
9894
9995Detector::Detector (const Detector& rhs)
@@ -202,12 +198,6 @@ o2::fd3::Hit* Detector::addHit(int trackId, unsigned int detId,
202198 return &(mHits ->back ());
203199}
204200
205- void Detector::ConstructGeometry ()
206- {
207- createMaterials ();
208- buildModules ();
209- }
210-
211201void Detector::EndOfEvent ()
212202{
213203 Reset ();
@@ -231,6 +221,12 @@ void Detector::Reset()
231221 }
232222}
233223
224+ void Detector::ConstructGeometry ()
225+ {
226+ createMaterials ();
227+ buildModules ();
228+ }
229+
234230void Detector::createMaterials ()
235231{
236232 float density, as[11 ], zs[11 ], ws[11 ];
@@ -285,8 +281,16 @@ void Detector::buildModules()
285281 TGeoVolumeAssembly* vFD3A = buildModuleA ();
286282 TGeoVolumeAssembly* vFD3C = buildModuleC ();
287283
288- vCave->AddNode (vFD3A, 1 , new TGeoTranslation (0 ., 0 ., mZA ));
289- vCave->AddNode (vFD3C, 2 , new TGeoTranslation (0 ., 0 ., mZC ));
284+ vCave->AddNode (vFD3A, 1 , new TGeoTranslation (0 ., 0 ., mZAC ));
285+ vCave->AddNode (vFD3C, 2 , new TGeoTranslation (0 ., 0 ., -mZAC ));
286+
287+ if (mExtra ) {
288+ TGeoVolumeAssembly* vFD3A_extra = buildModuleA_extra ();
289+ TGeoVolumeAssembly* vFD3C_extra = buildModuleC_extra ();
290+ vCave->AddNode (vFD3A_extra, 1 , new TGeoTranslation (0 ., 0 ., mZAC_extra ));
291+ vCave->AddNode (vFD3C_extra, 2 , new TGeoTranslation (0 ., 0 ., -mZAC_extra ));
292+
293+ }
290294}
291295
292296TGeoVolumeAssembly* Detector::buildModuleA ()
@@ -297,11 +301,11 @@ TGeoVolumeAssembly* Detector::buildModuleA()
297301
298302 float dphiDeg = 360 . / mNumberOfSectors ;
299303
300- for (int ir = 0 ; ir < mNumberOfRingsA ; ir++) {
304+ for (int ir = 0 ; ir < mNumberOfRings ; ir++) {
301305 std::string rName = " fd3_ring" + std::to_string (ir + 1 );
302306 TGeoVolumeAssembly* ring = new TGeoVolumeAssembly (rName.c_str ());
303- float rmin = mRingSizesA [ir];
304- float rmax = mRingSizesA [ir + 1 ];
307+ float rmin = mRingSizes [ir];
308+ float rmax = mRingSizes [ir + 1 ];
305309 LOG (info) << " ring" << ir << " : from " << rmin << " to " << rmax;
306310 for (int ic = 0 ; ic < mNumberOfSectors ; ic++) {
307311 int cellId = ic + mNumberOfSectors * ir;
@@ -324,7 +328,7 @@ TGeoVolumeAssembly* Detector::buildModuleA()
324328 if (mPlateBehindA || mFullContainer ) {
325329 LOG (info) << " adding container on A side" ;
326330 auto pmed = (TGeoMedium*)gGeoManager ->GetMedium (" FD3_Aluminium" );
327- auto pvol = new TGeoTube (" pvol_fd3a" , mRingSizesA [0 ], mRingSizesA [ mNumberOfRingsA ], mDzPlate );
331+ auto pvol = new TGeoTube (" pvol_fd3a" , mRingSizes [0 ], mRingSizes [ mNumberOfRings ], mDzPlate );
328332 auto pnod1 = new TGeoVolume (" pnod1_FD3A" , pvol, pmed);
329333 double dpz = 2 . + mDzPlate / 2 ;
330334 mod->AddNode (pnod1, 1 , new TGeoTranslation (0 , 0 , dpz));
@@ -345,14 +349,14 @@ TGeoVolumeAssembly* Detector::buildModuleC()
345349
346350 float dphiDeg = 360 . / mNumberOfSectors ;
347351
348- for (int ir = 0 ; ir < mNumberOfRingsC ; ir++) {
349- std::string rName = " fd3_ring" + std::to_string (ir + 1 + mNumberOfRingsA );
352+ for (int ir = 0 ; ir < mNumberOfRings ; ir++) {
353+ std::string rName = " fd3_ring" + std::to_string (ir + 1 + mNumberOfRings );
350354 TGeoVolumeAssembly* ring = new TGeoVolumeAssembly (rName.c_str ());
351- float rmin = mRingSizesC [ir];
352- float rmax = mRingSizesC [ir + 1 ];
353- LOG (info) << " ring" << ir + mNumberOfRingsA << " : from " << rmin << " to " << rmax;
355+ float rmin = mRingSizes [ir];
356+ float rmax = mRingSizes [ir + 1 ];
357+ LOG (info) << " ring" << ir + mNumberOfRings << " : from " << rmin << " to " << rmax;
354358 for (int ic = 0 ; ic < mNumberOfSectors ; ic++) {
355- int cellId = ic + mNumberOfSectors * (ir + mNumberOfRingsA );
359+ int cellId = ic + mNumberOfSectors * (ir + mNumberOfRings );
356360 std::string nodeName = " fd3_node" + std::to_string (cellId);
357361 float phimin = dphiDeg * ic;
358362 float phimax = dphiDeg * (ic + 1 );
@@ -372,7 +376,7 @@ TGeoVolumeAssembly* Detector::buildModuleC()
372376 if (mFullContainer ) {
373377 LOG (info) << " adding container on C side" ;
374378 auto pmed = (TGeoMedium*)gGeoManager ->GetMedium (" FD3_Aluminium" );
375- auto pvol = new TGeoTube (" pvol_fd3c" , mRingSizesC [0 ], mRingSizesC [ mNumberOfRingsC ], mDzPlate );
379+ auto pvol = new TGeoTube (" pvol_fd3c" , mRingSizes [0 ], mRingSizes [ mNumberOfRings ], mDzPlate );
376380 auto pnod1 = new TGeoVolume (" pnod1_FD3C" , pvol, pmed);
377381 auto pnod2 = new TGeoVolume (" pnod2_FD3C" , pvol, pmed);
378382 double dpz = mDzScint / 2 + mDzPlate / 2 ;
@@ -384,25 +388,92 @@ TGeoVolumeAssembly* Detector::buildModuleC()
384388 return mod;
385389}
386390
391+ TGeoVolumeAssembly* Detector::buildModuleA_extra ()
392+ {
393+ TGeoVolumeAssembly* mod = new TGeoVolumeAssembly (" FD3A_extra" );
394+
395+ const TGeoMedium* medium = gGeoManager ->GetMedium (" FD3_Scintillator" );
396+
397+ float dphiDeg = 360 . / mNumberOfSectors ;
398+
399+ for (int ir = 0 ; ir < mNumberOfRings_extra ; ir++) {
400+ std::string rName = " fd3_ring" + std::to_string (ir + 1 + 2 * mNumberOfRings );
401+ TGeoVolumeAssembly* ring = new TGeoVolumeAssembly (rName.c_str ());
402+ float rmin = mRingSizes_extra [ir];
403+ float rmax = mRingSizes_extra [ir + 1 ];
404+ LOG (info) << " ring" << ir << " : from " << rmin << " to " << rmax;
405+ for (int ic = 0 ; ic < mNumberOfSectors ; ic++) {
406+ int cellId = ic + mNumberOfSectors * (ir + 2 * mNumberOfRings );
407+ std::string nodeName = " fd3_node" + std::to_string (cellId);
408+ float phimin = dphiDeg * ic;
409+ float phimax = dphiDeg * (ic + 1 );
410+ auto tbs = new TGeoTubeSeg (" tbs" , rmin, rmax, mDzScint , phimin, phimax);
411+ auto nod = new TGeoVolume (nodeName.c_str (), tbs, medium);
412+ if ((ir + ic) % 2 == 0 ) {
413+ nod->SetLineColor (kRed );
414+ } else {
415+ nod->SetLineColor (kRed - 7 );
416+ }
417+ ring->AddNode (nod, cellId);
418+ }
419+ mod->AddNode (ring, ir + 1 );
420+ }
421+
422+ return mod;
423+ }
424+
425+ TGeoVolumeAssembly* Detector::buildModuleC_extra ()
426+ {
427+ TGeoVolumeAssembly* mod = new TGeoVolumeAssembly (" FD3C_extra" );
428+
429+ const TGeoMedium* medium = gGeoManager ->GetMedium (" FD3_Scintillator" );
430+
431+ float dphiDeg = 360 . / mNumberOfSectors ;
432+
433+ for (int ir = 0 ; ir < mNumberOfRings_extra ; ir++) {
434+ std::string rName = " fd3_ring" + std::to_string (ir + 1 + 2 * mNumberOfRings + mNumberOfRings_extra );
435+ TGeoVolumeAssembly* ring = new TGeoVolumeAssembly (rName.c_str ());
436+ float rmin = mRingSizes_extra [ir];
437+ float rmax = mRingSizes_extra [ir + 1 ];
438+ LOG (info) << " ring" << ir + mNumberOfRings_extra << " : from " << rmin << " to " << rmax;
439+ for (int ic = 0 ; ic < mNumberOfSectors ; ic++) {
440+ int cellId = ic + mNumberOfSectors * (ir + 2 * mNumberOfRings + mNumberOfRings_extra );
441+ std::string nodeName = " fd3_node" + std::to_string (cellId);
442+ float phimin = dphiDeg * ic;
443+ float phimax = dphiDeg * (ic + 1 );
444+ auto tbs = new TGeoTubeSeg (" tbs" , rmin, rmax, mDzScint , phimin, phimax);
445+ auto nod = new TGeoVolume (nodeName.c_str (), tbs, medium);
446+ if ((ir + ic) % 2 == 0 ) {
447+ nod->SetLineColor (kBlue );
448+ } else {
449+ nod->SetLineColor (kBlue - 7 );
450+ }
451+ ring->AddNode (nod, cellId);
452+ }
453+ mod->AddNode (ring, ir + 1 );
454+ }
455+
456+ return mod;
457+ }
458+
387459void Detector::defineSensitiveVolumes ()
388460{
389461 LOG (info) << " Adding FD3 Sentitive Volumes" ;
390462
391463 TGeoVolume* v;
392- TString volumeName;
393-
394- int nCellsA = mNumberOfRingsA * mNumberOfSectors ;
395- int nCellsC = mNumberOfRingsC * mNumberOfSectors ;
396464
397- LOG (info) << " number of A rings = " << mNumberOfRingsA << " number of cells = " << nCellsA;
398- LOG (info) << " number of C rings = " << mNumberOfRingsC << " number of cells = " << nCellsC;
465+ int nCells = 2 * mNumberOfRings * mNumberOfSectors ;
466+ if (mExtra ) {
467+ int nCells = nCells + 2 * mNumberOfRings_extra * mNumberOfSectors ;
468+ }
399469
400- for (int iv = 0 ; iv < nCellsA + nCellsC ; iv++) {
401- volumeName = " fd3_node" + std::to_string (iv);
470+ for (int iv = 0 ; iv < nCells ; iv++) {
471+ TString volumeName = " fd3_node" + std::to_string (iv);
402472 v = gGeoManager ->GetVolume (volumeName);
403473 LOG (info) << " Adding sensitive volume => " << v->GetName ();
404474 AddSensitiveVolume (v);
405475 }
476+
406477}
407478
408479float Detector::ringSize (float z, float eta)
0 commit comments