]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONClusterReconstructor.cxx
New numbering of motif positions.
[u/mrichter/AliRoot.git] / MUON / AliMUONClusterReconstructor.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 ////////////////////////////////////
19 //
20 // MUON cluster reconstructor for MUON
21 //
22 // Should implement a virtual class ClusterFinder to chose between VS and AZ method
23 ////////////////////////////////////
24
25 #include "AliMUONClusterReconstructor.h"
26 #include "AliRun.h" // for gAlice
27 #include "AliRunLoader.h"
28 #include "AliLoader.h"
29
30 #include "AliMUON.h"
31 #include "AliMUONDigit.h"
32 #include "AliMUONConstants.h"
33 #include "AliMUONData.h"
34 #include "AliMUONClusterFinderVS.h"
35 #include "AliMUONClusterInput.h"
36 #include "AliMUONRawCluster.h"
37 #include "AliRawReader.h" // for raw data
38 #include "AliLog.h"
39
40
41 const Int_t AliMUONClusterReconstructor::fgkDefaultPrintLevel = 0;
42
43 ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
44
45 //__________________________________________________________________________
46 AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliLoader* loader)
47   : TObject(),
48     fMUONData(0),
49     fPrintLevel(fgkDefaultPrintLevel),
50     fDebug(0)
51 {
52   // Standard Constructor
53
54   // initialize loader's
55   fLoader = loader;
56
57   // initialize container
58   fMUONData  = new AliMUONData(fLoader,"MUON","MUON");
59
60   // reconstruction model
61   fRecModel = new AliMUONClusterFinderVS();
62   //fRecModel = new AliMUONClusterFinderAZ();
63
64 }
65
66 //__________________________________________________________________________
67 AliMUONClusterReconstructor::AliMUONClusterReconstructor()
68   : TObject(),
69     fMUONData(0),
70     fPrintLevel(fgkDefaultPrintLevel),
71     fDebug(0),
72     fLoader(0)
73 {
74   // Default Constructor
75 }
76
77 //_______________________________________________________________________
78 AliMUONClusterReconstructor::AliMUONClusterReconstructor (const AliMUONClusterReconstructor& rhs)
79   : TObject(rhs)
80 {
81 // Protected copy constructor
82
83   AliFatal("Not implemented.");
84 }
85
86 //_______________________________________________________________________
87 AliMUONClusterReconstructor & 
88 AliMUONClusterReconstructor::operator=(const AliMUONClusterReconstructor& rhs)
89 {
90 // Protected assignement operator
91
92   if (this == &rhs) return *this;
93
94   AliFatal("Not implemented.");
95     
96   return *this;  
97 }
98
99 //__________________________________________________________________________
100 AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
101 {
102
103   if (fMUONData)
104     delete fMUONData;
105
106   return;
107 }
108 //____________________________________________________________________
109 void AliMUONClusterReconstructor::Digits2Clusters()
110 {
111
112     TClonesArray *dig1, *dig2, *digAll;
113     Int_t ndig, k, idDE, idDE_prev;
114     dig1 = new TClonesArray("AliMUONDigit",1000);
115     dig2 = new TClonesArray("AliMUONDigit",1000);
116     digAll = new TClonesArray("AliMUONDigit",2000);
117
118     AliMUONDigit* digit;
119
120     TArrayI id(200); // contains the different IdDE
121    
122   
123 // Loop on chambers and on cathode planes     
124     TClonesArray* muonDigits;
125     Int_t n2;
126     Int_t n1;
127     Int_t flag = 0;
128
129     for (Int_t ich = 0; ich < AliMUONConstants::NTrackingCh(); ich++) {
130  
131       id.Reset();
132       n1 = 0;
133       n2 = 0;
134       //cathode 0
135       fMUONData->ResetDigits();
136       fMUONData->GetCathode(0);
137       muonDigits = fMUONData->Digits(ich); 
138       ndig = muonDigits->GetEntriesFast();
139       TClonesArray &lDigit = *digAll;
140
141       idDE_prev = 0;
142
143       for (k = 0; k < ndig; k++) {
144
145         digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
146         new(lDigit[n1++]) AliMUONDigit(*digit);
147         idDE = digit->DetElemId();
148         if (idDE != idDE_prev) {
149           id.AddAt(idDE,n2++);
150         }
151         idDE_prev = idDE;
152       }
153
154       //cathode 1
155       fMUONData->ResetDigits();
156       fMUONData->GetCathode(1);
157       muonDigits =  fMUONData->Digits(ich);  
158       ndig = muonDigits->GetEntriesFast();
159
160       Int_t idSize = n2;
161     
162       for (k = 0; k < ndig; k++) {
163
164         digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
165         new(lDigit[n1++]) AliMUONDigit(*digit);
166         idDE = digit->DetElemId();
167         flag = 0;
168
169         // looking for new idDE in cathode 1 (method to be checked CF)
170         for (Int_t n = 0; n < idSize; n++) {
171           if (idDE == id[n]) {
172             flag = 1;
173             break;
174           }
175         }
176         if (flag) continue;
177         id.AddAt(idDE,n2++);
178       }
179
180       idSize = n2;
181
182       // loop over id DE
183       for (idDE = 0; idDE < idSize; idDE++) {
184         TClonesArray &lhits1 = *dig1;
185         TClonesArray &lhits2 = *dig2;
186         dig1->Clear();
187         dig2->Clear();
188         n1 = n2 = 0;
189
190         for (k = 0; k < digAll->GetEntriesFast(); k++) {
191           digit = (AliMUONDigit*) digAll->UncheckedAt(k);
192           //      printf("digit idDE %d\n", digit->DetElemId());
193           if (id[idDE] == digit->DetElemId()) {
194             if (digit->Cathode() == 0)
195               new(lhits1[n1++]) AliMUONDigit(*digit);
196             else 
197               new(lhits2[n2++]) AliMUONDigit(*digit);
198           }
199         }
200
201         //      if (id[idDE] < 500 && id[idDE] > 299) continue; // temporary patch til St2 geometry is not yet ok (CF)
202
203         // cluster finder
204         if (fRecModel) {
205           AliMUONClusterInput::Instance()->SetDigits(ich, id[idDE], dig1, dig2);
206           fRecModel->FindRawClusters();
207         }
208         // copy into the container
209         TClonesArray* tmp = fRecModel->GetRawClusters();
210         for (Int_t id = 0; id < tmp->GetEntriesFast(); id++) {
211           AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id);
212           fMUONData->AddRawCluster(ich, *pClus);
213         }
214         dig1->Delete();
215         dig2->Delete();
216       } // idDE
217       digAll->Delete();
218     } // for ich
219     delete dig1;
220     delete dig2;
221     delete digAll;
222 }
223
224 //____________________________________________________________________
225 void AliMUONClusterReconstructor::Digits2Clusters(AliRawReader* /*rawReader*/)
226 {
227
228 //  Perform cluster finding form raw data
229
230    AliFatal("clusterization not implemented for raw data input");
231 }
232 //_______________________________________________________________________
233 void AliMUONClusterReconstructor::Trigger2Trigger() 
234 {
235 // copy trigger from TreeD to TreeR
236
237   fMUONData->SetTreeAddress("GLT");
238   fMUONData->GetTriggerD();
239 }
240 //_______________________________________________________________________
241 void AliMUONClusterReconstructor::Trigger2Trigger(AliRawReader* /*rawReader*/) 
242 {
243 // call the Trigger Algorithm from raw data and fill TreeR 
244
245    AliFatal("Trigger not implemented for raw data input");
246
247 }