1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 Revision 1.46 2001/03/12 17:46:33 hristov
19 Changes needed on Sun with CC 5.0
21 Revision 1.45 2001/02/27 22:11:46 jbarbosa
22 Testing TreeS, removing of output.
24 Revision 1.44 2001/02/27 15:19:12 jbarbosa
25 Transition to SDigits.
27 Revision 1.43 2001/02/23 17:19:06 jbarbosa
28 Corrected photocathode definition in BuildGeometry().
30 Revision 1.42 2001/02/13 20:07:23 jbarbosa
31 Parametrised definition of photcathode dimensions. New spacers. New data members in AliRICHHit to store particle momentum
32 when entering the freon. Corrected calls to particle stack.
34 Revision 1.41 2001/01/26 20:00:20 hristov
35 Major upgrade of AliRoot code
37 Revision 1.40 2001/01/24 20:58:03 jbarbosa
38 Enhanced BuildGeometry. Now the photocathodes are drawn.
40 Revision 1.39 2001/01/22 21:40:24 jbarbosa
41 Removing magic numbers
43 Revision 1.37 2000/12/20 14:07:25 jbarbosa
44 Removed dependencies on TGeant3 (thanks to F. Carminati and I. Hrivnacova)
46 Revision 1.36 2000/12/18 17:45:54 jbarbosa
47 Cleaned up PadHits object.
49 Revision 1.35 2000/12/15 16:49:40 jbarbosa
50 Geometry and materials updates (wire supports, pcbs, backplane supports, frame).
52 Revision 1.34 2000/11/10 18:12:12 jbarbosa
53 Bug fix for AliRICHCerenkov (thanks to P. Hristov)
55 Revision 1.33 2000/11/02 10:09:01 jbarbosa
56 Minor bug correction (some pointers were not initialised in the default constructor)
58 Revision 1.32 2000/11/01 15:32:55 jbarbosa
59 Updated to handle both reconstruction algorithms.
61 Revision 1.31 2000/10/26 20:18:33 jbarbosa
62 Supports for methane and freon vessels
64 Revision 1.30 2000/10/24 13:19:12 jbarbosa
67 Revision 1.29 2000/10/19 19:39:25 jbarbosa
68 Some more changes to geometry. Further correction of digitisation "per part. type"
70 Revision 1.28 2000/10/17 20:50:57 jbarbosa
71 Inversed digtise by particle type (now, only the selected particle type is not digitsed).
72 Corrected several geometry minor bugs.
73 Added new parameter (opaque quartz thickness).
75 Revision 1.27 2000/10/11 10:33:55 jbarbosa
76 Corrected bug introduced by earlier revisions (CerenkovData array cannot be reset to zero on wach call of StepManager)
78 Revision 1.26 2000/10/03 21:44:08 morsch
79 Use AliSegmentation and AliHit abstract base classes.
81 Revision 1.25 2000/10/02 21:28:12 fca
82 Removal of useless dependecies via forward declarations
84 Revision 1.24 2000/10/02 15:43:17 jbarbosa
85 Fixed forward declarations.
86 Fixed honeycomb density.
87 Fixed cerenkov storing.
90 Revision 1.23 2000/09/13 10:42:14 hristov
91 Minor corrections for HP, DEC and Sun; strings.h included
93 Revision 1.22 2000/09/12 18:11:13 fca
94 zero hits area before using
96 Revision 1.21 2000/07/21 10:21:07 morsch
97 fNrawch = 0; and fNrechits = 0; in the default constructor.
99 Revision 1.20 2000/07/10 15:28:39 fca
100 Correction of the inheritance scheme
102 Revision 1.19 2000/06/30 16:29:51 dibari
103 Added kDebugLevel variable to control output size on demand
105 Revision 1.18 2000/06/12 15:15:46 jbarbosa
108 Revision 1.17 2000/06/09 14:58:37 jbarbosa
109 New digitisation per particle type
111 Revision 1.16 2000/04/19 12:55:43 morsch
112 Newly structured and updated version (JB, AM)
117 ////////////////////////////////////////////////
118 // Manager and hits classes for set:RICH //
119 ////////////////////////////////////////////////
127 #include <TObjArray.h>
130 #include <TParticle.h>
131 #include <TGeometry.h>
134 #include <iostream.h>
138 #include "AliSegmentation.h"
139 #include "AliRICHSegmentationV0.h"
140 #include "AliRICHHit.h"
141 #include "AliRICHCerenkov.h"
142 #include "AliRICHSDigit.h"
143 #include "AliRICHDigit.h"
144 #include "AliRICHTransientDigit.h"
145 #include "AliRICHRawCluster.h"
146 #include "AliRICHRecHit1D.h"
147 #include "AliRICHRecHit3D.h"
148 #include "AliRICHHitMapA1.h"
149 #include "AliRICHClusterFinder.h"
150 #include "AliRICHMerger.h"
154 #include "AliConst.h"
156 #include "AliPoints.h"
157 #include "AliCallf77.h"
160 // Static variables for the pad-hit iterator routines
161 static Int_t sMaxIterPad=0;
162 static Int_t sCurIterPad=0;
166 //___________________________________________
169 // Default constructor for RICH manager class
182 for (Int_t i=0; i<7; i++)
193 //___________________________________________
194 AliRICH::AliRICH(const char *name, const char *title)
195 : AliDetector(name,title)
199 <img src="gif/alirich.gif">
203 fHits = new TClonesArray("AliRICHHit",1000 );
204 gAlice->AddHitList(fHits);
205 fSDigits = new TClonesArray("AliRICHSDigit",100000);
206 fCerenkovs = new TClonesArray("AliRICHCerenkov",1000);
207 gAlice->AddHitList(fCerenkovs);
208 //gAlice->AddHitList(fHits);
213 //fNdch = new Int_t[kNCH];
215 fDchambers = new TObjArray(kNCH);
217 fRecHits1D = new TObjArray(kNCH);
218 fRecHits3D = new TObjArray(kNCH);
222 for (i=0; i<kNCH ;i++) {
223 (*fDchambers)[i] = new TClonesArray("AliRICHDigit",10000);
227 //fNrawch = new Int_t[kNCH];
229 fRawClusters = new TObjArray(kNCH);
230 //printf("Created fRwClusters with adress:%p",fRawClusters);
232 for (i=0; i<kNCH ;i++) {
233 (*fRawClusters)[i] = new TClonesArray("AliRICHRawCluster",10000);
237 //fNrechits = new Int_t[kNCH];
239 for (i=0; i<kNCH ;i++) {
240 (*fRecHits1D)[i] = new TClonesArray("AliRICHRecHit1D",1000);
242 for (i=0; i<kNCH ;i++) {
243 (*fRecHits3D)[i] = new TClonesArray("AliRICHRecHit3D",1000);
245 //printf("Created fRecHits with adress:%p",fRecHits);
248 SetMarkerColor(kRed);
250 /*fChambers = new TObjArray(kNCH);
251 for (i=0; i<kNCH; i++)
252 (*fChambers)[i] = new AliRICHChamber();*/
257 AliRICH::AliRICH(const AliRICH& RICH)
263 //___________________________________________
267 // Destructor of RICH manager class
274 //PH Delete TObjArrays
280 fDchambers->Delete();
284 fRawClusters->Delete();
288 fRecHits1D->Delete();
292 fRecHits3D->Delete();
299 //_____________________________________________________________________________
300 Int_t AliRICH::Hits2SDigits(Float_t xhit,Float_t yhit,Float_t eloss, Int_t idvol, ResponseType res)
303 // Calls the charge disintegration method of the current chamber and adds
304 // the simulated cluster to the root treee
307 Float_t newclust[4][500];
311 // Integrated pulse height on chamber
315 ((AliRICHChamber*) (*fChambers)[idvol])->DisIntegration(eloss, xhit, yhit, nnew, newclust, res);
320 for (Int_t i=0; i<nnew; i++) {
321 if (Int_t(newclust[0][i]) > 0) {
324 clhits[1] = Int_t(newclust[0][i]);
326 clhits[2] = Int_t(newclust[1][i]);
328 clhits[3] = Int_t(newclust[2][i]);
329 // Pad: chamber sector
330 clhits[4] = Int_t(newclust[3][i]);
332 //printf(" %d %d %d %d %d\n", clhits[0], clhits[1], clhits[2], clhits[3], clhits[4]);
340 gAlice->TreeS()->Fill();
341 gAlice->TreeS()->Write(0,TObject::kOverwrite);
342 //printf("Filled SDigits...\n");
347 //___________________________________________
348 void AliRICH::Hits2SDigits()
351 // Dummy: sdigits are created during transport.
352 // Called from alirun.
354 int nparticles = gAlice->GetNtrack();
355 cout << "Particles (RICH):" <<nparticles<<endl;
356 if (nparticles > 0) printf("SDigits were already generated.\n");
360 //___________________________________________
361 void AliRICH::SDigits2Digits(Int_t nev, Int_t flag)
366 // Called from macro. Multiple events, more functionality.
368 AliRICHChamber* iChamber;
370 printf("Generating tresholds...\n");
372 for(Int_t i=0;i<7;i++) {
373 iChamber = &(Chamber(i));
374 iChamber->GenerateTresholds();
377 int nparticles = gAlice->GetNtrack();
382 fMerger->Digitise(nev,flag);
385 //Digitise(nev,flag);
387 //___________________________________________
388 void AliRICH::SDigits2Digits()
393 // Called from alirun, single event only.
395 AliRICHChamber* iChamber;
397 printf("Generating tresholds...\n");
399 for(Int_t i=0;i<7;i++) {
400 iChamber = &(Chamber(i));
401 iChamber->GenerateTresholds();
404 int nparticles = gAlice->GetNtrack();
405 cout << "Particles (RICH):" <<nparticles<<endl;
410 fMerger->Digitise(0,0);
414 //___________________________________________
415 void AliRICH::Digits2Reco()
419 // Called from alirun, single event only.
421 int nparticles = gAlice->GetNtrack();
422 cout << "Particles (RICH):" <<nparticles<<endl;
423 if (nparticles > 0) FindClusters(0,0);
427 //___________________________________________
428 void AliRICH::AddHit(Int_t track, Int_t *vol, Float_t *hits)
432 // Adds a hit to the Hits list
435 TClonesArray &lhits = *fHits;
436 new(lhits[fNhits++]) AliRICHHit(fIshunt,track,vol,hits);
438 //_____________________________________________________________________________
439 void AliRICH::AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs)
443 // Adds a RICH cerenkov hit to the Cerenkov Hits list
446 TClonesArray &lcerenkovs = *fCerenkovs;
447 new(lcerenkovs[fNcerenkovs++]) AliRICHCerenkov(fIshunt,track,vol,cerenkovs);
448 //printf ("Done for Cerenkov %d\n\n\n\n",fNcerenkovs);
450 //___________________________________________
451 void AliRICH::AddSDigit(Int_t *clhits)
455 // Add a RICH pad hit to the list
458 //printf("fsdigits:%p, data: %d\n",fSDigits,clhits[2]);
459 TClonesArray &lSDigits = *fSDigits;
460 new(lSDigits[fNSDigits++]) AliRICHSDigit(clhits);
462 //_____________________________________________________________________________
463 void AliRICH::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
467 // Add a RICH digit to the list
470 //printf("fdigits:%p, data: %d\n",((TClonesArray*)(*fDchambers)[id]),digits[0]);
471 TClonesArray &ldigits = *((TClonesArray*)(*fDchambers)[id]);
472 new(ldigits[fNdch[id]++]) AliRICHDigit(tracks,charges,digits);
475 //_____________________________________________________________________________
476 void AliRICH::AddRawCluster(Int_t id, const AliRICHRawCluster& c)
479 // Add a RICH digit to the list
482 TClonesArray &lrawcl = *((TClonesArray*)(*fRawClusters)[id]);
483 new(lrawcl[fNrawch[id]++]) AliRICHRawCluster(c);
486 //_____________________________________________________________________________
487 void AliRICH::AddRecHit1D(Int_t id, Float_t *rechit, Float_t *photons, Int_t *padsx, Int_t* padsy)
491 // Add a RICH reconstructed hit to the list
494 TClonesArray &lrec1D = *((TClonesArray*)(*fRecHits1D)[id]);
495 new(lrec1D[fNrechits1D[id]++]) AliRICHRecHit1D(id,rechit,photons,padsx,padsy);
498 //_____________________________________________________________________________
499 void AliRICH::AddRecHit3D(Int_t id, Float_t *rechit)
503 // Add a RICH reconstructed hit to the list
506 TClonesArray &lrec3D = *((TClonesArray*)(*fRecHits3D)[id]);
507 new(lrec3D[fNrechits3D[id]++]) AliRICHRecHit3D(id,rechit);
510 //___________________________________________
511 void AliRICH::BuildGeometry()
516 // Builds a TNode geometry for event display
518 TNode *node, *subnode, *top;
520 const int kColorRICH = kRed;
522 top=gAlice->GetGeometry()->GetNode("alice");
524 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
525 AliRICHSegmentationV0* segmentation;
526 AliRICHChamber* iChamber;
528 iChamber = &(pRICH->Chamber(0));
529 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
531 new TBRIK("S_RICH","S_RICH","void",71.09999,11.5,73.15);
533 Float_t padplane_width = segmentation->GetPadPlaneWidth();
534 Float_t padplane_length = segmentation->GetPadPlaneLength();
536 //printf("\n\n\n\n\n In BuildGeometry() npx: %d, npy: %d, dpx: %f, dpy:%f\n\n\n\n\n\n",segmentation->Npx(),segmentation->Npy(),segmentation->Dpx(),segmentation->Dpy());
538 new TBRIK("PHOTO","PHOTO","void", padplane_width/2,.1,padplane_length/2);
540 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", padplane_width/2,padplane_length/2);
541 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", segmentation->GetPadPlaneWidth(), segmentation->GetPadPlaneLength());
545 Float_t pos1[3]={0,471.8999,165.2599};
546 //Chamber(0).SetChamberTransform(pos1[0],pos1[1],pos1[2],
547 new TRotMatrix("rot993","rot993",90,0,70.69,90,19.30999,-90);
548 node = new TNode("RICH1","RICH1","S_RICH",pos1[0],pos1[1],pos1[2],"rot993");
549 node->SetLineColor(kColorRICH);
551 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
552 subnode->SetLineColor(kGreen);
553 fNodes->Add(subnode);
554 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
555 subnode->SetLineColor(kGreen);
556 fNodes->Add(subnode);
557 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
558 subnode->SetLineColor(kGreen);
559 fNodes->Add(subnode);
560 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
561 subnode->SetLineColor(kGreen);
562 fNodes->Add(subnode);
563 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
564 subnode->SetLineColor(kGreen);
565 fNodes->Add(subnode);
566 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
567 subnode->SetLineColor(kGreen);
568 fNodes->Add(subnode);
573 Float_t pos2[3]={171,470,0};
574 //Chamber(1).SetChamberTransform(pos2[0],pos2[1],pos2[2],
575 new TRotMatrix("rot994","rot994",90,-20,90,70,0,0);
576 node = new TNode("RICH2","RICH2","S_RICH",pos2[0],pos2[1],pos2[2],"rot994");
577 node->SetLineColor(kColorRICH);
579 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
580 subnode->SetLineColor(kGreen);
581 fNodes->Add(subnode);
582 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
583 subnode->SetLineColor(kGreen);
584 fNodes->Add(subnode);
585 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
586 subnode->SetLineColor(kGreen);
587 fNodes->Add(subnode);
588 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
589 subnode->SetLineColor(kGreen);
590 fNodes->Add(subnode);
591 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
592 subnode->SetLineColor(kGreen);
593 fNodes->Add(subnode);
594 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
595 subnode->SetLineColor(kGreen);
596 fNodes->Add(subnode);
601 Float_t pos3[3]={0,500,0};
602 //Chamber(2).SetChamberTransform(pos3[0],pos3[1],pos3[2],
603 new TRotMatrix("rot995","rot995",90,0,90,90,0,0);
604 node = new TNode("RICH3","RICH3","S_RICH",pos3[0],pos3[1],pos3[2],"rot995");
605 node->SetLineColor(kColorRICH);
607 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
608 subnode->SetLineColor(kGreen);
609 fNodes->Add(subnode);
610 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
611 subnode->SetLineColor(kGreen);
612 fNodes->Add(subnode);
613 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
614 subnode->SetLineColor(kGreen);
615 fNodes->Add(subnode);
616 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
617 subnode->SetLineColor(kGreen);
618 fNodes->Add(subnode);
619 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
620 subnode->SetLineColor(kGreen);
621 fNodes->Add(subnode);
622 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
623 subnode->SetLineColor(kGreen);
624 fNodes->Add(subnode);
628 Float_t pos4[3]={-171,470,0};
629 //Chamber(3).SetChamberTransform(pos4[0],pos4[1],pos4[2],
630 new TRotMatrix("rot996","rot996",90,20,90,110,0,0);
631 node = new TNode("RICH4","RICH4","S_RICH",pos4[0],pos4[1],pos4[2],"rot996");
632 node->SetLineColor(kColorRICH);
634 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
635 subnode->SetLineColor(kGreen);
636 fNodes->Add(subnode);
637 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
638 subnode->SetLineColor(kGreen);
639 fNodes->Add(subnode);
640 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
641 subnode->SetLineColor(kGreen);
642 fNodes->Add(subnode);
643 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
644 subnode->SetLineColor(kGreen);
645 fNodes->Add(subnode);
646 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
647 subnode->SetLineColor(kGreen);
648 fNodes->Add(subnode);
649 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
650 subnode->SetLineColor(kGreen);
651 fNodes->Add(subnode);
656 Float_t pos5[3]={161.3999,443.3999,-165.3};
657 //Chamber(4).SetChamberTransform(pos5[0],pos5[1],pos5[2],
658 new TRotMatrix("rot997","rot997",90,340,108.1999,70,18.2,70);
659 node = new TNode("RICH5","RICH5","S_RICH",pos5[0],pos5[1],pos5[2],"rot997");
660 node->SetLineColor(kColorRICH);
662 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
663 subnode->SetLineColor(kGreen);
664 fNodes->Add(subnode);
665 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
666 subnode->SetLineColor(kGreen);
667 fNodes->Add(subnode);
668 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
669 subnode->SetLineColor(kGreen);
670 fNodes->Add(subnode);
671 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
672 subnode->SetLineColor(kGreen);
673 fNodes->Add(subnode);
674 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
675 subnode->SetLineColor(kGreen);
676 fNodes->Add(subnode);
677 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
678 subnode->SetLineColor(kGreen);
679 fNodes->Add(subnode);
684 Float_t pos6[3]={0., 471.9, -165.3,};
685 //Chamber(5).SetChamberTransform(pos6[0],pos6[1],pos6[2],
686 new TRotMatrix("rot998","rot998",90,0,109.3099,90,19.30999,90);
687 node = new TNode("RICH6","RICH6","S_RICH",pos6[0],pos6[1],pos6[2],"rot998");
688 node->SetLineColor(kColorRICH);
690 fNodes->Add(node);node->cd();
691 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
692 subnode->SetLineColor(kGreen);
693 fNodes->Add(subnode);
694 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
695 subnode->SetLineColor(kGreen);
696 fNodes->Add(subnode);
697 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
698 subnode->SetLineColor(kGreen);
699 fNodes->Add(subnode);
700 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
701 subnode->SetLineColor(kGreen);
702 fNodes->Add(subnode);
703 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
704 subnode->SetLineColor(kGreen);
705 fNodes->Add(subnode);
706 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
707 subnode->SetLineColor(kGreen);
708 fNodes->Add(subnode);
712 Float_t pos7[3]={-161.399,443.3999,-165.3};
713 //Chamber(6).SetChamberTransform(pos7[0],pos7[1],pos7[2],
714 new TRotMatrix("rot999","rot999",90,20,108.1999,110,18.2,110);
715 node = new TNode("RICH7","RICH7","S_RICH",pos7[0],pos7[1],pos7[2],"rot999");
716 node->SetLineColor(kColorRICH);
718 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
719 subnode->SetLineColor(kGreen);
720 fNodes->Add(subnode);
721 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,padplane_length/2 + segmentation->DeadZone()/2,"");
722 subnode->SetLineColor(kGreen);
723 fNodes->Add(subnode);
724 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,padplane_length/2 + segmentation->DeadZone()/2,"");
725 subnode->SetLineColor(kGreen);
726 fNodes->Add(subnode);
727 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
728 subnode->SetLineColor(kGreen);
729 fNodes->Add(subnode);
730 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,0,-padplane_length/2 - segmentation->DeadZone()/2,"");
731 subnode->SetLineColor(kGreen);
732 fNodes->Add(subnode);
733 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),0,-padplane_length/2 - segmentation->DeadZone()/2,"");
734 subnode->SetLineColor(kGreen);
735 fNodes->Add(subnode);
740 //___________________________________________
741 void AliRICH::CreateGeometry()
744 // Create the geometry for RICH version 1
746 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
747 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
748 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
752 <img src="picts/AliRICHv1.gif">
757 <img src="picts/AliRICHv1Tree.gif">
761 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
762 AliRICHSegmentationV0* segmentation;
763 AliRICHGeometry* geometry;
764 AliRICHChamber* iChamber;
766 iChamber = &(pRICH->Chamber(0));
767 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
768 geometry=iChamber->GetGeometryModel();
771 distance = geometry->GetFreonThickness()/2 + geometry->GetQuartzThickness() + geometry->GetGapThickness();
772 geometry->SetRadiatorToPads(distance);
774 //Opaque quartz thickness
775 Float_t oqua_thickness = .5;
778 //Float_t csi_length = 160*.8 + 2.6;
779 //Float_t csi_width = 144*.84 + 2*2.6;
781 Float_t csi_width = segmentation->Npx()*segmentation->Dpx() + segmentation->DeadZone();
782 Float_t csi_length = segmentation->Npy()*segmentation->Dpy() + 2*segmentation->DeadZone();
784 //printf("\n\n\n\n\n In CreateGeometry() npx: %d, npy: %d, dpx: %f, dpy:%f deadzone: %f \n\n\n\n\n\n",segmentation->Npx(),segmentation->Npy(),segmentation->Dpx(),segmentation->Dpy(),segmentation->DeadZone());
786 Int_t *idtmed = fIdtmed->GetArray()-999;
793 // --- Define the RICH detector
794 // External aluminium box
796 par[1] = 13; //Original Settings
801 gMC->Gsvolu("RICH", "BOX ", idtmed[1009], par, 3);
805 par[1] = 13; //Original Settings
810 gMC->Gsvolu("SRIC", "BOX ", idtmed[1000], par, 3);
812 // Air 2 (cutting the lower part of the box)
815 par[1] = 3; //Original Settings
817 gMC->Gsvolu("AIR2", "BOX ", idtmed[1000], par, 3);
819 // Air 3 (cutting the lower part of the box)
822 par[1] = 3; //Original Settings
824 gMC->Gsvolu("AIR3", "BOX ", idtmed[1000], par, 3);
828 par[1] = .188; //Original Settings
833 gMC->Gsvolu("HONE", "BOX ", idtmed[1001], par, 3);
837 par[1] = .025; //Original Settings
842 gMC->Gsvolu("ALUM", "BOX ", idtmed[1009], par, 3);
845 par[0] = geometry->GetQuartzWidth()/2;
846 par[1] = geometry->GetQuartzThickness()/2;
847 par[2] = geometry->GetQuartzLength()/2;
849 par[1] = .25; //Original Settings
851 /*par[0] = geometry->GetQuartzWidth()/2;
852 par[1] = geometry->GetQuartzThickness()/2;
853 par[2] = geometry->GetQuartzLength()/2;*/
854 //printf("\n\n\n\n\n\n\n\\n\n\n\n Gap Thickness: %f %f %f\n\n\n\n\n\n\n\n\n\n\n\n\n\n",par[0],par[1],par[2]);
855 gMC->Gsvolu("QUAR", "BOX ", idtmed[1002], par, 3);
857 // Spacers (cylinders)
860 par[2] = geometry->GetFreonThickness()/2;
861 gMC->Gsvolu("SPAC", "TUBE", idtmed[1002], par, 3);
863 // Feet (freon slabs supports)
868 gMC->Gsvolu("FOOT", "BOX", idtmed[1009], par, 3);
871 par[0] = geometry->GetQuartzWidth()/2;
873 par[2] = geometry->GetQuartzLength()/2;
875 par[1] = .2; //Original Settings
880 gMC->Gsvolu("OQUA", "BOX ", idtmed[1007], par, 3);
882 // Frame of opaque quartz
883 par[0] = geometry->GetOuterFreonWidth()/2;
885 par[1] = geometry->GetFreonThickness()/2;
886 par[2] = geometry->GetOuterFreonLength()/2;
889 par[1] = .5; //Original Settings
894 gMC->Gsvolu("OQF1", "BOX ", idtmed[1007], par, 3);
896 par[0] = geometry->GetInnerFreonWidth()/2;
897 par[1] = geometry->GetFreonThickness()/2;
898 par[2] = geometry->GetInnerFreonLength()/2;
899 gMC->Gsvolu("OQF2", "BOX ", idtmed[1007], par, 3);
901 // Little bar of opaque quartz
903 //par[1] = geometry->GetQuartzThickness()/2;
904 //par[2] = geometry->GetInnerFreonLength()/2 - 2.4;
905 //par[2] = geometry->GetInnerFreonLength()/2;
908 par[1] = .25; //Original Settings
913 //gMC->Gsvolu("BARR", "BOX ", idtmed[1007], par, 3);
916 par[0] = geometry->GetOuterFreonWidth()/2 - oqua_thickness;
917 par[1] = geometry->GetFreonThickness()/2;
918 par[2] = geometry->GetOuterFreonLength()/2 - 2*oqua_thickness;
920 par[1] = .5; //Original Settings
925 gMC->Gsvolu("FRE1", "BOX ", idtmed[1003], par, 3);
927 par[0] = geometry->GetInnerFreonWidth()/2 - oqua_thickness;
928 par[1] = geometry->GetFreonThickness()/2;
929 par[2] = geometry->GetInnerFreonLength()/2 - 2*oqua_thickness;
930 gMC->Gsvolu("FRE2", "BOX ", idtmed[1003], par, 3);
934 par[0] = csi_width/2;
935 par[1] = geometry->GetGapThickness()/2;
936 //printf("\n\n\n\n\n\n\n\\n\n\n\n Gap Thickness: %f\n\n\n\n\n\n\n\n\n\n\n\n\n\n",par[1]);
938 par[2] = csi_length/2;
939 gMC->Gsvolu("META", "BOX ", idtmed[1004], par, 3);
943 par[0] = csi_width/2;
944 par[1] = geometry->GetProximityGapThickness()/2;
945 //printf("\n\n\n\n\n\n\n\\n\n\n\n Gap Thickness: %f\n\n\n\n\n\n\n\n\n\n\n\n\n\n",par[1]);
947 par[2] = csi_length/2;
948 gMC->Gsvolu("GAP ", "BOX ", idtmed[1008], par, 3);
952 par[0] = csi_width/2;
955 par[2] = csi_length/2;
956 gMC->Gsvolu("CSI ", "BOX ", idtmed[1005], par, 3);
962 gMC->Gsvolu("GRID", "TUBE", idtmed[1006], par, 3);
967 par[0] = csi_width/2;
970 gMC->Gsvolu("WSMe", "BOX ", idtmed[1009], par, 3);
972 // Ceramic pick up (base)
974 par[0] = csi_width/2;
977 gMC->Gsvolu("WSG1", "BOX ", idtmed[1010], par, 3);
979 // Ceramic pick up (head)
981 par[0] = csi_width/2;
984 gMC->Gsvolu("WSG2", "BOX ", idtmed[1010], par, 3);
986 // Aluminium supports for methane and CsI
989 par[0] = csi_width/2;
990 par[1] = geometry->GetGapThickness()/2 + .25;
991 par[2] = (68.35 - csi_length/2)/2;
992 gMC->Gsvolu("SMSH", "BOX", idtmed[1009], par, 3);
996 par[0] = (66.3 - csi_width/2)/2;
997 par[1] = geometry->GetGapThickness()/2 + .25;
998 par[2] = csi_length/2 + 68.35 - csi_length/2;
999 gMC->Gsvolu("SMLG", "BOX", idtmed[1009], par, 3);
1001 // Aluminium supports for freon
1004 par[0] = geometry->GetQuartzWidth()/2;
1006 par[2] = (68.35 - geometry->GetQuartzLength()/2)/2;
1007 gMC->Gsvolu("SFSH", "BOX", idtmed[1009], par, 3);
1011 par[0] = (66.3 - geometry->GetQuartzWidth()/2)/2;
1013 par[2] = geometry->GetQuartzLength()/2 + 68.35 - geometry->GetQuartzLength()/2;
1014 gMC->Gsvolu("SFLG", "BOX", idtmed[1009], par, 3);
1018 par[0] = csi_width/2;
1020 par[2] = csi_length/4 -.5025;
1021 gMC->Gsvolu("PCB ", "BOX", idtmed[1011], par, 3);
1024 // Backplane supports
1031 gMC->Gsvolu("BACK", "BOX", idtmed[1009], par, 3);
1038 gMC->Gsvolu("BKHL", "BOX", idtmed[1000], par, 3);
1045 gMC->Gsvolu("BKHS", "BOX", idtmed[1000], par, 3);
1047 // Place holes inside backplane support
1049 gMC->Gspos("BKHS", 1, "BACK", .8 + 5.7,0., .6 + 4.4625, 0, "ONLY");
1050 gMC->Gspos("BKHS", 2, "BACK", -.8 - 5.7,0., .6 + 4.4625, 0, "ONLY");
1051 gMC->Gspos("BKHS", 3, "BACK", .8 + 5.7,0., -.6 - 4.4625, 0, "ONLY");
1052 gMC->Gspos("BKHS", 4, "BACK", -.8 - 5.7,0., -.6 - 4.4625, 0, "ONLY");
1053 gMC->Gspos("BKHS", 5, "BACK", .8 + 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1054 gMC->Gspos("BKHS", 6, "BACK", -.8 - 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1055 gMC->Gspos("BKHS", 7, "BACK", .8 + 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1056 gMC->Gspos("BKHS", 8, "BACK", -.8 - 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1057 gMC->Gspos("BKHL", 1, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., .6 + 4.4625, 0, "ONLY");
1058 gMC->Gspos("BKHL", 2, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 4.4625, 0, "ONLY");
1059 gMC->Gspos("BKHL", 3, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1060 gMC->Gspos("BKHL", 4, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1061 gMC->Gspos("BKHL", 5, "BACK", .8 + 11.4+ 1.6 + 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1062 gMC->Gspos("BKHL", 6, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1063 gMC->Gspos("BKHL", 7, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1064 gMC->Gspos("BKHL", 8, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1068 // --- Places the detectors defined with GSVOLU
1069 // Place material inside RICH
1070 gMC->Gspos("SRIC", 1, "RICH", 0.,0., 0., 0, "ONLY");
1071 gMC->Gspos("AIR2", 1, "RICH", 66.3 + 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 0., 0, "ONLY");
1072 gMC->Gspos("AIR2", 2, "RICH", -66.3 - 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 0., 0, "ONLY");
1073 gMC->Gspos("AIR3", 1, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, -68.35 - 1.25, 0, "ONLY");
1074 gMC->Gspos("AIR3", 2, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 68.35 + 1.25, 0, "ONLY");
1077 gMC->Gspos("ALUM", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.025, 0., 0, "ONLY");
1078 gMC->Gspos("HONE", 1, "SRIC", 0., 1.276- geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .188, 0., 0, "ONLY");
1079 gMC->Gspos("ALUM", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .025, 0., 0, "ONLY");
1080 gMC->Gspos("FOOT", 1, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1081 gMC->Gspos("FOOT", 2, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3 , 36.9, 0, "ONLY");
1082 gMC->Gspos("FOOT", 3, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1083 gMC->Gspos("FOOT", 4, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1084 gMC->Gspos("FOOT", 5, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1085 gMC->Gspos("FOOT", 6, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1086 gMC->Gspos("FOOT", 7, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1087 gMC->Gspos("FOOT", 8, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1088 gMC->Gspos("OQUA", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .2, 0., 0, "ONLY");
1093 gMC->Gspos("SMLG", 1, "SRIC", csi_width/2 + (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1094 gMC->Gspos("SMLG", 2, "SRIC", - csi_width/2 - (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1095 gMC->Gspos("SMSH", 1, "SRIC", 0., 1.276 + .25, csi_length/2 + (68.35 - csi_length/2)/2, 0, "ONLY");
1096 gMC->Gspos("SMSH", 2, "SRIC", 0., 1.276 + .25, - csi_length/2 - (68.35 - csi_length/2)/2, 0, "ONLY");
1100 Float_t supp_y = 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness() - .2 + .3; //y position of freon supports
1102 gMC->Gspos("SFLG", 1, "SRIC", geometry->GetQuartzWidth()/2 + (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1103 gMC->Gspos("SFLG", 2, "SRIC", - geometry->GetQuartzWidth()/2 - (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1104 gMC->Gspos("SFSH", 1, "SRIC", 0., supp_y, geometry->GetQuartzLength()/2 + (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1105 gMC->Gspos("SFSH", 2, "SRIC", 0., supp_y, - geometry->GetQuartzLength()/2 - (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1107 AliMatrix(idrotm[1019], 0., 0., 90., 0., 90., 90.);
1109 //Placing of the spacers inside the freon slabs
1111 Int_t nspacers = 30;
1112 //printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Spacers:%d\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",nspacers);
1114 //printf("Nspacers: %d", nspacers);
1116 for (i = 0; i < nspacers/3; i++) {
1117 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1118 gMC->Gspos("SPAC", i, "FRE1", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1121 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1122 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1123 gMC->Gspos("SPAC", i, "FRE1", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1126 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1127 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1128 gMC->Gspos("SPAC", i, "FRE1", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1131 for (i = 0; i < nspacers/3; i++) {
1132 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1133 gMC->Gspos("SPAC", i, "FRE2", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1136 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1137 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1138 gMC->Gspos("SPAC", i, "FRE2", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1141 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1142 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1143 gMC->Gspos("SPAC", i, "FRE2", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1147 gMC->Gspos("FRE1", 1, "OQF1", 0., 0., 0., 0, "ONLY");
1148 gMC->Gspos("FRE2", 1, "OQF2", 0., 0., 0., 0, "ONLY");
1149 gMC->Gspos("OQF1", 1, "SRIC", geometry->GetOuterFreonWidth()/2 + geometry->GetInnerFreonWidth()/2 + 2, 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings (31.3)
1150 // printf("Opaque quartz in SRIC %f\n", 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness()/2);
1151 gMC->Gspos("OQF2", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings
1152 gMC->Gspos("OQF1", 3, "SRIC", - (geometry->GetOuterFreonWidth()/2 + geometry->GetInnerFreonWidth()/2) - 2, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings (-31.3)
1153 //gMC->Gspos("BARR", 1, "QUAR", - geometry->GetInnerFreonWidth()/2 - oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (-21.65)
1154 //gMC->Gspos("BARR", 2, "QUAR", geometry->GetInnerFreonWidth()/2 + oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (21.65)
1155 gMC->Gspos("QUAR", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness()/2, 0., 0, "ONLY");
1156 gMC->Gspos("GAP ", 1, "META", 0., geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 - 0.0001, 0., 0, "ONLY");
1157 gMC->Gspos("META", 1, "SRIC", 0., 1.276, 0., 0, "ONLY");
1158 gMC->Gspos("CSI ", 1, "SRIC", 0., 1.276 + geometry->GetGapThickness()/2 + .25, 0., 0, "ONLY");
1160 // Wire support placing
1162 gMC->Gspos("WSG2", 1, "GAP ", 0., geometry->GetProximityGapThickness()/2 - .1, 0., 0, "ONLY");
1163 gMC->Gspos("WSG1", 1, "CSI ", 0., 0., 0., 0, "ONLY");
1164 gMC->Gspos("WSMe", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, 0., 0, "ONLY");
1166 // Backplane placing
1168 gMC->Gspos("BACK", 1, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 43.3, 0, "ONLY");
1169 gMC->Gspos("BACK", 2, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2 , 43.3, 0, "ONLY");
1170 gMC->Gspos("BACK", 3, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1171 gMC->Gspos("BACK", 4, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1172 gMC->Gspos("BACK", 5, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1173 gMC->Gspos("BACK", 6, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1177 gMC->Gspos("PCB ", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, csi_width/4 + .5025 + 1.2, 0, "ONLY");
1178 gMC->Gspos("PCB ", 2, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, -csi_width/4 - .5025 - 1.2, 0, "ONLY");
1182 //printf("Position of the gap: %f to %f\n", 1.276 + geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 - .2, 1.276 + geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 + .2);
1184 // Place RICH inside ALICE apparatus
1186 // The placing of the chambers is measured from the vertex to the base of the methane vessel (490 cm)
1188 //Float_t offset = 1.276 - geometry->GetGapThickness()/2;
1190 AliMatrix(idrotm[1000], 90., 0., 70.69, 90., 19.31, -90.);
1191 AliMatrix(idrotm[1001], 90., -20., 90., 70., 0., 0.);
1192 AliMatrix(idrotm[1002], 90., 0., 90., 90., 0., 0.);
1193 AliMatrix(idrotm[1003], 90., 20., 90., 110., 0., 0.);
1194 AliMatrix(idrotm[1004], 90., 340., 108.2, 70., 18.2, 70.);
1195 AliMatrix(idrotm[1005], 90., 0., 109.31, 90., 19.31, 90.);
1196 AliMatrix(idrotm[1006], 90., 20., 108.2, 110., 18.2, 110.);
1198 gMC->Gspos("RICH", 1, "ALIC", 0., 471.9, 165.26, idrotm[1000], "ONLY");
1199 gMC->Gspos("RICH", 2, "ALIC", 171., 470., 0., idrotm[1001], "ONLY");
1200 gMC->Gspos("RICH", 3, "ALIC", 0., 500., 0., idrotm[1002], "ONLY");
1201 gMC->Gspos("RICH", 4, "ALIC", -171., 470., 0., idrotm[1003], "ONLY");
1202 gMC->Gspos("RICH", 5, "ALIC", 161.4, 443.4, -165.3, idrotm[1004], "ONLY");
1203 gMC->Gspos("RICH", 6, "ALIC", 0., 471.9, -165.3, idrotm[1005], "ONLY");
1204 gMC->Gspos("RICH", 7, "ALIC", -161.4, 443.4, -165.3, idrotm[1006], "ONLY");
1209 //___________________________________________
1210 void AliRICH::CreateMaterials()
1213 // *** DEFINITION OF AVAILABLE RICH MATERIALS ***
1214 // ORIGIN : NICK VAN EIJNDHOVEN
1215 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
1216 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
1217 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
1219 Int_t isxfld = gAlice->Field()->Integ();
1220 Float_t sxmgmx = gAlice->Field()->Max();
1223 /************************************Antonnelo's Values (14-vectors)*****************************************/
1225 Float_t ppckov[14] = { 5.63e-9,5.77e-9,5.9e-9,6.05e-9,6.2e-9,6.36e-9,6.52e-9,
1226 6.7e-9,6.88e-9,7.08e-9,7.3e-9,7.51e-9,7.74e-9,8e-9 };
1227 Float_t rIndexQuarz[14] = { 1.528309,1.533333,
1228 1.538243,1.544223,1.550568,1.55777,
1229 1.565463,1.574765,1.584831,1.597027,
1230 1.611858,1.6277,1.6472,1.6724 };
1231 Float_t rIndexOpaqueQuarz[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1232 Float_t rIndexMethane[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1233 Float_t rIndexGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1234 Float_t abscoFreon[14] = { 179.0987,179.0987,
1235 179.0987,179.0987,179.0987,142.92,56.65,13.95,10.43,7.07,2.03,.5773,.33496,0. };
1236 //Float_t abscoFreon[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1237 // 1e-5,1e-5,1e-5,1e-5,1e-5 };
1238 Float_t abscoQuarz[14] = { 64.035,39.98,35.665,31.262,27.527,22.815,21.04,17.52,
1239 14.177,9.282,4.0925,1.149,.3627,.10857 };
1240 Float_t abscoOpaqueQuarz[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1241 1e-5,1e-5,1e-5,1e-5,1e-5 };
1242 Float_t abscoCsI[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1243 1e-4,1e-4,1e-4,1e-4 };
1244 Float_t abscoMethane[14] = { 1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,
1246 Float_t abscoGrid[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1247 1e-4,1e-4,1e-4,1e-4 };
1248 Float_t efficAll[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1249 Float_t efficCsI[14] = { 6e-4,.005,.0075,.01125,.045,.117,.135,.16575,
1250 .17425,.1785,.1836,.1904,.1938,.221 };
1251 Float_t efficGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1255 /**********************************End of Antonnelo's Values**********************************/
1257 /**********************************Values from rich_media.f (31-vectors)**********************************/
1260 //Photons energy intervals
1264 ppckov[i] = (Float_t(i)*0.1+5.5)*1e-9;
1265 //printf ("Energy intervals: %e\n",ppckov[i]);
1269 //Refraction index for quarz
1270 Float_t rIndexQuarz[26];
1277 Float_t ene=ppckov[i]*1e9;
1278 Float_t a=f1/(e1*e1 - ene*ene);
1279 Float_t b=f2/(e2*e2 - ene*ene);
1280 rIndexQuarz[i] = TMath::Sqrt(1. + a + b );
1281 //printf ("rIndexQuarz: %e\n",rIndexQuarz[i]);
1284 //Refraction index for opaque quarz, methane and grid
1285 Float_t rIndexOpaqueQuarz[26];
1286 Float_t rIndexMethane[26];
1287 Float_t rIndexGrid[26];
1290 rIndexOpaqueQuarz[i]=1;
1291 rIndexMethane[i]=1.000444;
1293 //printf ("rIndexOpaqueQuarz , etc: %e, %e, %e\n",rIndexOpaqueQuarz[i], rIndexMethane[i], rIndexGrid[i]=1);
1296 //Absorption index for freon
1297 Float_t abscoFreon[26] = {179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987,
1298 179.0987, 142.9206, 56.64957, 25.58622, 13.95293, 12.03905, 10.42953, 8.804196,
1299 7.069031, 4.461292, 2.028366, 1.293013, .577267, .40746, .334964, 0., 0., 0.};
1301 //Absorption index for quarz
1302 /*Float_t Qzt [21] = {.0,.0,.005,.04,.35,.647,.769,.808,.829,.844,.853,.858,.869,.887,.903,.902,.902,
1303 .906,.907,.907,.907};
1304 Float_t Wavl2[] = {150.,155.,160.0,165.0,170.0,175.0,180.0,185.0,190.0,195.0,200.0,205.0,210.0,
1305 215.0,220.0,225.0,230.0,235.0,240.0,245.0,250.0};
1306 Float_t abscoQuarz[31];
1307 for (Int_t i=0;i<31;i++)
1309 Float_t Xlam = 1237.79 / (ppckov[i]*1e9);
1310 if (Xlam <= 160) abscoQuarz[i] = 0;
1311 if (Xlam > 250) abscoQuarz[i] = 1;
1314 for (Int_t j=0;j<21;j++)
1316 //printf ("Passed\n");
1317 if (Xlam > Wavl2[j] && Xlam < Wavl2[j+1])
1319 Float_t Dabs = (Qzt[j+1] - Qzt[j])/(Wavl2[j+1] - Wavl2[j]);
1320 Float_t Abso = Qzt[j] + Dabs*(Xlam - Wavl2[j]);
1321 abscoQuarz[i] = -5.0/(TMath::Log(Abso));
1325 printf ("abscoQuarz: %e abscoFreon: %e for energy: %e\n",abscoQuarz[i],abscoFreon[i],ppckov[i]);
1328 /*Float_t abscoQuarz[31] = {49.64211, 48.41296, 47.46989, 46.50492, 45.13682, 44.47883, 43.1929 , 41.30922, 40.5943 ,
1329 39.82956, 38.98623, 38.6247 , 38.43448, 37.41084, 36.22575, 33.74852, 30.73901, 24.25086,
1330 17.94531, 11.88753, 5.99128, 3.83503, 2.36661, 1.53155, 1.30582, 1.08574, .8779708,
1331 .675275, 0., 0., 0.};
1333 for (Int_t i=0;i<31;i++)
1335 abscoQuarz[i] = abscoQuarz[i]/10;
1338 Float_t abscoQuarz [26] = {105.8, 65.52, 48.58, 42.85, 35.79, 31.262, 28.598, 27.527, 25.007, 22.815, 21.004,
1339 19.266, 17.525, 15.878, 14.177, 11.719, 9.282, 6.62, 4.0925, 2.601, 1.149, .667, .3627,
1340 .192, .1497, .10857};
1342 //Absorption index for methane
1343 Float_t abscoMethane[26];
1346 abscoMethane[i]=AbsoCH4(ppckov[i]*1e9);
1347 //printf("abscoMethane: %e for energy: %e\n", abscoMethane[i],ppckov[i]*1e9);
1350 //Absorption index for opaque quarz, csi and grid, efficiency for all and grid
1351 Float_t abscoOpaqueQuarz[26];
1352 Float_t abscoCsI[26];
1353 Float_t abscoGrid[26];
1354 Float_t efficAll[26];
1355 Float_t efficGrid[26];
1358 abscoOpaqueQuarz[i]=1e-5;
1363 //printf ("All must be 1: %e, %e, %e, %e, %e\n",abscoOpaqueQuarz[i],abscoCsI[i],abscoGrid[i],efficAll[i],efficGrid[i]);
1366 //Efficiency for csi
1368 Float_t efficCsI[26] = {0.000199999995, 0.000600000028, 0.000699999975, 0.00499999989, 0.00749999983, 0.010125,
1369 0.0242999997, 0.0405000001, 0.0688500032, 0.105299994, 0.121500008, 0.141749993, 0.157949999,
1370 0.162, 0.166050002, 0.167669997, 0.174299985, 0.176789999, 0.179279998, 0.182599992, 0.18592,
1371 0.187579989, 0.189239994, 0.190899998, 0.207499996, 0.215799987};
1375 //FRESNEL LOSS CORRECTION FOR PERPENDICULAR INCIDENCE AND
1376 //UNPOLARIZED PHOTONS
1380 efficCsI[i] = efficCsI[i]/(1.-Fresnel(ppckov[i]*1e9,1.,0));
1381 //printf ("Fresnel result: %e for energy: %e\n",Fresnel(ppckov[i]*1e9,1.,0),ppckov[i]*1e9);
1384 /*******************************************End of rich_media.f***************************************/
1391 Float_t afre[2], agri, amet[2], aqua[2], ahon, zfre[2], zgri, zhon,
1395 Int_t nlmatmet, nlmatqua;
1396 Float_t wmatquao[2], rIndexFreon[26];
1397 Float_t aquao[2], epsil, stmin, zquao[2];
1399 Float_t radlal, densal, tmaxfd, deemax, stemax;
1400 Float_t aal, zal, radlgri, densfre, radlhon, densgri, denshon,densqua, densmet, wmatfre[2], wmatmet[2], wmatqua[2];
1402 Int_t *idtmed = fIdtmed->GetArray()-999;
1404 // --- Photon energy (GeV)
1405 // --- Refraction indexes
1406 for (i = 0; i < 26; ++i) {
1407 rIndexFreon[i] = ppckov[i] * .0172 * 1e9 + 1.177;
1408 //rIndexFreon[i] = 1;
1409 //printf ("rIndexFreon: %e \n efficCsI: %e for energy: %e\n",rIndexFreon[i], efficCsI[i], ppckov[i]);
1412 // --- Detection efficiencies (quantum efficiency for CsI)
1413 // --- Define parameters for honeycomb.
1414 // Used carbon of equivalent rad. lenght
1421 // --- Parameters to include in GSMIXT, relative to Quarz (SiO2)
1432 // --- Parameters to include in GSMIXT, relative to opaque Quarz (SiO2)
1443 // --- Parameters to include in GSMIXT, relative to Freon (C6F14)
1454 // --- Parameters to include in GSMIXT, relative to methane (CH4)
1465 // --- Parameters to include in GSMIXT, relative to anode grid (Cu)
1472 // --- Parameters to include in GSMATE related to aluminium sheet
1479 // --- Glass parameters
1481 Float_t aglass[5]={12.01, 28.09, 16., 10.8, 23.};
1482 Float_t zglass[5]={ 6., 14., 8., 5., 11.};
1483 Float_t wglass[5]={ 0.5, 0.105, 0.355, 0.03, 0.01};
1484 Float_t dglass=1.74;
1487 AliMaterial(1, "Air $", 14.61, 7.3, .001205, 30420., 67500);
1488 AliMaterial(6, "HON", ahon, zhon, denshon, radlhon, 0);
1489 AliMaterial(16, "CSI", ahon, zhon, denshon, radlhon, 0);
1490 AliMixture(20, "QUA", aqua, zqua, densqua, nlmatqua, wmatqua);
1491 AliMixture(21, "QUAO", aquao, zquao, densquao, nlmatquao, wmatquao);
1492 AliMixture(30, "FRE", afre, zfre, densfre, nlmatfre, wmatfre);
1493 AliMixture(40, "MET", amet, zmet, densmet, nlmatmet, wmatmet);
1494 AliMixture(41, "METG", amet, zmet, densmet, nlmatmet, wmatmet);
1495 AliMaterial(11, "GRI", agri, zgri, densgri, radlgri, 0);
1496 AliMaterial(50, "ALUM", aal, zal, densal, radlal, 0);
1497 AliMixture(32, "GLASS",aglass, zglass, dglass, 5, wglass);
1498 AliMaterial(31, "COPPER$", 63.54, 29., 8.96, 1.4, 0.);
1506 AliMedium(1, "DEFAULT MEDIUM AIR$", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1507 AliMedium(2, "HONEYCOMB$", 6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1508 AliMedium(3, "QUARZO$", 20, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1509 AliMedium(4, "FREON$", 30, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1510 AliMedium(5, "METANO$", 40, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1511 AliMedium(6, "CSI$", 16, 1, isxfld, sxmgmx,tmaxfd, stemax, deemax, epsil, stmin);
1512 AliMedium(7, "GRIGLIA$", 11, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1513 AliMedium(8, "QUARZOO$", 21, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1514 AliMedium(9, "GAP$", 41, 1, isxfld, sxmgmx,tmaxfd, .1, -deemax, epsil, -stmin);
1515 AliMedium(10, "ALUMINUM$", 50, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1516 AliMedium(11, "GLASS", 32, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1517 AliMedium(12, "PCB_COPPER", 31, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1520 gMC->SetCerenkov(idtmed[1000], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1521 gMC->SetCerenkov(idtmed[1001], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1522 gMC->SetCerenkov(idtmed[1002], 26, ppckov, abscoQuarz, efficAll,rIndexQuarz);
1523 gMC->SetCerenkov(idtmed[1003], 26, ppckov, abscoFreon, efficAll,rIndexFreon);
1524 gMC->SetCerenkov(idtmed[1004], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1525 gMC->SetCerenkov(idtmed[1005], 26, ppckov, abscoCsI, efficCsI, rIndexMethane);
1526 gMC->SetCerenkov(idtmed[1006], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1527 gMC->SetCerenkov(idtmed[1007], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1528 gMC->SetCerenkov(idtmed[1008], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1529 gMC->SetCerenkov(idtmed[1009], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1530 gMC->SetCerenkov(idtmed[1010], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1533 //___________________________________________
1535 Float_t AliRICH::Fresnel(Float_t ene,Float_t pdoti, Bool_t pola)
1538 //ENE(EV), PDOTI=COS(INC.ANG.), PDOTR=COS(POL.PLANE ROT.ANG.)
1540 Float_t en[36] = {5.0,5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6.0,6.1,6.2,
1541 6.3,6.4,6.5,6.6,6.7,6.8,6.9,7.0,7.1,7.2,7.3,7.4,7.5,7.6,7.7,
1542 7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5};
1545 Float_t csin[36] = {2.14,2.21,2.33,2.48,2.76,2.97,2.99,2.59,2.81,3.05,
1546 2.86,2.53,2.55,2.66,2.79,2.96,3.18,3.05,2.84,2.81,2.38,2.11,
1547 2.01,2.13,2.39,2.73,3.08,3.15,2.95,2.73,2.56,2.41,2.12,1.95,
1550 Float_t csik[36] = {0.,0.,0.,0.,0.,0.196,0.408,0.208,0.118,0.49,0.784,0.543,
1551 0.424,0.404,0.371,0.514,0.922,1.102,1.139,1.376,1.461,1.253,0.878,
1552 0.69,0.612,0.649,0.824,1.347,1.571,1.678,1.763,1.857,1.824,1.824,
1555 Int_t j=Int_t(xe*10)-49;
1556 Float_t cn=csin[j]+((csin[j+1]-csin[j])/0.1)*(xe-en[j]);
1557 Float_t ck=csik[j]+((csik[j+1]-csik[j])/0.1)*(xe-en[j]);
1559 //FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
1560 //W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
1562 Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
1563 Float_t tanin=sinin/pdoti;
1565 Float_t c1=cn*cn-ck*ck-sinin*sinin;
1566 Float_t c2=4*cn*cn*ck*ck;
1567 Float_t aO=TMath::Sqrt(0.5*(TMath::Sqrt(c1*c1+c2)+c1));
1568 Float_t b2=0.5*(TMath::Sqrt(c1*c1+c2)-c1);
1570 Float_t rs=((aO-pdoti)*(aO-pdoti)+b2)/((aO+pdoti)*(aO+pdoti)+b2);
1571 Float_t rp=rs*((aO-sinin*tanin)*(aO-sinin*tanin)+b2)/((aO+sinin*tanin)*(aO+sinin*tanin)+b2);
1574 //CORRECTION FACTOR FOR SURFACE ROUGHNESS
1575 //B.J. STAGG APPLIED OPTICS, 30(1991),4113
1578 Float_t lamb=1240/ene;
1581 Float_t rO=TMath::Exp(-(4*TMath::Pi()*pdoti*sigraf/lamb)*(4*TMath::Pi()*pdoti*sigraf/lamb));
1585 Float_t pdotr=0.8; //DEGREE OF POLARIZATION : 1->P , -1->S
1586 fresn=0.5*(rp*(1+pdotr)+rs*(1-pdotr));
1595 //__________________________________________
1596 Float_t AliRICH::AbsoCH4(Float_t x)
1599 //KLOSCH,SCH4(9),WL(9),EM(9),ALENGTH(31)
1600 Float_t sch4[9] = {.12,.16,.23,.38,.86,2.8,7.9,28.,80.}; //MB X 10^22
1601 //Float_t wl[9] = {153.,152.,151.,150.,149.,148.,147.,146.,145};
1602 Float_t em[9] = {8.1,8.158,8.212,8.267,8.322,8.378,8.435,8.493,8.55};
1603 const Float_t kLosch=2.686763E19; // LOSCHMIDT NUMBER IN CM-3
1604 const Float_t kIgas1=100, kIgas2=0, kOxy=10., kWater=5., kPressure=750.,kTemperature=283.;
1605 Float_t pn=kPressure/760.;
1606 Float_t tn=kTemperature/273.16;
1609 // ------- METHANE CROSS SECTION -----------------
1610 // ASTROPH. J. 214, L47 (1978)
1616 if(x>=7.75 && x<=8.1)
1618 Float_t c0=-1.655279e-1;
1619 Float_t c1=6.307392e-2;
1620 Float_t c2=-8.011441e-3;
1621 Float_t c3=3.392126e-4;
1622 sm=(c0+c1*x+c2*x*x+c3*x*x*x)*1.e-18;
1628 while (x<=em[j] && x>=em[j+1])
1631 Float_t a=(sch4[j+1]-sch4[j])/(em[j+1]-em[j]);
1632 sm=(sch4[j]+a*(x-em[j]))*1e-22;
1636 Float_t dm=(kIgas1/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1637 Float_t abslm=1./sm/dm;
1639 // ------- ISOBUTHANE CROSS SECTION --------------
1640 // i-C4H10 (ai) abs. length from curves in
1641 // Lu-McDonald paper for BARI RICH workshop .
1642 // -----------------------------------------------------------
1651 if(x>=7.25 && x<7.375)
1657 Float_t si = 1./(ai*kLosch*273.16/293.); // ISOB. CRO.SEC.IN CM2
1658 Float_t di=(kIgas2/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1663 // ---------------------------------------------------------
1665 // transmission of O2
1667 // y= path in cm, x=energy in eV
1668 // so= cross section for UV absorption in cm2
1669 // do= O2 molecular density in cm-3
1670 // ---------------------------------------------------------
1678 so=3.392709e-13 * TMath::Exp(2.864104 *x);
1684 so=2.910039e-34 * TMath::Exp(10.3337*x);
1691 Float_t a0=-73770.76;
1692 Float_t a1=46190.69;
1693 Float_t a2=-11475.44;
1694 Float_t a3=1412.611;
1695 Float_t a4=-86.07027;
1696 Float_t a5=2.074234;
1697 so= a0+(a1*x)+(a2*x*x)+(a3*x*x*x)+(a4*x*x*x*x)+(a5*x*x*x*x*x);
1701 Float_t dox=(kOxy/1e6)*kLosch*pn/tn;
1706 // ---------------------------------------------------------
1708 // transmission of H2O
1710 // y= path in cm, x=energy in eV
1711 // sw= cross section for UV absorption in cm2
1712 // dw= H2O molecular density in cm-3
1713 // ---------------------------------------------------------
1717 Float_t b0=29231.65;
1718 Float_t b1=-15807.74;
1719 Float_t b2=3192.926;
1720 Float_t b3=-285.4809;
1721 Float_t b4=9.533944;
1725 Float_t sw= b0+(b1*x)+(b2*x*x)+(b3*x*x*x)+(b4*x*x*x*x);
1727 Float_t dw=(kWater/1e6)*kLosch*pn/tn;
1733 // ---------------------------------------------------------
1735 Float_t alength=1./(1./abslm+1./absli+1./abslo+1./abslw);
1741 //___________________________________________
1742 Int_t AliRICH::DistancetoPrimitive(Int_t , Int_t )
1750 //___________________________________________
1751 void AliRICH::MakeBranch(Option_t* option, char *file)
1753 // Create Tree branches for the RICH.
1755 const Int_t kBufferSize = 4000;
1756 char branchname[20];
1758 AliDetector::MakeBranch(option,file);
1760 const char *cH = strstr(option,"H");
1761 const char *cD = strstr(option,"D");
1762 const char *cR = strstr(option,"R");
1763 const char *cS = strstr(option,"S");
1767 sprintf(branchname,"%sCerenkov",GetName());
1768 if (fCerenkovs && gAlice->TreeH()) {
1769 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),
1770 branchname, &fCerenkovs, kBufferSize, file) ;
1771 branch->SetAutoDelete(kFALSE);
1773 sprintf(branchname,"%sSDigits",GetName());
1774 if (fSDigits && gAlice->TreeH()) {
1775 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),
1776 branchname, &fSDigits, kBufferSize, file) ;
1777 branch->SetAutoDelete(kFALSE);
1778 //printf("Making branch %sSDigits in TreeH\n",GetName());
1783 sprintf(branchname,"%sSDigits",GetName());
1784 if (fSDigits && gAlice->TreeS()) {
1785 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeS(),
1786 branchname, &fSDigits, kBufferSize, file) ;
1787 branch->SetAutoDelete(kFALSE);
1788 //printf("Making branch %sSDigits in TreeS\n",GetName());
1794 // one branch for digits per chamber
1798 for (i=0; i<kNCH ;i++) {
1799 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1800 if (fDchambers && gAlice->TreeD()) {
1801 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeD(),
1802 branchname, &((*fDchambers)[i]), kBufferSize, file) ;
1803 branch->SetAutoDelete(kFALSE);
1804 //printf("Making Branch %sDigits%d\n",GetName(),i+1);
1811 // one branch for raw clusters per chamber
1814 //printf("Called MakeBranch for TreeR\n");
1818 for (i=0; i<kNCH ;i++) {
1819 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1820 if (fRawClusters && gAlice->TreeR()) {
1821 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),
1822 branchname, &((*fRawClusters)[i]), kBufferSize, file) ;
1823 branch->SetAutoDelete(kFALSE);
1827 // one branch for rec hits per chamber
1829 for (i=0; i<kNCH ;i++) {
1830 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1831 if (fRecHits1D && gAlice->TreeR()) {
1832 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),
1833 branchname, &((*fRecHits1D)[i]), kBufferSize, file) ;
1834 branch->SetAutoDelete(kFALSE);
1837 for (i=0; i<kNCH ;i++) {
1838 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1839 if (fRecHits3D && gAlice->TreeR()) {
1840 TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),
1841 branchname, &((*fRecHits3D)[i]), kBufferSize, file) ;
1842 branch->SetAutoDelete(kFALSE);
1848 //___________________________________________
1849 void AliRICH::SetTreeAddress()
1851 // Set branch address for the Hits and Digits Tree.
1852 char branchname[20];
1855 AliDetector::SetTreeAddress();
1858 TTree *treeH = gAlice->TreeH();
1859 TTree *treeD = gAlice->TreeD();
1860 TTree *treeR = gAlice->TreeR();
1861 TTree *treeS = gAlice->TreeS();
1865 branch = treeH->GetBranch("RICHCerenkov");
1866 if (branch) branch->SetAddress(&fCerenkovs);
1869 branch = treeH->GetBranch("RICHSDigits");
1872 branch->SetAddress(&fSDigits);
1873 //printf("Setting sdigits branch address at %p in TreeH\n",&fSDigits);
1880 branch = treeS->GetBranch("RICHSDigits");
1883 branch->SetAddress(&fSDigits);
1884 //printf("Setting sdigits branch address at %p in TreeS\n",&fSDigits);
1891 for (int i=0; i<kNCH; i++) {
1892 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1894 branch = treeD->GetBranch(branchname);
1895 if (branch) branch->SetAddress(&((*fDchambers)[i]));
1900 for (i=0; i<kNCH; i++) {
1901 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1903 branch = treeR->GetBranch(branchname);
1904 if (branch) branch->SetAddress(&((*fRawClusters)[i]));
1908 for (i=0; i<kNCH; i++) {
1909 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1911 branch = treeR->GetBranch(branchname);
1912 if (branch) branch->SetAddress(&((*fRecHits1D)[i]));
1916 for (i=0; i<kNCH; i++) {
1917 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1919 branch = treeR->GetBranch(branchname);
1920 if (branch) branch->SetAddress(&((*fRecHits3D)[i]));
1926 //___________________________________________
1927 void AliRICH::ResetHits()
1929 // Reset number of clusters and the cluster array for this detector
1930 AliDetector::ResetHits();
1933 if (fSDigits) fSDigits->Clear();
1934 if (fCerenkovs) fCerenkovs->Clear();
1938 //____________________________________________
1939 void AliRICH::ResetDigits()
1942 // Reset number of digits and the digits array for this detector
1944 for ( int i=0;i<kNCH;i++ ) {
1945 if (fDchambers && (*fDchambers)[i]) (*fDchambers)[i]->Clear();
1946 if (fNdch) fNdch[i]=0;
1950 //____________________________________________
1951 void AliRICH::ResetRawClusters()
1954 // Reset number of raw clusters and the raw clust array for this detector
1956 for ( int i=0;i<kNCH;i++ ) {
1957 if ((*fRawClusters)[i]) ((TClonesArray*)(*fRawClusters)[i])->Clear();
1958 if (fNrawch) fNrawch[i]=0;
1962 //____________________________________________
1963 void AliRICH::ResetRecHits1D()
1966 // Reset number of raw clusters and the raw clust array for this detector
1969 for ( int i=0;i<kNCH;i++ ) {
1970 if ((*fRecHits1D)[i]) ((TClonesArray*)(*fRecHits1D)[i])->Clear();
1971 if (fNrechits1D) fNrechits1D[i]=0;
1975 //____________________________________________
1976 void AliRICH::ResetRecHits3D()
1979 // Reset number of raw clusters and the raw clust array for this detector
1982 for ( int i=0;i<kNCH;i++ ) {
1983 if ((*fRecHits3D)[i]) ((TClonesArray*)(*fRecHits3D)[i])->Clear();
1984 if (fNrechits3D) fNrechits3D[i]=0;
1988 //___________________________________________
1989 void AliRICH::SetGeometryModel(Int_t id, AliRICHGeometry *geometry)
1993 // Setter for the RICH geometry model
1997 ((AliRICHChamber*) (*fChambers)[id])->GeometryModel(geometry);
2000 //___________________________________________
2001 void AliRICH::SetSegmentationModel(Int_t id, AliSegmentation *segmentation)
2005 // Setter for the RICH segmentation model
2008 ((AliRICHChamber*) (*fChambers)[id])->SetSegmentationModel(segmentation);
2011 //___________________________________________
2012 void AliRICH::SetResponseModel(Int_t id, AliRICHResponse *response)
2016 // Setter for the RICH response model
2019 ((AliRICHChamber*) (*fChambers)[id])->ResponseModel(response);
2022 void AliRICH::SetReconstructionModel(Int_t id, AliRICHClusterFinder *reconst)
2026 // Setter for the RICH reconstruction model (clusters)
2029 ((AliRICHChamber*) (*fChambers)[id])->SetReconstructionModel(reconst);
2032 //___________________________________________
2033 void AliRICH::StepManager()
2036 // Full Step Manager
2040 static Int_t vol[2];
2042 static Float_t hits[22];
2043 static Float_t ckovData[19];
2044 TLorentzVector position;
2045 TLorentzVector momentum;
2048 Float_t localPos[3];
2049 Float_t localMom[4];
2050 Float_t localTheta,localPhi;
2052 Float_t destep, step;
2055 Float_t coscerenkov;
2056 static Float_t eloss, xhit, yhit, tlength;
2057 const Float_t kBig=1.e10;
2059 TClonesArray &lhits = *fHits;
2060 TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->CurrentTrack()];
2062 //if (current->Energy()>1)
2065 // Only gas gap inside chamber
2066 // Tag chambers and record hits when track enters
2069 id=gMC->CurrentVolID(copy);
2070 Float_t cherenkovLoss=0;
2071 //gAlice->KeepTrack(gAlice->CurrentTrack());
2073 gMC->TrackPosition(position);
2077 //bzero((char *)ckovData,sizeof(ckovData)*19);
2078 ckovData[1] = pos[0]; // X-position for hit
2079 ckovData[2] = pos[1]; // Y-position for hit
2080 ckovData[3] = pos[2]; // Z-position for hit
2081 ckovData[6] = 0; // dummy track length
2082 //ckovData[11] = gAlice->CurrentTrack();
2084 //printf("\n+++++++++++\nTrack: %d\n++++++++++++\n",gAlice->CurrentTrack());
2086 //AliRICH *RICH = (AliRICH *) gAlice->GetDetector("RICH");
2088 /********************Store production parameters for Cerenkov photons************************/
2089 //is it a Cerenkov photon?
2090 if (gMC->TrackPid() == 50000050) {
2092 //if (gMC->VolId("GAP ")==gMC->CurrentVolID(copy))
2094 Float_t ckovEnergy = current->Energy();
2095 //energy interval for tracking
2096 if (ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 )
2097 //if (ckovEnergy > 0)
2099 if (gMC->IsTrackEntering()){ //is track entering?
2100 //printf("Track entered (1)\n");
2101 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2103 if (gMC->IsNewTrack()){ //is it the first step?
2104 //printf("I'm in!\n");
2105 Int_t mother = current->GetFirstMother();
2107 //printf("Second Mother:%d\n",current->GetSecondMother());
2109 ckovData[10] = mother;
2110 ckovData[11] = gAlice->CurrentTrack();
2111 ckovData[12] = 1; //Media where photon was produced 1->Freon, 2->Quarz
2112 //printf("Produced in FREO\n");
2115 //printf("Index: %d\n",fCkovNumber);
2116 } //first step question
2119 if (gMC->IsNewTrack()){ //is it first step?
2120 if (gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) //is it in quarz?
2123 //printf("Produced in QUAR\n");
2125 } //first step question
2127 //printf("Before %d\n",fFreonProd);
2128 } //track entering question
2130 if (ckovData[12] == 1) //was it produced in Freon?
2131 //if (fFreonProd == 1)
2133 if (gMC->IsTrackEntering()){ //is track entering?
2134 //printf("Track entered (2)\n");
2135 //printf("Current volume (should be META): %s\n",gMC->CurrentVolName());
2136 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("META"),gMC->CurrentVolID(copy));
2137 if (gMC->VolId("META")==gMC->CurrentVolID(copy)) //is it in gap?
2139 //printf("Got in META\n");
2140 gMC->TrackMomentum(momentum);
2145 // Z-position for hit
2148 /**************** Photons lost in second grid have to be calculated by hand************/
2150 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2151 Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi);
2153 //printf("grid calculation:%f\n",t);
2157 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2158 //printf("Added One (1)!\n");
2159 //printf("Lost one in grid\n");
2161 /**********************************************************************************/
2164 //printf("Current volume (should be CSI) (1): %s\n",gMC->CurrentVolName());
2165 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2166 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)) //is it in csi?
2168 //printf("Got in CSI\n");
2169 gMC->TrackMomentum(momentum);
2175 /********* Photons lost by Fresnel reflection have to be calculated by hand********/
2176 /***********************Cerenkov phtons (always polarised)*************************/
2178 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2179 Float_t t = Fresnel(ckovEnergy*1e9,cophi,1);
2184 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2185 //printf("Added One (2)!\n");
2186 //printf("Lost by Fresnel\n");
2188 /**********************************************************************************/
2193 /********************Evaluation of losses************************/
2194 /******************still in the old fashion**********************/
2197 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
2198 for (Int_t i = 0; i < i1; ++i) {
2200 if (procs[i] == kPLightReflection) { //was it reflected
2202 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2204 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2207 //AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2208 } //reflection question
2211 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
2212 //printf("Got in absorption\n");
2214 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2216 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2218 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
2220 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
2223 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
2227 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
2231 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2232 //printf("Added One (3)!\n");
2233 //printf("Added cerenkov %d\n",fCkovNumber);
2234 } //absorption question
2237 // Photon goes out of tracking scope
2238 else if (procs[i] == kPStop) { //is it below energy treshold?
2241 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2242 //printf("Added One (4)!\n");
2243 } // energy treshold question
2244 } //number of mechanisms cycle
2245 /**********************End of evaluation************************/
2246 } //freon production question
2247 } //energy interval question
2248 //}//inside the proximity gap question
2249 } //cerenkov photon question
2251 /**************************************End of Production Parameters Storing*********************/
2254 /*******************************Treat photons that hit the CsI (Ckovs and Feedbacks)************/
2256 if (gMC->TrackPid() == 50000050 || gMC->TrackPid() == 50000051) {
2257 //printf("Cerenkov\n");
2258 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy))
2260 //printf("Current volume (should be CSI) (2): %s\n",gMC->CurrentVolName());
2261 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2262 //printf("Got in CSI\n");
2263 if (gMC->Edep() > 0.){
2264 gMC->TrackPosition(position);
2265 gMC->TrackMomentum(momentum);
2273 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2274 Double_t rt = TMath::Sqrt(tc);
2275 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2276 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2277 gMC->Gmtod(pos,localPos,1);
2278 gMC->Gmtod(mom,localMom,2);
2280 gMC->CurrentVolOffID(2,copy);
2284 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2285 //->Sector(localPos[0], localPos[2]);
2286 //printf("Sector:%d\n",sector);
2288 /*if (gMC->TrackPid() == 50000051){
2290 printf("Feedbacks:%d\n",fFeedbacks);
2293 ((AliRICHChamber*) (*fChambers)[idvol])
2294 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2296 ckovData[0] = gMC->TrackPid(); // particle type
2297 ckovData[1] = pos[0]; // X-position for hit
2298 ckovData[2] = pos[1]; // Y-position for hit
2299 ckovData[3] = pos[2]; // Z-position for hit
2300 ckovData[4] = theta; // theta angle of incidence
2301 ckovData[5] = phi; // phi angle of incidence
2302 ckovData[8] = (Float_t) fNSDigits; // first sdigit
2303 ckovData[9] = -1; // last pad hit
2304 ckovData[13] = 4; // photon was detected
2305 ckovData[14] = mom[0];
2306 ckovData[15] = mom[1];
2307 ckovData[16] = mom[2];
2309 destep = gMC->Edep();
2310 gMC->SetMaxStep(kBig);
2311 cherenkovLoss += destep;
2312 ckovData[7]=cherenkovLoss;
2314 nPads = Hits2SDigits(localPos[0],localPos[2],cherenkovLoss,idvol,kCerenkov);
2316 if (fNSDigits > (Int_t)ckovData[8]) {
2317 ckovData[8]= ckovData[8]+1;
2318 ckovData[9]= (Float_t) fNSDigits;
2321 //printf("Cerenkov loss: %f\n", cherenkovLoss);
2323 ckovData[17] = nPads;
2324 //printf("nPads:%d",nPads);
2326 //TClonesArray *Hits = RICH->Hits();
2327 AliRICHHit *mipHit = (AliRICHHit*) (fHits->UncheckedAt(0));
2330 mom[0] = current->Px();
2331 mom[1] = current->Py();
2332 mom[2] = current->Pz();
2333 Float_t mipPx = mipHit->fMomX;
2334 Float_t mipPy = mipHit->fMomY;
2335 Float_t mipPz = mipHit->fMomZ;
2337 Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
2338 Float_t rt = TMath::Sqrt(r);
2339 Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz;
2340 Float_t mipRt = TMath::Sqrt(mipR);
2343 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
2349 Float_t cherenkov = TMath::ACos(coscerenkov);
2350 ckovData[18]=cherenkov;
2354 AddHit(gAlice->CurrentTrack(),vol,ckovData);
2355 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2356 //printf("Added One (5)!\n");
2363 /***********************************************End of photon hits*********************************************/
2366 /**********************************************Charged particles treatment*************************************/
2368 else if (gMC->TrackCharge())
2372 /*if (gMC->IsTrackEntering())
2374 hits[13]=20;//is track entering?
2376 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2378 gMC->TrackMomentum(momentum);
2389 if (gMC->VolId("GAP ")== gMC->CurrentVolID(copy)) {
2390 // Get current particle id (ipart), track position (pos) and momentum (mom)
2392 gMC->CurrentVolOffID(3,copy);
2396 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2397 //->Sector(localPos[0], localPos[2]);
2398 //printf("Sector:%d\n",sector);
2400 gMC->TrackPosition(position);
2401 gMC->TrackMomentum(momentum);
2409 gMC->Gmtod(pos,localPos,1);
2410 gMC->Gmtod(mom,localMom,2);
2412 ipart = gMC->TrackPid();
2414 // momentum loss and steplength in last step
2415 destep = gMC->Edep();
2416 step = gMC->TrackStep();
2419 // record hits when track enters ...
2420 if( gMC->IsTrackEntering()) {
2421 // gMC->SetMaxStep(fMaxStepGas);
2422 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2423 Double_t rt = TMath::Sqrt(tc);
2424 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2425 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2428 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
2429 Double_t localRt = TMath::Sqrt(localTc);
2430 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg;
2431 localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg;
2433 hits[0] = Float_t(ipart); // particle type
2434 hits[1] = localPos[0]; // X-position for hit
2435 hits[2] = localPos[1]; // Y-position for hit
2436 hits[3] = localPos[2]; // Z-position for hit
2437 hits[4] = localTheta; // theta angle of incidence
2438 hits[5] = localPhi; // phi angle of incidence
2439 hits[8] = (Float_t) fNSDigits; // first sdigit
2440 hits[9] = -1; // last pad hit
2441 hits[13] = fFreonProd; // did id hit the freon?
2445 hits[18] = 0; // dummy cerenkov angle
2451 Chamber(idvol).LocaltoGlobal(localPos,hits+1);
2454 //To make chamber coordinates x-y had to pass localPos[0], localPos[2]
2457 // Only if not trigger chamber
2460 // Initialize hit position (cursor) in the segmentation model
2461 ((AliRICHChamber*) (*fChambers)[idvol])
2462 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2467 // Calculate the charge induced on a pad (disintegration) in case
2469 // Mip left chamber ...
2470 if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){
2471 gMC->SetMaxStep(kBig);
2476 // Only if not trigger chamber
2480 if(gMC->TrackPid() == kNeutron)
2481 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2482 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2484 //printf("nPads:%d",nPads);
2490 if (fNSDigits > (Int_t)hits[8]) {
2492 hits[9]= (Float_t) fNSDigits;
2496 new(lhits[fNhits++]) AliRICHHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
2499 // Check additional signal generation conditions
2500 // defined by the segmentation
2501 // model (boundary crossing conditions)
2503 (((AliRICHChamber*) (*fChambers)[idvol])
2504 ->SigGenCond(localPos[0], localPos[2], localPos[1]))
2506 ((AliRICHChamber*) (*fChambers)[idvol])
2507 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2510 if(gMC->TrackPid() == kNeutron)
2511 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2512 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2514 //printf("Npads:%d",NPads);
2521 // nothing special happened, add up energy loss
2528 /*************************************************End of MIP treatment**************************************/
2532 void AliRICH::FindClusters(Int_t nev,Int_t lastEntry)
2536 // Loop on chambers and on cathode planes
2538 for (Int_t icat=1;icat<2;icat++) {
2539 gAlice->ResetDigits();
2540 gAlice->TreeD()->GetEvent(0);
2541 for (Int_t ich=0;ich<kNCH;ich++) {
2542 AliRICHChamber* iChamber=(AliRICHChamber*) (*fChambers)[ich];
2543 TClonesArray *pRICHdigits = this->DigitsAddress(ich);
2544 if (pRICHdigits == 0)
2547 // Get ready the current chamber stuff
2549 AliRICHResponse* response = iChamber->GetResponseModel();
2550 AliSegmentation* seg = iChamber->GetSegmentationModel();
2551 AliRICHClusterFinder* rec = iChamber->GetReconstructionModel();
2553 rec->SetSegmentation(seg);
2554 rec->SetResponse(response);
2555 rec->SetDigits(pRICHdigits);
2556 rec->SetChamber(ich);
2557 if (nev==0) rec->CalibrateCOG();
2558 rec->FindRawClusters();
2561 fRch=RawClustAddress(ich);
2565 gAlice->TreeR()->Fill();
2567 for (int i=0;i<kNCH;i++) {
2568 fRch=RawClustAddress(i);
2569 int nraw=fRch->GetEntriesFast();
2570 printf ("Chamber %d, raw clusters %d\n",i,nraw);
2578 sprintf(hname,"TreeR%d",nev);
2579 gAlice->TreeR()->Write(hname,kOverwrite,0);
2580 gAlice->TreeR()->Reset();
2582 //gObjectTable->Print();
2585 AliRICHSDigit* AliRICH::FirstPad(AliRICHHit* hit,TClonesArray *clusters )
2588 // Initialise the pad iterator
2589 // Return the address of the first sdigit for hit
2590 TClonesArray *theClusters = clusters;
2591 Int_t nclust = theClusters->GetEntriesFast();
2592 if (nclust && hit->fPHlast > 0) {
2593 sMaxIterPad=Int_t(hit->fPHlast);
2594 sCurIterPad=Int_t(hit->fPHfirst);
2595 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2602 AliRICHSDigit* AliRICH::NextPad(TClonesArray *clusters)
2605 // Iterates over pads
2608 if (sCurIterPad <= sMaxIterPad) {
2609 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2615 AliRICH& AliRICH::operator=(const AliRICH& rhs)
2617 // Assignment operator