3 ////////////////////////////////////////////////
4 // Manager and hits classes for set:MUON //
5 ////////////////////////////////////////////////
6 #include "AliDetector.h"
8 #include "AliMUONConst.h"
11 #include <TObjArray.h>
14 static const int NCH=14;
18 class AliMUONRecCluster;
19 //----------------------------------------------
24 virtual ~AliMUONgeometry(){}
25 void InitGeo(Float_t z);
26 Float_t fdGas; // half gaz gap
27 Float_t fdAlu; // half Alu width
28 Float_t frMin; // innermost sensitive radius
29 Float_t frMax; // outermost sensitive radius
30 ClassDef(AliMUONgeometry,1)
32 //----------------------------------------------
34 // Chamber segmentation virtual base class
36 class AliMUONsegmentation :
41 // Set Chamber Segmentation Parameters
42 virtual void SetPADSIZ(Float_t p1, Float_t p2) =0;
43 virtual void SetDAnod(Float_t D) =0;
44 // Transform from pad (wire) to real coordinates and vice versa
45 virtual Float_t GetAnod(Float_t xhit) =0;
46 virtual void GetPadIxy(Float_t x ,Float_t y ,Int_t &ix,Int_t &iy)=0;
47 virtual void GetPadCxy(Int_t ix,Int_t iy,Float_t &x ,Float_t &y )=0;
50 virtual void Init(AliMUONchamber*) =0;
53 virtual Float_t Dpx() =0;
54 virtual Float_t Dpy() =0;
55 virtual Int_t Npx() =0;
56 virtual Int_t Npy() =0;
59 virtual void FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy) =0;
60 virtual void NextPad()=0;
61 virtual Int_t MorePads() =0;
62 // Get next neighbours
63 virtual void Neighbours
64 (Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10]) =0;
65 // Provisory RecCluster coordinates reconstructor
66 virtual void FitXY(AliMUONRecCluster* Cluster,TClonesArray* MUONdigits) =0;
68 // Current pad cursor during disintegration
69 virtual Int_t Ix() =0;
70 virtual Int_t Iy() =0;
71 virtual Int_t ISector() =0;
73 // Signal Generation Condition during Stepping
74 virtual Int_t SigGenCond(Float_t x, Float_t y, Float_t z) = 0;
75 virtual void SigGenInit(Float_t x, Float_t y, Float_t z) = 0;
76 virtual void IntegrationLimits
77 (Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2) = 0;
80 virtual char* YourName() =0;
81 ClassDef(AliMUONsegmentation,1)
83 //----------------------------------------------
85 // Chamber response virtual base class
87 class AliMUONresponse :
91 // Configuration methods
92 virtual void SetRSIGM(Float_t p1) =0;
93 virtual void SetMUCHSP(Float_t p1) =0;
94 virtual void SetMUSIGM(Float_t p1, Float_t p2) =0;
95 virtual void SetMAXADC(Float_t p1) =0;
98 virtual Float_t Chslope() =0;
99 virtual Float_t ChwX() =0;
100 virtual Float_t ChwY() =0;
101 virtual Float_t Nsigma() =0;
102 virtual Float_t adc_satm() =0;
104 // Chamber response methods
105 // Pulse height from scored quantity (eloss)
106 virtual Float_t IntPH(Float_t eloss) =0;
107 // Charge disintegration
108 virtual Float_t IntXY(AliMUONsegmentation *) =0;
111 virtual char* YourName() =0;
112 ClassDef(AliMUONresponse,1)
115 //----------------------------------------------
116 class AliMUONchamber :
118 public AliMUONgeometry{
123 // Set and get GEANT id
124 Int_t GetGid() {return fGid;}
125 void SetGid(Int_t id) {fGid=id;}
127 // Initialisation and z-Position
129 void SetZPOS(Float_t p1) {fzPos=p1;}
130 Float_t ZPosition() {return fzPos;}
132 // Configure response model
133 void ResponseModel(AliMUONresponse* thisResponse) {fResponse=thisResponse;}
135 // Configure segmentation model
136 void SegmentationModel(Int_t i, AliMUONsegmentation* thisSegmentation) {
137 (*fSegmentation)[i-1] = thisSegmentation;
140 // Get reference to response model
141 AliMUONresponse* &GetResponseModel(){return fResponse;}
143 // Get reference to segmentation model
144 AliMUONsegmentation* GetSegmentationModel(Int_t isec) {
145 return (AliMUONsegmentation *) (*fSegmentation)[isec-1];
147 Int_t Nsec() {return fnsec;}
148 void SetNsec(Int_t nsec) {fnsec=nsec;}
150 // Member function forwarding to the segmentation and response models
152 // Calculate pulse height from energy loss
153 Float_t IntPH(Float_t eloss) {return fResponse->IntPH(eloss);}
155 // Ask segmentation if signal should be generated
156 Int_t SigGenCond(Float_t x, Float_t y, Float_t z)
159 return ((AliMUONsegmentation*) (*fSegmentation)[0])
160 ->SigGenCond(x, y, z) ;
162 return (((AliMUONsegmentation*) (*fSegmentation)[0])
163 ->SigGenCond(x, y, z)) ||
164 (((AliMUONsegmentation*) (*fSegmentation)[1])
165 ->SigGenCond(x, y, z)) ;
169 // Initialisation of segmentation for hit
170 void SigGenInit(Float_t x, Float_t y, Float_t z)
174 ((AliMUONsegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
176 ((AliMUONsegmentation*) (*fSegmentation)[0])->SigGenInit(x, y, z) ;
177 ((AliMUONsegmentation*) (*fSegmentation)[1])->SigGenInit(x, y, z) ;
181 // Configuration forwarding
183 void SetRSIGM(Float_t p1) {fResponse->SetRSIGM(p1);}
184 void SetMUCHSP(Float_t p1) {fResponse->SetMUCHSP(p1);}
185 void SetMUSIGM(Float_t p1, Float_t p2) {fResponse->SetMUSIGM(p1,p2);}
186 void SetMAXADC(Float_t p1) {fResponse->SetMAXADC(p1);}
188 void SetPADSIZ(Int_t isec, Float_t p1, Float_t p2) {
189 ((AliMUONsegmentation*) (*fSegmentation)[isec-1])->SetPADSIZ(p1,p2);
192 // Cluster formation method
193 void DisIntegration(Float_t, Float_t, Float_t, Int_t&x, Float_t newclust[6][500]);
194 ClassDef(AliMUONchamber,1)
197 // GEANT volume if for sensitive volume of this chamber
199 // z-position of this chamber
201 // The segmentation models for the cathode planes
202 // fnsec=1: one plane segmented, fnsec=2: both planes are segmented.
204 TObjArray *fSegmentation;
205 AliMUONresponse *fResponse;
211 class AliMUONcluster : public TObject {
214 Int_t fHitNumber; // Hit number
215 Int_t fCathode; // Cathode number
216 Int_t fQ ; // Total charge
217 Int_t fPadX ; // Pad number along X
218 Int_t fPadY ; // Pad number along Y
219 Int_t fQpad ; // Charge per pad
220 Int_t fRSec ; // R -sector of pad
224 fHitNumber=fQ=fPadX=fPadY=fQpad=fRSec=0;
226 AliMUONcluster(Int_t *clhits);
227 virtual ~AliMUONcluster() {;}
229 ClassDef(AliMUONcluster,1) //Cluster object for set:MUON
233 class AliMUONreccluster : public TObject {
236 Int_t fTracks[3]; //labels of overlapped tracks
238 Int_t fQ ; // Q of cluster (in ADC counts)
239 Float_t fX ; // X of cluster
240 Float_t fY ; // Y of cluster
243 AliMUONreccluster() {
244 fTracks[0]=fTracks[1]=fTracks[2]=0;
247 virtual ~AliMUONreccluster() {;}
249 ClassDef(AliMUONreccluster,1) //Cluster object for set:MUON
252 //_____________________________________________________________________________
254 class AliMUONdigit : public TObject {
256 Int_t fPadX; // Pad number along x
257 Int_t fPadY ; // Pad number along y
258 Int_t fSignal; // Signal amplitude
261 Int_t fTcharges[10]; // charge per track making this digit (up to 10)
262 Int_t fTracks[10]; // tracks making this digit (up to 10)
268 AliMUONdigit(Int_t *digits);
269 AliMUONdigit(Int_t *tracks, Int_t *charges, Int_t *digits);
270 virtual ~AliMUONdigit() {}
273 ClassDef(AliMUONdigit,1) //Digits for set:MUON
275 //_____________________________________________________________________________
277 class AliMUONlist : public AliMUONdigit {
280 Int_t fRpad; // r_pos of pad
282 TObjArray *fTrackList;
286 AliMUONlist() {fTrackList=0;}
287 AliMUONlist(Int_t rpad, Int_t *digits);
288 virtual ~AliMUONlist() {}
290 TObjArray *TrackList() {return fTrackList;}
292 ClassDef(AliMUONlist,1) //Digits for set:MUON
294 //___________________________________________
297 //___________________________________________
299 class AliMUONhit : public AliHit {
301 Int_t fChamber; // Chamber number
302 Float_t fParticle; // Geant3 particle type
303 Float_t fTheta ; // Incident theta angle in degrees
304 Float_t fPhi ; // Incident phi angle in degrees
305 Float_t fTlength; // Track length inside the chamber
306 Float_t fEloss; // ionisation energy loss in gas
307 Int_t fPHfirst; // first padhit
308 Int_t fPHlast; // last padhit
311 AliMUONhit(Int_t fIshunt, Int_t track, Int_t *vol, Float_t *hits);
312 virtual ~AliMUONhit() {}
314 ClassDef(AliMUONhit,1) //Hits object for set:MUON
317 class AliMUON : public AliDetector {
320 AliMUON(const char *name, const char *title);
322 virtual void AddHit(Int_t, Int_t*, Float_t*);
323 virtual void AddCluster(Int_t*);
324 virtual void AddDigits(Int_t, Int_t*, Int_t*, Int_t*);
325 virtual void AddRecCluster(Int_t iCh, Int_t iCat,
326 AliMUONRecCluster* Cluster);
327 virtual void BuildGeometry();
328 virtual void CreateGeometry() {}
329 virtual void CreateMaterials() {}
330 virtual void StepManager();
331 Int_t DistancetoPrimitive(Int_t px, Int_t py);
332 virtual Int_t IsVersion() const =0;
334 TClonesArray *Clusters() {return fClusters;}
335 virtual void MakeBranch(Option_t *opt=" ");
336 void SetTreeAddress();
337 virtual void ResetHits();
338 virtual void ResetDigits();
339 virtual void ResetRecClusters();
340 virtual void ReconstructClusters();
342 // Configuration Methods (per station id)
344 // Set Chamber Segmentation Parameters
345 // id refers to the station and isec to the cathode plane
346 virtual void SetPADSIZ(Int_t id, Int_t isec, Float_t p1, Float_t p2);
348 // Set Signal Generation Parameters
349 virtual void SetRSIGM(Int_t id, Float_t p1);
350 virtual void SetMUCHSP(Int_t id, Float_t p1);
351 virtual void SetMUSIGM(Int_t id, Float_t p1, Float_t p2);
352 virtual void SetMAXADC(Int_t id, Float_t p1);
353 // Set Segmentation and Response Model
354 virtual void SetSegmentationModel(Int_t id, Int_t isec, AliMUONsegmentation *segmentation);
355 virtual void SetResponseModel(Int_t id, AliMUONresponse *response);
356 virtual void SetNsec(Int_t id, Int_t nsec);
357 // Set Stepping Parameters
358 virtual void SetSMAXAR(Float_t p1);
359 virtual void SetSMAXAL(Float_t p1);
360 virtual void SetDMAXAR(Float_t p1);
361 virtual void SetDMAXAL(Float_t p1);
362 virtual void SetMUONACC(Bool_t acc=0, Float_t angmin=2, Float_t angmax=9);
363 // Response Simulation
364 virtual void MakePadHits(Float_t xhit,Float_t yhit,Float_t eloss,Int_t id);
365 // Return reference to Chamber #id
366 virtual AliMUONchamber& Chamber(Int_t id) {return *((AliMUONchamber *) (*fChambers)[id]);}
367 // Retrieve pad hits for a given Hit
368 virtual AliMUONcluster* FirstPad(AliMUONhit *);
369 virtual AliMUONcluster* NextPad();
370 // Return pointers to digits
371 TObjArray *Dchambers() {return fDchambers;}
372 Int_t *Ndch() {return fNdch;}
373 virtual TClonesArray *DigitsAddress(Int_t id) {return ((TClonesArray *) (*fDchambers)[id]);}
374 // Return pointers to reconstructed clusters
375 virtual TObjArray *RecClusters(Int_t iCh, Int_t iCat)
376 {return ( (TObjArray*) (*fRecClusters)[iCh+iCat*10]);}
380 TObjArray *fChambers; // List of Tracking Chambers
381 Int_t fNclusters; // Number of clusters
382 TClonesArray *fClusters; // List of clusters
383 TObjArray *fDchambers; // List of digits
384 TObjArray *fRecClusters; // List of clusters
385 Int_t *fNdch; // Number of digits
387 Bool_t fAccCut; //Transport acceptance cut
388 Float_t fAccMin; //Minimum acceptance cut used during transport
389 Float_t fAccMax; //Minimum acceptance cut used during transport
392 // Stepping Parameters
393 Float_t fMaxStepGas; // Maximum step size inside the chamber gas
394 Float_t fMaxStepAlu; // Maximum step size inside the chamber aluminum
395 Float_t fMaxDestepGas; // Maximum relative energy loss in gas
396 Float_t fMaxDestepAlu; // Maximum relative energy loss in aluminum
400 ClassDef(AliMUON,1) //Hits manager for set:MUON
402 //___________________________________________
403 class AliMUONRecCluster : public TObject {
405 AliMUONRecCluster() ;
406 AliMUONRecCluster(Int_t FirstDigit,Int_t Ichamber, Int_t Icathod) ;
407 virtual ~AliMUONRecCluster();
408 virtual void AddDigit(Int_t Digit);
409 virtual Int_t FirstDigitIndex();
410 virtual Int_t NextDigitIndex();
411 virtual Int_t InvalidDigitIndex() {return -1;}
413 virtual Int_t NDigits();
414 virtual void Finish(); // Nothing yet ...
415 virtual Int_t GetCathod() {return fCathod;}
416 virtual Int_t GetChamber() {return fChamber;}
419 Float_t fX; // reconstructed x
420 Float_t fY; // reconstructed y
423 TArrayI *fDigits; // List of digits indexes for that cluster
424 Int_t fNdigit; // Number of digits indexes stored;
425 Int_t fCathod; // Number of the cathod to be used;
426 Int_t fChamber; // Number of the chamber to be used;
427 Int_t fCurrentDigit; // Current Digit inside an iteration
429 ClassDef(AliMUONRecCluster,1) //Cluster object for set:MUON
431 //___________________________________________