]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSv0hits.cxx
2d45f6ef3bdb48aa4a204070e2301b4a22644f06
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv0hits.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /* $Id$ */
17 //_________________________________________________________________________
18 // Version of AliPHOSv0 which allows for keeping all hits in TreeH
19 //                  
20 //*-- Author: Gines MARTINEZ (SUBATECH)
21
22
23 // --- ROOT system ---
24
25 #include "TBRIK.h"
26 #include "TNode.h"
27 #include "TRandom.h"
28
29 // --- Standard library ---
30
31 #include <stdio.h>
32 #include <string.h>
33 #include <stdlib.h>
34 #include <strstream.h>
35
36 // --- AliRoot header files ---
37
38 #include "AliPHOSv0hits.h"
39 #include "AliPHOSHit.h"
40 #include "AliPHOSDigit.h"
41 #include "AliPHOSReconstructioner.h"
42 #include "AliRun.h"
43 #include "AliConst.h"
44
45 ClassImp(AliPHOSv0hits)
46
47 //____________________________________________________________________________
48 AliPHOSv0hits::AliPHOSv0hits()
49 {
50   // ctor
51   fNTmpHits = 0 ; 
52   fTmpHits  = 0 ; 
53 }
54
55 //____________________________________________________________________________
56 AliPHOSv0hits::AliPHOSv0hits(const char *name, const char *title):
57   AliPHOSv0(name,title)
58 {
59    fHits= new TClonesArray("AliPHOSHit",1000) ;
60 }
61
62 //____________________________________________________________________________
63 AliPHOSv0hits::~AliPHOSv0hits()
64 {
65   // dtor
66   fTmpHits->Delete() ; 
67   delete fTmpHits ;
68   fTmpHits = 0 ; 
69
70   fEmcRecPoints->Delete() ; 
71   delete fEmcRecPoints ; 
72   fEmcRecPoints = 0 ; 
73
74   fPpsdRecPoints->Delete() ;
75   delete fPpsdRecPoints ;
76   fPpsdRecPoints = 0 ; 
77
78   fTrackSegments->Delete() ; 
79   delete fTrackSegments ;
80   fTrackSegments = 0 ; 
81  
82 }
83
84 //____________________________________________________________________________
85 void AliPHOSv0hits::AddHit(Int_t tracknumber, Int_t Id, Float_t * hits)
86 {
87   // Add a hit to the hit list.
88   // In this version of AliPHOSv0, a PHOS hit is real geant 
89   // hits in a single crystal or in a single PPSD gas cell
90
91   //  cout << "Tracknumber is " << tracknumber << endl;
92   //cout << "Vol Id is " << Id << endl;
93   //cout << "hits is " << hits[0] << "  " << hits[1] << "  " << hits[2] << "   " << hits[3] <<endl;
94
95   //  cout << " Adding a hit number " << fNhits << endl ;
96
97   TClonesArray &ltmphits = *fHits ;
98   AliPHOSHit *newHit ;
99
100   //  fHits->Print("");
101
102   newHit = new AliPHOSHit(tracknumber, Id, hits) ;
103
104   // We DO want to save in TreeH the raw hits 
105   //  TClonesArray &lhits = *fHits;
106   //  cout << " Adding a hit to fHits TCloneArray number " << fNhits << endl ;     
107   new(ltmphits[fNhits]) AliPHOSHit(*newHit) ;
108   fNhits++ ;
109
110   // cout << " Added a hit to fHits TCloneArray number " << fNhits << endl ; 
111   // We do not want to save in TreeH the raw hits 
112   //   new(lhits[fNhits]) AliPHOSHit(*newHit) ;    
113   //   fNhits++ ;
114
115   // Please note that the fTmpHits array must survive up to the
116   // end of the events, so it does not appear e.g. in ResetHits() (
117   // which is called at the end of each primary).  
118
119   delete newHit;
120
121 }
122
123
124
125
126 //___________________________________________________________________________
127 void AliPHOSv0hits::FinishEvent()
128 {
129   // Makes the digits from the sum of summed hit in a single crystal or PPSD gas cell
130   // Adds to the energy the electronic noise
131   // Keeps digits with energy above fDigitThreshold
132
133   // Save the cumulated hits instead of raw hits (need to create the branch myself)
134   // It is put in the Digit Tree because the TreeH is filled after each primary
135   // and the TreeD at the end of the event.
136   
137   Int_t i ;
138   Int_t relid[4];
139   Int_t j ; 
140   TClonesArray &lDigits = *fDigits ;
141   AliPHOSHit  * hit ;
142   AliPHOSDigit * newdigit ;
143   AliPHOSDigit * curdigit ;
144   Bool_t deja = kFALSE ; 
145   
146   for ( i = 0 ; i < fNhits ; i++ ) {
147     hit = (AliPHOSHit*)fHits->At(i) ;
148     newdigit = new AliPHOSDigit( hit->GetPrimary(), hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
149     deja =kFALSE ;
150     for ( j = 0 ; j < fNdigits ;  j++) { 
151       curdigit = (AliPHOSDigit*) lDigits[j] ;
152       if ( *curdigit == *newdigit) {
153         *curdigit = *curdigit + *newdigit ; 
154         deja = kTRUE ; 
155       }
156     }
157     if ( !deja ) {
158       new(lDigits[fNdigits]) AliPHOSDigit(* newdigit) ;
159       fNdigits++ ;  
160     }
161  
162     delete newdigit ;    
163   } 
164   
165   // Noise induced by the PIN diode of the PbWO crystals
166
167   Float_t energyandnoise ;
168   for ( i = 0 ; i < fNdigits ; i++ ) {
169     newdigit =  (AliPHOSDigit * ) fDigits->At(i) ;
170     fGeom->AbsToRelNumbering(newdigit->GetId(), relid) ;
171
172     if (relid[1]==0){   // Digits belong to EMC (PbW0_4 crystals)
173       energyandnoise = newdigit->GetAmp() + Digitize(gRandom->Gaus(0., fPinElectronicNoise)) ;
174
175       if (energyandnoise < 0 ) 
176         energyandnoise = 0 ;
177
178       if ( newdigit->GetAmp() < fDigitThreshold ) // if threshold not surpassed, remove digit from list
179         fDigits->RemoveAt(i) ; 
180     }
181   }
182   
183   fDigits->Compress() ;  
184
185   fNdigits =  fDigits->GetEntries() ; 
186   for (i = 0 ; i < fNdigits ; i++) { 
187     newdigit = (AliPHOSDigit *) fDigits->At(i) ; 
188     newdigit->SetIndexInList(i) ; 
189   }
190
191 }
192
193 void AliPHOSv0hits::StepManager(void)
194 {
195   // Accumulates hits as long as the track stays in a single crystal or PPSD gas Cell
196
197   Int_t          relid[4] ;      // (box, layer, row, column) indices
198   Float_t        xyze[4] ;       // position wrt MRS and energy deposited
199   TLorentzVector pos ;
200   Int_t copy ;
201
202   Int_t tracknumber =  gAlice->CurrentTrack() ; 
203
204   TString name = fGeom->GetName() ; 
205   if ( name == "GPS2" ) { // the CPV is a PPSD
206     if( gMC->CurrentVolID(copy) == gMC->VolId("GCEL") ) // We are inside a gas cell 
207     {
208       gMC->TrackPosition(pos) ;
209       xyze[0] = pos[0] ;
210       xyze[1] = pos[1] ;
211       xyze[2] = pos[2] ;
212       xyze[3] = gMC->Edep() ; 
213
214       if ( xyze[3] != 0 ) { // there is deposited energy 
215         gMC->CurrentVolOffID(5, relid[0]) ;  // get the PHOS Module number
216         gMC->CurrentVolOffID(3, relid[1]) ;  // get the Micromegas Module number 
217       // 1-> Geom->GetNumberOfModulesPhi() *  fGeom->GetNumberOfModulesZ() upper                         
218       //  >  fGeom->GetNumberOfModulesPhi()  *  fGeom->GetNumberOfModulesZ() lower
219         gMC->CurrentVolOffID(1, relid[2]) ;  // get the row number of the cell
220         gMC->CurrentVolID(relid[3]) ;        // get the column number 
221
222         // get the absolute Id number
223
224         Int_t absid ; 
225         fGeom->RelToAbsNumbering(relid, absid) ; 
226
227         // add current hit to the hit list      
228         AddHit(tracknumber, absid, xyze);
229
230       } // there is deposited energy 
231      } // We are inside the gas of the CPV  
232    } // GPS2 configuration
233   
234    if(gMC->CurrentVolID(copy) == gMC->VolId("PXTL") )  //  We are inside a PBWO crystal
235      {
236        gMC->TrackPosition(pos) ;
237        xyze[0] = pos[0] ;
238        xyze[1] = pos[1] ;
239        xyze[2] = pos[2] ;
240        xyze[3] = gMC->Edep() ;
241
242        if ( xyze[3] != 0 ) {
243           gMC->CurrentVolOffID(10, relid[0]) ; // get the PHOS module number ;
244           relid[1] = 0   ;                    // means PBW04
245           gMC->CurrentVolOffID(4, relid[2]) ; // get the row number inside the module
246           gMC->CurrentVolOffID(3, relid[3]) ; // get the cell number inside the module
247
248       // get the absolute Id number
249
250           Int_t absid ; 
251           fGeom->RelToAbsNumbering(relid, absid) ; 
252  
253       // add current hit to the hit list
254
255           AddHit(tracknumber, absid, xyze);
256     
257        } // there is deposited energy
258     } // we are inside a PHOS Xtal
259 }
260