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.48 2001/03/15 10:35:00 jbarbosa
19 Corrected bug in MakeBranch (was using a different version of STEER)
21 Revision 1.47 2001/03/14 18:13:56 jbarbosa
22 Several changes to adapt to new IO.
23 Removed digitising function, using AliRICHMerger::Digitise from now on.
25 Revision 1.46 2001/03/12 17:46:33 hristov
26 Changes needed on Sun with CC 5.0
28 Revision 1.45 2001/02/27 22:11:46 jbarbosa
29 Testing TreeS, removing of output.
31 Revision 1.44 2001/02/27 15:19:12 jbarbosa
32 Transition to SDigits.
34 Revision 1.43 2001/02/23 17:19:06 jbarbosa
35 Corrected photocathode definition in BuildGeometry().
37 Revision 1.42 2001/02/13 20:07:23 jbarbosa
38 Parametrised definition of photcathode dimensions. New spacers. New data members in AliRICHHit to store particle momentum
39 when entering the freon. Corrected calls to particle stack.
41 Revision 1.41 2001/01/26 20:00:20 hristov
42 Major upgrade of AliRoot code
44 Revision 1.40 2001/01/24 20:58:03 jbarbosa
45 Enhanced BuildGeometry. Now the photocathodes are drawn.
47 Revision 1.39 2001/01/22 21:40:24 jbarbosa
48 Removing magic numbers
50 Revision 1.37 2000/12/20 14:07:25 jbarbosa
51 Removed dependencies on TGeant3 (thanks to F. Carminati and I. Hrivnacova)
53 Revision 1.36 2000/12/18 17:45:54 jbarbosa
54 Cleaned up PadHits object.
56 Revision 1.35 2000/12/15 16:49:40 jbarbosa
57 Geometry and materials updates (wire supports, pcbs, backplane supports, frame).
59 Revision 1.34 2000/11/10 18:12:12 jbarbosa
60 Bug fix for AliRICHCerenkov (thanks to P. Hristov)
62 Revision 1.33 2000/11/02 10:09:01 jbarbosa
63 Minor bug correction (some pointers were not initialised in the default constructor)
65 Revision 1.32 2000/11/01 15:32:55 jbarbosa
66 Updated to handle both reconstruction algorithms.
68 Revision 1.31 2000/10/26 20:18:33 jbarbosa
69 Supports for methane and freon vessels
71 Revision 1.30 2000/10/24 13:19:12 jbarbosa
74 Revision 1.29 2000/10/19 19:39:25 jbarbosa
75 Some more changes to geometry. Further correction of digitisation "per part. type"
77 Revision 1.28 2000/10/17 20:50:57 jbarbosa
78 Inversed digtise by particle type (now, only the selected particle type is not digitsed).
79 Corrected several geometry minor bugs.
80 Added new parameter (opaque quartz thickness).
82 Revision 1.27 2000/10/11 10:33:55 jbarbosa
83 Corrected bug introduced by earlier revisions (CerenkovData array cannot be reset to zero on wach call of StepManager)
85 Revision 1.26 2000/10/03 21:44:08 morsch
86 Use AliSegmentation and AliHit abstract base classes.
88 Revision 1.25 2000/10/02 21:28:12 fca
89 Removal of useless dependecies via forward declarations
91 Revision 1.24 2000/10/02 15:43:17 jbarbosa
92 Fixed forward declarations.
93 Fixed honeycomb density.
94 Fixed cerenkov storing.
97 Revision 1.23 2000/09/13 10:42:14 hristov
98 Minor corrections for HP, DEC and Sun; strings.h included
100 Revision 1.22 2000/09/12 18:11:13 fca
101 zero hits area before using
103 Revision 1.21 2000/07/21 10:21:07 morsch
104 fNrawch = 0; and fNrechits = 0; in the default constructor.
106 Revision 1.20 2000/07/10 15:28:39 fca
107 Correction of the inheritance scheme
109 Revision 1.19 2000/06/30 16:29:51 dibari
110 Added kDebugLevel variable to control output size on demand
112 Revision 1.18 2000/06/12 15:15:46 jbarbosa
115 Revision 1.17 2000/06/09 14:58:37 jbarbosa
116 New digitisation per particle type
118 Revision 1.16 2000/04/19 12:55:43 morsch
119 Newly structured and updated version (JB, AM)
124 ////////////////////////////////////////////////
125 // Manager and hits classes for set:RICH //
126 ////////////////////////////////////////////////
134 #include <TObjArray.h>
137 #include <TParticle.h>
138 #include <TGeometry.h>
146 #include <iostream.h>
150 #include "AliSegmentation.h"
151 #include "AliRICHSegmentationV0.h"
152 #include "AliRICHHit.h"
153 #include "AliRICHCerenkov.h"
154 #include "AliRICHSDigit.h"
155 #include "AliRICHDigit.h"
156 #include "AliRICHTransientDigit.h"
157 #include "AliRICHRawCluster.h"
158 #include "AliRICHRecHit1D.h"
159 #include "AliRICHRecHit3D.h"
160 #include "AliRICHHitMapA1.h"
161 #include "AliRICHClusterFinder.h"
162 #include "AliRICHMerger.h"
166 #include "AliConst.h"
168 #include "AliPoints.h"
169 #include "AliCallf77.h"
172 // Static variables for the pad-hit iterator routines
173 static Int_t sMaxIterPad=0;
174 static Int_t sCurIterPad=0;
178 //___________________________________________
181 // Default constructor for RICH manager class
194 for (Int_t i=0; i<7; i++)
205 //___________________________________________
206 AliRICH::AliRICH(const char *name, const char *title)
207 : AliDetector(name,title)
211 <img src="gif/alirich.gif">
215 fHits = new TClonesArray("AliRICHHit",1000 );
216 gAlice->AddHitList(fHits);
217 fSDigits = new TClonesArray("AliRICHSDigit",100000);
218 fCerenkovs = new TClonesArray("AliRICHCerenkov",1000);
219 gAlice->AddHitList(fCerenkovs);
220 //gAlice->AddHitList(fHits);
225 //fNdch = new Int_t[kNCH];
227 fDchambers = new TObjArray(kNCH);
229 fRecHits1D = new TObjArray(kNCH);
230 fRecHits3D = new TObjArray(kNCH);
234 for (i=0; i<kNCH ;i++) {
235 (*fDchambers)[i] = new TClonesArray("AliRICHDigit",10000);
239 //fNrawch = new Int_t[kNCH];
241 fRawClusters = new TObjArray(kNCH);
242 //printf("Created fRwClusters with adress:%p",fRawClusters);
244 for (i=0; i<kNCH ;i++) {
245 (*fRawClusters)[i] = new TClonesArray("AliRICHRawCluster",10000);
249 //fNrechits = new Int_t[kNCH];
251 for (i=0; i<kNCH ;i++) {
252 (*fRecHits1D)[i] = new TClonesArray("AliRICHRecHit1D",1000);
254 for (i=0; i<kNCH ;i++) {
255 (*fRecHits3D)[i] = new TClonesArray("AliRICHRecHit3D",1000);
257 //printf("Created fRecHits with adress:%p",fRecHits);
260 SetMarkerColor(kRed);
262 /*fChambers = new TObjArray(kNCH);
263 for (i=0; i<kNCH; i++)
264 (*fChambers)[i] = new AliRICHChamber();*/
269 AliRICH::AliRICH(const AliRICH& RICH)
275 //___________________________________________
279 // Destructor of RICH manager class
286 //PH Delete TObjArrays
292 fDchambers->Delete();
296 fRawClusters->Delete();
300 fRecHits1D->Delete();
304 fRecHits3D->Delete();
311 //_____________________________________________________________________________
312 Int_t AliRICH::Hits2SDigits(Float_t xhit,Float_t yhit,Float_t eloss, Int_t idvol, ResponseType res)
315 // Calls the charge disintegration method of the current chamber and adds
316 // the simulated cluster to the root treee
319 Float_t newclust[4][500];
323 // Integrated pulse height on chamber
327 ((AliRICHChamber*) (*fChambers)[idvol])->DisIntegration(eloss, xhit, yhit, nnew, newclust, res);
332 for (Int_t i=0; i<nnew; i++) {
333 if (Int_t(newclust[0][i]) > 0) {
336 clhits[1] = Int_t(newclust[0][i]);
338 clhits[2] = Int_t(newclust[1][i]);
340 clhits[3] = Int_t(newclust[2][i]);
341 // Pad: chamber sector
342 clhits[4] = Int_t(newclust[3][i]);
344 //printf(" %d %d %d %d %d\n", clhits[0], clhits[1], clhits[2], clhits[3], clhits[4]);
352 gAlice->TreeS()->Fill();
353 gAlice->TreeS()->Write(0,TObject::kOverwrite);
354 //printf("Filled SDigits...\n");
359 //___________________________________________
360 void AliRICH::Hits2SDigits()
363 // Dummy: sdigits are created during transport.
364 // Called from alirun.
366 int nparticles = gAlice->GetNtrack();
367 cout << "Particles (RICH):" <<nparticles<<endl;
368 if (nparticles > 0) printf("SDigits were already generated.\n");
372 //___________________________________________
373 void AliRICH::SDigits2Digits(Int_t nev, Int_t flag)
378 // Called from macro. Multiple events, more functionality.
380 AliRICHChamber* iChamber;
382 printf("Generating tresholds...\n");
384 for(Int_t i=0;i<7;i++) {
385 iChamber = &(Chamber(i));
386 iChamber->GenerateTresholds();
389 int nparticles = gAlice->GetNtrack();
394 fMerger->Digitise(nev,flag);
397 //Digitise(nev,flag);
399 //___________________________________________
400 void AliRICH::SDigits2Digits()
405 // Called from alirun, single event only.
407 AliRICHChamber* iChamber;
409 printf("Generating tresholds...\n");
411 for(Int_t i=0;i<7;i++) {
412 iChamber = &(Chamber(i));
413 iChamber->GenerateTresholds();
416 int nparticles = gAlice->GetNtrack();
417 cout << "Particles (RICH):" <<nparticles<<endl;
422 fMerger->Digitise(0,0);
426 //___________________________________________
427 void AliRICH::Digits2Reco()
431 // Called from alirun, single event only.
433 int nparticles = gAlice->GetNtrack();
434 cout << "Particles (RICH):" <<nparticles<<endl;
435 if (nparticles > 0) FindClusters(0,0);
439 //___________________________________________
440 void AliRICH::AddHit(Int_t track, Int_t *vol, Float_t *hits)
444 // Adds a hit to the Hits list
446 TClonesArray &lhits = *fHits;
447 new(lhits[fNhits++]) AliRICHHit(fIshunt,track,vol,hits);
449 //_____________________________________________________________________________
450 void AliRICH::AddCerenkov(Int_t track, Int_t *vol, Float_t *cerenkovs)
454 // Adds a RICH cerenkov hit to the Cerenkov Hits list
457 TClonesArray &lcerenkovs = *fCerenkovs;
458 new(lcerenkovs[fNcerenkovs++]) AliRICHCerenkov(fIshunt,track,vol,cerenkovs);
459 //printf ("Done for Cerenkov %d\n\n\n\n",fNcerenkovs);
461 //___________________________________________
462 void AliRICH::AddSDigit(Int_t *clhits)
466 // Add a RICH pad hit to the list
469 //printf("fsdigits:%p, data: %d\n",fSDigits,clhits[2]);
470 TClonesArray &lSDigits = *fSDigits;
471 new(lSDigits[fNSDigits++]) AliRICHSDigit(clhits);
473 //_____________________________________________________________________________
474 void AliRICH::AddDigits(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
478 // Add a RICH digit to the list
481 //printf("fdigits:%p, data: %d\n",((TClonesArray*)(*fDchambers)[id]),digits[0]);
482 TClonesArray &ldigits = *((TClonesArray*)(*fDchambers)[id]);
483 new(ldigits[fNdch[id]++]) AliRICHDigit(tracks,charges,digits);
486 //_____________________________________________________________________________
487 void AliRICH::AddRawCluster(Int_t id, const AliRICHRawCluster& c)
490 // Add a RICH digit to the list
493 TClonesArray &lrawcl = *((TClonesArray*)(*fRawClusters)[id]);
494 new(lrawcl[fNrawch[id]++]) AliRICHRawCluster(c);
497 //_____________________________________________________________________________
498 void AliRICH::AddRecHit1D(Int_t id, Float_t *rechit, Float_t *photons, Int_t *padsx, Int_t* padsy)
502 // Add a RICH reconstructed hit to the list
505 TClonesArray &lrec1D = *((TClonesArray*)(*fRecHits1D)[id]);
506 new(lrec1D[fNrechits1D[id]++]) AliRICHRecHit1D(id,rechit,photons,padsx,padsy);
509 //_____________________________________________________________________________
510 void AliRICH::AddRecHit3D(Int_t id, Float_t *rechit)
514 // Add a RICH reconstructed hit to the list
517 TClonesArray &lrec3D = *((TClonesArray*)(*fRecHits3D)[id]);
518 new(lrec3D[fNrechits3D[id]++]) AliRICHRecHit3D(id,rechit);
521 //___________________________________________
522 void AliRICH::BuildGeometry()
527 // Builds a TNode geometry for event display
529 TNode *node, *subnode, *top;
531 const int kColorRICH = kRed;
533 top=gAlice->GetGeometry()->GetNode("alice");
535 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
536 AliRICHSegmentationV0* segmentation;
537 AliRICHChamber* iChamber;
538 AliRICHGeometry* geometry;
540 iChamber = &(pRICH->Chamber(0));
541 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
542 geometry=iChamber->GetGeometryModel();
544 new TBRIK("S_RICH","S_RICH","void",71.09999,11.5,73.15);
546 Float_t padplane_width = segmentation->GetPadPlaneWidth();
547 Float_t padplane_length = segmentation->GetPadPlaneLength();
549 //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());
551 new TBRIK("PHOTO","PHOTO","void", padplane_width/2,.1,padplane_length/2);
553 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", padplane_width/2,padplane_length/2);
554 //printf("\n\n\n\n\n Padplane w: %f l: %f \n\n\n\n\n", segmentation->GetPadPlaneWidth(), segmentation->GetPadPlaneLength());
556 Float_t offset = 490 + 1.276 - geometry->GetGapThickness()/2; //distance from center of mother volume to methane
557 Float_t deltaphi = 19.5; //phi angle between center of chambers - z direction
558 Float_t deltatheta = 20; //theta angle between center of chambers - x direction
559 Float_t cosphi = TMath::Cos(deltaphi*TMath::Pi()/180);
560 Float_t sinphi = TMath::Sin(deltaphi*TMath::Pi()/180);
561 Float_t costheta = TMath::Cos(deltatheta*TMath::Pi()/180);
562 Float_t sintheta = TMath::Sin(deltatheta*TMath::Pi()/180);
564 //printf("\n\n%f %f %f %f %f %f %f\n\n",offset,deltatheta,deltaphi,cosphi,costheta,sinphi,sintheta);
566 new TRotMatrix("rot993","rot993",90., 0. , 90. - deltaphi, 90. , deltaphi, -90. );
567 new TRotMatrix("rot994","rot994",90., -deltatheta , 90. , 90.- deltatheta , 0. , 0. );
568 new TRotMatrix("rot995","rot995",90., 0. , 90. , 90. , 0. , 0. );
569 new TRotMatrix("rot996","rot996",90., deltatheta , 90. , 90 + deltatheta , 0. , 0. );
570 new TRotMatrix("rot997","rot997",90., 360. - deltatheta, 108.2 , 90.- deltatheta ,18.2 , 90 - deltatheta);
571 new TRotMatrix("rot998","rot998",90., 0. , 90 + deltaphi , 90. , deltaphi, 90. );
572 new TRotMatrix("rot999","rot999",90., deltatheta , 108.2 , 90.+ deltatheta ,18.2 , 90 + deltatheta);
574 Float_t pos1[3]={0. , offset*cosphi , offset*sinphi};
575 Float_t pos2[3]={offset*sintheta , offset*costheta , 0. };
576 Float_t pos3[3]={0. , offset , 0.};
577 Float_t pos4[3]={-offset*sintheta , offset*costheta , 0.};
578 Float_t pos5[3]={offset*sinphi , offset*costheta*cosphi, -offset*sinphi};
579 Float_t pos6[3]={0. , offset*cosphi , -offset*sinphi};
580 Float_t pos7[3]={ -offset*sinphi , offset*costheta*cosphi, -offset*sinphi};
584 //Float_t pos1[3]={0,471.8999,165.2599};
585 //Chamber(0).SetChamberTransform(pos1[0],pos1[1],pos1[2],
586 //new TRotMatrix("rot993","rot993",90,0,70.69,90,19.30999,-90);
587 node = new TNode("RICH1","RICH1","S_RICH",pos1[0],pos1[1],pos1[2],"rot993");
588 node->SetLineColor(kColorRICH);
590 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
591 subnode->SetLineColor(kGreen);
592 fNodes->Add(subnode);
593 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
594 subnode->SetLineColor(kGreen);
595 fNodes->Add(subnode);
596 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
597 subnode->SetLineColor(kGreen);
598 fNodes->Add(subnode);
599 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
600 subnode->SetLineColor(kGreen);
601 fNodes->Add(subnode);
602 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
603 subnode->SetLineColor(kGreen);
604 fNodes->Add(subnode);
605 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
606 subnode->SetLineColor(kGreen);
607 fNodes->Add(subnode);
612 //Float_t pos2[3]={171,470,0};
613 //Chamber(1).SetChamberTransform(pos2[0],pos2[1],pos2[2],
614 //new TRotMatrix("rot994","rot994",90,-20,90,70,0,0);
615 node = new TNode("RICH2","RICH2","S_RICH",pos2[0],pos2[1],pos2[2],"rot994");
616 node->SetLineColor(kColorRICH);
618 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
619 subnode->SetLineColor(kGreen);
620 fNodes->Add(subnode);
621 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
622 subnode->SetLineColor(kGreen);
623 fNodes->Add(subnode);
624 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
625 subnode->SetLineColor(kGreen);
626 fNodes->Add(subnode);
627 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
628 subnode->SetLineColor(kGreen);
629 fNodes->Add(subnode);
630 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
631 subnode->SetLineColor(kGreen);
632 fNodes->Add(subnode);
633 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
634 subnode->SetLineColor(kGreen);
635 fNodes->Add(subnode);
640 //Float_t pos3[3]={0,500,0};
641 //Chamber(2).SetChamberTransform(pos3[0],pos3[1],pos3[2],
642 //new TRotMatrix("rot995","rot995",90,0,90,90,0,0);
643 node = new TNode("RICH3","RICH3","S_RICH",pos3[0],pos3[1],pos3[2],"rot995");
644 node->SetLineColor(kColorRICH);
646 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
647 subnode->SetLineColor(kGreen);
648 fNodes->Add(subnode);
649 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
650 subnode->SetLineColor(kGreen);
651 fNodes->Add(subnode);
652 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
653 subnode->SetLineColor(kGreen);
654 fNodes->Add(subnode);
655 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
656 subnode->SetLineColor(kGreen);
657 fNodes->Add(subnode);
658 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
659 subnode->SetLineColor(kGreen);
660 fNodes->Add(subnode);
661 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
662 subnode->SetLineColor(kGreen);
663 fNodes->Add(subnode);
667 //Float_t pos4[3]={-171,470,0};
668 //Chamber(3).SetChamberTransform(pos4[0],pos4[1],pos4[2],
669 //new TRotMatrix("rot996","rot996",90,20,90,110,0,0);
670 node = new TNode("RICH4","RICH4","S_RICH",pos4[0],pos4[1],pos4[2],"rot996");
671 node->SetLineColor(kColorRICH);
673 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
674 subnode->SetLineColor(kGreen);
675 fNodes->Add(subnode);
676 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
677 subnode->SetLineColor(kGreen);
678 fNodes->Add(subnode);
679 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
680 subnode->SetLineColor(kGreen);
681 fNodes->Add(subnode);
682 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
683 subnode->SetLineColor(kGreen);
684 fNodes->Add(subnode);
685 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
686 subnode->SetLineColor(kGreen);
687 fNodes->Add(subnode);
688 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
689 subnode->SetLineColor(kGreen);
690 fNodes->Add(subnode);
695 //Float_t pos5[3]={161.3999,443.3999,-165.3};
696 //Chamber(4).SetChamberTransform(pos5[0],pos5[1],pos5[2],
697 //new TRotMatrix("rot997","rot997",90,340,108.1999,70,18.2,70);
698 node = new TNode("RICH5","RICH5","S_RICH",pos5[0],pos5[1],pos5[2],"rot997");
699 node->SetLineColor(kColorRICH);
701 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
702 subnode->SetLineColor(kGreen);
703 fNodes->Add(subnode);
704 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
705 subnode->SetLineColor(kGreen);
706 fNodes->Add(subnode);
707 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
708 subnode->SetLineColor(kGreen);
709 fNodes->Add(subnode);
710 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
711 subnode->SetLineColor(kGreen);
712 fNodes->Add(subnode);
713 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
714 subnode->SetLineColor(kGreen);
715 fNodes->Add(subnode);
716 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
717 subnode->SetLineColor(kGreen);
718 fNodes->Add(subnode);
723 //Float_t pos6[3]={0., 471.9, -165.3,};
724 //Chamber(5).SetChamberTransform(pos6[0],pos6[1],pos6[2],
725 //new TRotMatrix("rot998","rot998",90,0,109.3099,90,19.30999,90);
726 node = new TNode("RICH6","RICH6","S_RICH",pos6[0],pos6[1],pos6[2],"rot998");
727 node->SetLineColor(kColorRICH);
728 fNodes->Add(node);node->cd();
729 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
730 subnode->SetLineColor(kGreen);
731 fNodes->Add(subnode);
732 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
733 subnode->SetLineColor(kGreen);
734 fNodes->Add(subnode);
735 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
736 subnode->SetLineColor(kGreen);
737 fNodes->Add(subnode);
738 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
739 subnode->SetLineColor(kGreen);
740 fNodes->Add(subnode);
741 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
742 subnode->SetLineColor(kGreen);
743 fNodes->Add(subnode);
744 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
745 subnode->SetLineColor(kGreen);
746 fNodes->Add(subnode);
750 //Float_t pos7[3]={-161.399,443.3999,-165.3};
751 //Chamber(6).SetChamberTransform(pos7[0],pos7[1],pos7[2],
752 //new TRotMatrix("rot999","rot999",90,20,108.1999,110,18.2,110);
753 node = new TNode("RICH7","RICH7","S_RICH",pos7[0],pos7[1],pos7[2],"rot999");
754 node->SetLineColor(kColorRICH);
756 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
757 subnode->SetLineColor(kGreen);
758 fNodes->Add(subnode);
759 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,padplane_length/2 + segmentation->DeadZone()/2,"");
760 subnode->SetLineColor(kGreen);
761 fNodes->Add(subnode);
762 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,padplane_length/2 + segmentation->DeadZone()/2,"");
763 subnode->SetLineColor(kGreen);
764 fNodes->Add(subnode);
765 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",padplane_width + segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
766 subnode->SetLineColor(kGreen);
767 fNodes->Add(subnode);
768 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",0,5,-padplane_length/2 - segmentation->DeadZone()/2,"");
769 subnode->SetLineColor(kGreen);
770 fNodes->Add(subnode);
771 subnode = new TNode("PHOTO1","PHOTO1","PHOTO",-padplane_width - segmentation->DeadZone(),5,-padplane_length/2 - segmentation->DeadZone()/2,"");
772 subnode->SetLineColor(kGreen);
773 fNodes->Add(subnode);
778 //___________________________________________
779 void AliRICH::CreateGeometry()
782 // Create the geometry for RICH version 1
784 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
785 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
786 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
790 <img src="picts/AliRICHv1.gif">
795 <img src="picts/AliRICHv1Tree.gif">
799 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
800 AliRICHSegmentationV0* segmentation;
801 AliRICHGeometry* geometry;
802 AliRICHChamber* iChamber;
804 iChamber = &(pRICH->Chamber(0));
805 segmentation=(AliRICHSegmentationV0*) iChamber->GetSegmentationModel(0);
806 geometry=iChamber->GetGeometryModel();
809 distance = geometry->GetFreonThickness()/2 + geometry->GetQuartzThickness() + geometry->GetGapThickness();
810 geometry->SetRadiatorToPads(distance);
812 //Opaque quartz thickness
813 Float_t oqua_thickness = .5;
816 //Float_t csi_length = 160*.8 + 2.6;
817 //Float_t csi_width = 144*.84 + 2*2.6;
819 Float_t csi_width = segmentation->Npx()*segmentation->Dpx() + segmentation->DeadZone();
820 Float_t csi_length = segmentation->Npy()*segmentation->Dpy() + 2*segmentation->DeadZone();
822 //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());
824 Int_t *idtmed = fIdtmed->GetArray()-999;
831 // --- Define the RICH detector
832 // External aluminium box
834 par[1] = 13; //Original Settings
839 gMC->Gsvolu("RICH", "BOX ", idtmed[1009], par, 3);
843 par[1] = 13; //Original Settings
848 gMC->Gsvolu("SRIC", "BOX ", idtmed[1000], par, 3);
850 // Air 2 (cutting the lower part of the box)
853 par[1] = 3; //Original Settings
855 gMC->Gsvolu("AIR2", "BOX ", idtmed[1000], par, 3);
857 // Air 3 (cutting the lower part of the box)
860 par[1] = 3; //Original Settings
862 gMC->Gsvolu("AIR3", "BOX ", idtmed[1000], par, 3);
866 par[1] = .188; //Original Settings
871 gMC->Gsvolu("HONE", "BOX ", idtmed[1001], par, 3);
875 par[1] = .025; //Original Settings
880 gMC->Gsvolu("ALUM", "BOX ", idtmed[1009], par, 3);
883 par[0] = geometry->GetQuartzWidth()/2;
884 par[1] = geometry->GetQuartzThickness()/2;
885 par[2] = geometry->GetQuartzLength()/2;
887 par[1] = .25; //Original Settings
889 /*par[0] = geometry->GetQuartzWidth()/2;
890 par[1] = geometry->GetQuartzThickness()/2;
891 par[2] = geometry->GetQuartzLength()/2;*/
892 //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]);
893 gMC->Gsvolu("QUAR", "BOX ", idtmed[1002], par, 3);
895 // Spacers (cylinders)
898 par[2] = geometry->GetFreonThickness()/2;
899 gMC->Gsvolu("SPAC", "TUBE", idtmed[1002], par, 3);
901 // Feet (freon slabs supports)
906 gMC->Gsvolu("FOOT", "BOX", idtmed[1009], par, 3);
909 par[0] = geometry->GetQuartzWidth()/2;
911 par[2] = geometry->GetQuartzLength()/2;
913 par[1] = .2; //Original Settings
918 gMC->Gsvolu("OQUA", "BOX ", idtmed[1007], par, 3);
920 // Frame of opaque quartz
921 par[0] = geometry->GetOuterFreonWidth()/2;
923 par[1] = geometry->GetFreonThickness()/2;
924 par[2] = geometry->GetOuterFreonLength()/2;
927 par[1] = .5; //Original Settings
932 gMC->Gsvolu("OQF1", "BOX ", idtmed[1007], par, 3);
934 par[0] = geometry->GetInnerFreonWidth()/2;
935 par[1] = geometry->GetFreonThickness()/2;
936 par[2] = geometry->GetInnerFreonLength()/2;
937 gMC->Gsvolu("OQF2", "BOX ", idtmed[1007], par, 3);
939 // Little bar of opaque quartz
941 //par[1] = geometry->GetQuartzThickness()/2;
942 //par[2] = geometry->GetInnerFreonLength()/2 - 2.4;
943 //par[2] = geometry->GetInnerFreonLength()/2;
946 par[1] = .25; //Original Settings
951 //gMC->Gsvolu("BARR", "BOX ", idtmed[1007], par, 3);
954 par[0] = geometry->GetOuterFreonWidth()/2 - oqua_thickness;
955 par[1] = geometry->GetFreonThickness()/2;
956 par[2] = geometry->GetOuterFreonLength()/2 - 2*oqua_thickness;
958 par[1] = .5; //Original Settings
963 gMC->Gsvolu("FRE1", "BOX ", idtmed[1003], par, 3);
965 par[0] = geometry->GetInnerFreonWidth()/2 - oqua_thickness;
966 par[1] = geometry->GetFreonThickness()/2;
967 par[2] = geometry->GetInnerFreonLength()/2 - 2*oqua_thickness;
968 gMC->Gsvolu("FRE2", "BOX ", idtmed[1003], par, 3);
972 par[0] = csi_width/2;
973 par[1] = geometry->GetGapThickness()/2;
974 //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]);
976 par[2] = csi_length/2;
977 gMC->Gsvolu("META", "BOX ", idtmed[1004], par, 3);
981 par[0] = csi_width/2;
982 par[1] = geometry->GetProximityGapThickness()/2;
983 //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]);
985 par[2] = csi_length/2;
986 gMC->Gsvolu("GAP ", "BOX ", idtmed[1008], par, 3);
990 par[0] = csi_width/2;
993 par[2] = csi_length/2;
994 gMC->Gsvolu("CSI ", "BOX ", idtmed[1005], par, 3);
1000 gMC->Gsvolu("GRID", "TUBE", idtmed[1006], par, 3);
1005 par[0] = csi_width/2;
1008 gMC->Gsvolu("WSMe", "BOX ", idtmed[1009], par, 3);
1010 // Ceramic pick up (base)
1012 par[0] = csi_width/2;
1015 gMC->Gsvolu("WSG1", "BOX ", idtmed[1010], par, 3);
1017 // Ceramic pick up (head)
1019 par[0] = csi_width/2;
1022 gMC->Gsvolu("WSG2", "BOX ", idtmed[1010], par, 3);
1024 // Aluminium supports for methane and CsI
1027 par[0] = csi_width/2;
1028 par[1] = geometry->GetGapThickness()/2 + .25;
1029 par[2] = (68.35 - csi_length/2)/2;
1030 gMC->Gsvolu("SMSH", "BOX", idtmed[1009], par, 3);
1034 par[0] = (66.3 - csi_width/2)/2;
1035 par[1] = geometry->GetGapThickness()/2 + .25;
1036 par[2] = csi_length/2 + 68.35 - csi_length/2;
1037 gMC->Gsvolu("SMLG", "BOX", idtmed[1009], par, 3);
1039 // Aluminium supports for freon
1042 par[0] = geometry->GetQuartzWidth()/2;
1044 par[2] = (68.35 - geometry->GetQuartzLength()/2)/2;
1045 gMC->Gsvolu("SFSH", "BOX", idtmed[1009], par, 3);
1049 par[0] = (66.3 - geometry->GetQuartzWidth()/2)/2;
1051 par[2] = geometry->GetQuartzLength()/2 + 68.35 - geometry->GetQuartzLength()/2;
1052 gMC->Gsvolu("SFLG", "BOX", idtmed[1009], par, 3);
1056 par[0] = csi_width/2;
1058 par[2] = csi_length/4 -.5025;
1059 gMC->Gsvolu("PCB ", "BOX", idtmed[1011], par, 3);
1062 // Backplane supports
1069 gMC->Gsvolu("BACK", "BOX", idtmed[1009], par, 3);
1076 gMC->Gsvolu("BKHL", "BOX", idtmed[1000], par, 3);
1083 gMC->Gsvolu("BKHS", "BOX", idtmed[1000], par, 3);
1085 // Place holes inside backplane support
1087 gMC->Gspos("BKHS", 1, "BACK", .8 + 5.7,0., .6 + 4.4625, 0, "ONLY");
1088 gMC->Gspos("BKHS", 2, "BACK", -.8 - 5.7,0., .6 + 4.4625, 0, "ONLY");
1089 gMC->Gspos("BKHS", 3, "BACK", .8 + 5.7,0., -.6 - 4.4625, 0, "ONLY");
1090 gMC->Gspos("BKHS", 4, "BACK", -.8 - 5.7,0., -.6 - 4.4625, 0, "ONLY");
1091 gMC->Gspos("BKHS", 5, "BACK", .8 + 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1092 gMC->Gspos("BKHS", 6, "BACK", -.8 - 5.7,0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1093 gMC->Gspos("BKHS", 7, "BACK", .8 + 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1094 gMC->Gspos("BKHS", 8, "BACK", -.8 - 5.7,0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1095 gMC->Gspos("BKHL", 1, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., .6 + 4.4625, 0, "ONLY");
1096 gMC->Gspos("BKHL", 2, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 4.4625, 0, "ONLY");
1097 gMC->Gspos("BKHL", 3, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1098 gMC->Gspos("BKHL", 4, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 4.4625, 0, "ONLY");
1099 gMC->Gspos("BKHL", 5, "BACK", .8 + 11.4+ 1.6 + 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1100 gMC->Gspos("BKHL", 6, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., .6 + 8.925 + 1.2 + 4.4625, 0, "ONLY");
1101 gMC->Gspos("BKHL", 7, "BACK", .8 + 11.4 + 1.6 + 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1102 gMC->Gspos("BKHL", 8, "BACK", -.8 - 11.4 - 1.6 - 9.05, 0., -.6 - 8.925 - 1.2 - 4.4625, 0, "ONLY");
1106 // --- Places the detectors defined with GSVOLU
1107 // Place material inside RICH
1108 gMC->Gspos("SRIC", 1, "RICH", 0.,0., 0., 0, "ONLY");
1109 gMC->Gspos("AIR2", 1, "RICH", 66.3 + 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 0., 0, "ONLY");
1110 gMC->Gspos("AIR2", 2, "RICH", -66.3 - 1.2505, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 0., 0, "ONLY");
1111 gMC->Gspos("AIR3", 1, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, -68.35 - 1.25, 0, "ONLY");
1112 gMC->Gspos("AIR3", 2, "RICH", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.5 - 3.5, 68.35 + 1.25, 0, "ONLY");
1115 gMC->Gspos("ALUM", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .376 -.025, 0., 0, "ONLY");
1116 gMC->Gspos("HONE", 1, "SRIC", 0., 1.276- geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .05 - .188, 0., 0, "ONLY");
1117 gMC->Gspos("ALUM", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .6 - .025, 0., 0, "ONLY");
1118 gMC->Gspos("FOOT", 1, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1119 gMC->Gspos("FOOT", 2, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3 , 36.9, 0, "ONLY");
1120 gMC->Gspos("FOOT", 3, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1121 gMC->Gspos("FOOT", 4, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, 36.9, 0, "ONLY");
1122 gMC->Gspos("FOOT", 5, "SRIC", 64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1123 gMC->Gspos("FOOT", 6, "SRIC", 21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1124 gMC->Gspos("FOOT", 7, "SRIC", -21.65, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1125 gMC->Gspos("FOOT", 8, "SRIC", -64.95, 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .4 - .3, -36.9, 0, "ONLY");
1126 gMC->Gspos("OQUA", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()- .2, 0., 0, "ONLY");
1131 gMC->Gspos("SMLG", 1, "SRIC", csi_width/2 + (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1132 gMC->Gspos("SMLG", 2, "SRIC", - csi_width/2 - (66.3 - csi_width/2)/2, 1.276 + .25, 0., 0, "ONLY");
1133 gMC->Gspos("SMSH", 1, "SRIC", 0., 1.276 + .25, csi_length/2 + (68.35 - csi_length/2)/2, 0, "ONLY");
1134 gMC->Gspos("SMSH", 2, "SRIC", 0., 1.276 + .25, - csi_length/2 - (68.35 - csi_length/2)/2, 0, "ONLY");
1138 Float_t supp_y = 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness() - .2 + .3; //y position of freon supports
1140 gMC->Gspos("SFLG", 1, "SRIC", geometry->GetQuartzWidth()/2 + (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1141 gMC->Gspos("SFLG", 2, "SRIC", - geometry->GetQuartzWidth()/2 - (66.3 - geometry->GetQuartzWidth()/2)/2, supp_y, 0., 0, "ONLY");
1142 gMC->Gspos("SFSH", 1, "SRIC", 0., supp_y, geometry->GetQuartzLength()/2 + (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1143 gMC->Gspos("SFSH", 2, "SRIC", 0., supp_y, - geometry->GetQuartzLength()/2 - (68.35 - geometry->GetQuartzLength()/2)/2, 0, "ONLY");
1145 AliMatrix(idrotm[1019], 0., 0., 90., 0., 90., 90.);
1147 //Placing of the spacers inside the freon slabs
1149 Int_t nspacers = 30;
1150 //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);
1152 //printf("Nspacers: %d", nspacers);
1154 for (i = 0; i < nspacers/3; i++) {
1155 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1156 gMC->Gspos("SPAC", i, "FRE1", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1159 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1160 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1161 gMC->Gspos("SPAC", i, "FRE1", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1164 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1165 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1166 gMC->Gspos("SPAC", i, "FRE1", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1169 for (i = 0; i < nspacers/3; i++) {
1170 zs = -11.6/2 + (TMath::Abs(nspacers/6) - i) * 12.2;
1171 gMC->Gspos("SPAC", i, "FRE2", 10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1174 for (i = nspacers/3; i < (nspacers*2)/3; i++) {
1175 zs = -11.6/2 + (nspacers/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1176 gMC->Gspos("SPAC", i, "FRE2", 0, 0., zs, idrotm[1019], "ONLY"); //Original settings
1179 for (i = (nspacers*2)/3; i < nspacers; ++i) {
1180 zs = -11.6/2 + ((nspacers*2)/3 + TMath::Abs(nspacers/6) - i) * 12.2;
1181 gMC->Gspos("SPAC", i, "FRE2", -10.5, 0., zs, idrotm[1019], "ONLY"); //Original settings
1185 gMC->Gspos("FRE1", 1, "OQF1", 0., 0., 0., 0, "ONLY");
1186 gMC->Gspos("FRE2", 1, "OQF2", 0., 0., 0., 0, "ONLY");
1187 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)
1188 // printf("Opaque quartz in SRIC %f\n", 1.276 - geometry->GetGapThickness()/2- geometry->GetQuartzThickness() -geometry->GetFreonThickness()/2);
1189 gMC->Gspos("OQF2", 2, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness() - geometry->GetFreonThickness()/2, 0., 0, "ONLY"); //Original settings
1190 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)
1191 //gMC->Gspos("BARR", 1, "QUAR", - geometry->GetInnerFreonWidth()/2 - oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (-21.65)
1192 //gMC->Gspos("BARR", 2, "QUAR", geometry->GetInnerFreonWidth()/2 + oqua_thickness, 0., 0., 0, "ONLY"); //Original settings (21.65)
1193 gMC->Gspos("QUAR", 1, "SRIC", 0., 1.276 - geometry->GetGapThickness()/2 - geometry->GetQuartzThickness()/2, 0., 0, "ONLY");
1194 gMC->Gspos("GAP ", 1, "META", 0., geometry->GetGapThickness()/2 - geometry->GetProximityGapThickness()/2 - 0.0001, 0., 0, "ONLY");
1195 gMC->Gspos("META", 1, "SRIC", 0., 1.276, 0., 0, "ONLY");
1196 gMC->Gspos("CSI ", 1, "SRIC", 0., 1.276 + geometry->GetGapThickness()/2 + .25, 0., 0, "ONLY");
1197 printf("CSI pos: %f\n",1.276 + geometry->GetGapThickness()/2 + .25);
1199 // Wire support placing
1201 gMC->Gspos("WSG2", 1, "GAP ", 0., geometry->GetProximityGapThickness()/2 - .1, 0., 0, "ONLY");
1202 gMC->Gspos("WSG1", 1, "CSI ", 0., 0., 0., 0, "ONLY");
1203 gMC->Gspos("WSMe", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, 0., 0, "ONLY");
1205 // Backplane placing
1207 gMC->Gspos("BACK", 1, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 43.3, 0, "ONLY");
1208 gMC->Gspos("BACK", 2, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2 , 43.3, 0, "ONLY");
1209 gMC->Gspos("BACK", 3, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1210 gMC->Gspos("BACK", 4, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, 0., 0, "ONLY");
1211 gMC->Gspos("BACK", 5, "SRIC ", 33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1212 gMC->Gspos("BACK", 6, "SRIC ", -33.15, 1.276 + geometry->GetGapThickness()/2 + .5 + 2.1 + 2, -43.3, 0, "ONLY");
1216 gMC->Gspos("PCB ", 1, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, csi_width/4 + .5025 + 1.2, 0, "ONLY");
1217 gMC->Gspos("PCB ", 2, "SRIC ", 0., 1.276 + geometry->GetGapThickness()/2 + .5 + 1.05, -csi_width/4 - .5025 - 1.2, 0, "ONLY");
1221 //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);
1223 // Place RICH inside ALICE apparatus
1227 AliMatrix(idrotm[1000], 90., 0., 70.69, 90., 19.31, -90.);
1228 AliMatrix(idrotm[1001], 90., -20., 90., 70., 0., 0.);
1229 AliMatrix(idrotm[1002], 90., 0., 90., 90., 0., 0.);
1230 AliMatrix(idrotm[1003], 90., 20., 90., 110., 0., 0.);
1231 AliMatrix(idrotm[1004], 90., 340., 108.2, 70., 18.2, 70.);
1232 AliMatrix(idrotm[1005], 90., 0., 109.31, 90., 19.31, 90.);
1233 AliMatrix(idrotm[1006], 90., 20., 108.2, 110., 18.2, 110.);
1235 gMC->Gspos("RICH", 1, "ALIC", 0., 471.9, 165.26, idrotm[1000], "ONLY");
1236 gMC->Gspos("RICH", 2, "ALIC", 171., 470., 0., idrotm[1001], "ONLY");
1237 gMC->Gspos("RICH", 3, "ALIC", 0., 500., 0., idrotm[1002], "ONLY");
1238 gMC->Gspos("RICH", 4, "ALIC", -171., 470., 0., idrotm[1003], "ONLY");
1239 gMC->Gspos("RICH", 5, "ALIC", 161.4, 443.4, -165.3, idrotm[1004], "ONLY");
1240 gMC->Gspos("RICH", 6, "ALIC", 0., 471.9, -165.3, idrotm[1005], "ONLY");
1241 gMC->Gspos("RICH", 7, "ALIC", -161.4, 443.4, -165.3, idrotm[1006], "ONLY");*/
1243 // The placing of the chambers is measured from the vertex to the base of the methane vessel (490 cm)
1245 Float_t offset = 490 + 1.276 - geometry->GetGapThickness()/2; //distance from center of mother volume to methane
1246 Float_t deltaphi = 19.5; //phi angle between center of chambers - z direction
1247 Float_t deltatheta = 20; //theta angle between center of chambers - x direction
1248 Float_t cosphi = TMath::Cos(deltaphi*TMath::Pi()/180);
1249 Float_t sinphi = TMath::Sin(deltaphi*TMath::Pi()/180);
1250 Float_t costheta = TMath::Cos(deltatheta*TMath::Pi()/180);
1251 Float_t sintheta = TMath::Sin(deltatheta*TMath::Pi()/180);
1253 //printf("\n\n%f %f %f %f %f %f %f\n\n",offset,deltatheta,deltaphi,cosphi,costheta,sinphi,sintheta);
1255 AliMatrix(idrotm[1000], 90., 0. , 90. - deltaphi, 90. , deltaphi, -90. );
1256 AliMatrix(idrotm[1001], 90., -deltatheta , 90. , 90.- deltatheta , 0. , 0. );
1257 AliMatrix(idrotm[1002], 90., 0. , 90. , 90. , 0. , 0. );
1258 AliMatrix(idrotm[1003], 90., deltatheta , 90. , 90 + deltatheta , 0. , 0. );
1259 AliMatrix(idrotm[1004], 90., 360. - deltatheta, 108.2 , 90.- deltatheta ,18.2 , 90 - deltatheta);
1260 AliMatrix(idrotm[1005], 90., 0. , 90 + deltaphi , 90. , deltaphi, 90. );
1261 AliMatrix(idrotm[1006], 90., deltatheta , 108.2 , 90.+ deltatheta ,18.2 , 90 + deltatheta);
1263 gMC->Gspos("RICH", 1, "ALIC", 0. , offset*cosphi , offset*sinphi ,idrotm[1000], "ONLY");
1264 gMC->Gspos("RICH", 2, "ALIC", (offset)*sintheta , offset*costheta , 0. ,idrotm[1001], "ONLY");
1265 gMC->Gspos("RICH", 3, "ALIC", 0. , offset , 0. ,idrotm[1002], "ONLY");
1266 gMC->Gspos("RICH", 4, "ALIC", -(offset)*sintheta, offset*costheta , 0. ,idrotm[1003], "ONLY");
1267 gMC->Gspos("RICH", 5, "ALIC", (offset)*sinphi , offset*costheta*cosphi, -offset*sinphi,idrotm[1004], "ONLY");
1268 gMC->Gspos("RICH", 6, "ALIC", 0. , offset*cosphi , -offset*sinphi,idrotm[1005], "ONLY");
1269 gMC->Gspos("RICH", 7, "ALIC", -(offset)*sinphi , offset*costheta*cosphi, -offset*sinphi,idrotm[1006], "ONLY");
1274 //___________________________________________
1275 void AliRICH::CreateMaterials()
1278 // *** DEFINITION OF AVAILABLE RICH MATERIALS ***
1279 // ORIGIN : NICK VAN EIJNDHOVEN
1280 // Modified by: N. Colonna (INFN - BARI, Nicola.Colonna@ba.infn.it)
1281 // R.A. Fini (INFN - BARI, Rosanna.Fini@ba.infn.it)
1282 // R.A. Loconsole (Bari University, loco@riscom.ba.infn.it)
1284 Int_t isxfld = gAlice->Field()->Integ();
1285 Float_t sxmgmx = gAlice->Field()->Max();
1288 /************************************Antonnelo's Values (14-vectors)*****************************************/
1290 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,
1291 6.7e-9,6.88e-9,7.08e-9,7.3e-9,7.51e-9,7.74e-9,8e-9 };
1292 Float_t rIndexQuarz[14] = { 1.528309,1.533333,
1293 1.538243,1.544223,1.550568,1.55777,
1294 1.565463,1.574765,1.584831,1.597027,
1295 1.611858,1.6277,1.6472,1.6724 };
1296 Float_t rIndexOpaqueQuarz[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1297 Float_t rIndexMethane[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1298 Float_t rIndexGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1299 Float_t abscoFreon[14] = { 179.0987,179.0987,
1300 179.0987,179.0987,179.0987,142.92,56.65,13.95,10.43,7.07,2.03,.5773,.33496,0. };
1301 //Float_t abscoFreon[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1302 // 1e-5,1e-5,1e-5,1e-5,1e-5 };
1303 Float_t abscoQuarz[14] = { 64.035,39.98,35.665,31.262,27.527,22.815,21.04,17.52,
1304 14.177,9.282,4.0925,1.149,.3627,.10857 };
1305 Float_t abscoOpaqueQuarz[14] = { 1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,1e-5,
1306 1e-5,1e-5,1e-5,1e-5,1e-5 };
1307 Float_t abscoCsI[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1308 1e-4,1e-4,1e-4,1e-4 };
1309 Float_t abscoMethane[14] = { 1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,1e6,
1311 Float_t abscoGrid[14] = { 1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,1e-4,
1312 1e-4,1e-4,1e-4,1e-4 };
1313 Float_t efficAll[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1314 Float_t efficCsI[14] = { 6e-4,.005,.0075,.01125,.045,.117,.135,.16575,
1315 .17425,.1785,.1836,.1904,.1938,.221 };
1316 Float_t efficGrid[14] = { 1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1.,1. };
1320 /**********************************End of Antonnelo's Values**********************************/
1322 /**********************************Values from rich_media.f (31-vectors)**********************************/
1325 //Photons energy intervals
1329 ppckov[i] = (Float_t(i)*0.1+5.5)*1e-9;
1330 //printf ("Energy intervals: %e\n",ppckov[i]);
1334 //Refraction index for quarz
1335 Float_t rIndexQuarz[26];
1342 Float_t ene=ppckov[i]*1e9;
1343 Float_t a=f1/(e1*e1 - ene*ene);
1344 Float_t b=f2/(e2*e2 - ene*ene);
1345 rIndexQuarz[i] = TMath::Sqrt(1. + a + b );
1346 //printf ("rIndexQuarz: %e\n",rIndexQuarz[i]);
1349 //Refraction index for opaque quarz, methane and grid
1350 Float_t rIndexOpaqueQuarz[26];
1351 Float_t rIndexMethane[26];
1352 Float_t rIndexGrid[26];
1355 rIndexOpaqueQuarz[i]=1;
1356 rIndexMethane[i]=1.000444;
1358 //printf ("rIndexOpaqueQuarz , etc: %e, %e, %e\n",rIndexOpaqueQuarz[i], rIndexMethane[i], rIndexGrid[i]=1);
1361 //Absorption index for freon
1362 Float_t abscoFreon[26] = {179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987, 179.0987,
1363 179.0987, 142.9206, 56.64957, 25.58622, 13.95293, 12.03905, 10.42953, 8.804196,
1364 7.069031, 4.461292, 2.028366, 1.293013, .577267, .40746, .334964, 0., 0., 0.};
1366 //Absorption index for quarz
1367 /*Float_t Qzt [21] = {.0,.0,.005,.04,.35,.647,.769,.808,.829,.844,.853,.858,.869,.887,.903,.902,.902,
1368 .906,.907,.907,.907};
1369 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,
1370 215.0,220.0,225.0,230.0,235.0,240.0,245.0,250.0};
1371 Float_t abscoQuarz[31];
1372 for (Int_t i=0;i<31;i++)
1374 Float_t Xlam = 1237.79 / (ppckov[i]*1e9);
1375 if (Xlam <= 160) abscoQuarz[i] = 0;
1376 if (Xlam > 250) abscoQuarz[i] = 1;
1379 for (Int_t j=0;j<21;j++)
1381 //printf ("Passed\n");
1382 if (Xlam > Wavl2[j] && Xlam < Wavl2[j+1])
1384 Float_t Dabs = (Qzt[j+1] - Qzt[j])/(Wavl2[j+1] - Wavl2[j]);
1385 Float_t Abso = Qzt[j] + Dabs*(Xlam - Wavl2[j]);
1386 abscoQuarz[i] = -5.0/(TMath::Log(Abso));
1390 printf ("abscoQuarz: %e abscoFreon: %e for energy: %e\n",abscoQuarz[i],abscoFreon[i],ppckov[i]);
1393 /*Float_t abscoQuarz[31] = {49.64211, 48.41296, 47.46989, 46.50492, 45.13682, 44.47883, 43.1929 , 41.30922, 40.5943 ,
1394 39.82956, 38.98623, 38.6247 , 38.43448, 37.41084, 36.22575, 33.74852, 30.73901, 24.25086,
1395 17.94531, 11.88753, 5.99128, 3.83503, 2.36661, 1.53155, 1.30582, 1.08574, .8779708,
1396 .675275, 0., 0., 0.};
1398 for (Int_t i=0;i<31;i++)
1400 abscoQuarz[i] = abscoQuarz[i]/10;
1403 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,
1404 19.266, 17.525, 15.878, 14.177, 11.719, 9.282, 6.62, 4.0925, 2.601, 1.149, .667, .3627,
1405 .192, .1497, .10857};
1407 //Absorption index for methane
1408 Float_t abscoMethane[26];
1411 abscoMethane[i]=AbsoCH4(ppckov[i]*1e9);
1412 //printf("abscoMethane: %e for energy: %e\n", abscoMethane[i],ppckov[i]*1e9);
1415 //Absorption index for opaque quarz, csi and grid, efficiency for all and grid
1416 Float_t abscoOpaqueQuarz[26];
1417 Float_t abscoCsI[26];
1418 Float_t abscoGrid[26];
1419 Float_t efficAll[26];
1420 Float_t efficGrid[26];
1423 abscoOpaqueQuarz[i]=1e-5;
1428 //printf ("All must be 1: %e, %e, %e, %e, %e\n",abscoOpaqueQuarz[i],abscoCsI[i],abscoGrid[i],efficAll[i],efficGrid[i]);
1431 //Efficiency for csi
1433 Float_t efficCsI[26] = {0.000199999995, 0.000600000028, 0.000699999975, 0.00499999989, 0.00749999983, 0.010125,
1434 0.0242999997, 0.0405000001, 0.0688500032, 0.105299994, 0.121500008, 0.141749993, 0.157949999,
1435 0.162, 0.166050002, 0.167669997, 0.174299985, 0.176789999, 0.179279998, 0.182599992, 0.18592,
1436 0.187579989, 0.189239994, 0.190899998, 0.207499996, 0.215799987};
1440 //FRESNEL LOSS CORRECTION FOR PERPENDICULAR INCIDENCE AND
1441 //UNPOLARIZED PHOTONS
1445 efficCsI[i] = efficCsI[i]/(1.-Fresnel(ppckov[i]*1e9,1.,0));
1446 //printf ("Fresnel result: %e for energy: %e\n",Fresnel(ppckov[i]*1e9,1.,0),ppckov[i]*1e9);
1449 /*******************************************End of rich_media.f***************************************/
1456 Float_t afre[2], agri, amet[2], aqua[2], ahon, zfre[2], zgri, zhon,
1460 Int_t nlmatmet, nlmatqua;
1461 Float_t wmatquao[2], rIndexFreon[26];
1462 Float_t aquao[2], epsil, stmin, zquao[2];
1464 Float_t radlal, densal, tmaxfd, deemax, stemax;
1465 Float_t aal, zal, radlgri, densfre, radlhon, densgri, denshon,densqua, densmet, wmatfre[2], wmatmet[2], wmatqua[2];
1467 Int_t *idtmed = fIdtmed->GetArray()-999;
1469 // --- Photon energy (GeV)
1470 // --- Refraction indexes
1471 for (i = 0; i < 26; ++i) {
1472 rIndexFreon[i] = ppckov[i] * .0172 * 1e9 + 1.177;
1473 //rIndexFreon[i] = 1;
1474 //printf ("rIndexFreon: %e \n efficCsI: %e for energy: %e\n",rIndexFreon[i], efficCsI[i], ppckov[i]);
1477 // --- Detection efficiencies (quantum efficiency for CsI)
1478 // --- Define parameters for honeycomb.
1479 // Used carbon of equivalent rad. lenght
1486 // --- Parameters to include in GSMIXT, relative to Quarz (SiO2)
1497 // --- Parameters to include in GSMIXT, relative to opaque Quarz (SiO2)
1508 // --- Parameters to include in GSMIXT, relative to Freon (C6F14)
1519 // --- Parameters to include in GSMIXT, relative to methane (CH4)
1530 // --- Parameters to include in GSMIXT, relative to anode grid (Cu)
1537 // --- Parameters to include in GSMATE related to aluminium sheet
1544 // --- Glass parameters
1546 Float_t aglass[5]={12.01, 28.09, 16., 10.8, 23.};
1547 Float_t zglass[5]={ 6., 14., 8., 5., 11.};
1548 Float_t wglass[5]={ 0.5, 0.105, 0.355, 0.03, 0.01};
1549 Float_t dglass=1.74;
1552 AliMaterial(1, "Air $", 14.61, 7.3, .001205, 30420., 67500);
1553 AliMaterial(6, "HON", ahon, zhon, denshon, radlhon, 0);
1554 AliMaterial(16, "CSI", ahon, zhon, denshon, radlhon, 0);
1555 AliMixture(20, "QUA", aqua, zqua, densqua, nlmatqua, wmatqua);
1556 AliMixture(21, "QUAO", aquao, zquao, densquao, nlmatquao, wmatquao);
1557 AliMixture(30, "FRE", afre, zfre, densfre, nlmatfre, wmatfre);
1558 AliMixture(40, "MET", amet, zmet, densmet, nlmatmet, wmatmet);
1559 AliMixture(41, "METG", amet, zmet, densmet, nlmatmet, wmatmet);
1560 AliMaterial(11, "GRI", agri, zgri, densgri, radlgri, 0);
1561 AliMaterial(50, "ALUM", aal, zal, densal, radlal, 0);
1562 AliMixture(32, "GLASS",aglass, zglass, dglass, 5, wglass);
1563 AliMaterial(31, "COPPER$", 63.54, 29., 8.96, 1.4, 0.);
1571 AliMedium(1, "DEFAULT MEDIUM AIR$", 1, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1572 AliMedium(2, "HONEYCOMB$", 6, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1573 AliMedium(3, "QUARZO$", 20, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1574 AliMedium(4, "FREON$", 30, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1575 AliMedium(5, "METANO$", 40, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1576 AliMedium(6, "CSI$", 16, 1, isxfld, sxmgmx,tmaxfd, stemax, deemax, epsil, stmin);
1577 AliMedium(7, "GRIGLIA$", 11, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1578 AliMedium(8, "QUARZOO$", 21, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1579 AliMedium(9, "GAP$", 41, 1, isxfld, sxmgmx,tmaxfd, .1, -deemax, epsil, -stmin);
1580 AliMedium(10, "ALUMINUM$", 50, 1, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1581 AliMedium(11, "GLASS", 32, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1582 AliMedium(12, "PCB_COPPER", 31, 0, isxfld, sxmgmx, tmaxfd, stemax, deemax, epsil, stmin);
1585 gMC->SetCerenkov(idtmed[1000], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1586 gMC->SetCerenkov(idtmed[1001], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1587 gMC->SetCerenkov(idtmed[1002], 26, ppckov, abscoQuarz, efficAll,rIndexQuarz);
1588 gMC->SetCerenkov(idtmed[1003], 26, ppckov, abscoFreon, efficAll,rIndexFreon);
1589 gMC->SetCerenkov(idtmed[1004], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1590 gMC->SetCerenkov(idtmed[1005], 26, ppckov, abscoCsI, efficCsI, rIndexMethane);
1591 gMC->SetCerenkov(idtmed[1006], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1592 gMC->SetCerenkov(idtmed[1007], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1593 gMC->SetCerenkov(idtmed[1008], 26, ppckov, abscoMethane, efficAll, rIndexMethane);
1594 gMC->SetCerenkov(idtmed[1009], 26, ppckov, abscoGrid, efficGrid, rIndexGrid);
1595 gMC->SetCerenkov(idtmed[1010], 26, ppckov, abscoOpaqueQuarz, efficAll, rIndexOpaqueQuarz);
1598 //___________________________________________
1600 Float_t AliRICH::Fresnel(Float_t ene,Float_t pdoti, Bool_t pola)
1603 //ENE(EV), PDOTI=COS(INC.ANG.), PDOTR=COS(POL.PLANE ROT.ANG.)
1605 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,
1606 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,
1607 7.8,7.9,8.0,8.1,8.2,8.3,8.4,8.5};
1610 Float_t csin[36] = {2.14,2.21,2.33,2.48,2.76,2.97,2.99,2.59,2.81,3.05,
1611 2.86,2.53,2.55,2.66,2.79,2.96,3.18,3.05,2.84,2.81,2.38,2.11,
1612 2.01,2.13,2.39,2.73,3.08,3.15,2.95,2.73,2.56,2.41,2.12,1.95,
1615 Float_t csik[36] = {0.,0.,0.,0.,0.,0.196,0.408,0.208,0.118,0.49,0.784,0.543,
1616 0.424,0.404,0.371,0.514,0.922,1.102,1.139,1.376,1.461,1.253,0.878,
1617 0.69,0.612,0.649,0.824,1.347,1.571,1.678,1.763,1.857,1.824,1.824,
1620 Int_t j=Int_t(xe*10)-49;
1621 Float_t cn=csin[j]+((csin[j+1]-csin[j])/0.1)*(xe-en[j]);
1622 Float_t ck=csik[j]+((csik[j+1]-csik[j])/0.1)*(xe-en[j]);
1624 //FORMULAE FROM HANDBOOK OF OPTICS, 33.23 OR
1625 //W.R. HUNTER, J.O.S.A. 54 (1964),15 , J.O.S.A. 55(1965),1197
1627 Float_t sinin=TMath::Sqrt(1-pdoti*pdoti);
1628 Float_t tanin=sinin/pdoti;
1630 Float_t c1=cn*cn-ck*ck-sinin*sinin;
1631 Float_t c2=4*cn*cn*ck*ck;
1632 Float_t aO=TMath::Sqrt(0.5*(TMath::Sqrt(c1*c1+c2)+c1));
1633 Float_t b2=0.5*(TMath::Sqrt(c1*c1+c2)-c1);
1635 Float_t rs=((aO-pdoti)*(aO-pdoti)+b2)/((aO+pdoti)*(aO+pdoti)+b2);
1636 Float_t rp=rs*((aO-sinin*tanin)*(aO-sinin*tanin)+b2)/((aO+sinin*tanin)*(aO+sinin*tanin)+b2);
1639 //CORRECTION FACTOR FOR SURFACE ROUGHNESS
1640 //B.J. STAGG APPLIED OPTICS, 30(1991),4113
1643 Float_t lamb=1240/ene;
1646 Float_t rO=TMath::Exp(-(4*TMath::Pi()*pdoti*sigraf/lamb)*(4*TMath::Pi()*pdoti*sigraf/lamb));
1650 Float_t pdotr=0.8; //DEGREE OF POLARIZATION : 1->P , -1->S
1651 fresn=0.5*(rp*(1+pdotr)+rs*(1-pdotr));
1660 //__________________________________________
1661 Float_t AliRICH::AbsoCH4(Float_t x)
1664 //KLOSCH,SCH4(9),WL(9),EM(9),ALENGTH(31)
1665 Float_t sch4[9] = {.12,.16,.23,.38,.86,2.8,7.9,28.,80.}; //MB X 10^22
1666 //Float_t wl[9] = {153.,152.,151.,150.,149.,148.,147.,146.,145};
1667 Float_t em[9] = {8.1,8.158,8.212,8.267,8.322,8.378,8.435,8.493,8.55};
1668 const Float_t kLosch=2.686763E19; // LOSCHMIDT NUMBER IN CM-3
1669 const Float_t kIgas1=100, kIgas2=0, kOxy=10., kWater=5., kPressure=750.,kTemperature=283.;
1670 Float_t pn=kPressure/760.;
1671 Float_t tn=kTemperature/273.16;
1674 // ------- METHANE CROSS SECTION -----------------
1675 // ASTROPH. J. 214, L47 (1978)
1681 if(x>=7.75 && x<=8.1)
1683 Float_t c0=-1.655279e-1;
1684 Float_t c1=6.307392e-2;
1685 Float_t c2=-8.011441e-3;
1686 Float_t c3=3.392126e-4;
1687 sm=(c0+c1*x+c2*x*x+c3*x*x*x)*1.e-18;
1693 while (x<=em[j] && x>=em[j+1])
1696 Float_t a=(sch4[j+1]-sch4[j])/(em[j+1]-em[j]);
1697 sm=(sch4[j]+a*(x-em[j]))*1e-22;
1701 Float_t dm=(kIgas1/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1702 Float_t abslm=1./sm/dm;
1704 // ------- ISOBUTHANE CROSS SECTION --------------
1705 // i-C4H10 (ai) abs. length from curves in
1706 // Lu-McDonald paper for BARI RICH workshop .
1707 // -----------------------------------------------------------
1716 if(x>=7.25 && x<7.375)
1722 Float_t si = 1./(ai*kLosch*273.16/293.); // ISOB. CRO.SEC.IN CM2
1723 Float_t di=(kIgas2/100.)*(1.-((kOxy+kWater)/1.e6))*kLosch*pn/tn;
1728 // ---------------------------------------------------------
1730 // transmission of O2
1732 // y= path in cm, x=energy in eV
1733 // so= cross section for UV absorption in cm2
1734 // do= O2 molecular density in cm-3
1735 // ---------------------------------------------------------
1743 so=3.392709e-13 * TMath::Exp(2.864104 *x);
1749 so=2.910039e-34 * TMath::Exp(10.3337*x);
1756 Float_t a0=-73770.76;
1757 Float_t a1=46190.69;
1758 Float_t a2=-11475.44;
1759 Float_t a3=1412.611;
1760 Float_t a4=-86.07027;
1761 Float_t a5=2.074234;
1762 so= a0+(a1*x)+(a2*x*x)+(a3*x*x*x)+(a4*x*x*x*x)+(a5*x*x*x*x*x);
1766 Float_t dox=(kOxy/1e6)*kLosch*pn/tn;
1771 // ---------------------------------------------------------
1773 // transmission of H2O
1775 // y= path in cm, x=energy in eV
1776 // sw= cross section for UV absorption in cm2
1777 // dw= H2O molecular density in cm-3
1778 // ---------------------------------------------------------
1782 Float_t b0=29231.65;
1783 Float_t b1=-15807.74;
1784 Float_t b2=3192.926;
1785 Float_t b3=-285.4809;
1786 Float_t b4=9.533944;
1790 Float_t sw= b0+(b1*x)+(b2*x*x)+(b3*x*x*x)+(b4*x*x*x*x);
1792 Float_t dw=(kWater/1e6)*kLosch*pn/tn;
1798 // ---------------------------------------------------------
1800 Float_t alength=1./(1./abslm+1./absli+1./abslo+1./abslw);
1806 //___________________________________________
1807 Int_t AliRICH::DistancetoPrimitive(Int_t , Int_t )
1815 //___________________________________________
1816 void AliRICH::MakeBranch(Option_t* option, char *file)
1818 // Create Tree branches for the RICH.
1820 const Int_t kBufferSize = 4000;
1821 char branchname[20];
1823 AliDetector::MakeBranch(option,file);
1825 const char *cH = strstr(option,"H");
1826 const char *cD = strstr(option,"D");
1827 const char *cR = strstr(option,"R");
1828 const char *cS = strstr(option,"S");
1832 sprintf(branchname,"%sCerenkov",GetName());
1833 if (fCerenkovs && gAlice->TreeH()) {
1834 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fCerenkovs, kBufferSize, file) ;
1835 gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fCerenkovs, kBufferSize, file) ;
1836 //branch->SetAutoDelete(kFALSE);
1838 sprintf(branchname,"%sSDigits",GetName());
1839 if (fSDigits && gAlice->TreeH()) {
1840 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fSDigits, kBufferSize, file) ;
1841 gAlice->MakeBranchInTree(gAlice->TreeH(),branchname, &fSDigits, kBufferSize, file) ;
1842 //branch->SetAutoDelete(kFALSE);
1843 //printf("Making branch %sSDigits in TreeH\n",GetName());
1848 sprintf(branchname,"%sSDigits",GetName());
1849 if (fSDigits && gAlice->TreeS()) {
1850 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeS(),branchname, &fSDigits, kBufferSize, file) ;
1851 gAlice->MakeBranchInTree(gAlice->TreeS(),branchname, &fSDigits, kBufferSize, file) ;
1852 //branch->SetAutoDelete(kFALSE);
1853 //printf("Making branch %sSDigits in TreeS\n",GetName());
1859 // one branch for digits per chamber
1863 for (i=0; i<kNCH ;i++) {
1864 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1865 if (fDchambers && gAlice->TreeD()) {
1866 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeD(),branchname, &((*fDchambers)[i]), kBufferSize, file) ;
1867 gAlice->MakeBranchInTree(gAlice->TreeD(),branchname, &((*fDchambers)[i]), kBufferSize, file) ;
1868 //branch->SetAutoDelete(kFALSE);
1869 //printf("Making Branch %sDigits%d\n",GetName(),i+1);
1876 // one branch for raw clusters per chamber
1879 //printf("Called MakeBranch for TreeR\n");
1883 for (i=0; i<kNCH ;i++) {
1884 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1885 if (fRawClusters && gAlice->TreeR()) {
1886 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRawClusters)[i]), kBufferSize, file) ;
1887 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRawClusters)[i]), kBufferSize, file) ;
1888 //branch->SetAutoDelete(kFALSE);
1892 // one branch for rec hits per chamber
1894 for (i=0; i<kNCH ;i++) {
1895 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1896 if (fRecHits1D && gAlice->TreeR()) {
1897 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits1D)[i]), kBufferSize, file) ;
1898 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits1D)[i]), kBufferSize, file) ;
1899 //branch->SetAutoDelete(kFALSE);
1902 for (i=0; i<kNCH ;i++) {
1903 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1904 if (fRecHits3D && gAlice->TreeR()) {
1905 //TBranch* branch = gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits3D)[i]), kBufferSize, file) ;
1906 gAlice->MakeBranchInTree(gAlice->TreeR(),branchname, &((*fRecHits3D)[i]), kBufferSize, file) ;
1907 //branch->SetAutoDelete(kFALSE);
1913 //___________________________________________
1914 void AliRICH::SetTreeAddress()
1916 // Set branch address for the Hits and Digits Tree.
1917 char branchname[20];
1920 AliDetector::SetTreeAddress();
1923 TTree *treeH = gAlice->TreeH();
1924 TTree *treeD = gAlice->TreeD();
1925 TTree *treeR = gAlice->TreeR();
1926 TTree *treeS = gAlice->TreeS();
1930 branch = treeH->GetBranch("RICHCerenkov");
1931 if (branch) branch->SetAddress(&fCerenkovs);
1934 branch = treeH->GetBranch("RICHSDigits");
1937 branch->SetAddress(&fSDigits);
1938 //printf("Setting sdigits branch address at %p in TreeH\n",&fSDigits);
1945 branch = treeS->GetBranch("RICHSDigits");
1948 branch->SetAddress(&fSDigits);
1949 //printf("Setting sdigits branch address at %p in TreeS\n",&fSDigits);
1956 for (int i=0; i<kNCH; i++) {
1957 sprintf(branchname,"%sDigits%d",GetName(),i+1);
1959 branch = treeD->GetBranch(branchname);
1960 if (branch) branch->SetAddress(&((*fDchambers)[i]));
1965 for (i=0; i<kNCH; i++) {
1966 sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
1968 branch = treeR->GetBranch(branchname);
1969 if (branch) branch->SetAddress(&((*fRawClusters)[i]));
1973 for (i=0; i<kNCH; i++) {
1974 sprintf(branchname,"%sRecHits1D%d",GetName(),i+1);
1976 branch = treeR->GetBranch(branchname);
1977 if (branch) branch->SetAddress(&((*fRecHits1D)[i]));
1981 for (i=0; i<kNCH; i++) {
1982 sprintf(branchname,"%sRecHits3D%d",GetName(),i+1);
1984 branch = treeR->GetBranch(branchname);
1985 if (branch) branch->SetAddress(&((*fRecHits3D)[i]));
1991 //___________________________________________
1992 void AliRICH::ResetHits()
1994 // Reset number of clusters and the cluster array for this detector
1995 AliDetector::ResetHits();
1998 if (fSDigits) fSDigits->Clear();
1999 if (fCerenkovs) fCerenkovs->Clear();
2003 //____________________________________________
2004 void AliRICH::ResetDigits()
2007 // Reset number of digits and the digits array for this detector
2009 for ( int i=0;i<kNCH;i++ ) {
2010 if (fDchambers && (*fDchambers)[i]) (*fDchambers)[i]->Clear();
2011 if (fNdch) fNdch[i]=0;
2015 //____________________________________________
2016 void AliRICH::ResetRawClusters()
2019 // Reset number of raw clusters and the raw clust array for this detector
2021 for ( int i=0;i<kNCH;i++ ) {
2022 if ((*fRawClusters)[i]) ((TClonesArray*)(*fRawClusters)[i])->Clear();
2023 if (fNrawch) fNrawch[i]=0;
2027 //____________________________________________
2028 void AliRICH::ResetRecHits1D()
2031 // Reset number of raw clusters and the raw clust array for this detector
2034 for ( int i=0;i<kNCH;i++ ) {
2035 if ((*fRecHits1D)[i]) ((TClonesArray*)(*fRecHits1D)[i])->Clear();
2036 if (fNrechits1D) fNrechits1D[i]=0;
2040 //____________________________________________
2041 void AliRICH::ResetRecHits3D()
2044 // Reset number of raw clusters and the raw clust array for this detector
2047 for ( int i=0;i<kNCH;i++ ) {
2048 if ((*fRecHits3D)[i]) ((TClonesArray*)(*fRecHits3D)[i])->Clear();
2049 if (fNrechits3D) fNrechits3D[i]=0;
2053 //___________________________________________
2054 void AliRICH::SetGeometryModel(Int_t id, AliRICHGeometry *geometry)
2058 // Setter for the RICH geometry model
2062 ((AliRICHChamber*) (*fChambers)[id])->GeometryModel(geometry);
2065 //___________________________________________
2066 void AliRICH::SetSegmentationModel(Int_t id, AliSegmentation *segmentation)
2070 // Setter for the RICH segmentation model
2073 ((AliRICHChamber*) (*fChambers)[id])->SetSegmentationModel(segmentation);
2076 //___________________________________________
2077 void AliRICH::SetResponseModel(Int_t id, AliRICHResponse *response)
2081 // Setter for the RICH response model
2084 ((AliRICHChamber*) (*fChambers)[id])->ResponseModel(response);
2087 void AliRICH::SetReconstructionModel(Int_t id, AliRICHClusterFinder *reconst)
2091 // Setter for the RICH reconstruction model (clusters)
2094 ((AliRICHChamber*) (*fChambers)[id])->SetReconstructionModel(reconst);
2097 //___________________________________________
2098 void AliRICH::StepManager()
2101 // Full Step Manager
2105 static Int_t vol[2];
2107 static Float_t hits[22];
2108 static Float_t ckovData[19];
2109 TLorentzVector position;
2110 TLorentzVector momentum;
2113 Float_t localPos[3];
2114 Float_t localMom[4];
2115 Float_t localTheta,localPhi;
2117 Float_t destep, step;
2120 Float_t coscerenkov;
2121 static Float_t eloss, xhit, yhit, tlength;
2122 const Float_t kBig=1.e10;
2124 TClonesArray &lhits = *fHits;
2125 TParticle *current = (TParticle*)(*gAlice->Particles())[gAlice->CurrentTrack()];
2127 //if (current->Energy()>1)
2130 // Only gas gap inside chamber
2131 // Tag chambers and record hits when track enters
2134 id=gMC->CurrentVolID(copy);
2135 Float_t cherenkovLoss=0;
2136 //gAlice->KeepTrack(gAlice->CurrentTrack());
2138 gMC->TrackPosition(position);
2142 //bzero((char *)ckovData,sizeof(ckovData)*19);
2143 ckovData[1] = pos[0]; // X-position for hit
2144 ckovData[2] = pos[1]; // Y-position for hit
2145 ckovData[3] = pos[2]; // Z-position for hit
2146 ckovData[6] = 0; // dummy track length
2147 //ckovData[11] = gAlice->CurrentTrack();
2149 //printf("\n+++++++++++\nTrack: %d\n++++++++++++\n",gAlice->CurrentTrack());
2151 //AliRICH *RICH = (AliRICH *) gAlice->GetDetector("RICH");
2153 /********************Store production parameters for Cerenkov photons************************/
2154 //is it a Cerenkov photon?
2155 if (gMC->TrackPid() == 50000050) {
2157 //if (gMC->VolId("GAP ")==gMC->CurrentVolID(copy))
2159 Float_t ckovEnergy = current->Energy();
2160 //energy interval for tracking
2161 if (ckovEnergy > 5.6e-09 && ckovEnergy < 7.8e-09 )
2162 //if (ckovEnergy > 0)
2164 if (gMC->IsTrackEntering()){ //is track entering?
2165 //printf("Track entered (1)\n");
2166 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2168 if (gMC->IsNewTrack()){ //is it the first step?
2169 //printf("I'm in!\n");
2170 Int_t mother = current->GetFirstMother();
2172 //printf("Second Mother:%d\n",current->GetSecondMother());
2174 ckovData[10] = mother;
2175 ckovData[11] = gAlice->CurrentTrack();
2176 ckovData[12] = 1; //Media where photon was produced 1->Freon, 2->Quarz
2177 //printf("Produced in FREO\n");
2180 //printf("Index: %d\n",fCkovNumber);
2181 } //first step question
2184 if (gMC->IsNewTrack()){ //is it first step?
2185 if (gMC->VolId("QUAR")==gMC->CurrentVolID(copy)) //is it in quarz?
2188 //printf("Produced in QUAR\n");
2190 } //first step question
2192 //printf("Before %d\n",fFreonProd);
2193 } //track entering question
2195 if (ckovData[12] == 1) //was it produced in Freon?
2196 //if (fFreonProd == 1)
2198 if (gMC->IsTrackEntering()){ //is track entering?
2199 //printf("Track entered (2)\n");
2200 //printf("Current volume (should be META): %s\n",gMC->CurrentVolName());
2201 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("META"),gMC->CurrentVolID(copy));
2202 if (gMC->VolId("META")==gMC->CurrentVolID(copy)) //is it in gap?
2204 //printf("Got in META\n");
2205 gMC->TrackMomentum(momentum);
2210 // Z-position for hit
2213 /**************** Photons lost in second grid have to be calculated by hand************/
2215 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2216 Float_t t = (1. - .025 / cophi) * (1. - .05 / cophi);
2218 //printf("grid calculation:%f\n",t);
2222 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2223 //printf("Added One (1)!\n");
2224 //printf("Lost one in grid\n");
2226 /**********************************************************************************/
2229 //printf("Current volume (should be CSI) (1): %s\n",gMC->CurrentVolName());
2230 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2231 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy)) //is it in csi?
2233 //printf("Got in CSI\n");
2234 gMC->TrackMomentum(momentum);
2240 /********* Photons lost by Fresnel reflection have to be calculated by hand********/
2241 /***********************Cerenkov phtons (always polarised)*************************/
2243 Float_t cophi = TMath::Cos(TMath::ATan2(mom[0], mom[1]));
2244 Float_t t = Fresnel(ckovEnergy*1e9,cophi,1);
2249 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2250 //printf("Added One (2)!\n");
2251 //printf("Lost by Fresnel\n");
2253 /**********************************************************************************/
2258 /********************Evaluation of losses************************/
2259 /******************still in the old fashion**********************/
2262 Int_t i1 = gMC->StepProcesses(procs); //number of physics mechanisms acting on the particle
2263 for (Int_t i = 0; i < i1; ++i) {
2265 if (procs[i] == kPLightReflection) { //was it reflected
2267 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2269 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2272 //AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2273 } //reflection question
2276 else if (procs[i] == kPLightAbsorption) { //was it absorbed?
2277 //printf("Got in absorption\n");
2279 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2281 if (gMC->CurrentVolID(copy) == gMC->VolId("QUAR"))
2283 if (gMC->CurrentVolID(copy) == gMC->VolId("META"))
2285 if (gMC->CurrentVolID(copy) == gMC->VolId("GAP "))
2288 if (gMC->CurrentVolID(copy) == gMC->VolId("SRIC"))
2292 if (gMC->CurrentVolID(copy) == gMC->VolId("CSI ")) {
2296 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2297 //printf("Added One (3)!\n");
2298 //printf("Added cerenkov %d\n",fCkovNumber);
2299 } //absorption question
2302 // Photon goes out of tracking scope
2303 else if (procs[i] == kPStop) { //is it below energy treshold?
2306 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2307 //printf("Added One (4)!\n");
2308 } // energy treshold question
2309 } //number of mechanisms cycle
2310 /**********************End of evaluation************************/
2311 } //freon production question
2312 } //energy interval question
2313 //}//inside the proximity gap question
2314 } //cerenkov photon question
2316 /**************************************End of Production Parameters Storing*********************/
2319 /*******************************Treat photons that hit the CsI (Ckovs and Feedbacks)************/
2321 if (gMC->TrackPid() == 50000050 || gMC->TrackPid() == 50000051) {
2322 //printf("Cerenkov\n");
2324 //if (gMC->TrackPid() == 50000051)
2325 //printf("Tracking a feedback\n");
2327 if (gMC->VolId("CSI ")==gMC->CurrentVolID(copy))
2329 //printf("Current volume (should be CSI) (2): %s\n",gMC->CurrentVolName());
2330 //printf("VolId: %d, CurrentVolID: %d\n",gMC->VolId("CSI "),gMC->CurrentVolID(copy));
2331 //printf("Got in CSI\n");
2332 //printf("Tracking a %d\n",gMC->TrackPid());
2333 if (gMC->Edep() > 0.){
2334 gMC->TrackPosition(position);
2335 gMC->TrackMomentum(momentum);
2343 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2344 Double_t rt = TMath::Sqrt(tc);
2345 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2346 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2347 gMC->Gmtod(pos,localPos,1);
2348 gMC->Gmtod(mom,localMom,2);
2350 gMC->CurrentVolOffID(2,copy);
2354 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2355 //->Sector(localPos[0], localPos[2]);
2356 //printf("Sector:%d\n",sector);
2358 /*if (gMC->TrackPid() == 50000051){
2360 printf("Feedbacks:%d\n",fFeedbacks);
2363 ((AliRICHChamber*) (*fChambers)[idvol])
2364 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2366 ckovData[0] = gMC->TrackPid(); // particle type
2367 ckovData[1] = pos[0]; // X-position for hit
2368 ckovData[2] = pos[1]; // Y-position for hit
2369 ckovData[3] = pos[2]; // Z-position for hit
2370 ckovData[4] = theta; // theta angle of incidence
2371 ckovData[5] = phi; // phi angle of incidence
2372 ckovData[8] = (Float_t) fNSDigits; // first sdigit
2373 ckovData[9] = -1; // last pad hit
2374 ckovData[13] = 4; // photon was detected
2375 ckovData[14] = mom[0];
2376 ckovData[15] = mom[1];
2377 ckovData[16] = mom[2];
2379 destep = gMC->Edep();
2380 gMC->SetMaxStep(kBig);
2381 cherenkovLoss += destep;
2382 ckovData[7]=cherenkovLoss;
2384 nPads = Hits2SDigits(localPos[0],localPos[2],cherenkovLoss,idvol,kCerenkov);
2386 if (fNSDigits > (Int_t)ckovData[8]) {
2387 ckovData[8]= ckovData[8]+1;
2388 ckovData[9]= (Float_t) fNSDigits;
2391 //printf("Cerenkov loss: %f\n", cherenkovLoss);
2393 ckovData[17] = nPads;
2394 //printf("nPads:%d",nPads);
2396 //TClonesArray *Hits = RICH->Hits();
2397 AliRICHHit *mipHit = (AliRICHHit*) (fHits->UncheckedAt(0));
2400 mom[0] = current->Px();
2401 mom[1] = current->Py();
2402 mom[2] = current->Pz();
2403 Float_t mipPx = mipHit->fMomX;
2404 Float_t mipPy = mipHit->fMomY;
2405 Float_t mipPz = mipHit->fMomZ;
2407 Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
2408 Float_t rt = TMath::Sqrt(r);
2409 Float_t mipR = mipPx*mipPx + mipPy*mipPy + mipPz*mipPz;
2410 Float_t mipRt = TMath::Sqrt(mipR);
2413 coscerenkov = (mom[0]*mipPx + mom[1]*mipPy + mom[2]*mipPz)/(rt*mipRt);
2419 Float_t cherenkov = TMath::ACos(coscerenkov);
2420 ckovData[18]=cherenkov;
2424 AddHit(gAlice->CurrentTrack(),vol,ckovData);
2425 AddCerenkov(gAlice->CurrentTrack(),vol,ckovData);
2426 //printf("Added One (5)!\n");
2433 /***********************************************End of photon hits*********************************************/
2436 /**********************************************Charged particles treatment*************************************/
2438 else if (gMC->TrackCharge())
2442 /*if (gMC->IsTrackEntering())
2444 hits[13]=20;//is track entering?
2446 if (gMC->VolId("FRE1")==gMC->CurrentVolID(copy) || gMC->VolId("FRE2")==gMC->CurrentVolID(copy))
2448 gMC->TrackMomentum(momentum);
2459 if (gMC->VolId("GAP ")== gMC->CurrentVolID(copy)) {
2460 // Get current particle id (ipart), track position (pos) and momentum (mom)
2462 gMC->CurrentVolOffID(3,copy);
2466 //Int_t sector=((AliRICHChamber*) (*fChambers)[idvol])
2467 //->Sector(localPos[0], localPos[2]);
2468 //printf("Sector:%d\n",sector);
2470 gMC->TrackPosition(position);
2471 gMC->TrackMomentum(momentum);
2479 gMC->Gmtod(pos,localPos,1);
2480 gMC->Gmtod(mom,localMom,2);
2482 ipart = gMC->TrackPid();
2484 // momentum loss and steplength in last step
2485 destep = gMC->Edep();
2486 step = gMC->TrackStep();
2489 // record hits when track enters ...
2490 if( gMC->IsTrackEntering()) {
2491 // gMC->SetMaxStep(fMaxStepGas);
2492 Double_t tc = mom[0]*mom[0]+mom[1]*mom[1];
2493 Double_t rt = TMath::Sqrt(tc);
2494 theta = Float_t(TMath::ATan2(rt,Double_t(mom[2])))*kRaddeg;
2495 phi = Float_t(TMath::ATan2(Double_t(mom[1]),Double_t(mom[0])))*kRaddeg;
2498 Double_t localTc = localMom[0]*localMom[0]+localMom[2]*localMom[2];
2499 Double_t localRt = TMath::Sqrt(localTc);
2500 localTheta = Float_t(TMath::ATan2(localRt,Double_t(localMom[1])))*kRaddeg;
2501 localPhi = Float_t(TMath::ATan2(Double_t(localMom[2]),Double_t(localMom[0])))*kRaddeg;
2503 hits[0] = Float_t(ipart); // particle type
2504 hits[1] = localPos[0]; // X-position for hit
2505 hits[2] = localPos[1]; // Y-position for hit
2506 hits[3] = localPos[2]; // Z-position for hit
2507 hits[4] = localTheta; // theta angle of incidence
2508 hits[5] = localPhi; // phi angle of incidence
2509 hits[8] = (Float_t) fNSDigits; // first sdigit
2510 hits[9] = -1; // last pad hit
2511 hits[13] = fFreonProd; // did id hit the freon?
2515 hits[18] = 0; // dummy cerenkov angle
2521 Chamber(idvol).LocaltoGlobal(localPos,hits+1);
2524 //To make chamber coordinates x-y had to pass localPos[0], localPos[2]
2527 // Only if not trigger chamber
2530 // Initialize hit position (cursor) in the segmentation model
2531 ((AliRICHChamber*) (*fChambers)[idvol])
2532 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2537 // Calculate the charge induced on a pad (disintegration) in case
2539 // Mip left chamber ...
2540 if( gMC->IsTrackExiting() || gMC->IsTrackStop() || gMC->IsTrackDisappeared()){
2541 gMC->SetMaxStep(kBig);
2546 // Only if not trigger chamber
2550 if(gMC->TrackPid() == kNeutron)
2551 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2552 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2554 //printf("nPads:%d",nPads);
2560 if (fNSDigits > (Int_t)hits[8]) {
2562 hits[9]= (Float_t) fNSDigits;
2566 new(lhits[fNhits++]) AliRICHHit(fIshunt,gAlice->CurrentTrack(),vol,hits);
2569 // Check additional signal generation conditions
2570 // defined by the segmentation
2571 // model (boundary crossing conditions)
2573 (((AliRICHChamber*) (*fChambers)[idvol])
2574 ->SigGenCond(localPos[0], localPos[2], localPos[1]))
2576 ((AliRICHChamber*) (*fChambers)[idvol])
2577 ->SigGenInit(localPos[0], localPos[2], localPos[1]);
2580 if(gMC->TrackPid() == kNeutron)
2581 printf("\n\n\n\n\n Neutron Making Pad Hit!!! \n\n\n\n");
2582 nPads = Hits2SDigits(xhit,yhit,eloss,idvol,kMip);
2584 //printf("Npads:%d",NPads);
2591 // nothing special happened, add up energy loss
2598 /*************************************************End of MIP treatment**************************************/
2602 void AliRICH::FindClusters(Int_t nev,Int_t lastEntry)
2606 // Loop on chambers and on cathode planes
2608 for (Int_t icat=1;icat<2;icat++) {
2609 gAlice->ResetDigits();
2610 gAlice->TreeD()->GetEvent(0);
2611 for (Int_t ich=0;ich<kNCH;ich++) {
2612 AliRICHChamber* iChamber=(AliRICHChamber*) (*fChambers)[ich];
2613 TClonesArray *pRICHdigits = this->DigitsAddress(ich);
2614 if (pRICHdigits == 0)
2617 // Get ready the current chamber stuff
2619 AliRICHResponse* response = iChamber->GetResponseModel();
2620 AliSegmentation* seg = iChamber->GetSegmentationModel();
2621 AliRICHClusterFinder* rec = iChamber->GetReconstructionModel();
2623 rec->SetSegmentation(seg);
2624 rec->SetResponse(response);
2625 rec->SetDigits(pRICHdigits);
2626 rec->SetChamber(ich);
2627 if (nev==0) rec->CalibrateCOG();
2628 rec->FindRawClusters();
2631 fRch=RawClustAddress(ich);
2635 gAlice->TreeR()->Fill();
2637 for (int i=0;i<kNCH;i++) {
2638 fRch=RawClustAddress(i);
2639 int nraw=fRch->GetEntriesFast();
2640 printf ("Chamber %d, raw clusters %d\n",i,nraw);
2648 sprintf(hname,"TreeR%d",nev);
2649 gAlice->TreeR()->Write(hname,kOverwrite,0);
2650 gAlice->TreeR()->Reset();
2652 //gObjectTable->Print();
2655 AliRICHSDigit* AliRICH::FirstPad(AliRICHHit* hit,TClonesArray *clusters )
2658 // Initialise the pad iterator
2659 // Return the address of the first sdigit for hit
2660 TClonesArray *theClusters = clusters;
2661 Int_t nclust = theClusters->GetEntriesFast();
2662 if (nclust && hit->fPHlast > 0) {
2663 sMaxIterPad=Int_t(hit->fPHlast);
2664 sCurIterPad=Int_t(hit->fPHfirst);
2665 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2672 AliRICHSDigit* AliRICH::NextPad(TClonesArray *clusters)
2675 // Iterates over pads
2678 if (sCurIterPad <= sMaxIterPad) {
2679 return (AliRICHSDigit*) clusters->UncheckedAt(sCurIterPad-1);
2685 AliRICH& AliRICH::operator=(const AliRICH& rhs)
2687 // Assignment operator
2692 void AliRICH::DiagnosticsFE(Int_t evNumber1=0,Int_t evNumber2=0)
2695 Int_t NpadX = 162; // number of pads on X
2696 Int_t NpadY = 162; // number of pads on Y
2698 Int_t Pad[162][162];
2699 for (Int_t i=0;i<NpadX;i++) {
2700 for (Int_t j=0;j<NpadY;j++) {
2705 // Create some histograms
2707 TH1F *pionspectra1 = new TH1F("pionspectra1","Pion Spectra",200,-4,2);
2708 TH1F *pionspectra2 = new TH1F("pionspectra2","Pion Spectra",200,-4,2);
2709 TH1F *pionspectra3 = new TH1F("pionspectra3","Pion Spectra",200,-4,2);
2710 TH1F *protonspectra1 = new TH1F("protonspectra1","Proton Spectra",200,-4,2);
2711 TH1F *protonspectra2 = new TH1F("protonspectra2","Proton Spectra",200,-4,2);
2712 TH1F *protonspectra3 = new TH1F("protonspectra3","Proton Spectra",200,-4,2);
2713 TH1F *kaonspectra1 = new TH1F("kaonspectra1","Kaon Spectra",100,-4,2);
2714 TH1F *kaonspectra2 = new TH1F("kaonspectra2","Kaon Spectra",100,-4,2);
2715 TH1F *kaonspectra3 = new TH1F("kaonspectra3","Kaon Spectra",100,-4,2);
2716 TH1F *electronspectra1 = new TH1F("electronspectra1","Electron Spectra",100,-4,2);
2717 TH1F *electronspectra2 = new TH1F("electronspectra2","Electron Spectra",100,-4,2);
2718 TH1F *electronspectra3 = new TH1F("electronspectra3","Electron Spectra",100,-4,2);
2719 TH1F *muonspectra1 = new TH1F("muonspectra1","Muon Spectra",100,-4,2);
2720 TH1F *muonspectra2 = new TH1F("muonspectra2","Muon Spectra",100,-4,2);
2721 TH1F *muonspectra3 = new TH1F("muonspectra3","Muon Spectra",100,-4,2);
2722 TH1F *neutronspectra1 = new TH1F("neutronspectra1","Neutron Spectra",100,-4,2);
2723 TH1F *neutronspectra2 = new TH1F("neutronspectra2","Neutron Spectra",100,-4,2);
2724 TH1F *neutronspectra3 = new TH1F("neutronspectra2","Neutron Spectra",100,-4,2);
2725 TH1F *chargedspectra1 = new TH1F("chargedspectra1","Charged particles above 1 GeV Spectra",100,-1,3);
2726 TH1F *chargedspectra2 = new TH1F("chargedspectra2","Charged particles above 1 GeV Spectra",100,-1,3);
2727 TH1F *chargedspectra3 = new TH1F("chargedspectra2","Charged particles above 1 GeV Spectra",100,-1,3);
2728 TH1F *pionptspectrafinal = new TH1F("pionptspectrafinal","Primary Pions Transverse Momenta at HMPID",20,0,5);
2729 TH1F *pionptspectravertex = new TH1F("pionptspectravertex","Primary Pions Transverse Momenta at vertex",20,0,5);
2730 TH1F *kaonptspectrafinal = new TH1F("kaonptspectrafinal","Primary Kaons Transverse Momenta at HMPID",20,0,5);
2731 TH1F *kaonptspectravertex = new TH1F("kaonptspectravertex","Primary Kaons Transverse Momenta at vertex",20,0,5);
2732 //TH1F *hitsPhi = new TH1F("hitsPhi","Distribution of phi angle of incidence",100,-180,180);
2733 TH1F *hitsTheta = new TH1F("hitsTheta","Distribution of Theta angle of incidence, all tracks",100,0,50);
2734 TH1F *hitsTheta500MeV = new TH1F("hitsTheta500MeV","Distribution of Theta angle of incidence, 0.5-1 GeV primary tracks",100,0,50);
2735 TH1F *hitsTheta1GeV = new TH1F("hitsTheta1GeV","Distribution of Theta angle of incidence, 1-2 GeV primary tracks",100,0,50);
2736 TH1F *hitsTheta2GeV = new TH1F("hitsTheta2GeV","Distribution of Theta angle of incidence, 2-3 GeV primary tracks",100,0,50);
2737 TH1F *hitsTheta3GeV = new TH1F("hitsTheta3GeV","Distribution of Theta angle of incidence, >3 GeV primary tracks",100,0,50);
2738 TH2F *production = new TH2F("production","Mother production vertices",100,-300,300,100,0,600);
2743 // Start loop over events
2745 Int_t pion=0, kaon=0, proton=0, electron=0, positron=0, neutron=0, highneutrons=0, muon=0;
2746 Int_t chargedpions=0,primarypions=0,highprimarypions=0,chargedkaons=0,primarykaons=0,highprimarykaons=0;
2747 Int_t photons=0, primaryphotons=0, highprimaryphotons=0;
2750 for (int nev=0; nev<= evNumber2; nev++) {
2751 Int_t nparticles = gAlice->GetEvent(nev);
2754 printf ("Event number : %d\n",nev);
2755 printf ("Number of particles: %d\n",nparticles);
2756 if (nev < evNumber1) continue;
2757 if (nparticles <= 0) return;
2759 // Get pointers to RICH detector and Hits containers
2761 AliRICH *pRICH = (AliRICH *) gAlice->GetDetector("RICH");
2763 TTree *treeH = gAlice->TreeH();
2764 Int_t ntracks =(Int_t) treeH->GetEntries();
2766 // Start loop on tracks in the hits containers
2768 for (Int_t track=0; track<ntracks;track++) {
2769 printf ("Processing Track: %d\n",track);
2770 gAlice->ResetHits();
2771 treeH->GetEvent(track);
2773 for(AliRICHHit* mHit=(AliRICHHit*)pRICH->FirstHit(-1);
2775 mHit=(AliRICHHit*)pRICH->NextHit())
2777 //Int_t nch = mHit->fChamber; // chamber number
2778 //Float_t x = mHit->X(); // x-pos of hit
2779 //Float_t y = mHit->Z(); // y-pos
2780 //Float_t z = mHit->Y();
2781 //Float_t phi = mHit->fPhi; //Phi angle of incidence
2782 Float_t theta = mHit->fTheta; //Theta angle of incidence
2783 Float_t px = mHit->MomX();
2784 Float_t py = mHit->MomY();
2785 Int_t index = mHit->Track();
2786 Int_t particle = (Int_t)(mHit->fParticle);
2791 TParticle *current = gAlice->Particle(index);
2793 //Float_t energy=current->Energy();
2795 R=TMath::Sqrt(current->Vx()*current->Vx() + current->Vy()*current->Vy());
2796 PTfinal=TMath::Sqrt(px*px + py*py);
2797 PTvertex=TMath::Sqrt(current->Px()*current->Px() + current->Py()*current->Py());
2801 if (TMath::Abs(particle) < 10000000)
2803 hitsTheta->Fill(theta,(float) 1);
2806 if (PTvertex>.5 && PTvertex<=1)
2808 hitsTheta500MeV->Fill(theta,(float) 1);
2810 if (PTvertex>1 && PTvertex<=2)
2812 hitsTheta1GeV->Fill(theta,(float) 1);
2814 if (PTvertex>2 && PTvertex<=3)
2816 hitsTheta2GeV->Fill(theta,(float) 1);
2820 hitsTheta3GeV->Fill(theta,(float) 1);
2829 //printf("Particle type: %d\n",current->GetPdgCode());
2830 if (TMath::Abs(particle) < 50000051)
2832 //if (TMath::Abs(particle) == 50000050 || TMath::Abs(particle) == 2112)
2833 if (TMath::Abs(particle) == 2112 || TMath::Abs(particle) == 50000050)
2835 //gMC->Rndm(&random, 1);
2836 if (random->Rndm() < .1)
2837 production->Fill(current->Vz(),R,(float) 1);
2838 if (TMath::Abs(particle) == 50000050)
2839 //if (TMath::Abs(particle) > 50000000)
2845 if (current->Energy()>0.001)
2846 highprimaryphotons +=1;
2849 if (TMath::Abs(particle) == 2112)
2852 if (current->Energy()>0.0001)
2856 if (TMath::Abs(particle) < 50000000)
2858 production->Fill(current->Vz(),R,(float) 1);
2859 //printf("Adding %d at %f\n",particle,R);
2861 //mip->Fill(x,y,(float) 1);
2864 if (TMath::Abs(particle)==211 || TMath::Abs(particle)==111)
2868 pionptspectravertex->Fill(PTvertex,(float) 1);
2869 pionptspectrafinal->Fill(PTfinal,(float) 1);
2873 if (TMath::Abs(particle)==321 || TMath::Abs(particle)==130 || TMath::Abs(particle)==310
2874 || TMath::Abs(particle)==311)
2878 kaonptspectravertex->Fill(PTvertex,(float) 1);
2879 kaonptspectrafinal->Fill(PTfinal,(float) 1);
2884 if (TMath::Abs(particle)==211 || TMath::Abs(particle)==111)
2886 pionspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2887 //printf ("fParticle: %d, PDG code:%d\n",particle,current->GetPdgCode());
2888 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2889 pionspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2892 pionspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2893 //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);
2895 //printf("Pion mass: %e\n",current->GetCalcMass());
2897 if (TMath::Abs(particle)==211)
2903 if (current->Energy()>1)
2904 highprimarypions +=1;
2908 if (TMath::Abs(particle)==2212)
2910 protonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2911 //ptspectra->Fill(Pt,(float) 1);
2912 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2913 protonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2915 protonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2916 //printf("\n\n\n\n\n\n\nProton mass: %e\n\n\n\n\n\n\n\n\n",current->GetCalcMass());
2919 if (TMath::Abs(particle)==321 || TMath::Abs(particle)==130 || TMath::Abs(particle)==310
2920 || TMath::Abs(particle)==311)
2922 kaonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2923 //ptspectra->Fill(Pt,(float) 1);
2924 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2925 kaonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2927 kaonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2928 //printf("Kaon mass: %e\n",current->GetCalcMass());
2930 if (TMath::Abs(particle)==321)
2936 if (current->Energy()>1)
2937 highprimarykaons +=1;
2941 if (TMath::Abs(particle)==11)
2943 electronspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2944 //ptspectra->Fill(Pt,(float) 1);
2945 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2946 electronspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2948 electronspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2949 //printf("Electron mass: %e\n",current->GetCalcMass());
2952 if (particle == -11)
2955 if (TMath::Abs(particle)==13)
2957 muonspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2958 //ptspectra->Fill(Pt,(float) 1);
2959 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2960 muonspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2962 muonspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2963 //printf("Muon mass: %e\n",current->GetCalcMass());
2966 if (TMath::Abs(particle)==2112)
2968 neutronspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2969 //ptspectra->Fill(Pt,(float) 1);
2970 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2971 neutronspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2974 neutronspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2975 //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);
2977 //printf("Neutron mass: %e\n",current->GetCalcMass());
2980 if(TMath::Abs(particle)==211 || TMath::Abs(particle)==2212 || TMath::Abs(particle)==321)
2982 if (current->Energy()-current->GetCalcMass()>1)
2984 chargedspectra1->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2985 if (current->Vx()>5 && current->Vy()>5 && current->Vz()>5)
2986 chargedspectra2->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2988 chargedspectra3->Fill(TMath::Log10(current->Energy() - current->GetCalcMass()),(float) 1);
2991 //printf("Hits:%d\n",hit);
2992 //printf ("Chamber number:%d x:%f y:%f\n",nch,x,y);
2993 // Fill the histograms
2995 //h->Fill(x,y,(float) 1);
3005 //Create canvases, set the view range, show histograms
3007 TCanvas *c2 = new TCanvas("c2","Angles of incidence",150,150,100,150);
3009 //c2->SetFillColor(42);
3012 hitsTheta500MeV->SetFillColor(5);
3013 hitsTheta500MeV->Draw();
3015 hitsTheta1GeV->SetFillColor(5);
3016 hitsTheta1GeV->Draw();
3018 hitsTheta2GeV->SetFillColor(5);
3019 hitsTheta2GeV->Draw();
3021 hitsTheta3GeV->SetFillColor(5);
3022 hitsTheta3GeV->Draw();
3026 TCanvas *c15 = new TCanvas("c15","Mothers Production Vertices",50,50,600,600);
3028 production->SetFillColor(42);
3029 production->SetXTitle("z (m)");
3030 production->SetYTitle("R (m)");
3033 TCanvas *c10 = new TCanvas("c10","Pt Spectra",50,50,600,700);
3036 pionptspectravertex->SetFillColor(5);
3037 pionptspectravertex->SetXTitle("Pt (GeV)");
3038 pionptspectravertex->Draw();
3040 pionptspectrafinal->SetFillColor(5);
3041 pionptspectrafinal->SetXTitle("Pt (GeV)");
3042 pionptspectrafinal->Draw();
3044 kaonptspectravertex->SetFillColor(5);
3045 kaonptspectravertex->SetXTitle("Pt (GeV)");
3046 kaonptspectravertex->Draw();
3048 kaonptspectrafinal->SetFillColor(5);
3049 kaonptspectrafinal->SetXTitle("Pt (GeV)");
3050 kaonptspectrafinal->Draw();
3053 TCanvas *c16 = new TCanvas("c16","Particles Spectra II",150,150,600,350);
3057 //TCanvas *c13 = new TCanvas("c13","Electron Spectra",400,10,600,700);
3058 electronspectra1->SetFillColor(5);
3059 electronspectra1->SetXTitle("log(GeV)");
3060 electronspectra2->SetFillColor(46);
3061 electronspectra2->SetXTitle("log(GeV)");
3062 electronspectra3->SetFillColor(10);
3063 electronspectra3->SetXTitle("log(GeV)");
3065 electronspectra1->Draw();
3066 electronspectra2->Draw("same");
3067 electronspectra3->Draw("same");
3070 //TCanvas *c14 = new TCanvas("c14","Muon Spectra",400,10,600,700);
3071 muonspectra1->SetFillColor(5);
3072 muonspectra1->SetXTitle("log(GeV)");
3073 muonspectra2->SetFillColor(46);
3074 muonspectra2->SetXTitle("log(GeV)");
3075 muonspectra3->SetFillColor(10);
3076 muonspectra3->SetXTitle("log(GeV)");
3078 muonspectra1->Draw();
3079 muonspectra2->Draw("same");
3080 muonspectra3->Draw("same");
3083 //TCanvas *c16 = new TCanvas("c16","Neutron Spectra",400,10,600,700);
3084 //neutronspectra1->SetFillColor(42);
3085 //neutronspectra1->SetXTitle("log(GeV)");
3086 //neutronspectra2->SetFillColor(46);
3087 //neutronspectra2->SetXTitle("log(GeV)");
3088 //neutronspectra3->SetFillColor(10);
3089 //neutronspectra3->SetXTitle("log(GeV)");
3091 //neutronspectra1->Draw();
3092 //neutronspectra2->Draw("same");
3093 //neutronspectra3->Draw("same");
3095 TCanvas *c9 = new TCanvas("c9","Particles Spectra",150,150,600,700);
3096 //TCanvas *c9 = new TCanvas("c9","Pion Spectra",400,10,600,700);
3100 pionspectra1->SetFillColor(5);
3101 pionspectra1->SetXTitle("log(GeV)");
3102 pionspectra2->SetFillColor(46);
3103 pionspectra2->SetXTitle("log(GeV)");
3104 pionspectra3->SetFillColor(10);
3105 pionspectra3->SetXTitle("log(GeV)");
3107 pionspectra1->Draw();
3108 pionspectra2->Draw("same");
3109 pionspectra3->Draw("same");
3112 //TCanvas *c10 = new TCanvas("c10","Proton Spectra",400,10,600,700);
3113 protonspectra1->SetFillColor(5);
3114 protonspectra1->SetXTitle("log(GeV)");
3115 protonspectra2->SetFillColor(46);
3116 protonspectra2->SetXTitle("log(GeV)");
3117 protonspectra3->SetFillColor(10);
3118 protonspectra3->SetXTitle("log(GeV)");
3120 protonspectra1->Draw();
3121 protonspectra2->Draw("same");
3122 protonspectra3->Draw("same");
3125 //TCanvas *c11 = new TCanvas("c11","Kaon Spectra",400,10,600,700);
3126 kaonspectra1->SetFillColor(5);
3127 kaonspectra1->SetXTitle("log(GeV)");
3128 kaonspectra2->SetFillColor(46);
3129 kaonspectra2->SetXTitle("log(GeV)");
3130 kaonspectra3->SetFillColor(10);
3131 kaonspectra3->SetXTitle("log(GeV)");
3133 kaonspectra1->Draw();
3134 kaonspectra2->Draw("same");
3135 kaonspectra3->Draw("same");
3138 //TCanvas *c12 = new TCanvas("c12","Charged Particles Spectra",400,10,600,700);
3139 chargedspectra1->SetFillColor(5);
3140 chargedspectra1->SetXTitle("log(GeV)");
3141 chargedspectra2->SetFillColor(46);
3142 chargedspectra2->SetXTitle("log(GeV)");
3143 chargedspectra3->SetFillColor(10);
3144 chargedspectra3->SetXTitle("log(GeV)");
3146 chargedspectra1->Draw();
3147 chargedspectra2->Draw("same");
3148 chargedspectra3->Draw("same");
3152 printf("*****************************************\n");
3153 printf("* Particle * Counts *\n");
3154 printf("*****************************************\n");
3156 printf("* Pions: * %4d *\n",pion);
3157 printf("* Charged Pions: * %4d *\n",chargedpions);
3158 printf("* Primary Pions: * %4d *\n",primarypions);
3159 printf("* Primary Pions (p>1GeV/c): * %4d *\n",highprimarypions);
3160 printf("* Kaons: * %4d *\n",kaon);
3161 printf("* Charged Kaons: * %4d *\n",chargedkaons);
3162 printf("* Primary Kaons: * %4d *\n",primarykaons);
3163 printf("* Primary Kaons (p>1GeV/c): * %4d *\n",highprimarykaons);
3164 printf("* Muons: * %4d *\n",muon);
3165 printf("* Electrons: * %4d *\n",electron);
3166 printf("* Positrons: * %4d *\n",positron);
3167 printf("* Protons: * %4d *\n",proton);
3168 printf("* All Charged: * %4d *\n",(chargedpions+chargedkaons+muon+electron+positron+proton));
3169 printf("*****************************************\n");
3170 //printf("* Photons: * %3.1f *\n",photons);
3171 //printf("* Primary Photons: * %3.1f *\n",primaryphotons);
3172 //printf("* Primary Photons (p>1MeV/c):* %3.1f *\n",highprimaryphotons);
3173 //printf("*****************************************\n");
3174 //printf("* Neutrons: * %3.1f *\n",neutron);
3175 //printf("* Neutrons (p>100keV/c): * %3.1f *\n",highneutrons);
3176 //printf("*****************************************\n");
3178 if (gAlice->TreeD())
3180 gAlice->TreeD()->GetEvent(0);
3185 printf("\n*****************************************\n");
3186 printf("* Chamber * Digits * Occupancy *\n");
3187 printf("*****************************************\n");
3189 for (Int_t ich=0;ich<7;ich++)
3191 TClonesArray *Digits = DigitsAddress(ich); // Raw clusters branch
3192 Int_t ndigits = Digits->GetEntriesFast();
3193 occ[ich] = Float_t(ndigits)/(160*144);
3194 sum += Float_t(ndigits)/(160*144);
3195 printf("* %d * %d * %3.1f%% *\n",ich,ndigits,occ[ich]*100);
3198 printf("*****************************************\n");
3199 printf("* Mean occupancy * %3.1f%% *\n",mean*100);
3200 printf("*****************************************\n");
3203 printf("\nEnd of analysis\n");
3207 //_________________________________________________________________________________________________
3210 void AliRICH::DiagnosticsSE(Int_t diaglevel,Int_t evNumber1=0,Int_t evNumber2=0)
3213 AliRICH *pRICH = (AliRICH*)gAlice->GetDetector("RICH");
3214 AliRICHSegmentationV0* segmentation;
3215 AliRICHChamber* chamber;
3217 chamber = &(pRICH->Chamber(0));
3218 segmentation=(AliRICHSegmentationV0*) chamber->GetSegmentationModel(0);
3220 Int_t NpadX = segmentation->Npx(); // number of pads on X
3221 Int_t NpadY = segmentation->Npy(); // number of pads on Y
3223 //Int_t Pad[144][160];
3224 /*for (Int_t i=0;i<NpadX;i++) {
3225 for (Int_t j=0;j<NpadY;j++) {
3231 Int_t xmin= -NpadX/2;
3232 Int_t xmax= NpadX/2;
3233 Int_t ymin= -NpadY/2;
3234 Int_t ymax= NpadY/2;
3243 TH2F *hc0 = new TH2F("hc0","Zoom on center of central chamber",150,-30,30,150,-50,10);
3247 printf("Single Ring Hits\n");
3248 feedback = new TH2F("feedback","Feedback hit distribution",150,-30,30,150,-50,10);
3249 mip = new TH2F("mip","Mip hit distribution",150,-30,30,150,-50,10);
3250 cerenkov = new TH2F("cerenkov","Cerenkov hit distribution",150,-30,30,150,-50,10);
3251 h = new TH2F("h","Detector hit distribution",150,-30,30,150,-50,10);
3252 hitsX = new TH1F("hitsX","Distribution of hits along x-axis",150,-30,30);
3253 hitsY = new TH1F("hitsY","Distribution of hits along z-axis",150,-50,10);
3257 printf("Full Event Hits\n");
3259 feedback = new TH2F("feedback","Feedback hit distribution",150,-300,300,150,-300,300);
3260 mip = new TH2F("mip","Mip hit distribution",150,-300,300,150,-300,300);
3261 cerenkov = new TH2F("cerenkov","Cerenkov hit distribution",150,-300,300,150,-300,300);
3262 h = new TH2F("h","Detector hit distribution",150,-300,300,150,-300,300);
3263 hitsX = new TH1F("digitsX","Distribution of hits along x-axis",200,-300,300);
3264 hitsY = new TH1F("digitsY","Distribution of hits along z-axis",200,-300,300);
3269 TH2F *hc1 = new TH2F("hc1","Chamber 1 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3270 TH2F *hc2 = new TH2F("hc2","Chamber 2 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3271 TH2F *hc3 = new TH2F("hc3","Chamber 3 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3272 TH2F *hc4 = new TH2F("hc4","Chamber 4 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3273 TH2F *hc5 = new TH2F("hc5","Chamber 5 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3274 TH2F *hc6 = new TH2F("hc6","Chamber 6 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3275 TH2F *hc7 = new TH2F("hc7","Chamber 7 signal distribution",NpadX,xmin,xmax,NpadY,ymin,ymax);
3277 TH1F *Clcharge = new TH1F("Clcharge","Cluster Charge Distribution",500,0.,500.);
3278 TH1F *ckovangle = new TH1F("ckovangle","Cerenkov angle per photon",200,.3,1);
3279 TH1F *hckphi = new TH1F("hckphi","Cerenkov phi angle per photon",620,-3.1,3.1);
3280 TH1F *mother = new TH1F("mother","Cerenkovs per Mip",75,0.,75.);
3281 TH1F *radius = new TH1F("radius","Mean distance to Mip",100,0.,20.);
3282 TH1F *phspectra1 = new TH1F("phspectra1","Detected Photon Spectra",200,5.,10.);
3283 TH1F *phspectra2 = new TH1F("phspectra2","Produced Photon Spectra",200,5.,10.);
3284 TH1F *totalphotonstrack = new TH1F("totalphotonstrack","Produced Photons per Mip",100,200,700.);
3285 TH1F *totalphotonsevent = new TH1F("totalphotonsevent","Produced Photons per Mip",100,200,700.);
3286 //TH1F *feedbacks = new TH1F("feedbacks","Produced Feedbacks per Mip",50,0.5,50.);
3287 TH1F *padnumber = new TH1F("padnumber","Number of pads per cluster",50,-0.5,50.);
3288 TH1F *padsev = new TH1F("padsev","Number of pads hit per MIP",50,0.5,100.);
3289 TH1F *clusev = new TH1F("clusev","Number of clusters per MIP",50,0.5,50.);
3290 TH1F *photev = new TH1F("photev","Number of detected photons per MIP",50,0.5,50.);
3291 TH1F *feedev = new TH1F("feedev","Number of feedbacks per MIP",50,0.5,50.);
3292 TH1F *padsmip = new TH1F("padsmip","Number of pads per event inside MIP region",50,0.5,50.);
3293 TH1F *padscl = new TH1F("padscl","Number of pads per event from cluster count",50,0.5,100.);
3294 TH1F *pionspectra = new TH1F("pionspectra","Pion Spectra",200,.5,10.);
3295 TH1F *protonspectra = new TH1F("protonspectra","Proton Spectra",200,.5,10.);
3296 TH1F *kaonspectra = new TH1F("kaonspectra","Kaon Spectra",100,.5,10.);
3297 TH1F *chargedspectra = new TH1F("chargedspectra","Charged particles above 1 GeV Spectra",100,.5,10.);
3298 TH1F *hitsPhi = new TH1F("hitsPhi","Distribution of phi angle of incidence",100,0,360);
3299 TH1F *hitsTheta = new TH1F("hitsTheta","Distribution of Theta angle of incidence",100,0,15);
3300 TH1F *Omega1D = new TH1F("omega","Reconstructed Cerenkov angle per track",200,.5,1);
3301 TH1F *Theta = new TH1F("theta","Reconstructed theta incidence angle per track",200,0,15);
3302 TH1F *Phi = new TH1F("phi","Reconstructed phi incidence per track",200,0,360);
3303 TH1F *Omega3D = new TH1F("omega","Reconstructed Cerenkov angle per track",200,.3,1);
3304 TH1F *PhotonCer = new TH1F("photoncer","Reconstructed Cerenkov angle per photon",200,.3,1);
3305 TH2F *PadsUsed = new TH2F("padsused","Pads Used for Reconstruction",100,-30,30,100,-30,30);
3306 TH1F *MeanRadius = new TH1F("radius","Mean Radius for reconstructed track",100,0.,20.);
3308 // Start loop over events
3313 Int_t mothers[80000];
3314 Int_t mothers2[80000];
3322 for (Int_t i=0;i<100;i++) mothers[i]=0;
3324 for (int nev=0; nev<= evNumber2; nev++) {
3325 Int_t nparticles = gAlice->GetEvent(nev);
3328 //cout<<"nev "<<nev<<endl;
3329 printf ("\n**********************************\nProcessing Event: %d\n",nev);
3330 //cout<<"nparticles "<<nparticles<<endl;
3331 printf ("Particles : %d\n\n",nparticles);
3332 if (nev < evNumber1) continue;
3333 if (nparticles <= 0) return;
3335 // Get pointers to RICH detector and Hits containers
3338 TTree *TH = gAlice->TreeH();
3339 Stat_t ntracks = TH->GetEntries();
3341 // Start loop on tracks in the hits containers
3343 for (Int_t track=0; track<ntracks;track++) {
3345 printf ("\nProcessing Track: %d\n",track);
3346 gAlice->ResetHits();
3347 TH->GetEvent(track);
3348 Int_t nhits = pRICH->Hits()->GetEntriesFast();
3349 if (nhits) Nh+=nhits;
3350 printf("Hits : %d\n",nhits);
3351 for(AliRICHHit* mHit=(AliRICHHit*)pRICH->FirstHit(-1);
3353 mHit=(AliRICHHit*)pRICH->NextHit())
3355 //Int_t nch = mHit->fChamber; // chamber number
3356 x = mHit->X(); // x-pos of hit
3357 y = mHit->Z(); // y-pos
3358 Float_t phi = mHit->fPhi; //Phi angle of incidence
3359 Float_t theta = mHit->fTheta; //Theta angle of incidence
3360 Int_t index = mHit->Track();
3361 Int_t particle = (Int_t)(mHit->fParticle);
3362 //Int_t freon = (Int_t)(mHit->fLoss);
3364 hitsX->Fill(x,(float) 1);
3365 hitsY->Fill(y,(float) 1);
3367 //printf("Particle:%9d\n",particle);
3369 TParticle *current = (TParticle*)gAlice->Particle(index);
3370 //printf("Particle type: %d\n",sizeoff(Particles));
3372 hitsTheta->Fill(theta,(float) 1);
3373 //hitsPhi->Fill(phi,(float) 1);
3374 //if (pRICH->GetDebugLevel() == -1)
3375 //printf("Theta:%f, Phi:%f\n",theta,phi);
3377 //printf("Debug Level:%d\n",pRICH->GetDebugLevel());
3379 if (current->GetPdgCode() < 10000000)
3381 mip->Fill(x,y,(float) 1);
3382 //printf("adding mip\n");
3383 //if (current->Energy() - current->GetCalcMass()>1 && freon==1)
3385 hitsPhi->Fill(TMath::Abs(phi),(float) 1);
3386 //hitsTheta->Fill(theta,(float) 1);
3387 //printf("Theta:%f, Phi:%f\n",theta,phi);
3391 if (TMath::Abs(particle)==211 || TMath::Abs(particle)==111)
3393 pionspectra->Fill(current->Energy() - current->GetCalcMass(),(float) 1);
3395 if (TMath::Abs(particle)==2212)
3397 protonspectra->Fill(current->Energy() - current->GetCalcMass(),(float) 1);
3399 if (TMath::Abs(particle)==321 || TMath::Abs(particle)==130 || TMath::Abs(particle)==310
3400 || TMath::Abs(particle)==311)
3402 kaonspectra->Fill(current->Energy() - current->GetCalcMass(),(float) 1);
3404 if(TMath::Abs(particle)==211 || TMath::Abs(particle)==2212 || TMath::Abs(particle)==321)
3406 if (current->Energy() - current->GetCalcMass()>1)
3407 chargedspectra->Fill(current->Energy() - current->GetCalcMass(),(float) 1);
3409 //printf("Hits:%d\n",hit);
3410 //printf ("Chamber number:%d x:%f y:%f\n",nch,x,y);
3411 // Fill the histograms
3413 h->Fill(x,y,(float) 1);
3418 Int_t ncerenkovs = pRICH->Cerenkovs()->GetEntriesFast();
3419 //if (current->GetPdgCode() < 50000051 && current->GetPdgCode() > 50000040)
3420 //totalphotonsevent->Fill(ncerenkovs,(float) 1);
3423 printf("Cerenkovs : %d\n",ncerenkovs);
3424 totalphotonsevent->Fill(ncerenkovs,(float) 1);
3425 for (Int_t hit=0;hit<ncerenkovs;hit++) {
3426 AliRICHCerenkov* cHit = (AliRICHCerenkov*) pRICH->Cerenkovs()->UncheckedAt(hit);
3427 //Int_t nchamber = cHit->fChamber; // chamber number
3428 Int_t index = cHit->Track();
3429 //Int_t pindex = (Int_t)(cHit->fIndex);
3430 Float_t cx = cHit->X(); // x-position
3431 Float_t cy = cHit->Z(); // y-position
3432 Int_t cmother = cHit->fCMother; // Index of mother particle
3433 Int_t closs = (Int_t)(cHit->fLoss); // How did the particle get lost?
3434 Float_t cherenkov = cHit->fCerenkovAngle; //production cerenkov angle
3435 //printf ("Cerenkov hit number %d/%d, X:%d, Y:%d\n",hit,ncerenkovs,cx,cy);
3437 //printf("Particle:%9d\n",index);
3439 TParticle *current = (TParticle*)gAlice->Particle(index);
3440 Float_t energyckov = current->Energy();
3442 if (current->GetPdgCode() == 50000051)
3446 feedback->Fill(cx,cy,(float) 1);
3450 if (current->GetPdgCode() == 50000050)
3455 phspectra2->Fill(energyckov*1e9,(float) 1);
3460 cerenkov->Fill(cx,cy,(float) 1);
3462 //printf ("Cerenkov hit number %d/%d, X:%d, Y:%d\n",hit,ncerenkovs,cx,cy);
3464 //TParticle *MIP = (TParticle*)gAlice->Particle(cmother);
3465 AliRICHHit* mipHit = (AliRICHHit*) pRICH->Hits()->UncheckedAt(0);
3466 mom[0] = current->Px();
3467 mom[1] = current->Py();
3468 mom[2] = current->Pz();
3469 //mom[0] = cHit->fMomX;
3470 // mom[1] = cHit->fMomZ;
3471 //mom[2] = cHit->fMomY;
3472 //Float_t energymip = MIP->Energy();
3473 //Float_t Mip_px = mipHit->fMomFreoX;
3474 //Float_t Mip_py = mipHit->fMomFreoY;
3475 //Float_t Mip_pz = mipHit->fMomFreoZ;
3476 //Float_t Mip_px = MIP->Px();
3477 //Float_t Mip_py = MIP->Py();
3478 //Float_t Mip_pz = MIP->Pz();
3482 //Float_t r = mom[0]*mom[0] + mom[1]*mom[1] + mom[2]*mom[2];
3483 //Float_t rt = TMath::Sqrt(r);
3484 //Float_t Mip_r = Mip_px*Mip_px + Mip_py*Mip_py + Mip_pz*Mip_pz;
3485 //Float_t Mip_rt = TMath::Sqrt(Mip_r);
3486 //Float_t coscerenkov = (mom[0]*Mip_px + mom[1]*Mip_py + mom[2]*Mip_pz)/(rt*Mip_rt+0.0000001);
3487 //Float_t cherenkov = TMath::ACos(coscerenkov);
3488 ckovangle->Fill(cherenkov,(float) 1); //Cerenkov angle calculus
3489 //printf("Cherenkov: %f\n",cherenkov);
3490 Float_t ckphi=TMath::ATan2(mom[0], mom[2]);
3491 hckphi->Fill(ckphi,(float) 1);
3494 //Float_t mix = MIP->Vx();
3495 //Float_t miy = MIP->Vy();
3496 Float_t mx = mipHit->X();
3497 Float_t my = mipHit->Z();
3498 //printf("FX %e, FY %e, VX %e, VY %e\n",cx,cy,mx,my);
3499 Float_t dx = cx - mx;
3500 Float_t dy = cy - my;
3501 //printf("Dx:%f, Dy:%f\n",dx,dy);
3502 Float_t final_radius = TMath::Sqrt(dx*dx+dy*dy);
3503 //printf("Final radius:%f\n",final_radius);
3504 radius->Fill(final_radius,(float) 1);
3506 phspectra1->Fill(energyckov*1e9,(float) 1);
3509 for (Int_t nmothers=0;nmothers<=ntracks;nmothers++){
3510 if (cmother == nmothers){
3512 mothers2[cmother]++;
3523 Int_t nent=(Int_t)gAlice->TreeR()->GetEntries();
3524 gAlice->TreeR()->GetEvent(nent-1);
3525 TClonesArray *Rawclusters = pRICH->RawClustAddress(2); // Raw clusters branch
3526 //printf ("Rawclusters:%p",Rawclusters);
3527 Int_t nrawclusters = Rawclusters->GetEntriesFast();
3530 printf("Raw Clusters : %d\n",nrawclusters);
3531 for (Int_t hit=0;hit<nrawclusters;hit++) {
3532 AliRICHRawCluster* rcHit = (AliRICHRawCluster*) pRICH->RawClustAddress(2)->UncheckedAt(hit);
3533 //Int_t nchamber = rcHit->fChamber; // chamber number
3534 //Int_t nhit = cHit->fHitNumber; // hit number
3535 Int_t qtot = rcHit->fQ; // charge
3536 Float_t fx = rcHit->fX; // x-position
3537 Float_t fy = rcHit->fY; // y-position
3538 //Int_t type = rcHit->fCtype; // cluster type ?
3539 Int_t mult = rcHit->fMultiplicity; // How many pads form the cluster
3542 //printf ("fx: %d, fy: %d\n",fx,fy);
3543 if (fx>(x-4) && fx<(x+4) && fy>(y-4) && fy<(y+4)) {
3544 //printf("There %d \n",mult);
3547 padnumber->Fill(mult,(float) 1);
3549 if (mult<4) Clcharge->Fill(qtot,(float) 1);
3557 TClonesArray *RecHits1D = pRICH->RecHitsAddress1D(2);
3558 Int_t nrechits1D = RecHits1D->GetEntriesFast();
3559 //printf (" nrechits:%d\n",nrechits);
3563 for (Int_t hit=0;hit<nrechits1D;hit++) {
3564 AliRICHRecHit1D* recHit1D = (AliRICHRecHit1D*) pRICH->RecHitsAddress1D(2)->UncheckedAt(hit);
3565 Float_t r_omega = recHit1D->fOmega; // Cerenkov angle
3566 Float_t *cer_pho = recHit1D->fCerPerPhoton; // Cerenkov angle per photon
3567 Int_t *padsx = recHit1D->fPadsUsedX; // Pads Used fo reconstruction (x)
3568 Int_t *padsy = recHit1D->fPadsUsedY; // Pads Used fo reconstruction (y)
3569 Int_t goodPhotons = recHit1D->fGoodPhotons; // Number of pads used for reconstruction
3571 Omega1D->Fill(r_omega,(float) 1);
3573 for (Int_t i=0; i<goodPhotons; i++)
3575 PhotonCer->Fill(cer_pho[i],(float) 1);
3576 PadsUsed->Fill(padsx[i],padsy[i],1);
3577 //printf("Angle:%f, pad: %d %d\n",cer_pho[i],padsx[i],padsy[i]);
3580 //printf("Omega: %f, Theta: %f, Phi: %f\n",r_omega,r_theta,r_phi);
3585 TClonesArray *RecHits3D = pRICH->RecHitsAddress3D(2);
3586 Int_t nrechits3D = RecHits3D->GetEntriesFast();
3587 //printf (" nrechits:%d\n",nrechits);
3591 for (Int_t hit=0;hit<nrechits3D;hit++) {
3592 AliRICHRecHit3D* recHit3D = (AliRICHRecHit3D*) pRICH->RecHitsAddress3D(2)->UncheckedAt(hit);
3593 Float_t r_omega = recHit3D->fOmega; // Cerenkov angle
3594 Float_t r_theta = recHit3D->fTheta; // Theta angle of incidence
3595 Float_t r_phi = recHit3D->fPhi; // Phi angle if incidence
3596 Float_t meanradius = recHit3D->fMeanRadius; // Mean radius for reconstructed point
3598 //printf("rechit %f %f %f %f %f\n",recHit3D->fOmega,recHit3D->fTheta,recHit3D->fPhi, recHit3D->fX,recHit3D->fY);
3600 Omega3D->Fill(r_omega,(float) 1);
3601 Theta->Fill(r_theta*180/TMath::Pi(),(float) 1);
3602 Phi->Fill(r_phi*180/TMath::Pi()-180,(float) 1);
3603 MeanRadius->Fill(meanradius,(float) 1);
3609 for (Int_t nmothers=0;nmothers<ntracks;nmothers++){
3610 totalphotonstrack->Fill(mothers[nmothers],(float) 1);
3611 mother->Fill(mothers2[nmothers],(float) 1);
3612 //printf ("Entries in %d : %d\n",nmothers, mothers[nmothers]);
3615 clusev->Fill(nraw,(float) 1);
3616 photev->Fill(phot,(float) 1);
3617 feedev->Fill(feed,(float) 1);
3618 padsmip->Fill(padmip,(float) 1);
3619 padscl->Fill(pads,(float) 1);
3620 //printf("Photons:%d\n",phot);
3629 gAlice->ResetDigits();
3630 //Int_t nent=(Int_t)gAlice->TreeD()->GetEntries();
3631 gAlice->TreeD()->GetEvent(0);
3637 TClonesArray *Digits = pRICH->DigitsAddress(2);
3638 Int_t ndigits = Digits->GetEntriesFast();
3639 printf("Digits : %d\n",ndigits);
3640 padsev->Fill(ndigits,(float) 1);
3641 for (Int_t hit=0;hit<ndigits;hit++) {
3642 AliRICHDigit* dHit = (AliRICHDigit*) Digits->UncheckedAt(hit);
3643 Int_t qtot = dHit->fSignal; // charge
3644 Int_t ipx = dHit->fPadX; // pad number on X
3645 Int_t ipy = dHit->fPadY; // pad number on Y
3646 //printf("%d, %d\n",ipx,ipy);
3647 if( ipx<=100 && ipy <=100) hc0->Fill(ipx,ipy,(float) qtot);
3653 for (Int_t ich=0;ich<7;ich++)
3655 TClonesArray *Digits = pRICH->DigitsAddress(ich); // Raw clusters branch
3656 Int_t ndigits = Digits->GetEntriesFast();
3657 //printf("Digits:%d\n",ndigits);
3658 padsev->Fill(ndigits,(float) 1);
3660 for (Int_t hit=0;hit<ndigits;hit++) {
3661 AliRICHDigit* dHit = (AliRICHDigit*) Digits->UncheckedAt(hit);
3662 //Int_t nchamber = dHit->fChamber; // chamber number
3663 //Int_t nhit = dHit->fHitNumber; // hit number
3664 Int_t qtot = dHit->fSignal; // charge
3665 Int_t ipx = dHit->fPadX; // pad number on X
3666 Int_t ipy = dHit->fPadY; // pad number on Y
3667 //Int_t iqpad = dHit->fQpad; // charge per pad
3668 //Int_t rpad = dHit->fRSec; // R-position of pad
3669 //printf ("Pad hit, PadX:%d, PadY:%d\n",ipx,ipy);
3670 if( ipx<=100 && ipy <=100 && ich==2) hc0->Fill(ipx,ipy,(float) qtot);
3671 if( ipx<=162 && ipy <=162 && ich==0) hc1->Fill(ipx,ipy,(float) qtot);
3672 if( ipx<=162 && ipy <=162 && ich==1) hc2->Fill(ipx,ipy,(float) qtot);
3673 if( ipx<=162 && ipy <=162 && ich==2) hc3->Fill(ipx,ipy,(float) qtot);
3674 if( ipx<=162 && ipy <=162 && ich==3) hc4->Fill(ipx,ipy,(float) qtot);
3675 if( ipx<=162 && ipy <=162 && ich==4) hc5->Fill(ipx,ipy,(float) qtot);
3676 if( ipx<=162 && ipy <=162 && ich==5) hc6->Fill(ipx,ipy,(float) qtot);
3677 if( ipx<=162 && ipy <=162 && ich==6) hc7->Fill(ipx,ipy,(float) qtot);
3685 //Create canvases, set the view range, show histograms
3703 TClonesArray *RecHits3D = pRICH->RecHitsAddress3D(2);
3704 Int_t nrechits3D = RecHits3D->GetEntriesFast();
3705 TClonesArray *RecHits1D = pRICH->RecHitsAddress1D(2);
3706 Int_t nrechits1D = RecHits1D->GetEntriesFast();
3712 c1 = new TCanvas("c1","Alice RICH digits",50,50,300,350);
3713 hc0->SetXTitle("ix (npads)");
3717 c2 = new TCanvas("c2","Hits per type",100,100,600,700);
3719 //c4->SetFillColor(42);
3722 feedback->SetXTitle("x (cm)");
3723 feedback->SetYTitle("y (cm)");
3727 //mip->SetFillColor(5);
3728 mip->SetXTitle("x (cm)");
3729 mip->SetYTitle("y (cm)");
3733 //cerenkov->SetFillColor(5);
3734 cerenkov->SetXTitle("x (cm)");
3735 cerenkov->SetYTitle("y (cm)");
3739 //h->SetFillColor(5);
3740 h->SetXTitle("x (cm)");
3741 h->SetYTitle("y (cm)");
3744 c3 = new TCanvas("c3","Hits distribution",150,150,600,350);
3746 //c10->SetFillColor(42);
3749 hitsX->SetFillColor(5);
3750 hitsX->SetXTitle("(cm)");
3754 hitsY->SetFillColor(5);
3755 hitsY->SetXTitle("(cm)");
3763 c4 = new TCanvas("c4","Photon Spectra",50,50,600,350);
3765 //c6->SetFillColor(42);
3768 phspectra2->SetFillColor(5);
3769 phspectra2->SetXTitle("energy (eV)");
3772 phspectra1->SetFillColor(5);
3773 phspectra1->SetXTitle("energy (eV)");
3776 c5 = new TCanvas("c5","Particles Spectra",100,100,600,700);
3778 //c9->SetFillColor(42);
3781 pionspectra->SetFillColor(5);
3782 pionspectra->SetXTitle("(GeV)");
3783 pionspectra->Draw();
3786 protonspectra->SetFillColor(5);
3787 protonspectra->SetXTitle("(GeV)");
3788 protonspectra->Draw();
3791 kaonspectra->SetFillColor(5);
3792 kaonspectra->SetXTitle("(GeV)");
3793 kaonspectra->Draw();
3796 chargedspectra->SetFillColor(5);
3797 chargedspectra->SetXTitle("(GeV)");
3798 chargedspectra->Draw();
3807 c6=new TCanvas("c6","Clusters Statistics",50,50,600,700);
3809 //c3->SetFillColor(42);
3814 Clcharge->SetFillColor(5);
3815 Clcharge->SetXTitle("ADC counts");
3818 Clcharge->Fit("expo");
3819 //expo->SetLineColor(2);
3820 //expo->SetLineWidth(3);
3825 padnumber->SetFillColor(5);
3826 padnumber->SetXTitle("(counts)");
3830 clusev->SetFillColor(5);
3831 clusev->SetXTitle("(counts)");
3834 clusev->Fit("gaus");
3835 //gaus->SetLineColor(2);
3836 //gaus->SetLineWidth(3);
3841 padsmip->SetFillColor(5);
3842 padsmip->SetXTitle("(counts)");
3848 c11 = new TCanvas("c11","Cherenkov per Mip",400,10,600,700);
3849 mother->SetFillColor(5);
3850 mother->SetXTitle("counts");
3854 c7 = new TCanvas("c7","Production Statistics",100,100,600,700);
3856 //c7->SetFillColor(42);
3859 totalphotonsevent->SetFillColor(5);
3860 totalphotonsevent->SetXTitle("Photons (counts)");
3863 totalphotonsevent->Fit("gaus");
3864 //gaus->SetLineColor(2);
3865 //gaus->SetLineWidth(3);
3867 totalphotonsevent->Draw();
3870 photev->SetFillColor(5);
3871 photev->SetXTitle("(counts)");
3874 photev->Fit("gaus");
3875 //gaus->SetLineColor(2);
3876 //gaus->SetLineWidth(3);
3881 feedev->SetFillColor(5);
3882 feedev->SetXTitle("(counts)");
3885 feedev->Fit("gaus");
3886 //gaus->SetLineColor(2);
3887 //gaus->SetLineWidth(3);
3892 padsev->SetFillColor(5);
3893 padsev->SetXTitle("(counts)");
3896 padsev->Fit("gaus");
3897 //gaus->SetLineColor(2);
3898 //gaus->SetLineWidth(3);
3909 c8 = new TCanvas("c8","3D reconstruction",50,50,1100,700);
3911 //c2->SetFillColor(42);
3914 hitsPhi->SetFillColor(5);
3917 hitsTheta->SetFillColor(5);
3920 ckovangle->SetFillColor(5);
3921 ckovangle->SetXTitle("angle (radians)");
3924 radius->SetFillColor(5);
3925 radius->SetXTitle("radius (cm)");
3928 Phi->SetFillColor(5);
3931 Theta->SetFillColor(5);
3934 Omega3D->SetFillColor(5);
3935 Omega3D->SetXTitle("angle (radians)");
3938 MeanRadius->SetFillColor(5);
3939 MeanRadius->SetXTitle("radius (cm)");
3946 c9 = new TCanvas("c9","1D Reconstruction",100,100,1100,700);
3948 //c5->SetFillColor(42);
3951 ckovangle->SetFillColor(5);
3952 ckovangle->SetXTitle("angle (radians)");
3956 radius->SetFillColor(5);
3957 radius->SetXTitle("radius (cm)");
3961 hc0->SetXTitle("pads");
3965 Omega1D->SetFillColor(5);
3966 Omega1D->SetXTitle("angle (radians)");
3970 PhotonCer->SetFillColor(5);
3971 PhotonCer->SetXTitle("angle (radians)");
3975 PadsUsed->SetXTitle("pads");
3976 PadsUsed->Draw("box");
3983 printf("Drawing histograms.../n");
3987 c10 = new TCanvas("c10","Alice RICH digits",50,50,1200,700);
3989 //c1->SetFillColor(42);
3992 hc1->SetXTitle("ix (npads)");
3995 hc2->SetXTitle("ix (npads)");
3998 hc3->SetXTitle("ix (npads)");
4001 hc4->SetXTitle("ix (npads)");
4004 hc5->SetXTitle("ix (npads)");
4007 hc6->SetXTitle("ix (npads)");
4010 hc7->SetXTitle("ix (npads)");
4013 hc0->SetXTitle("ix (npads)");
4017 c11 = new TCanvas("c11","Hits per type",100,100,600,700);
4019 //c4->SetFillColor(42);
4022 feedback->SetXTitle("x (cm)");
4023 feedback->SetYTitle("y (cm)");
4027 //mip->SetFillColor(5);
4028 mip->SetXTitle("x (cm)");
4029 mip->SetYTitle("y (cm)");
4033 //cerenkov->SetFillColor(5);
4034 cerenkov->SetXTitle("x (cm)");
4035 cerenkov->SetYTitle("y (cm)");
4039 //h->SetFillColor(5);
4040 h->SetXTitle("x (cm)");
4041 h->SetYTitle("y (cm)");
4044 c12 = new TCanvas("c12","Hits distribution",150,150,600,350);
4046 //c10->SetFillColor(42);
4049 hitsX->SetFillColor(5);
4050 hitsX->SetXTitle("(cm)");
4054 hitsY->SetFillColor(5);
4055 hitsY->SetXTitle("(cm)");
4063 // calculate the number of pads which give a signal
4067 /*for (Int_t i=0;i< NpadX;i++) {
4068 for (Int_t j=0;j< NpadY;j++) {
4074 //printf("The total number of pads which give a signal: %d %d\n",Nh,Nh1);
4075 printf("\nEnd of analysis\n");
4076 printf("**********************************\n");