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.50 2001/05/10 14:44:16 jbarbosa
19 Corrected some overlaps (thanks I. Hrivnacovna).
21 Revision 1.49 2001/05/10 12:23:49 jbarbosa
22 Repositioned the RICH modules.
23 Eliminated magic numbers.
24 Incorporated diagnostics (from macros).
26 Revision 1.48 2001/03/15 10:35:00 jbarbosa
27 Corrected bug in MakeBranch (was using a different version of STEER)
29 Revision 1.47 2001/03/14 18:13:56 jbarbosa
30 Several changes to adapt to new IO.
31 Removed digitising function, using AliRICHMerger::Digitise from now on.
33 Revision 1.46 2001/03/12 17:46:33 hristov
34 Changes needed on Sun with CC 5.0
36 Revision 1.45 2001/02/27 22:11:46 jbarbosa
37 Testing TreeS, removing of output.
39 Revision 1.44 2001/02/27 15:19:12 jbarbosa
40 Transition to SDigits.
42 Revision 1.43 2001/02/23 17:19:06 jbarbosa
43 Corrected photocathode definition in BuildGeometry().
45 Revision 1.42 2001/02/13 20:07:23 jbarbosa
46 Parametrised definition of photcathode dimensions. New spacers. New data members in AliRICHHit to store particle momentum
47 when entering the freon. Corrected calls to particle stack.
49 Revision 1.41 2001/01/26 20:00:20 hristov
50 Major upgrade of AliRoot code
52 Revision 1.40 2001/01/24 20:58:03 jbarbosa
53 Enhanced BuildGeometry. Now the photocathodes are drawn.
55 Revision 1.39 2001/01/22 21:40:24 jbarbosa
56 Removing magic numbers
58 Revision 1.37 2000/12/20 14:07:25 jbarbosa
59 Removed dependencies on TGeant3 (thanks to F. Carminati and I. Hrivnacova)
61 Revision 1.36 2000/12/18 17:45:54 jbarbosa
62 Cleaned up PadHits object.
64 Revision 1.35 2000/12/15 16:49:40 jbarbosa
65 Geometry and materials updates (wire supports, pcbs, backplane supports, frame).
67 Revision 1.34 2000/11/10 18:12:12 jbarbosa
68 Bug fix for AliRICHCerenkov (thanks to P. Hristov)
70 Revision 1.33 2000/11/02 10:09:01 jbarbosa
71 Minor bug correction (some pointers were not initialised in the default constructor)
73 Revision 1.32 2000/11/01 15:32:55 jbarbosa
74 Updated to handle both reconstruction algorithms.
76 Revision 1.31 2000/10/26 20:18:33 jbarbosa
77 Supports for methane and freon vessels
79 Revision 1.30 2000/10/24 13:19:12 jbarbosa
82 Revision 1.29 2000/10/19 19:39:25 jbarbosa
83 Some more changes to geometry. Further correction of digitisation "per part. type"
85 Revision 1.28 2000/10/17 20:50:57 jbarbosa
86 Inversed digtise by particle type (now, only the selected particle type is not digitsed).
87 Corrected several geometry minor bugs.
88 Added new parameter (opaque quartz thickness).
90 Revision 1.27 2000/10/11 10:33:55 jbarbosa
91 Corrected bug introduced by earlier revisions (CerenkovData array cannot be reset to zero on wach call of StepManager)
93 Revision 1.26 2000/10/03 21:44:08 morsch
94 Use AliSegmentation and AliHit abstract base classes.
96 Revision 1.25 2000/10/02 21:28:12 fca
97 Removal of useless dependecies via forward declarations
99 Revision 1.24 2000/10/02 15:43:17 jbarbosa
100 Fixed forward declarations.
101 Fixed honeycomb density.
102 Fixed cerenkov storing.
105 Revision 1.23 2000/09/13 10:42:14 hristov
106 Minor corrections for HP, DEC and Sun; strings.h included
108 Revision 1.22 2000/09/12 18:11:13 fca
109 zero hits area before using
111 Revision 1.21 2000/07/21 10:21:07 morsch
112 fNrawch = 0; and fNrechits = 0; in the default constructor.
114 Revision 1.20 2000/07/10 15:28:39 fca
115 Correction of the inheritance scheme
117 Revision 1.19 2000/06/30 16:29:51 dibari
118 Added kDebugLevel variable to control output size on demand
120 Revision 1.18 2000/06/12 15:15:46 jbarbosa
123 Revision 1.17 2000/06/09 14:58:37 jbarbosa
124 New digitisation per particle type
126 Revision 1.16 2000/04/19 12:55:43 morsch
127 Newly structured and updated version (JB, AM)
132 ////////////////////////////////////////////////
133 // Manager and hits classes for set:RICH //
134 ////////////////////////////////////////////////
142 #include <TObjArray.h>
145 #include <TParticle.h>
146 #include <TGeometry.h>
154 #include <iostream.h>
158 #include "AliSegmentation.h"
159 #include "AliRICHSegmentationV0.h"
160 #include "AliRICHHit.h"
161 #include "AliRICHCerenkov.h"
162 #include "AliRICHSDigit.h"
163 #include "AliRICHDigit.h"
164 #include "AliRICHTransientDigit.h"
165 #include "AliRICHRawCluster.h"
166 #include "AliRICHRecHit1D.h"
167 #include "AliRICHRecHit3D.h"
168 #include "AliRICHHitMapA1.h"
169 #include "AliRICHClusterFinder.h"
170 #include "AliRICHMerger.h"
174 #include "AliConst.h"
176 #include "AliPoints.h"
177 #include "AliCallf77.h"
180 // Static variables for the pad-hit iterator routines
181 static Int_t sMaxIterPad=0;
182 static Int_t sCurIterPad=0;
186 //___________________________________________
189 // Default constructor for RICH manager class
202 for (Int_t i=0; i<7; i++)
213 //___________________________________________
214 AliRICH::AliRICH(const char *name, const char *title)
215 : AliDetector(name,title)
219 <img src="gif/alirich.gif">
223 fHits = new TClonesArray("AliRICHHit",1000 );
224 gAlice->AddHitList(fHits);
225 fSDigits = new TClonesArray("AliRICHSDigit",100000);
226 fCerenkovs = new TClonesArray("AliRICHCerenkov",1000);
227 gAlice->AddHitList(fCerenkovs);
228 //gAlice->AddHitList(fHits);
233 //fNdch = new Int_t[kNCH];
235 fDchambers = new TObjArray(kNCH);
237 fRecHits1D = new TObjArray(kNCH);
238 fRecHits3D = new TObjArray(kNCH);
242 for (i=0; i<kNCH ;i++) {
243 (*fDchambers)[i] = new TClonesArray("AliRICHDigit",10000);
247 //fNrawch = new Int_t[kNCH];
249 fRawClusters = new TObjArray(kNCH);
250 //printf("Created fRwClusters with adress:%p",fRawClusters);
252 for (i=0; i<kNCH ;i++) {
253 (*fRawClusters)[i] = new TClonesArray("AliRICHRawCluster",10000);
257 //fNrechits = new Int_t[kNCH];
259 for (i=0; i<kNCH ;i++) {
260 (*fRecHits1D)[i] = new TClonesArray("AliRICHRecHit1D",1000);
262 for (i=0; i<kNCH ;i++) {
263 (*fRecHits3D)[i] = new TClonesArray("AliRICHRecHit3D",1000);
265 //printf("Created fRecHits with adress:%p",fRecHits);
268 SetMarkerColor(kRed);
270 /*fChambers = new TObjArray(kNCH);
271 for (i=0; i<kNCH; i++)
272 (*fChambers)[i] = new AliRICHChamber();*/
277 AliRICH::AliRICH(const AliRICH& RICH)
283 //___________________________________________
287 // Destructor of RICH manager class
294 //PH Delete TObjArrays
300 fDchambers->Delete();
304 fRawClusters->Delete();
308 fRecHits1D->Delete();
312 fRecHits3D->Delete();
319 //_____________________________________________________________________________
320 Int_t AliRICH::Hits2SDigits(Float_t xhit,Float_t yhit,Float_t eloss, Int_t idvol, ResponseType res)
323 // Calls the charge disintegration method of the current chamber and adds
324 // the simulated cluster to the root treee
327 Float_t newclust[4][500];
331 // Integrated pulse height on chamber
335 ((AliRICHChamber*) (*fChambers)[idvol])->DisIntegration(eloss, xhit, yhit, nnew, newclust, res);
340 for (Int_t i=0; i<nnew; i++) {
341 if (Int_t(newclust[0][i]) > 0) {
344 clhits[1] = Int_t(newclust[0][i]);
346 clhits[2] = Int_t(newclust[1][i]);
348 clhits[3] = Int_t(newclust[2][i]);
349 // Pad: chamber sector
350 clhits[4] = Int_t(newclust[3][i]);
352 //printf(" %d %d %d %d %d\n", clhits[0], clhits[1], clhits[2], clhits[3], clhits[4]);
360 gAlice->TreeS()->Fill();
361 gAlice->TreeS()->Write(0,TObject::kOverwrite);
362 //printf("Filled SDigits...\n");
367 //___________________________________________
368 void AliRICH::Hits2SDigits()
371 // Dummy: sdigits are created during transport.
372 // Called from alirun.
374 int nparticles = gAlice->GetNtrack();
375 cout << "Particles (RICH):" <<nparticles<<endl;
376 if (nparticles > 0) printf("SDigits were already generated.\n");
380 //___________________________________________
381 void AliRICH::SDigits2Digits(Int_t nev, Int_t flag)
386 // Called from macro. Multiple events, more functionality.
388 AliRICHChamber* iChamber;
390 printf("Generating tresholds...\n");
392 for(Int_t i=0;i<7;i++) {
393 iChamber = &(Chamber(i));
394 iChamber->GenerateTresholds();
397 int nparticles = gAlice->GetNtrack();
402 fMerger->Digitise(nev,flag);
405 //Digitise(nev,flag);
407 //___________________________________________
408 void AliRICH::SDigits2Digits()
413 // Called from alirun, single event only.
415 AliRICHChamber* iChamber;
417 printf("Generating tresholds...\n");
419 for(Int_t i=0;i<7;i++) {
420 iChamber = &(Chamber(i));
421 iChamber->GenerateTresholds();
424 int nparticles = gAlice->GetNtrack();
425 cout << "Particles (RICH):" <<nparticles<<endl;
430 fMerger->Digitise(0,0);
434 //___________________________________________
435 void AliRICH::Digits2Reco()
439 // Called from alirun, single event only.
441 int nparticles = gAlice->GetNtrack();
442 cout << "Particles (RICH):" <<nparticles<<endl;
443 if (nparticles > 0) FindClusters(0,0);
447 //___________________________________________
448 void AliRICH::AddHit(Int_t track, Int_t *vol, Float_t *hits)
452 // Adds a hit to the Hits list
454 TClonesArray &lhits = *fHits;
455 new(lhits[fNhits++]) AliRICHHit(fIshunt,track,vol,hits);
457 //_____________________________________________________________________________
458 void AliRICH::AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs)
462 // Adds a RICH cerenkov hit to the Cerenkov Hits list
465 TClonesArray &lcerenkovs = *fCerenkovs;
466 new(lcerenkovs[fNcerenkovs++]) AliRICHCerenkov(fIshunt,track,vol,cerenkovs);
467 //printf ("Done for Cerenkov %d\n\n\n\n",fNcerenkovs);
469 //___________________________________________
470 void AliRICH::AddSDigit(Int_t *clhits)
474 // Add a RICH pad hit to the list
477 //printf("fsdigits:%p, data: %d\n",fSDigits,clhits[2]);
478 TClonesArray &lSDigits = *fSDigits;
479 new(lSDigits[fNSDigits++]) AliRICHSDigit(clhits);
481 //_____________________________________________________________________________
482 void AliRICH::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
486 // Add a RICH digit to the list
489 //printf("fdigits:%p, data: %d\n",((TClonesArray*)(*fDchambers)[id]),digits[0]);
490 TClonesArray &ldigits = *((TClonesArray*)(*fDchambers)[id]);
491 new(ldigits[fNdch[id]++]) AliRICHDigit(tracks,charges,digits);
494 //_____________________________________________________________________________
495 void AliRICH::AddRawCluster(Int_t id, const AliRICHRawCluster& c)
498 // Add a RICH digit to the list
501 TClonesArray &lrawcl = *((TClonesArray*)(*fRawClusters)[id]);
502 new(lrawcl[fNrawch[id]++]) AliRICHRawCluster(c);
505 //_____________________________________________________________________________
506 void AliRICH::AddRecHit1D(Int_t id, Float_t *rechit, Float_t *photons, Int_t *padsx, Int_t* padsy)
510 // Add a RICH reconstructed hit to the list
513 TClonesArray &lrec1D = *((TClonesArray*)(*fRecHits1D)[id]);
514 new(lrec1D[fNrechits1D[id]++]) AliRICHRecHit1D(id,rechit,photons,padsx,padsy);
517 //_____________________________________________________________________________
518 void AliRICH::AddRecHit3D(Int_t id, Float_t *rechit)
522 // Add a RICH reconstructed hit to the list
525 TClonesArray &lrec3D = *((TClonesArray*)(*fRecHits3D)[id]);
526 new(lrec3D[fNrechits3D[id]++]) AliRICHRecHit3D(id,rechit);
529 //___________________________________________
530 void AliRICH::BuildGeometry()
535 // Builds a TNode geometry for event display
537 TNode *node, *subnode, *top;
539 const int kColorRICH = kRed;
541 top=gAlice->GetGeometry()->GetNode("alice");
543 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
544 AliRICHSegmentationV0* segmentation;
545 AliRICHChamber* iChamber;
546 AliRICHGeometry* geometry;
548 iChamber = &(pRICH->Chamber(0));
549 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
550 geometry=iChamber->GetGeometryModel();
552 new TBRIK("S_RICH","S_RICH","void",71.09999,11.5,73.15);
554 Float_t padplane_width = segmentation->GetPadPlaneWidth();
555 Float_t padplane_length = segmentation->GetPadPlaneLength();
557 //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());
559 new TBRIK("PHOTO","PHOTO","void", padplane_width/2,.1,padplane_length/2);
561 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", padplane_width/2,padplane_length/2);
562 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", segmentation->GetPadPlaneWidth(), segmentation->GetPadPlaneLength());
564 Float_t offset = 490 + 1.276 - geometry->GetGapThickness()/2; //distance from center of mother volume to methane
565 Float_t deltaphi = 19.5; //phi angle between center of chambers - z direction
566 Float_t deltatheta = 20; //theta angle between center of chambers - x direction
567 Float_t cosphi = TMath::Cos(deltaphi*TMath::Pi()/180);
568 Float_t sinphi = TMath::Sin(deltaphi*TMath::Pi()/180);
569 Float_t costheta = TMath::Cos(deltatheta*TMath::Pi()/180);
570 Float_t sintheta = TMath::Sin(deltatheta*TMath::Pi()/180);
572 //printf("\n\n%f %f %f %f %f %f %f\n\n",offset,deltatheta,deltaphi,cosphi,costheta,sinphi,sintheta);
574 new TRotMatrix("rot993","rot993",90., 0. , 90. - deltaphi, 90. , deltaphi, -90. );
575 new TRotMatrix("rot994","rot994",90., -deltatheta , 90. , 90.- deltatheta , 0. , 0. );
576 new TRotMatrix("rot995","rot995",90., 0. , 90. , 90. , 0. , 0. );
577 new TRotMatrix("rot996","rot996",90., deltatheta , 90. , 90 + deltatheta , 0. , 0. );
578 new TRotMatrix("rot997","rot997",90., 360. - deltatheta, 108.2 , 90.- deltatheta ,18.2 , 90 - deltatheta);
579 new TRotMatrix("rot998","rot998",90., 0. , 90 + deltaphi , 90. , deltaphi, 90. );
580 new TRotMatrix("rot999","rot999",90., deltatheta , 108.2 , 90.+ deltatheta ,18.2 , 90 + deltatheta);
582 Float_t pos1[3]={0. , offset*cosphi , offset*sinphi};
583 Float_t pos2[3]={offset*sintheta , offset*costheta , 0. };
584 Float_t pos3[3]={0. , offset , 0.};
585 Float_t pos4[3]={-offset*sintheta , offset*costheta , 0.};
586 Float_t pos5[3]={offset*sinphi , offset*costheta*cosphi, -offset*sinphi};
587 Float_t pos6[3]={0. , offset*cosphi , -offset*sinphi};
588 Float_t pos7[3]={ -offset*sinphi , offset*costheta*cosphi, -offset*sinphi};
592 //Float_t pos1[3]={0,471.8999,165.2599};
593 //Chamber(0).SetChamberTransform(pos1[0],pos1[1],pos1[2],
594 //new TRotMatrix("rot993","rot993",90,0,70.69,90,19.30999,-90);
595 node = new TNode("RICH1","RICH1","S_RICH",pos1[0],pos1[1],pos1[2],"rot993");
596 node->SetLineColor(kColorRICH);
598 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
599 subnode->SetLineColor(kGreen);
600 fNodes->Add(subnode);
601 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
602 subnode->SetLineColor(kGreen);
603 fNodes->Add(subnode);
604 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
605 subnode->SetLineColor(kGreen);
606 fNodes->Add(subnode);
607 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
608 subnode->SetLineColor(kGreen);
609 fNodes->Add(subnode);
610 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-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(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
614 subnode->SetLineColor(kGreen);
615 fNodes->Add(subnode);
620 //Float_t pos2[3]={171,470,0};
621 //Chamber(1).SetChamberTransform(pos2[0],pos2[1],pos2[2],
622 //new TRotMatrix("rot994","rot994",90,-20,90,70,0,0);
623 node = new TNode("RICH2","RICH2","S_RICH",pos2[0],pos2[1],pos2[2],"rot994");
624 node->SetLineColor(kColorRICH);
626 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
627 subnode->SetLineColor(kGreen);
628 fNodes->Add(subnode);
629 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
630 subnode->SetLineColor(kGreen);
631 fNodes->Add(subnode);
632 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
633 subnode->SetLineColor(kGreen);
634 fNodes->Add(subnode);
635 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
636 subnode->SetLineColor(kGreen);
637 fNodes->Add(subnode);
638 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
639 subnode->SetLineColor(kGreen);
640 fNodes->Add(subnode);
641 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
642 subnode->SetLineColor(kGreen);
643 fNodes->Add(subnode);
648 //Float_t pos3[3]={0,500,0};
649 //Chamber(2).SetChamberTransform(pos3[0],pos3[1],pos3[2],
650 //new TRotMatrix("rot995","rot995",90,0,90,90,0,0);
651 node = new TNode("RICH3","RICH3","S_RICH",pos3[0],pos3[1],pos3[2],"rot995");
652 node->SetLineColor(kColorRICH);
654 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
655 subnode->SetLineColor(kGreen);
656 fNodes->Add(subnode);
657 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
658 subnode->SetLineColor(kGreen);
659 fNodes->Add(subnode);
660 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
661 subnode->SetLineColor(kGreen);
662 fNodes->Add(subnode);
663 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
664 subnode->SetLineColor(kGreen);
665 fNodes->Add(subnode);
666 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
667 subnode->SetLineColor(kGreen);
668 fNodes->Add(subnode);
669 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
670 subnode->SetLineColor(kGreen);
671 fNodes->Add(subnode);
675 //Float_t pos4[3]={-171,470,0};
676 //Chamber(3).SetChamberTransform(pos4[0],pos4[1],pos4[2],
677 //new TRotMatrix("rot996","rot996",90,20,90,110,0,0);
678 node = new TNode("RICH4","RICH4","S_RICH",pos4[0],pos4[1],pos4[2],"rot996");
679 node->SetLineColor(kColorRICH);
681 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
682 subnode->SetLineColor(kGreen);
683 fNodes->Add(subnode);
684 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
685 subnode->SetLineColor(kGreen);
686 fNodes->Add(subnode);
687 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
688 subnode->SetLineColor(kGreen);
689 fNodes->Add(subnode);
690 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
691 subnode->SetLineColor(kGreen);
692 fNodes->Add(subnode);
693 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
694 subnode->SetLineColor(kGreen);
695 fNodes->Add(subnode);
696 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
697 subnode->SetLineColor(kGreen);
698 fNodes->Add(subnode);
703 //Float_t pos5[3]={161.3999,443.3999,-165.3};
704 //Chamber(4).SetChamberTransform(pos5[0],pos5[1],pos5[2],
705 //new TRotMatrix("rot997","rot997",90,340,108.1999,70,18.2,70);
706 node = new TNode("RICH5","RICH5","S_RICH",pos5[0],pos5[1],pos5[2],"rot997");
707 node->SetLineColor(kColorRICH);
709 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
710 subnode->SetLineColor(kGreen);
711 fNodes->Add(subnode);
712 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
713 subnode->SetLineColor(kGreen);
714 fNodes->Add(subnode);
715 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
716 subnode->SetLineColor(kGreen);
717 fNodes->Add(subnode);
718 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
719 subnode->SetLineColor(kGreen);
720 fNodes->Add(subnode);
721 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-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(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
725 subnode->SetLineColor(kGreen);
726 fNodes->Add(subnode);
731 //Float_t pos6[3]={0., 471.9, -165.3,};
732 //Chamber(5).SetChamberTransform(pos6[0],pos6[1],pos6[2],
733 //new TRotMatrix("rot998","rot998",90,0,109.3099,90,19.30999,90);
734 node = new TNode("RICH6","RICH6","S_RICH",pos6[0],pos6[1],pos6[2],"rot998");
735 node->SetLineColor(kColorRICH);
736 fNodes->Add(node);node->cd();
737 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
738 subnode->SetLineColor(kGreen);
739 fNodes->Add(subnode);
740 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
741 subnode->SetLineColor(kGreen);
742 fNodes->Add(subnode);
743 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
744 subnode->SetLineColor(kGreen);
745 fNodes->Add(subnode);
746 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
747 subnode->SetLineColor(kGreen);
748 fNodes->Add(subnode);
749 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
750 subnode->SetLineColor(kGreen);
751 fNodes->Add(subnode);
752 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
753 subnode->SetLineColor(kGreen);
754 fNodes->Add(subnode);
758 //Float_t pos7[3]={-161.399,443.3999,-165.3};
759 //Chamber(6).SetChamberTransform(pos7[0],pos7[1],pos7[2],
760 //new TRotMatrix("rot999","rot999",90,20,108.1999,110,18.2,110);
761 node = new TNode("RICH7","RICH7","S_RICH",pos7[0],pos7[1],pos7[2],"rot999");
762 node->SetLineColor(kColorRICH);
764 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
765 subnode->SetLineColor(kGreen);
766 fNodes->Add(subnode);
767 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
768 subnode->SetLineColor(kGreen);
769 fNodes->Add(subnode);
770 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
771 subnode->SetLineColor(kGreen);
772 fNodes->Add(subnode);
773 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
774 subnode->SetLineColor(kGreen);
775 fNodes->Add(subnode);
776 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
777 subnode->SetLineColor(kGreen);
778 fNodes->Add(subnode);
779 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
780 subnode->SetLineColor(kGreen);
781 fNodes->Add(subnode);
786 //___________________________________________
787 void AliRICH::CreateGeometry()
790 // Create the geometry for RICH version 1
792 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
793 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
794 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
798 <img src="picts/AliRICHv1.gif">
803 <img src="picts/AliRICHv1Tree.gif">
807 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
808 AliRICHSegmentationV0* segmentation;
809 AliRICHGeometry* geometry;
810 AliRICHChamber* iChamber;
812 iChamber = &(pRICH->Chamber(0));
813 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
814 geometry=iChamber->GetGeometryModel();
817 distance = geometry->GetFreonThickness()/2 + geometry->GetQuartzThickness() + geometry->GetGapThickness();
818 geometry->SetRadiatorToPads(distance);
820 //Opaque quartz thickness
821 Float_t oqua_thickness = .5;
824 //Float_t csi_length = 160*.8 + 2.6;
825 //Float_t csi_width = 144*.84 + 2*2.6;
827 Float_t csi_width = segmentation->Npx()*segmentation->Dpx() + segmentation->DeadZone();
828 Float_t csi_length = segmentation->Npy()*segmentation->Dpy() + 2*segmentation->DeadZone();
830 //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());
832 Int_t *idtmed = fIdtmed->GetArray()-999;
839 // --- Define the RICH detector
840 // External aluminium box
842 par[1] = 13; //Original Settings
847 gMC->Gsvolu("RICH", "BOX ", idtmed[1009], par, 3);
851 par[1] = 13; //Original Settings
856 gMC->Gsvolu("SRIC", "BOX ", idtmed[1000], par, 3);
858 // Air 2 (cutting the lower part of the box)
861 par[1] = 3; //Original Settings
863 gMC->Gsvolu("AIR2", "BOX ", idtmed[1000], par, 3);
865 // Air 3 (cutting the lower part of the box)
868 par[1] = 3; //Original Settings
870 gMC->Gsvolu("AIR3", "BOX ", idtmed[1000], par, 3);
874 par[1] = .188; //Original Settings
879 gMC->Gsvolu("HONE", "BOX ", idtmed[1001], par, 3);
883 par[1] = .025; //Original Settings
888 gMC->Gsvolu("ALUM", "BOX ", idtmed[1009], par, 3);
891 par[0] = geometry->GetQuartzWidth()/2;
892 par[1] = geometry->GetQuartzThickness()/2;
893 par[2] = geometry->GetQuartzLength()/2;
895 par[1] = .25; //Original Settings
897 /*par[0] = geometry->GetQuartzWidth()/2;
898 par[1] = geometry->GetQuartzThickness()/2;
899 par[2] = geometry->GetQuartzLength()/2;*/
900 //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]);
901 gMC->Gsvolu("QUAR", "BOX ", idtmed[1002], par, 3);
903 // Spacers (cylinders)
906 par[2] = geometry->GetFreonThickness()/2;
907 gMC->Gsvolu("SPAC", "TUBE", idtmed[1002], par, 3);
909 // Feet (freon slabs supports)
914 gMC->Gsvolu("FOOT", "BOX", idtmed[1009], par, 3);
917 par[0] = geometry->GetQuartzWidth()/2;
919 par[2] = geometry->GetQuartzLength()/2;
921 par[1] = .2; //Original Settings
926 gMC->Gsvolu("OQUA", "BOX ", idtmed[1007], par, 3);
928 // Frame of opaque quartz
929 par[0] = geometry->GetOuterFreonWidth()/2;
931 par[1] = geometry->GetFreonThickness()/2;
932 par[2] = geometry->GetOuterFreonLength()/2;
935 par[1] = .5; //Original Settings
940 gMC->Gsvolu("OQF1", "BOX ", idtmed[1007], par, 3);
942 par[0] = geometry->GetInnerFreonWidth()/2;
943 par[1] = geometry->GetFreonThickness()/2;
944 par[2] = geometry->GetInnerFreonLength()/2;
945 gMC->Gsvolu("OQF2", "BOX ", idtmed[1007], par, 3);
947 // Little bar of opaque quartz
949 //par[1] = geometry->GetQuartzThickness()/2;
950 //par[2] = geometry->GetInnerFreonLength()/2 - 2.4;
951 //par[2] = geometry->GetInnerFreonLength()/2;
954 par[1] = .25; //Original Settings
959 //gMC->Gsvolu("BARR", "BOX ", idtmed[1007], par, 3);
962 par[0] = geometry->GetOuterFreonWidth()/2 - oqua_thickness;
963 par[1] = geometry->GetFreonThickness()/2;
964 par[2] = geometry->GetOuterFreonLength()/2 - 2*oqua_thickness;
966 par[1] = .5; //Original Settings
971 gMC->Gsvolu("FRE1", "BOX ", idtmed[1003], par, 3);
973 par[0] = geometry->GetInnerFreonWidth()/2 - oqua_thickness;
974 par[1] = geometry->GetFreonThickness()/2;
975 par[2] = geometry->GetInnerFreonLength()/2 - 2*oqua_thickness;
976 gMC->Gsvolu("FRE2", "BOX ", idtmed[1003], par, 3);
980 par[0] = csi_width/2;
981 par[1] = geometry->GetGapThickness()/2;
982 //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]);
984 par[2] = csi_length/2;
985 gMC->Gsvolu("META", "BOX ", idtmed[1004], par, 3);
989 par[0] = csi_width/2;
990 par[1] = geometry->GetProximityGapThickness()/2;
991 //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]);
993 par[2] = csi_length/2;
994 gMC->Gsvolu("GAP ", "BOX ", idtmed[1008], par, 3);
998 par[0] = csi_width/2;
1001 par[2] = csi_length/2;
1002 gMC->Gsvolu("CSI ", "BOX ", idtmed[1005], par, 3);
1008 gMC->Gsvolu("GRID", "TUBE", idtmed[1006], par, 3);
1013 par[0] = csi_width/2;
1016 gMC->Gsvolu("WSMe", "BOX ", idtmed[1009], par, 3);
1018 // Ceramic pick up (base)
1020 par[0] = csi_width/2;
1023 gMC->Gsvolu("WSG1", "BOX ", idtmed[1010], par, 3);
1025 // Ceramic pick up (head)
1027 par[0] = csi_width/2;
1030 gMC->Gsvolu("WSG2", "BOX ", idtmed[1010], par, 3);
1032 // Aluminium supports for methane and CsI
1035 par[0] = csi_width/2;
1036 par[1] = geometry->GetGapThickness()/2 + .25;
1037 par[2] = (68.35 - csi_length/2)/2;
1038 gMC->Gsvolu("SMSH", "BOX", idtmed[1009], par, 3);
1042 par[0] = (66.3 - csi_width/2)/2;
1043 par[1] = geometry->GetGapThickness()/2 + .25;
1044 par[2] = csi_length/2 + 68.35 - csi_length/2;
1045 gMC->Gsvolu("SMLG", "BOX", idtmed[1009], par, 3);
1047 // Aluminium supports for freon
1050 par[0] = geometry->GetQuartzWidth()/2;
1052 par[2] = (68.35 - geometry->GetQuartzLength()/2)/2;
1053 gMC->Gsvolu("SFSH", "BOX", idtmed[1009], par, 3);
1057 par[0] = (66.3 - geometry->GetQuartzWidth()/2)/2;
1059 par[2] = geometry->GetQuartzLength()/2 + 68.35 - geometry->GetQuartzLength()/2;
1060 gMC->Gsvolu("SFLG", "BOX", idtmed[1009], par, 3);
1064 par[0] = csi_width/2;
1066 par[2] = csi_length/4 -.5025;
1067 gMC->Gsvolu("PCB ", "BOX", idtmed[1011], par, 3);
1070 // Backplane supports
1077 gMC->Gsvolu("BACK", "BOX", idtmed[1009], par, 3);
1084 gMC->Gsvolu("BKHL", "BOX", idtmed[1000], par, 3);
1091 gMC->Gsvolu("BKHS", "BOX", idtmed[1000], par, 3);
1093 // Place holes inside backplane support
1095 gMC->Gspos("BKHS", 1, "BACK", .8 + 5.7,0., .6 + 4.4625, 0, "ONLY");
1096 gMC->Gspos("BKHS", 2, "BACK", -.8 - 5.7,0., .6 + 4.4625, 0, "ONLY");
1097 gMC->Gspos("BKHS", 3, "BACK", .8 + 5.7,0., -.6 - 4.4625, 0, "ONLY");
1098 gMC->Gspos("BKHS", 4, "BACK", -.8 - 5.7,0., -.6 - 4.4625, 0, "ONLY");
1099 gMC->Gspos("BKHS", 5, "BACK", .8 + 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1100 gMC->Gspos("BKHS", 6, "BACK", -.8 - 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1101 gMC->Gspos("BKHS", 7, "BACK", .8 + 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1102 gMC->Gspos("BKHS", 8, "BACK", -.8 - 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1103 gMC->Gspos("BKHL", 1, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., .6 + 4.4625, 0, "ONLY");
1104 gMC->Gspos("BKHL", 2, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 4.4625, 0, "ONLY");
1105 gMC->Gspos("BKHL", 3, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1106 gMC->Gspos("BKHL", 4, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1107 gMC->Gspos("BKHL", 5, "BACK", .8 + 11.4+ 1.6 + 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1108 gMC->Gspos("BKHL", 6, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1109 gMC->Gspos("BKHL", 7, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1110 gMC->Gspos("BKHL", 8, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1114 // --- Places the detectors defined with GSVOLU
1115 // Place material inside RICH
1116 gMC->Gspos("SRIC", 1, "RICH", 0.,0., 0., 0, "ONLY");
1117 gMC->Gspos("AIR2", 1, "RICH", 66.3 + 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 0., 0, "ONLY");
1118 gMC->Gspos("AIR2", 2, "RICH", -66.3 - 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 0., 0, "ONLY");
1119 gMC->Gspos("AIR3", 1, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, -68.35 - 1.25, 0, "ONLY");
1120 gMC->Gspos("AIR3", 2, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.35, 68.35 + 1.25, 0, "ONLY");
1123 gMC->Gspos("ALUM", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.025, 0., 0, "ONLY");
1124 gMC->Gspos("HONE", 1, "SRIC", 0., 1.276- geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .188, 0., 0, "ONLY");
1125 gMC->Gspos("ALUM", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .025, 0., 0, "ONLY");
1126 gMC->Gspos("FOOT", 1, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1127 gMC->Gspos("FOOT", 2, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3 , 36.9, 0, "ONLY");
1128 gMC->Gspos("FOOT", 3, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1129 gMC->Gspos("FOOT", 4, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1130 gMC->Gspos("FOOT", 5, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1131 gMC->Gspos("FOOT", 6, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1132 gMC->Gspos("FOOT", 7, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1133 gMC->Gspos("FOOT", 8, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1134 gMC->Gspos("OQUA", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .2, 0., 0, "ONLY");
1139 gMC->Gspos("SMLG", 1, "SRIC", csi_width/2 + (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1140 gMC->Gspos("SMLG", 2, "SRIC", - csi_width/2 - (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1141 gMC->Gspos("SMSH", 1, "SRIC", 0., 1.276 + .25, csi_length/2 + (68.35 - csi_length/2)/2, 0, "ONLY");
1142 gMC->Gspos("SMSH", 2, "SRIC", 0., 1.276 + .25, - csi_length/2 - (68.35 - csi_length/2)/2, 0, "ONLY");
1146 Float_t supp_y = 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness() - .2 + .3; //y position of freon supports
1148 gMC->Gspos("SFLG", 1, "SRIC", geometry->GetQuartzWidth()/2 + (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1149 gMC->Gspos("SFLG", 2, "SRIC", - geometry->GetQuartzWidth()/2 - (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1150 gMC->Gspos("SFSH", 1, "SRIC", 0., supp_y, geometry->GetQuartzLength()/2 + (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1151 gMC->Gspos("SFSH", 2, "SRIC", 0., supp_y, - geometry->GetQuartzLength()/2 - (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1153 AliMatrix(idrotm[1019], 0., 0., 90., 0., 90., 90.);
1155 //Placing of the spacers inside the freon slabs
1157 Int_t nspacers = 30;
1158 //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);
1160 //printf("Nspacers: %d", nspacers);
1162 for (i = 0; i < nspacers/3; i++) {
1163 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1164 gMC->Gspos("SPAC", i, "FRE1", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1167 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1168 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1169 gMC->Gspos("SPAC", i, "FRE1", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1172 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1173 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1174 gMC->Gspos("SPAC", i, "FRE1", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1177 for (i = 0; i < nspacers/3; i++) {
1178 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1179 gMC->Gspos("SPAC", i, "FRE2", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1182 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1183 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1184 gMC->Gspos("SPAC", i, "FRE2", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1187 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1188 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1189 gMC->Gspos("SPAC", i, "FRE2", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1193 gMC->Gspos("FRE1", 1, "OQF1", 0., 0., 0., 0, "ONLY");
1194 gMC->Gspos("FRE2", 1, "OQF2", 0., 0., 0., 0, "ONLY");
1195 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)
1196 // printf("Opaque quartz in SRIC %f\n", 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness()/2);
1197 gMC->Gspos("OQF2", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings
1198 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)
1199 //gMC->Gspos("BARR", 1, "QUAR", - geometry->GetInnerFreonWidth()/2 - oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (-21.65)
1200 //gMC->Gspos("BARR", 2, "QUAR", geometry->GetInnerFreonWidth()/2 + oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (21.65)
1201 gMC->Gspos("QUAR", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness()/2, 0., 0, "ONLY");
1202 gMC->Gspos("GAP ", 1, "META", 0., geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 - 0.0001, 0., 0, "ONLY");
1203 gMC->Gspos("META", 1, "SRIC", 0., 1.276, 0., 0, "ONLY");
1204 gMC->Gspos("CSI ", 1, "SRIC", 0., 1.276 + geometry->GetGapThickness()/2 + .25, 0., 0, "ONLY");
1205 printf("CSI pos: %f\n",1.276 + geometry->GetGapThickness()/2 + .25);
1207 // Wire support placing
1209 gMC->Gspos("WSG2", 1, "GAP ", 0., geometry->GetProximityGapThickness()/2 - .1, 0., 0, "ONLY");
1210 gMC->Gspos("WSG1", 1, "CSI ", 0., 0., 0., 0, "ONLY");
1211 gMC->Gspos("WSMe", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, 0., 0, "ONLY");
1213 // Backplane placing
1215 gMC->Gspos("BACK", 1, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 43.3, 0, "ONLY");
1216 gMC->Gspos("BACK", 2, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2 , 43.3, 0, "ONLY");
1217 gMC->Gspos("BACK", 3, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1218 gMC->Gspos("BACK", 4, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1219 gMC->Gspos("BACK", 5, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1220 gMC->Gspos("BACK", 6, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1224 gMC->Gspos("PCB ", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, csi_width/4 + .5025 + 2.5, 0, "ONLY");
1225 gMC->Gspos("PCB ", 2, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, -csi_width/4 - .5025 - 2.5, 0, "ONLY");
1229 //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);
1231 // Place RICH inside ALICE apparatus
1235 AliMatrix(idrotm[1000], 90., 0., 70.69, 90., 19.31, -90.);
1236 AliMatrix(idrotm[1001], 90., -20., 90., 70., 0., 0.);
1237 AliMatrix(idrotm[1002], 90., 0., 90., 90., 0., 0.);
1238 AliMatrix(idrotm[1003], 90., 20., 90., 110., 0., 0.);
1239 AliMatrix(idrotm[1004], 90., 340., 108.2, 70., 18.2, 70.);
1240 AliMatrix(idrotm[1005], 90., 0., 109.31, 90., 19.31, 90.);
1241 AliMatrix(idrotm[1006], 90., 20., 108.2, 110., 18.2, 110.);
1243 gMC->Gspos("RICH", 1, "ALIC", 0., 471.9, 165.26, idrotm[1000], "ONLY");
1244 gMC->Gspos("RICH", 2, "ALIC", 171., 470., 0., idrotm[1001], "ONLY");
1245 gMC->Gspos("RICH", 3, "ALIC", 0., 500., 0., idrotm[1002], "ONLY");
1246 gMC->Gspos("RICH", 4, "ALIC", -171., 470., 0., idrotm[1003], "ONLY");
1247 gMC->Gspos("RICH", 5, "ALIC", 161.4, 443.4, -165.3, idrotm[1004], "ONLY");
1248 gMC->Gspos("RICH", 6, "ALIC", 0., 471.9, -165.3, idrotm[1005], "ONLY");
1249 gMC->Gspos("RICH", 7, "ALIC", -161.4, 443.4, -165.3, idrotm[1006], "ONLY");*/
1251 // The placing of the chambers is measured from the vertex to the base of the methane vessel (490 cm)
1253 Float_t offset = 490 + 1.276 - geometry->GetGapThickness()/2; //distance from center of mother volume to methane
1254 Float_t deltaphi = 19.5; //phi angle between center of chambers - z direction
1255 Float_t deltatheta = 20; //theta angle between center of chambers - x direction
1256 Float_t cosphi = TMath::Cos(deltaphi*TMath::Pi()/180);
1257 Float_t sinphi = TMath::Sin(deltaphi*TMath::Pi()/180);
1258 Float_t costheta = TMath::Cos(deltatheta*TMath::Pi()/180);
1259 Float_t sintheta = TMath::Sin(deltatheta*TMath::Pi()/180);
1261 //printf("\n\n%f %f %f %f %f %f %f\n\n",offset,deltatheta,deltaphi,cosphi,costheta,sinphi,sintheta);
1263 AliMatrix(idrotm[1000], 90., 0. , 90. - deltaphi, 90. , deltaphi, -90. );
1264 AliMatrix(idrotm[1001], 90., -deltatheta , 90. , 90.- deltatheta , 0. , 0. );
1265 AliMatrix(idrotm[1002], 90., 0. , 90. , 90. , 0. , 0. );
1266 AliMatrix(idrotm[1003], 90., deltatheta , 90. , 90 + deltatheta , 0. , 0. );
1267 AliMatrix(idrotm[1004], 90., 360. - deltatheta, 108.2 , 90.- deltatheta ,18.2 , 90 - deltatheta);
1268 AliMatrix(idrotm[1005], 90., 0. , 90 + deltaphi , 90. , deltaphi, 90. );
1269 AliMatrix(idrotm[1006], 90., deltatheta , 108.2 , 90.+ deltatheta ,18.2 , 90 + deltatheta);
1271 gMC->Gspos("RICH", 1, "ALIC", 0. , offset*cosphi , offset*sinphi ,idrotm[1000], "ONLY");
1272 gMC->Gspos("RICH", 2, "ALIC", (offset)*sintheta , offset*costheta , 0. ,idrotm[1001], "ONLY");
1273 gMC->Gspos("RICH", 3, "ALIC", 0. , offset , 0. ,idrotm[1002], "ONLY");
1274 gMC->Gspos("RICH", 4, "ALIC", -(offset)*sintheta, offset*costheta , 0. ,idrotm[1003], "ONLY");
1275 gMC->Gspos("RICH", 5, "ALIC", (offset)*sinphi , offset*costheta*cosphi, -offset*sinphi,idrotm[1004], "ONLY");
1276 gMC->Gspos("RICH", 6, "ALIC", 0. , offset*cosphi , -offset*sinphi,idrotm[1005], "ONLY");
1277 gMC->Gspos("RICH", 7, "ALIC", -(offset)*sinphi , offset*costheta*cosphi, -offset*sinphi,idrotm[1006], "ONLY");
1282 //___________________________________________
1283 void AliRICH::CreateMaterials()
1286 // *** DEFINITION OF AVAILABLE RICH MATERIALS ***
1287 // ORIGIN : NICK VAN EIJNDHOVEN
1288 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
1289 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
1290 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
1292 Int_t isxfld = gAlice->Field()->Integ();
1293 Float_t sxmgmx = gAlice->Field()->Max();
1296 /************************************Antonnelo's Values (14-vectors)*****************************************/
1298 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,
1299 6.7e-9,6.88e-9,7.08e-9,7.3e-9,7.51e-9,7.74e-9,8e-9 };
1300 Float_t rIndexQuarz[14] = { 1.528309,1.533333,
1301 1.538243,1.544223,1.550568,1.55777,
1302 1.565463,1.574765,1.584831,1.597027,
1303 1.611858,1.6277,1.6472,1.6724 };
1304 Float_t rIndexOpaqueQuarz[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1305 Float_t rIndexMethane[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1306 Float_t rIndexGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1307 Float_t abscoFreon[14] = { 179.0987,179.0987,
1308 179.0987,179.0987,179.0987,142.92,56.65,13.95,10.43,7.07,2.03,.5773,.33496,0. };
1309 //Float_t abscoFreon[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1310 // 1e-5,1e-5,1e-5,1e-5,1e-5 };
1311 Float_t abscoQuarz[14] = { 64.035,39.98,35.665,31.262,27.527,22.815,21.04,17.52,
1312 14.177,9.282,4.0925,1.149,.3627,.10857 };
1313 Float_t abscoOpaqueQuarz[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1314 1e-5,1e-5,1e-5,1e-5,1e-5 };
1315 Float_t abscoCsI[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1316 1e-4,1e-4,1e-4,1e-4 };
1317 Float_t abscoMethane[14] = { 1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,
1319 Float_t abscoGrid[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1320 1e-4,1e-4,1e-4,1e-4 };
1321 Float_t efficAll[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1322 Float_t efficCsI[14] = { 6e-4,.005,.0075,.01125,.045,.117,.135,.16575,
1323 .17425,.1785,.1836,.1904,.1938,.221 };
1324 Float_t efficGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1328 /**********************************End of Antonnelo's Values**********************************/
1330 /**********************************Values from rich_media.f (31-vectors)**********************************/
1333 //Photons energy intervals
1337 ppckov[i] = (Float_t(i)*0.1+5.5)*1e-9;
1338 //printf ("Energy intervals: %e\n",ppckov[i]);
1342 //Refraction index for quarz
1343 Float_t rIndexQuarz[26];
1350 Float_t ene=ppckov[i]*1e9;
1351 Float_t a=f1/(e1*e1 - ene*ene);
1352 Float_t b=f2/(e2*e2 - ene*ene);
1353 rIndexQuarz[i] = TMath::Sqrt(1. + a + b );
1354 //printf ("rIndexQuarz: %e\n",rIndexQuarz[i]);
1357 //Refraction index for opaque quarz, methane and grid
1358 Float_t rIndexOpaqueQuarz[26];
1359 Float_t rIndexMethane[26];
1360 Float_t rIndexGrid[26];
1363 rIndexOpaqueQuarz[i]=1;
1364 rIndexMethane[i]=1.000444;
1366 //printf ("rIndexOpaqueQuarz , etc: %e, %e, %e\n",rIndexOpaqueQuarz[i], rIndexMethane[i], rIndexGrid[i]=1);
1369 //Absorption index for freon
1370 Float_t abscoFreon[26] = {179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987,
1371 179.0987, 142.9206, 56.64957, 25.58622, 13.95293, 12.03905, 10.42953, 8.804196,
1372 7.069031, 4.461292, 2.028366, 1.293013, .577267, .40746, .334964, 0., 0., 0.};
1374 //Absorption index for quarz
1375 /*Float_t Qzt [21] = {.0,.0,.005,.04,.35,.647,.769,.808,.829,.844,.853,.858,.869,.887,.903,.902,.902,
1376 .906,.907,.907,.907};
1377 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,
1378 215.0,220.0,225.0,230.0,235.0,240.0,245.0,250.0};
1379 Float_t abscoQuarz[31];
1380 for (Int_t i=0;i<31;i++)
1382 Float_t Xlam = 1237.79 / (ppckov[i]*1e9);
1383 if (Xlam <= 160) abscoQuarz[i] = 0;
1384 if (Xlam > 250) abscoQuarz[i] = 1;
1387 for (Int_t j=0;j<21;j++)
1389 //printf ("Passed\n");
1390 if (Xlam > Wavl2[j] && Xlam < Wavl2[j+1])
1392 Float_t Dabs = (Qzt[j+1] - Qzt[j])/(Wavl2[j+1] - Wavl2[j]);
1393 Float_t Abso = Qzt[j] + Dabs*(Xlam - Wavl2[j]);
1394 abscoQuarz[i] = -5.0/(TMath::Log(Abso));
1398 printf ("abscoQuarz: %e abscoFreon: %e for energy: %e\n",abscoQuarz[i],abscoFreon[i],ppckov[i]);
1401 /*Float_t abscoQuarz[31] = {49.64211, 48.41296, 47.46989, 46.50492, 45.13682, 44.47883, 43.1929 , 41.30922, 40.5943 ,
1402 39.82956, 38.98623, 38.6247 , 38.43448, 37.41084, 36.22575, 33.74852, 30.73901, 24.25086,
1403 17.94531, 11.88753, 5.99128, 3.83503, 2.36661, 1.53155, 1.30582, 1.08574, .8779708,
1404 .675275, 0., 0., 0.};
1406 for (Int_t i=0;i<31;i++)
1408 abscoQuarz[i] = abscoQuarz[i]/10;
1411 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,
1412 19.266, 17.525, 15.878, 14.177, 11.719, 9.282, 6.62, 4.0925, 2.601, 1.149, .667, .3627,
1413 .192, .1497, .10857};
1415 //Absorption index for methane
1416 Float_t abscoMethane[26];
1419 abscoMethane[i]=AbsoCH4(ppckov[i]*1e9);
1420 //printf("abscoMethane: %e for energy: %e\n", abscoMethane[i],ppckov[i]*1e9);
1423 //Absorption index for opaque quarz, csi and grid, efficiency for all and grid
1424 Float_t abscoOpaqueQuarz[26];
1425 Float_t abscoCsI[26];
1426 Float_t abscoGrid[26];
1427 Float_t efficAll[26];
1428 Float_t efficGrid[26];
1431 abscoOpaqueQuarz[i]=1e-5;
1436 //printf ("All must be 1: %e, %e, %e, %e, %e\n",abscoOpaqueQuarz[i],abscoCsI[i],abscoGrid[i],efficAll[i],efficGrid[i]);
1439 //Efficiency for csi
1441 Float_t efficCsI[26] = {0.000199999995, 0.000600000028, 0.000699999975, 0.00499999989, 0.00749999983, 0.010125,
1442 0.0242999997, 0.0405000001, 0.0688500032, 0.105299994, 0.121500008, 0.141749993, 0.157949999,
1443 0.162, 0.166050002, 0.167669997, 0.174299985, 0.176789999, 0.179279998, 0.182599992, 0.18592,
1444 0.187579989, 0.189239994, 0.190899998, 0.207499996, 0.215799987};
1448 //FRESNEL LOSS CORRECTION FOR PERPENDICULAR INCIDENCE AND
1449 //UNPOLARIZED PHOTONS
1453 efficCsI[i] = efficCsI[i]/(1.-Fresnel(ppckov[i]*1e9,1.,0));
1454 //printf ("Fresnel result: %e for energy: %e\n",Fresnel(ppckov[i]*1e9,1.,0),ppckov[i]*1e9);
1457 /*******************************************End of rich_media.f***************************************/
1464 Float_t afre[2], agri, amet[2], aqua[2], ahon, zfre[2], zgri, zhon,
1468 Int_t nlmatmet, nlmatqua;
1469 Float_t wmatquao[2], rIndexFreon[26];
1470 Float_t aquao[2], epsil, stmin, zquao[2];
1472 Float_t radlal, densal, tmaxfd, deemax, stemax;
1473 Float_t aal, zal, radlgri, densfre, radlhon, densgri, denshon,densqua, densmet, wmatfre[2], wmatmet[2], wmatqua[2];
1475 Int_t *idtmed = fIdtmed->GetArray()-999;
1477 // --- Photon energy (GeV)
1478 // --- Refraction indexes
1479 for (i = 0; i < 26; ++i) {
1480 rIndexFreon[i] = ppckov[i] * .0172 * 1e9 + 1.177;
1481 //rIndexFreon[i] = 1;
1482 //printf ("rIndexFreon: %e \n efficCsI: %e for energy: %e\n",rIndexFreon[i], efficCsI[i], ppckov[i]);
1485 // --- Detection efficiencies (quantum efficiency for CsI)
1486 // --- Define parameters for honeycomb.
1487 // Used carbon of equivalent rad. lenght
1494 // --- Parameters to include in GSMIXT, relative to Quarz (SiO2)
1505 // --- Parameters to include in GSMIXT, relative to opaque Quarz (SiO2)
1516 // --- Parameters to include in GSMIXT, relative to Freon (C6F14)
1527 // --- Parameters to include in GSMIXT, relative to methane (CH4)
1538 // --- Parameters to include in GSMIXT, relative to anode grid (Cu)
1545 // --- Parameters to include in GSMATE related to aluminium sheet
1552 // --- Glass parameters
1554 Float_t aglass[5]={12.01, 28.09, 16., 10.8, 23.};
1555 Float_t zglass[5]={ 6., 14., 8., 5., 11.};
1556 Float_t wglass[5]={ 0.5, 0.105, 0.355, 0.03, 0.01};
1557 Float_t dglass=1.74;
1560 AliMaterial(1, "Air $", 14.61, 7.3, .001205, 30420., 67500);
1561 AliMaterial(6, "HON", ahon, zhon, denshon, radlhon, 0);
1562 AliMaterial(16, "CSI", ahon, zhon, denshon, radlhon, 0);
1563 AliMixture(20, "QUA", aqua, zqua, densqua, nlmatqua, wmatqua);
1564 AliMixture(21, "QUAO", aquao, zquao, densquao, nlmatquao, wmatquao);
1565 AliMixture(30, "FRE", afre, zfre, densfre, nlmatfre, wmatfre);
1566 AliMixture(40, "MET", amet, zmet, densmet, nlmatmet, wmatmet);
1567 AliMixture(41, "METG", amet, zmet, densmet, nlmatmet, wmatmet);
1568 AliMaterial(11, "GRI", agri, zgri, densgri, radlgri, 0);
1569 AliMaterial(50, "ALUM", aal, zal, densal, radlal, 0);
1570 AliMixture(32, "GLASS",aglass, zglass, dglass, 5, wglass);
1571 AliMaterial(31, "COPPER$", 63.54, 29., 8.96, 1.4, 0.);
1579 AliMedium(1, "DEFAULT MEDIUM AIR$", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1580 AliMedium(2, "HONEYCOMB$", 6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1581 AliMedium(3, "QUARZO$", 20, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1582 AliMedium(4, "FREON$", 30, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1583 AliMedium(5, "METANO$", 40, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1584 AliMedium(6, "CSI$", 16, 1, isxfld, sxmgmx,tmaxfd, stemax, deemax, epsil, stmin);
1585 AliMedium(7, "GRIGLIA$", 11, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1586 AliMedium(8, "QUARZOO$", 21, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1587 AliMedium(9, "GAP$", 41, 1, isxfld, sxmgmx,tmaxfd, .1, -deemax, epsil, -stmin);
1588 AliMedium(10, "ALUMINUM$", 50, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1589 AliMedium(11, "GLASS", 32, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1590 AliMedium(12, "PCB_COPPER", 31, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1593 gMC->SetCerenkov(idtmed[1000], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1594 gMC->SetCerenkov(idtmed[1001], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1595 gMC->SetCerenkov(idtmed[1002], 26, ppckov, abscoQuarz, efficAll,rIndexQuarz);
1596 gMC->SetCerenkov(idtmed[1003], 26, ppckov, abscoFreon, efficAll,rIndexFreon);
1597 gMC->SetCerenkov(idtmed[1004], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1598 gMC->SetCerenkov(idtmed[1005], 26, ppckov, abscoCsI, efficCsI, rIndexMethane);
1599 gMC->SetCerenkov(idtmed[1006], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1600 gMC->SetCerenkov(idtmed[1007], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1601 gMC->SetCerenkov(idtmed[1008], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1602 gMC->SetCerenkov(idtmed[1009], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1603 gMC->SetCerenkov(idtmed[1010], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1606 //___________________________________________
1608 Float_t AliRICH::Fresnel(Float_t ene,Float_t pdoti, Bool_t pola)
1611 //ENE(EV), PDOTI=COS(INC.ANG.), PDOTR=COS(POL.PLANE ROT.ANG.)
1613 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,
1614 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,
1615 7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5};
1618 Float_t csin[36] = {2.14,2.21,2.33,2.48,2.76,2.97,2.99,2.59,2.81,3.05,
1619 2.86,2.53,2.55,2.66,2.79,2.96,3.18,3.05,2.84,2.81,2.38,2.11,
1620 2.01,2.13,2.39,2.73,3.08,3.15,2.95,2.73,2.56,2.41,2.12,1.95,
1623 Float_t csik[36] = {0.,0.,0.,0.,0.,0.196,0.408,0.208,0.118,0.49,0.784,0.543,
1624 0.424,0.404,0.371,0.514,0.922,1.102,1.139,1.376,1.461,1.253,0.878,
1625 0.69,0.612,0.649,0.824,1.347,1.571,1.678,1.763,1.857,1.824,1.824,
1628 Int_t j=Int_t(xe*10)-49;
1629 Float_t cn=csin[j]+((csin[j+1]-csin[j])/0.1)*(xe-en[j]);
1630 Float_t ck=csik[j]+((csik[j+1]-csik[j])/0.1)*(xe-en[j]);
1632 //FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
1633 //W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
1635 Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
1636 Float_t tanin=sinin/pdoti;
1638 Float_t c1=cn*cn-ck*ck-sinin*sinin;
1639 Float_t c2=4*cn*cn*ck*ck;
1640 Float_t aO=TMath::Sqrt(0.5*(TMath::Sqrt(c1*c1+c2)+c1));
1641 Float_t b2=0.5*(TMath::Sqrt(c1*c1+c2)-c1);
1643 Float_t rs=((aO-pdoti)*(aO-pdoti)+b2)/((aO+pdoti)*(aO+pdoti)+b2);
1644 Float_t rp=rs*((aO-sinin*tanin)*(aO-sinin*tanin)+b2)/((aO+sinin*tanin)*(aO+sinin*tanin)+b2);
1647 //CORRECTION FACTOR FOR SURFACE ROUGHNESS
1648 //B.J. STAGG APPLIED OPTICS, 30(1991),4113
1651 Float_t lamb=1240/ene;
1654 Float_t rO=TMath::Exp(-(4*TMath::Pi()*pdoti*sigraf/lamb)*(4*TMath::Pi()*pdoti*sigraf/lamb));
1658 Float_t pdotr=0.8; //DEGREE OF POLARIZATION : 1->P , -1->S
1659 fresn=0.5*(rp*(1+pdotr)+rs*(1-pdotr));
1668 //__________________________________________
1669 Float_t AliRICH::AbsoCH4(Float_t x)
1672 //KLOSCH,SCH4(9),WL(9),EM(9),ALENGTH(31)
1673 Float_t sch4[9] = {.12,.16,.23,.38,.86,2.8,7.9,28.,80.}; //MB X 10^22
1674 //Float_t wl[9] = {153.,152.,151.,150.,149.,148.,147.,146.,145};
1675 Float_t em[9] = {8.1,8.158,8.212,8.267,8.322,8.378,8.435,8.493,8.55};
1676 const Float_t kLosch=2.686763E19; // LOSCHMIDT NUMBER IN CM-3
1677 const Float_t kIgas1=100, kIgas2=0, kOxy=10., kWater=5., kPressure=750.,kTemperature=283.;
1678 Float_t pn=kPressure/760.;
1679 Float_t tn=kTemperature/273.16;
1682 // ------- METHANE CROSS SECTION -----------------
1683 // ASTROPH. J. 214, L47 (1978)
1689 if(x>=7.75 && x<=8.1)
1691 Float_t c0=-1.655279e-1;
1692 Float_t c1=6.307392e-2;
1693 Float_t c2=-8.011441e-3;
1694 Float_t c3=3.392126e-4;
1695 sm=(c0+c1*x+c2*x*x+c3*x*x*x)*1.e-18;
1701 while (x<=em[j] && x>=em[j+1])
1704 Float_t a=(sch4[j+1]-sch4[j])/(em[j+1]-em[j]);
1705 sm=(sch4[j]+a*(x-em[j]))*1e-22;
1709 Float_t dm=(kIgas1/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1710 Float_t abslm=1./sm/dm;
1712 // ------- ISOBUTHANE CROSS SECTION --------------
1713 // i-C4H10 (ai) abs. length from curves in
1714 // Lu-McDonald paper for BARI RICH workshop .
1715 // -----------------------------------------------------------
1724 if(x>=7.25 && x<7.375)
1730 Float_t si = 1./(ai*kLosch*273.16/293.); // ISOB. CRO.SEC.IN CM2
1731 Float_t di=(kIgas2/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1736 // ---------------------------------------------------------
1738 // transmission of O2
1740 // y= path in cm, x=energy in eV
1741 // so= cross section for UV absorption in cm2
1742 // do= O2 molecular density in cm-3
1743 // ---------------------------------------------------------
1751 so=3.392709e-13 * TMath::Exp(2.864104 *x);
1757 so=2.910039e-34 * TMath::Exp(10.3337*x);
1764 Float_t a0=-73770.76;
1765 Float_t a1=46190.69;
1766 Float_t a2=-11475.44;
1767 Float_t a3=1412.611;
1768 Float_t a4=-86.07027;
1769 Float_t a5=2.074234;
1770 so= a0+(a1*x)+(a2*x*x)+(a3*x*x*x)+(a4*x*x*x*x)+(a5*x*x*x*x*x);
1774 Float_t dox=(kOxy/1e6)*kLosch*pn/tn;
1779 // ---------------------------------------------------------
1781 // transmission of H2O
1783 // y= path in cm, x=energy in eV
1784 // sw= cross section for UV absorption in cm2
1785 // dw= H2O molecular density in cm-3
1786 // ---------------------------------------------------------
1790 Float_t b0=29231.65;
1791 Float_t b1=-15807.74;
1792 Float_t b2=3192.926;
1793 Float_t b3=-285.4809;
1794 Float_t b4=9.533944;
1798 Float_t sw= b0+(b1*x)+(b2*x*x)+(b3*x*x*x)+(b4*x*x*x*x);
1800 Float_t dw=(kWater/1e6)*kLosch*pn/tn;
1806 // ---------------------------------------------------------
1808 Float_t alength=1./(1./abslm+1./absli+1./abslo+1./abslw);
1814 //___________________________________________
1815 Int_t AliRICH::DistancetoPrimitive(Int_t , Int_t )
1823 //___________________________________________
1824 void AliRICH::MakeBranch(Option_t* option, char *file)
1826 // Create Tree branches for the RICH.
1828 const Int_t kBufferSize = 4000;
1829 char branchname[20];
1831 AliDetector::MakeBranch(option,file);
1833 const char *cH = strstr(option,"H");
1834 const char *cD = strstr(option,"D");
1835 const char *cR = strstr(option,"R");
1836 const char *cS = strstr(option,"S");
1840 sprintf(branchname,"%sCerenkov",GetName());
1841 if (fCerenkovs && gAlice->TreeH()) {
1842 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fCerenkovs, kBufferSize, file) ;
1843 gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fCerenkovs, kBufferSize, file) ;
1844 //branch->SetAutoDelete(kFALSE);
1846 sprintf(branchname,"%sSDigits",GetName());
1847 if (fSDigits && gAlice->TreeH()) {
1848 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fSDigits, kBufferSize, file) ;
1849 gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fSDigits, kBufferSize, file) ;
1850 //branch->SetAutoDelete(kFALSE);
1851 //printf("Making branch %sSDigits in TreeH\n",GetName());
1856 sprintf(branchname,"%sSDigits",GetName());
1857 if (fSDigits && gAlice->TreeS()) {
1858 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeS(),branchname, &fSDigits, kBufferSize, file) ;
1859 gAlice->MakeBranchInTree(gAlice->TreeS(),branchname, &fSDigits, kBufferSize, file) ;
1860 //branch->SetAutoDelete(kFALSE);
1861 //printf("Making branch %sSDigits in TreeS\n",GetName());
1867 // one branch for digits per chamber
1871 for (i=0; i<kNCH ;i++) {
1872 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1873 if (fDchambers && gAlice->TreeD()) {
1874 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeD(),branchname, &((*fDchambers)[i]), kBufferSize, file) ;
1875 gAlice->MakeBranchInTree(gAlice->TreeD(),branchname, &((*fDchambers)[i]), kBufferSize, file) ;
1876 //branch->SetAutoDelete(kFALSE);
1877 //printf("Making Branch %sDigits%d\n",GetName(),i+1);
1884 // one branch for raw clusters per chamber
1887 //printf("Called MakeBranch for TreeR\n");
1891 for (i=0; i<kNCH ;i++) {
1892 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1893 if (fRawClusters && gAlice->TreeR()) {
1894 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRawClusters)[i]), kBufferSize, file) ;
1895 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRawClusters)[i]), kBufferSize, file) ;
1896 //branch->SetAutoDelete(kFALSE);
1900 // one branch for rec hits per chamber
1902 for (i=0; i<kNCH ;i++) {
1903 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1904 if (fRecHits1D && gAlice->TreeR()) {
1905 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits1D)[i]), kBufferSize, file) ;
1906 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits1D)[i]), kBufferSize, file) ;
1907 //branch->SetAutoDelete(kFALSE);
1910 for (i=0; i<kNCH ;i++) {
1911 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1912 if (fRecHits3D && gAlice->TreeR()) {
1913 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits3D)[i]), kBufferSize, file) ;
1914 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits3D)[i]), kBufferSize, file) ;
1915 //branch->SetAutoDelete(kFALSE);
1921 //___________________________________________
1922 void AliRICH::SetTreeAddress()
1924 // Set branch address for the Hits and Digits Tree.
1925 char branchname[20];
1928 AliDetector::SetTreeAddress();
1931 TTree *treeH = gAlice->TreeH();
1932 TTree *treeD = gAlice->TreeD();
1933 TTree *treeR = gAlice->TreeR();
1934 TTree *treeS = gAlice->TreeS();
1938 branch = treeH->GetBranch("RICHCerenkov");
1939 if (branch) branch->SetAddress(&fCerenkovs);
1942 branch = treeH->GetBranch("RICHSDigits");
1945 branch->SetAddress(&fSDigits);
1946 //printf("Setting sdigits branch address at %p in TreeH\n",&fSDigits);
1953 branch = treeS->GetBranch("RICHSDigits");
1956 branch->SetAddress(&fSDigits);
1957 //printf("Setting sdigits branch address at %p in TreeS\n",&fSDigits);
1964 for (int i=0; i<kNCH; i++) {
1965 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1967 branch = treeD->GetBranch(branchname);
1968 if (branch) branch->SetAddress(&((*fDchambers)[i]));
1973 for (i=0; i<kNCH; i++) {
1974 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1976 branch = treeR->GetBranch(branchname);
1977 if (branch) branch->SetAddress(&((*fRawClusters)[i]));
1981 for (i=0; i<kNCH; i++) {
1982 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1984 branch = treeR->GetBranch(branchname);
1985 if (branch) branch->SetAddress(&((*fRecHits1D)[i]));
1989 for (i=0; i<kNCH; i++) {
1990 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1992 branch = treeR->GetBranch(branchname);
1993 if (branch) branch->SetAddress(&((*fRecHits3D)[i]));
1999 //___________________________________________
2000 void AliRICH::ResetHits()
2002 // Reset number of clusters and the cluster array for this detector
2003 AliDetector::ResetHits();
2006 if (fSDigits) fSDigits->Clear();
2007 if (fCerenkovs) fCerenkovs->Clear();
2011 //____________________________________________
2012 void AliRICH::ResetDigits()
2015 // Reset number of digits and the digits array for this detector
2017 for ( int i=0;i<kNCH;i++ ) {
2018 if (fDchambers && (*fDchambers)[i]) (*fDchambers)[i]->Clear();
2019 if (fNdch) fNdch[i]=0;
2023 //____________________________________________
2024 void AliRICH::ResetRawClusters()
2027 // Reset number of raw clusters and the raw clust array for this detector
2029 for ( int i=0;i<kNCH;i++ ) {
2030 if ((*fRawClusters)[i]) ((TClonesArray*)(*fRawClusters)[i])->Clear();
2031 if (fNrawch) fNrawch[i]=0;
2035 //____________________________________________
2036 void AliRICH::ResetRecHits1D()
2039 // Reset number of raw clusters and the raw clust array for this detector
2042 for ( int i=0;i<kNCH;i++ ) {
2043 if ((*fRecHits1D)[i]) ((TClonesArray*)(*fRecHits1D)[i])->Clear();
2044 if (fNrechits1D) fNrechits1D[i]=0;
2048 //____________________________________________
2049 void AliRICH::ResetRecHits3D()
2052 // Reset number of raw clusters and the raw clust array for this detector
2055 for ( int i=0;i<kNCH;i++ ) {
2056 if ((*fRecHits3D)[i]) ((TClonesArray*)(*fRecHits3D)[i])->Clear();
2057 if (fNrechits3D) fNrechits3D[i]=0;
2061 //___________________________________________
2062 void AliRICH::SetGeometryModel(Int_t id, AliRICHGeometry *geometry)
2066 // Setter for the RICH geometry model
2070 ((AliRICHChamber*) (*fChambers)[id])->GeometryModel(geometry);
2073 //___________________________________________
2074 void AliRICH::SetSegmentationModel(Int_t id, AliSegmentation *segmentation)
2078 // Setter for the RICH segmentation model
2081 ((AliRICHChamber*) (*fChambers)[id])->SetSegmentationModel(segmentation);
2084 //___________________________________________
2085 void AliRICH::SetResponseModel(Int_t id, AliRICHResponse *response)
2089 // Setter for the RICH response model
2092 ((AliRICHChamber*) (*fChambers)[id])->ResponseModel(response);
2095 void AliRICH::SetReconstructionModel(Int_t id, AliRICHClusterFinder *reconst)
2099 // Setter for the RICH reconstruction model (clusters)
2102 ((AliRICHChamber*) (*fChambers)[id])->SetReconstructionModel(reconst);
2105 //___________________________________________
2106 void AliRICH::StepManager()
2109 // Full Step Manager
2113 static Int_t vol[2];
2115 static Float_t hits[22];
2116 static Float_t ckovData[19];
2117 TLorentzVector position;
2118 TLorentzVector momentum;
2121 Float_t localPos[3];
2122 Float_t localMom[4];
2123 Float_t localTheta,localPhi;
2125 Float_t destep, step;
2128 Float_t coscerenkov;
2129 static Float_t eloss, xhit, yhit, tlength;
2130 const Float_t kBig=1.e10;
2132 TClonesArray &lhits = *fHits;
2133 TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->CurrentTrack()];
2135 //if (current->Energy()>1)
2138 // Only gas gap inside chamber
2139 // Tag chambers and record hits when track enters
2142 id=gMC->CurrentVolID(copy);
2143 Float_t cherenkovLoss=0;
2144 //gAlice->KeepTrack(gAlice->CurrentTrack());
2146 gMC->TrackPosition(position);
2150 //bzero((char *)ckovData,sizeof(ckovData)*19);
2151 ckovData[1] = pos[0]; // X-position for hit
2152 ckovData[2] = pos[1]; // Y-position for hit
2153 ckovData[3] = pos[2]; // Z-position for hit
2154 ckovData[6] = 0; // dummy track length
2155 //ckovData[11] = gAlice->CurrentTrack();
2157 //printf("\n+++++++++++\nTrack: %d\n++++++++++++\n",gAlice->CurrentTrack());
2159 //AliRICH *RICH = (AliRICH *) gAlice->GetDetector("RICH");
2161 /********************Store production parameters for Cerenkov photons************************/
2162 //is it a Cerenkov photon?
2163 if (gMC->TrackPid() == 50000050) {
2165 //if (gMC->VolId("GAP ")==gMC->CurrentVolID(copy))
2167 Float_t ckovEnergy = current->Energy();
2168 //energy interval for tracking
2169 if (ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 )
2170 //if (ckovEnergy > 0)
2172 if (gMC->IsTrackEntering()){ //is track entering?
2173 //printf("Track entered (1)\n");
2174 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2176 if (gMC->IsNewTrack()){ //is it the first step?
2177 //printf("I'm in!\n");
2178 Int_t mother = current->GetFirstMother();
2180 //printf("Second Mother:%d\n",current->GetSecondMother());
2182 ckovData[10] = mother;
2183 ckovData[11] = gAlice->CurrentTrack();
2184 ckovData[12] = 1; //Media where photon was produced 1->Freon, 2->Quarz
2185 //printf("Produced in FREO\n");
2188 //printf("Index: %d\n",fCkovNumber);
2189 } //first step question
2192 if (gMC->IsNewTrack()){ //is it first step?
2193 if (gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) //is it in quarz?
2196 //printf("Produced in QUAR\n");
2198 } //first step question
2200 //printf("Before %d\n",fFreonProd);
2201 } //track entering question
2203 if (ckovData[12] == 1) //was it produced in Freon?
2204 //if (fFreonProd == 1)
2206 if (gMC->IsTrackEntering()){ //is track entering?
2207 //printf("Track entered (2)\n");
2208 //printf("Current volume (should be META): %s\n",gMC->CurrentVolName());
2209 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("META"),gMC->CurrentVolID(copy));
2210 if (gMC->VolId("META")==gMC->CurrentVolID(copy)) //is it in gap?
2212 //printf("Got in META\n");
2213 gMC->TrackMomentum(momentum);
2218 // Z-position for hit
2221 /**************** Photons lost in second grid have to be calculated by hand************/
2223 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2224 Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi);
2226 //printf("grid calculation:%f\n",t);
2230 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2231 //printf("Added One (1)!\n");
2232 //printf("Lost one in grid\n");
2234 /**********************************************************************************/
2237 //printf("Current volume (should be CSI) (1): %s\n",gMC->CurrentVolName());
2238 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2239 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)) //is it in csi?
2241 //printf("Got in CSI\n");
2242 gMC->TrackMomentum(momentum);
2248 /********* Photons lost by Fresnel reflection have to be calculated by hand********/
2249 /***********************Cerenkov phtons (always polarised)*************************/
2251 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2252 Float_t t = Fresnel(ckovEnergy*1e9,cophi,1);
2257 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2258 //printf("Added One (2)!\n");
2259 //printf("Lost by Fresnel\n");
2261 /**********************************************************************************/
2266 /********************Evaluation of losses************************/
2267 /******************still in the old fashion**********************/
2270 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
2271 for (Int_t i = 0; i < i1; ++i) {
2273 if (procs[i] == kPLightReflection) { //was it reflected
2275 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2277 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2280 //AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2281 } //reflection question
2284 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
2285 //printf("Got in absorption\n");
2287 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2289 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2291 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
2293 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
2296 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
2300 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
2304 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2305 //printf("Added One (3)!\n");
2306 //printf("Added cerenkov %d\n",fCkovNumber);
2307 } //absorption question
2310 // Photon goes out of tracking scope
2311 else if (procs[i] == kPStop) { //is it below energy treshold?
2314 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2315 //printf("Added One (4)!\n");
2316 } // energy treshold question
2317 } //number of mechanisms cycle
2318 /**********************End of evaluation************************/
2319 } //freon production question
2320 } //energy interval question
2321 //}//inside the proximity gap question
2322 } //cerenkov photon question
2324 /**************************************End of Production Parameters Storing*********************/
2327 /*******************************Treat photons that hit the CsI (Ckovs and Feedbacks)************/
2329 if (gMC->TrackPid() == 50000050 || gMC->TrackPid() == 50000051) {
2330 //printf("Cerenkov\n");
2332 //if (gMC->TrackPid() == 50000051)
2333 //printf("Tracking a feedback\n");
2335 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy))
2337 //printf("Current volume (should be CSI) (2): %s\n",gMC->CurrentVolName());
2338 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2339 //printf("Got in CSI\n");
2340 //printf("Tracking a %d\n",gMC->TrackPid());
2341 if (gMC->Edep() > 0.){
2342 gMC->TrackPosition(position);
2343 gMC->TrackMomentum(momentum);
2351 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2352 Double_t rt = TMath::Sqrt(tc);
2353 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2354 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2355 gMC->Gmtod(pos,localPos,1);
2356 gMC->Gmtod(mom,localMom,2);
2358 gMC->CurrentVolOffID(2,copy);
2362 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2363 //->Sector(localPos[0], localPos[2]);
2364 //printf("Sector:%d\n",sector);
2366 /*if (gMC->TrackPid() == 50000051){
2368 printf("Feedbacks:%d\n",fFeedbacks);
2371 ((AliRICHChamber*) (*fChambers)[idvol])
2372 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2374 ckovData[0] = gMC->TrackPid(); // particle type
2375 ckovData[1] = pos[0]; // X-position for hit
2376 ckovData[2] = pos[1]; // Y-position for hit
2377 ckovData[3] = pos[2]; // Z-position for hit
2378 ckovData[4] = theta; // theta angle of incidence
2379 ckovData[5] = phi; // phi angle of incidence
2380 ckovData[8] = (Float_t) fNSDigits; // first sdigit
2381 ckovData[9] = -1; // last pad hit
2382 ckovData[13] = 4; // photon was detected
2383 ckovData[14] = mom[0];
2384 ckovData[15] = mom[1];
2385 ckovData[16] = mom[2];
2387 destep = gMC->Edep();
2388 gMC->SetMaxStep(kBig);
2389 cherenkovLoss += destep;
2390 ckovData[7]=cherenkovLoss;
2392 nPads = Hits2SDigits(localPos[0],localPos[2],cherenkovLoss,idvol,kCerenkov);
2394 if (fNSDigits > (Int_t)ckovData[8]) {
2395 ckovData[8]= ckovData[8]+1;
2396 ckovData[9]= (Float_t) fNSDigits;
2399 //printf("Cerenkov loss: %f\n", cherenkovLoss);
2401 ckovData[17] = nPads;
2402 //printf("nPads:%d",nPads);
2404 //TClonesArray *Hits = RICH->Hits();
2405 AliRICHHit *mipHit = (AliRICHHit*) (fHits->UncheckedAt(0));
2408 mom[0] = current->Px();
2409 mom[1] = current->Py();
2410 mom[2] = current->Pz();
2411 Float_t mipPx = mipHit->fMomX;
2412 Float_t mipPy = mipHit->fMomY;
2413 Float_t mipPz = mipHit->fMomZ;
2415 Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
2416 Float_t rt = TMath::Sqrt(r);
2417 Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz;
2418 Float_t mipRt = TMath::Sqrt(mipR);
2421 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
2427 Float_t cherenkov = TMath::ACos(coscerenkov);
2428 ckovData[18]=cherenkov;
2432 AddHit(gAlice->CurrentTrack(),vol,ckovData);
2433 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2434 //printf("Added One (5)!\n");
2441 /***********************************************End of photon hits*********************************************/
2444 /**********************************************Charged particles treatment*************************************/
2446 else if (gMC->TrackCharge())
2450 /*if (gMC->IsTrackEntering())
2452 hits[13]=20;//is track entering?
2454 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2456 gMC->TrackMomentum(momentum);
2467 if (gMC->VolId("GAP ")== gMC->CurrentVolID(copy)) {
2468 // Get current particle id (ipart), track position (pos) and momentum (mom)
2470 gMC->CurrentVolOffID(3,copy);
2474 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2475 //->Sector(localPos[0], localPos[2]);
2476 //printf("Sector:%d\n",sector);
2478 gMC->TrackPosition(position);
2479 gMC->TrackMomentum(momentum);
2487 gMC->Gmtod(pos,localPos,1);
2488 gMC->Gmtod(mom,localMom,2);
2490 ipart = gMC->TrackPid();
2492 // momentum loss and steplength in last step
2493 destep = gMC->Edep();
2494 step = gMC->TrackStep();
2497 // record hits when track enters ...
2498 if( gMC->IsTrackEntering()) {
2499 // gMC->SetMaxStep(fMaxStepGas);
2500 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2501 Double_t rt = TMath::Sqrt(tc);
2502 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2503 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2506 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
2507 Double_t localRt = TMath::Sqrt(localTc);
2508 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg;
2509 localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg;
2511 hits[0] = Float_t(ipart); // particle type
2512 hits[1] = localPos[0]; // X-position for hit
2513 hits[2] = localPos[1]; // Y-position for hit
2514 hits[3] = localPos[2]; // Z-position for hit
2515 hits[4] = localTheta; // theta angle of incidence
2516 hits[5] = localPhi; // phi angle of incidence
2517 hits[8] = (Float_t) fNSDigits; // first sdigit
2518 hits[9] = -1; // last pad hit
2519 hits[13] = fFreonProd; // did id hit the freon?
2523 hits[18] = 0; // dummy cerenkov angle
2529 Chamber(idvol).LocaltoGlobal(localPos,hits+1);
2532 //To make chamber coordinates x-y had to pass localPos[0], localPos[2]
2535 // Only if not trigger chamber
2538 // Initialize hit position (cursor) in the segmentation model
2539 ((AliRICHChamber*) (*fChambers)[idvol])
2540 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2545 // Calculate the charge induced on a pad (disintegration) in case
2547 // Mip left chamber ...
2548 if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){
2549 gMC->SetMaxStep(kBig);
2554 // Only if not trigger chamber
2558 if(gMC->TrackPid() == kNeutron)
2559 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2560 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2562 //printf("nPads:%d",nPads);
2568 if (fNSDigits > (Int_t)hits[8]) {
2570 hits[9]= (Float_t) fNSDigits;
2574 new(lhits[fNhits++]) AliRICHHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
2577 // Check additional signal generation conditions
2578 // defined by the segmentation
2579 // model (boundary crossing conditions)
2581 (((AliRICHChamber*) (*fChambers)[idvol])
2582 ->SigGenCond(localPos[0], localPos[2], localPos[1]))
2584 ((AliRICHChamber*) (*fChambers)[idvol])
2585 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2588 if(gMC->TrackPid() == kNeutron)
2589 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2590 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2592 //printf("Npads:%d",NPads);
2599 // nothing special happened, add up energy loss
2606 /*************************************************End of MIP treatment**************************************/
2610 void AliRICH::FindClusters(Int_t nev,Int_t lastEntry)
2614 // Loop on chambers and on cathode planes
2616 for (Int_t icat=1;icat<2;icat++) {
2617 gAlice->ResetDigits();
2618 gAlice->TreeD()->GetEvent(0);
2619 for (Int_t ich=0;ich<kNCH;ich++) {
2620 AliRICHChamber* iChamber=(AliRICHChamber*) (*fChambers)[ich];
2621 TClonesArray *pRICHdigits = this->DigitsAddress(ich);
2622 if (pRICHdigits == 0)
2625 // Get ready the current chamber stuff
2627 AliRICHResponse* response = iChamber->GetResponseModel();
2628 AliSegmentation* seg = iChamber->GetSegmentationModel();
2629 AliRICHClusterFinder* rec = iChamber->GetReconstructionModel();
2631 rec->SetSegmentation(seg);
2632 rec->SetResponse(response);
2633 rec->SetDigits(pRICHdigits);
2634 rec->SetChamber(ich);
2635 if (nev==0) rec->CalibrateCOG();
2636 rec->FindRawClusters();
2639 fRch=RawClustAddress(ich);
2643 gAlice->TreeR()->Fill();
2645 for (int i=0;i<kNCH;i++) {
2646 fRch=RawClustAddress(i);
2647 int nraw=fRch->GetEntriesFast();
2648 printf ("Chamber %d, raw clusters %d\n",i,nraw);
2656 sprintf(hname,"TreeR%d",nev);
2657 gAlice->TreeR()->Write(hname,kOverwrite,0);
2658 gAlice->TreeR()->Reset();
2660 //gObjectTable->Print();
2663 AliRICHSDigit* AliRICH::FirstPad(AliRICHHit* hit,TClonesArray *clusters )
2666 // Initialise the pad iterator
2667 // Return the address of the first sdigit for hit
2668 TClonesArray *theClusters = clusters;
2669 Int_t nclust = theClusters->GetEntriesFast();
2670 if (nclust && hit->fPHlast > 0) {
2671 sMaxIterPad=Int_t(hit->fPHlast);
2672 sCurIterPad=Int_t(hit->fPHfirst);
2673 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2680 AliRICHSDigit* AliRICH::NextPad(TClonesArray *clusters)
2683 // Iterates over pads
2686 if (sCurIterPad <= sMaxIterPad) {
2687 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2693 AliRICH& AliRICH::operator=(const AliRICH& rhs)
2695 // Assignment operator
2700 void AliRICH::DiagnosticsFE(Int_t evNumber1,Int_t evNumber2)
2703 Int_t NpadX = 162; // number of pads on X
2704 Int_t NpadY = 162; // number of pads on Y
2706 Int_t Pad[162][162];
2707 for (Int_t i=0;i<NpadX;i++) {
2708 for (Int_t j=0;j<NpadY;j++) {
2713 // Create some histograms
2715 TH1F *pionspectra1 = new TH1F("pionspectra1","Pion Spectra",200,-4,2);
2716 TH1F *pionspectra2 = new TH1F("pionspectra2","Pion Spectra",200,-4,2);
2717 TH1F *pionspectra3 = new TH1F("pionspectra3","Pion Spectra",200,-4,2);
2718 TH1F *protonspectra1 = new TH1F("protonspectra1","Proton Spectra",200,-4,2);
2719 TH1F *protonspectra2 = new TH1F("protonspectra2","Proton Spectra",200,-4,2);
2720 TH1F *protonspectra3 = new TH1F("protonspectra3","Proton Spectra",200,-4,2);
2721 TH1F *kaonspectra1 = new TH1F("kaonspectra1","Kaon Spectra",100,-4,2);
2722 TH1F *kaonspectra2 = new TH1F("kaonspectra2","Kaon Spectra",100,-4,2);
2723 TH1F *kaonspectra3 = new TH1F("kaonspectra3","Kaon Spectra",100,-4,2);
2724 TH1F *electronspectra1 = new TH1F("electronspectra1","Electron Spectra",100,-4,2);
2725 TH1F *electronspectra2 = new TH1F("electronspectra2","Electron Spectra",100,-4,2);
2726 TH1F *electronspectra3 = new TH1F("electronspectra3","Electron Spectra",100,-4,2);
2727 TH1F *muonspectra1 = new TH1F("muonspectra1","Muon Spectra",100,-4,2);
2728 TH1F *muonspectra2 = new TH1F("muonspectra2","Muon Spectra",100,-4,2);
2729 TH1F *muonspectra3 = new TH1F("muonspectra3","Muon Spectra",100,-4,2);
2730 TH1F *neutronspectra1 = new TH1F("neutronspectra1","Neutron Spectra",100,-4,2);
2731 TH1F *neutronspectra2 = new TH1F("neutronspectra2","Neutron Spectra",100,-4,2);
2732 TH1F *neutronspectra3 = new TH1F("neutronspectra2","Neutron Spectra",100,-4,2);
2733 TH1F *chargedspectra1 = new TH1F("chargedspectra1","Charged particles above 1 GeV Spectra",100,-1,3);
2734 TH1F *chargedspectra2 = new TH1F("chargedspectra2","Charged particles above 1 GeV Spectra",100,-1,3);
2735 TH1F *chargedspectra3 = new TH1F("chargedspectra2","Charged particles above 1 GeV Spectra",100,-1,3);
2736 TH1F *pionptspectrafinal = new TH1F("pionptspectrafinal","Primary Pions Transverse Momenta at HMPID",20,0,5);
2737 TH1F *pionptspectravertex = new TH1F("pionptspectravertex","Primary Pions Transverse Momenta at vertex",20,0,5);
2738 TH1F *kaonptspectrafinal = new TH1F("kaonptspectrafinal","Primary Kaons Transverse Momenta at HMPID",20,0,5);
2739 TH1F *kaonptspectravertex = new TH1F("kaonptspectravertex","Primary Kaons Transverse Momenta at vertex",20,0,5);
2740 //TH1F *hitsPhi = new TH1F("hitsPhi","Distribution of phi angle of incidence",100,-180,180);
2741 TH1F *hitsTheta = new TH1F("hitsTheta","Distribution of Theta angle of incidence, all tracks",100,0,50);
2742 TH1F *hitsTheta500MeV = new TH1F("hitsTheta500MeV","Distribution of Theta angle of incidence, 0.5-1 GeV primary tracks",100,0,50);
2743 TH1F *hitsTheta1GeV = new TH1F("hitsTheta1GeV","Distribution of Theta angle of incidence, 1-2 GeV primary tracks",100,0,50);
2744 TH1F *hitsTheta2GeV = new TH1F("hitsTheta2GeV","Distribution of Theta angle of incidence, 2-3 GeV primary tracks",100,0,50);
2745 TH1F *hitsTheta3GeV = new TH1F("hitsTheta3GeV","Distribution of Theta angle of incidence, >3 GeV primary tracks",100,0,50);
2746 TH2F *production = new TH2F("production","Mother production vertices",100,-300,300,100,0,600);
2751 // Start loop over events
2753 Int_t pion=0, kaon=0, proton=0, electron=0, positron=0, neutron=0, highneutrons=0, muon=0;
2754 Int_t chargedpions=0,primarypions=0,highprimarypions=0,chargedkaons=0,primarykaons=0,highprimarykaons=0;
2755 Int_t photons=0, primaryphotons=0, highprimaryphotons=0;
2758 for (int nev=0; nev<= evNumber2; nev++) {
2759 Int_t nparticles = gAlice->GetEvent(nev);
2762 printf ("Event number : %d\n",nev);
2763 printf ("Number of particles: %d\n",nparticles);
2764 if (nev < evNumber1) continue;
2765 if (nparticles <= 0) return;
2767 // Get pointers to RICH detector and Hits containers
2769 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
2771 TTree *treeH = gAlice->TreeH();
2772 Int_t ntracks =(Int_t) treeH->GetEntries();
2774 // Start loop on tracks in the hits containers
2776 for (Int_t track=0; track<ntracks;track++) {
2777 printf ("Processing Track: %d\n",track);
2778 gAlice->ResetHits();
2779 treeH->GetEvent(track);
2781 for(AliRICHHit* mHit=(AliRICHHit*)pRICH->FirstHit(-1);
2783 mHit=(AliRICHHit*)pRICH->NextHit())
2785 //Int_t nch = mHit->fChamber; // chamber number
2786 //Float_t x = mHit->X(); // x-pos of hit
2787 //Float_t y = mHit->Z(); // y-pos
2788 //Float_t z = mHit->Y();
2789 //Float_t phi = mHit->fPhi; //Phi angle of incidence
2790 Float_t theta = mHit->fTheta; //Theta angle of incidence
2791 Float_t px = mHit->MomX();
2792 Float_t py = mHit->MomY();
2793 Int_t index = mHit->Track();
2794 Int_t particle = (Int_t)(mHit->fParticle);
2799 TParticle *current = gAlice->Particle(index);
2801 //Float_t energy=current->Energy();
2803 R=TMath::Sqrt(current->Vx()*current->Vx() + current->Vy()*current->Vy());
2804 PTfinal=TMath::Sqrt(px*px + py*py);
2805 PTvertex=TMath::Sqrt(current->Px()*current->Px() + current->Py()*current->Py());
2809 if (TMath::Abs(particle) < 10000000)
2811 hitsTheta->Fill(theta,(float) 1);
2814 if (PTvertex>.5 && PTvertex<=1)
2816 hitsTheta500MeV->Fill(theta,(float) 1);
2818 if (PTvertex>1 && PTvertex<=2)
2820 hitsTheta1GeV->Fill(theta,(float) 1);
2822 if (PTvertex>2 && PTvertex<=3)
2824 hitsTheta2GeV->Fill(theta,(float) 1);
2828 hitsTheta3GeV->Fill(theta,(float) 1);
2837 //printf("Particle type: %d\n",current->GetPdgCode());
2838 if (TMath::Abs(particle) < 50000051)
2840 //if (TMath::Abs(particle) == 50000050 || TMath::Abs(particle) == 2112)
2841 if (TMath::Abs(particle) == 2112 || TMath::Abs(particle) == 50000050)
2843 //gMC->Rndm(&random, 1);
2844 if (random->Rndm() < .1)
2845 production->Fill(current->Vz(),R,(float) 1);
2846 if (TMath::Abs(particle) == 50000050)
2847 //if (TMath::Abs(particle) > 50000000)
2853 if (current->Energy()>0.001)
2854 highprimaryphotons +=1;
2857 if (TMath::Abs(particle) == 2112)
2860 if (current->Energy()>0.0001)
2864 if (TMath::Abs(particle) < 50000000)
2866 production->Fill(current->Vz(),R,(float) 1);
2867 //printf("Adding %d at %f\n",particle,R);
2869 //mip->Fill(x,y,(float) 1);
2872 if (TMath::Abs(particle)==211 || TMath::Abs(particle)==111)
2876 pionptspectravertex->Fill(PTvertex,(float) 1);
2877 pionptspectrafinal->Fill(PTfinal,(float) 1);
2881 if (TMath::Abs(particle)==321 || TMath::Abs(particle)==130 || TMath::Abs(particle)==310
2882 || TMath::Abs(particle)==311)
2886 kaonptspectravertex->Fill(PTvertex,(float) 1);
2887 kaonptspectrafinal->Fill(PTfinal,(float) 1);
2892 if (TMath::Abs(particle)==211 || TMath::Abs(particle)==111)
2894 pionspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2895 //printf ("fParticle: %d, PDG code:%d\n",particle,current->GetPdgCode());
2896 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2897 pionspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2900 pionspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2901 //printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\R:%f\n\n\n\n\n\n\n\n\n",R);
2903 //printf("Pion mass: %e\n",current->GetCalcMass());
2905 if (TMath::Abs(particle)==211)
2911 if (current->Energy()>1)
2912 highprimarypions +=1;
2916 if (TMath::Abs(particle)==2212)
2918 protonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2919 //ptspectra->Fill(Pt,(float) 1);
2920 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2921 protonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2923 protonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2924 //printf("\n\n\n\n\n\n\nProton mass: %e\n\n\n\n\n\n\n\n\n",current->GetCalcMass());
2927 if (TMath::Abs(particle)==321 || TMath::Abs(particle)==130 || TMath::Abs(particle)==310
2928 || TMath::Abs(particle)==311)
2930 kaonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2931 //ptspectra->Fill(Pt,(float) 1);
2932 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2933 kaonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2935 kaonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2936 //printf("Kaon mass: %e\n",current->GetCalcMass());
2938 if (TMath::Abs(particle)==321)
2944 if (current->Energy()>1)
2945 highprimarykaons +=1;
2949 if (TMath::Abs(particle)==11)
2951 electronspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2952 //ptspectra->Fill(Pt,(float) 1);
2953 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2954 electronspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2956 electronspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2957 //printf("Electron mass: %e\n",current->GetCalcMass());
2960 if (particle == -11)
2963 if (TMath::Abs(particle)==13)
2965 muonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2966 //ptspectra->Fill(Pt,(float) 1);
2967 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2968 muonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2970 muonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2971 //printf("Muon mass: %e\n",current->GetCalcMass());
2974 if (TMath::Abs(particle)==2112)
2976 neutronspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2977 //ptspectra->Fill(Pt,(float) 1);
2978 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2979 neutronspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2982 neutronspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2983 //printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\R:%f\n\n\n\n\n\n\n\n\n",R);
2985 //printf("Neutron mass: %e\n",current->GetCalcMass());
2988 if(TMath::Abs(particle)==211 || TMath::Abs(particle)==2212 || TMath::Abs(particle)==321)
2990 if (current->Energy()-current->GetCalcMass()>1)
2992 chargedspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2993 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2994 chargedspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2996 chargedspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2999 //printf("Hits:%d\n",hit);
3000 //printf ("Chamber number:%d x:%f y:%f\n",nch,x,y);
3001 // Fill the histograms
3003 //h->Fill(x,y,(float) 1);
3013 //Create canvases, set the view range, show histograms
3015 TCanvas *c2 = new TCanvas("c2","Angles of incidence",150,150,100,150);
3017 //c2->SetFillColor(42);
3020 hitsTheta500MeV->SetFillColor(5);
3021 hitsTheta500MeV->Draw();
3023 hitsTheta1GeV->SetFillColor(5);
3024 hitsTheta1GeV->Draw();
3026 hitsTheta2GeV->SetFillColor(5);
3027 hitsTheta2GeV->Draw();
3029 hitsTheta3GeV->SetFillColor(5);
3030 hitsTheta3GeV->Draw();
3034 TCanvas *c15 = new TCanvas("c15","Mothers Production Vertices",50,50,600,600);
3036 production->SetFillColor(42);
3037 production->SetXTitle("z (m)");
3038 production->SetYTitle("R (m)");
3041 TCanvas *c10 = new TCanvas("c10","Pt Spectra",50,50,600,700);
3044 pionptspectravertex->SetFillColor(5);
3045 pionptspectravertex->SetXTitle("Pt (GeV)");
3046 pionptspectravertex->Draw();
3048 pionptspectrafinal->SetFillColor(5);
3049 pionptspectrafinal->SetXTitle("Pt (GeV)");
3050 pionptspectrafinal->Draw();
3052 kaonptspectravertex->SetFillColor(5);
3053 kaonptspectravertex->SetXTitle("Pt (GeV)");
3054 kaonptspectravertex->Draw();
3056 kaonptspectrafinal->SetFillColor(5);
3057 kaonptspectrafinal->SetXTitle("Pt (GeV)");
3058 kaonptspectrafinal->Draw();
3061 TCanvas *c16 = new TCanvas("c16","Particles Spectra II",150,150,600,350);
3065 //TCanvas *c13 = new TCanvas("c13","Electron Spectra",400,10,600,700);
3066 electronspectra1->SetFillColor(5);
3067 electronspectra1->SetXTitle("log(GeV)");
3068 electronspectra2->SetFillColor(46);
3069 electronspectra2->SetXTitle("log(GeV)");
3070 electronspectra3->SetFillColor(10);
3071 electronspectra3->SetXTitle("log(GeV)");
3073 electronspectra1->Draw();
3074 electronspectra2->Draw("same");
3075 electronspectra3->Draw("same");
3078 //TCanvas *c14 = new TCanvas("c14","Muon Spectra",400,10,600,700);
3079 muonspectra1->SetFillColor(5);
3080 muonspectra1->SetXTitle("log(GeV)");
3081 muonspectra2->SetFillColor(46);
3082 muonspectra2->SetXTitle("log(GeV)");
3083 muonspectra3->SetFillColor(10);
3084 muonspectra3->SetXTitle("log(GeV)");
3086 muonspectra1->Draw();
3087 muonspectra2->Draw("same");
3088 muonspectra3->Draw("same");
3091 //TCanvas *c16 = new TCanvas("c16","Neutron Spectra",400,10,600,700);
3092 //neutronspectra1->SetFillColor(42);
3093 //neutronspectra1->SetXTitle("log(GeV)");
3094 //neutronspectra2->SetFillColor(46);
3095 //neutronspectra2->SetXTitle("log(GeV)");
3096 //neutronspectra3->SetFillColor(10);
3097 //neutronspectra3->SetXTitle("log(GeV)");
3099 //neutronspectra1->Draw();
3100 //neutronspectra2->Draw("same");
3101 //neutronspectra3->Draw("same");
3103 TCanvas *c9 = new TCanvas("c9","Particles Spectra",150,150,600,700);
3104 //TCanvas *c9 = new TCanvas("c9","Pion Spectra",400,10,600,700);
3108 pionspectra1->SetFillColor(5);
3109 pionspectra1->SetXTitle("log(GeV)");
3110 pionspectra2->SetFillColor(46);
3111 pionspectra2->SetXTitle("log(GeV)");
3112 pionspectra3->SetFillColor(10);
3113 pionspectra3->SetXTitle("log(GeV)");
3115 pionspectra1->Draw();
3116 pionspectra2->Draw("same");
3117 pionspectra3->Draw("same");
3120 //TCanvas *c10 = new TCanvas("c10","Proton Spectra",400,10,600,700);
3121 protonspectra1->SetFillColor(5);
3122 protonspectra1->SetXTitle("log(GeV)");
3123 protonspectra2->SetFillColor(46);
3124 protonspectra2->SetXTitle("log(GeV)");
3125 protonspectra3->SetFillColor(10);
3126 protonspectra3->SetXTitle("log(GeV)");
3128 protonspectra1->Draw();
3129 protonspectra2->Draw("same");
3130 protonspectra3->Draw("same");
3133 //TCanvas *c11 = new TCanvas("c11","Kaon Spectra",400,10,600,700);
3134 kaonspectra1->SetFillColor(5);
3135 kaonspectra1->SetXTitle("log(GeV)");
3136 kaonspectra2->SetFillColor(46);
3137 kaonspectra2->SetXTitle("log(GeV)");
3138 kaonspectra3->SetFillColor(10);
3139 kaonspectra3->SetXTitle("log(GeV)");
3141 kaonspectra1->Draw();
3142 kaonspectra2->Draw("same");
3143 kaonspectra3->Draw("same");
3146 //TCanvas *c12 = new TCanvas("c12","Charged Particles Spectra",400,10,600,700);
3147 chargedspectra1->SetFillColor(5);
3148 chargedspectra1->SetXTitle("log(GeV)");
3149 chargedspectra2->SetFillColor(46);
3150 chargedspectra2->SetXTitle("log(GeV)");
3151 chargedspectra3->SetFillColor(10);
3152 chargedspectra3->SetXTitle("log(GeV)");
3154 chargedspectra1->Draw();
3155 chargedspectra2->Draw("same");
3156 chargedspectra3->Draw("same");
3160 printf("*****************************************\n");
3161 printf("* Particle * Counts *\n");
3162 printf("*****************************************\n");
3164 printf("* Pions: * %4d *\n",pion);
3165 printf("* Charged Pions: * %4d *\n",chargedpions);
3166 printf("* Primary Pions: * %4d *\n",primarypions);
3167 printf("* Primary Pions (p>1GeV/c): * %4d *\n",highprimarypions);
3168 printf("* Kaons: * %4d *\n",kaon);
3169 printf("* Charged Kaons: * %4d *\n",chargedkaons);
3170 printf("* Primary Kaons: * %4d *\n",primarykaons);
3171 printf("* Primary Kaons (p>1GeV/c): * %4d *\n",highprimarykaons);
3172 printf("* Muons: * %4d *\n",muon);
3173 printf("* Electrons: * %4d *\n",electron);
3174 printf("* Positrons: * %4d *\n",positron);
3175 printf("* Protons: * %4d *\n",proton);
3176 printf("* All Charged: * %4d *\n",(chargedpions+chargedkaons+muon+electron+positron+proton));
3177 printf("*****************************************\n");
3178 //printf("* Photons: * %3.1f *\n",photons);
3179 //printf("* Primary Photons: * %3.1f *\n",primaryphotons);
3180 //printf("* Primary Photons (p>1MeV/c):* %3.1f *\n",highprimaryphotons);
3181 //printf("*****************************************\n");
3182 //printf("* Neutrons: * %3.1f *\n",neutron);
3183 //printf("* Neutrons (p>100keV/c): * %3.1f *\n",highneutrons);
3184 //printf("*****************************************\n");
3186 if (gAlice->TreeD())
3188 gAlice->TreeD()->GetEvent(0);
3193 printf("\n*****************************************\n");
3194 printf("* Chamber * Digits * Occupancy *\n");
3195 printf("*****************************************\n");
3197 for (Int_t ich=0;ich<7;ich++)
3199 TClonesArray *Digits = DigitsAddress(ich); // Raw clusters branch
3200 Int_t ndigits = Digits->GetEntriesFast();
3201 occ[ich] = Float_t(ndigits)/(160*144);
3202 sum += Float_t(ndigits)/(160*144);
3203 printf("* %d * %d * %3.1f%% *\n",ich,ndigits,occ[ich]*100);
3206 printf("*****************************************\n");
3207 printf("* Mean occupancy * %3.1f%% *\n",mean*100);
3208 printf("*****************************************\n");
3211 printf("\nEnd of analysis\n");
3215 //_________________________________________________________________________________________________
3218 void AliRICH::DiagnosticsSE(Int_t diaglevel,Int_t evNumber1,Int_t evNumber2)
3221 AliRICH *pRICH = (AliRICH*)gAlice->GetDetector("RICH");
3222 AliRICHSegmentationV0* segmentation;
3223 AliRICHChamber* chamber;
3225 chamber = &(pRICH->Chamber(0));
3226 segmentation=(AliRICHSegmentationV0*) chamber->GetSegmentationModel(0);
3228 Int_t NpadX = segmentation->Npx(); // number of pads on X
3229 Int_t NpadY = segmentation->Npy(); // number of pads on Y
3231 //Int_t Pad[144][160];
3232 /*for (Int_t i=0;i<NpadX;i++) {
3233 for (Int_t j=0;j<NpadY;j++) {
3239 Int_t xmin= -NpadX/2;
3240 Int_t xmax= NpadX/2;
3241 Int_t ymin= -NpadY/2;
3242 Int_t ymax= NpadY/2;
3251 TH2F *hc0 = new TH2F("hc0","Zoom on center of central chamber",150,-30,30,150,-50,10);
3255 printf("Single Ring Hits\n");
3256 feedback = new TH2F("feedback","Feedback hit distribution",150,-30,30,150,-50,10);
3257 mip = new TH2F("mip","Mip hit distribution",150,-30,30,150,-50,10);
3258 cerenkov = new TH2F("cerenkov","Cerenkov hit distribution",150,-30,30,150,-50,10);
3259 h = new TH2F("h","Detector hit distribution",150,-30,30,150,-50,10);
3260 hitsX = new TH1F("hitsX","Distribution of hits along x-axis",150,-30,30);
3261 hitsY = new TH1F("hitsY","Distribution of hits along z-axis",150,-50,10);
3265 printf("Full Event Hits\n");
3267 feedback = new TH2F("feedback","Feedback hit distribution",150,-300,300,150,-300,300);
3268 mip = new TH2F("mip","Mip hit distribution",150,-300,300,150,-300,300);
3269 cerenkov = new TH2F("cerenkov","Cerenkov hit distribution",150,-300,300,150,-300,300);
3270 h = new TH2F("h","Detector hit distribution",150,-300,300,150,-300,300);
3271 hitsX = new TH1F("digitsX","Distribution of hits along x-axis",200,-300,300);
3272 hitsY = new TH1F("digitsY","Distribution of hits along z-axis",200,-300,300);
3277 TH2F *hc1 = new TH2F("hc1","Chamber 1 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3278 TH2F *hc2 = new TH2F("hc2","Chamber 2 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3279 TH2F *hc3 = new TH2F("hc3","Chamber 3 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3280 TH2F *hc4 = new TH2F("hc4","Chamber 4 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3281 TH2F *hc5 = new TH2F("hc5","Chamber 5 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3282 TH2F *hc6 = new TH2F("hc6","Chamber 6 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3283 TH2F *hc7 = new TH2F("hc7","Chamber 7 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3285 TH1F *Clcharge = new TH1F("Clcharge","Cluster Charge Distribution",500,0.,500.);
3286 TH1F *ckovangle = new TH1F("ckovangle","Cerenkov angle per photon",200,.3,1);
3287 TH1F *hckphi = new TH1F("hckphi","Cerenkov phi angle per photon",620,-3.1,3.1);
3288 TH1F *mother = new TH1F("mother","Cerenkovs per Mip",75,0.,75.);
3289 TH1F *radius = new TH1F("radius","Mean distance to Mip",100,0.,20.);
3290 TH1F *phspectra1 = new TH1F("phspectra1","Detected Photon Spectra",200,5.,10.);
3291 TH1F *phspectra2 = new TH1F("phspectra2","Produced Photon Spectra",200,5.,10.);
3292 TH1F *totalphotonstrack = new TH1F("totalphotonstrack","Produced Photons per Mip",100,200,700.);
3293 TH1F *totalphotonsevent = new TH1F("totalphotonsevent","Produced Photons per Mip",100,200,700.);
3294 //TH1F *feedbacks = new TH1F("feedbacks","Produced Feedbacks per Mip",50,0.5,50.);
3295 TH1F *padnumber = new TH1F("padnumber","Number of pads per cluster",50,-0.5,50.);
3296 TH1F *padsev = new TH1F("padsev","Number of pads hit per MIP",50,0.5,100.);
3297 TH1F *clusev = new TH1F("clusev","Number of clusters per MIP",50,0.5,50.);
3298 TH1F *photev = new TH1F("photev","Number of detected photons per MIP",50,0.5,50.);
3299 TH1F *feedev = new TH1F("feedev","Number of feedbacks per MIP",50,0.5,50.);
3300 TH1F *padsmip = new TH1F("padsmip","Number of pads per event inside MIP region",50,0.5,50.);
3301 TH1F *padscl = new TH1F("padscl","Number of pads per event from cluster count",50,0.5,100.);
3302 TH1F *pionspectra = new TH1F("pionspectra","Pion Spectra",200,.5,10.);
3303 TH1F *protonspectra = new TH1F("protonspectra","Proton Spectra",200,.5,10.);
3304 TH1F *kaonspectra = new TH1F("kaonspectra","Kaon Spectra",100,.5,10.);
3305 TH1F *chargedspectra = new TH1F("chargedspectra","Charged particles above 1 GeV Spectra",100,.5,10.);
3306 TH1F *hitsPhi = new TH1F("hitsPhi","Distribution of phi angle of incidence",100,0,360);
3307 TH1F *hitsTheta = new TH1F("hitsTheta","Distribution of Theta angle of incidence",100,0,15);
3308 TH1F *Omega1D = new TH1F("omega","Reconstructed Cerenkov angle per track",200,.5,1);
3309 TH1F *Theta = new TH1F("theta","Reconstructed theta incidence angle per track",200,0,15);
3310 TH1F *Phi = new TH1F("phi","Reconstructed phi incidence per track",200,0,360);
3311 TH1F *Omega3D = new TH1F("omega","Reconstructed Cerenkov angle per track",200,.3,1);
3312 TH1F *PhotonCer = new TH1F("photoncer","Reconstructed Cerenkov angle per photon",200,.3,1);
3313 TH2F *PadsUsed = new TH2F("padsused","Pads Used for Reconstruction",100,-30,30,100,-30,30);
3314 TH1F *MeanRadius = new TH1F("radius","Mean Radius for reconstructed track",100,0.,20.);
3316 // Start loop over events
3321 Int_t mothers[80000];
3322 Int_t mothers2[80000];
3330 for (Int_t i=0;i<100;i++) mothers[i]=0;
3332 for (int nev=0; nev<= evNumber2; nev++) {
3333 Int_t nparticles = gAlice->GetEvent(nev);
3336 //cout<<"nev "<<nev<<endl;