changes according to NewGeometry
[u/mrichter/AliRoot.git] / PMD / AliPMDClusterFinder.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 //-----------------------------------------------------//
17 //                                                     //
18 //           Date   : August 05 2003                   //
19 //  This reads the file PMD.digits.root(TreeD),        //
20 //  calls the Clustering algorithm and stores the      //
21 //  clustering output in PMD.RecPoints.root(TreeR)     // 
22 //                                                     //
23 //-----------------------------------------------------//
24
25 #include <Riostream.h>
26 #include <TBRIK.h>
27 #include <TNode.h>
28 #include <TTree.h>
29 #include <TGeometry.h>
30 #include <TObjArray.h>
31 #include <TClonesArray.h>
32 #include <TFile.h>
33 #include <TNtuple.h>
34 #include <TParticle.h>
35
36 #include "AliRun.h"
37 #include "AliPMD.h"
38 #include "AliDetector.h"
39 #include "AliRunLoader.h"
40 #include "AliLoader.h"
41 #include "AliHeader.h"
42
43 #include "AliPMDdigit.h"
44 #include "AliPMDClusterFinder.h"
45 #include "AliPMDClustering.h"
46 #include "AliPMDcluster.h"
47 #include "AliPMDrecpoint1.h"
48
49
50 ClassImp(AliPMDClusterFinder)
51 //
52 // Constructor
53 //
54 AliPMDClusterFinder::AliPMDClusterFinder()
55 {
56   if (!fRecpoints) fRecpoints = new TClonesArray("AliPMDrecpoint1", 1000);  
57   fNpoint = 0;
58
59   fDebug = 0;
60   fEcut  = 0.;
61
62 }
63 AliPMDClusterFinder::~AliPMDClusterFinder()
64 {
65   delete fRecpoints;
66 }
67 //
68 // Member functions
69 //
70 void AliPMDClusterFinder::OpengAliceFile(Char_t *file, Option_t *option)
71 {
72
73   fRunLoader = AliRunLoader::Open(file,AliConfig::fgkDefaultEventFolderName,
74                                   "UPDATE");
75   
76   if (!fRunLoader)
77    {
78      Error("Open","Can not open session for file %s.",file);
79    }
80   
81   fRunLoader->LoadgAlice();
82   fRunLoader->LoadHeader();
83   fRunLoader->LoadKinematics();
84
85   gAlice = fRunLoader->GetAliRun();
86   
87   if (gAlice)
88     {
89       printf("<AliPMDdigitizer::Open> ");
90       printf("AliRun object found on file.\n");
91     }
92   else
93     {
94       printf("<AliPMDdigitizer::Open> ");
95       printf("Could not find AliRun object.\n");
96     }
97   PMD  = (AliPMD*)gAlice->GetDetector("PMD");
98   pmdloader = fRunLoader->GetLoader("PMDLoader");
99   if (pmdloader == 0x0)
100     {
101       cerr<<"OpengAlice : Can not find PMD or PMDLoader\n";
102     }
103
104   const char *cDR = strstr(option,"DR");
105
106   if (cDR)
107     {
108       pmdloader->LoadDigits("READ");
109       pmdloader->LoadRecPoints("recreate");
110     }
111 }
112
113 void AliPMDClusterFinder::Digits2RecPoints(Int_t ievt)
114 {
115   Int_t    det = 0,smn = 0;
116   Int_t    cellno;
117   Int_t    xpos,ypos;
118   Float_t  adc;
119   Int_t    isup;
120   Int_t    idet;
121   Float_t  clusdata[7];
122
123   TObjArray *pmdcont = new TObjArray();
124   AliPMDcluster  *pmdcl  = new AliPMDcluster;
125   AliPMDClustering *pmdclust = new AliPMDClustering();
126   pmdclust->SetDebug(fDebug);
127   pmdclust->SetEdepCut(fEcut);
128
129   fRunLoader->GetEvent(ievt);
130   //cout << " ***** Beginning::Digits2RecPoints *****" << endl;
131   treeD = pmdloader->TreeD();
132   if (treeD == 0x0)
133     {
134       cout << " Can not get TreeD" << endl;
135     }
136   AliPMDdigit  *pmddigit;
137   TBranch *branch = treeD->GetBranch("PMDDigit");
138   branch->SetAddress(&fDigits);
139
140   ResetRecpoint();
141   treeR = pmdloader->TreeR();
142   if (treeR == 0x0)
143     {
144       pmdloader->MakeTree("R");
145       treeR = pmdloader->TreeR();
146     }
147
148   Int_t bufsize = 16000;
149   treeR->Branch("PMDRecpoint", &fRecpoints, bufsize); 
150
151   Int_t nmodules = (Int_t) treeD->GetEntries();
152   
153   for (Int_t imodule = 0; imodule < nmodules; imodule++)
154     {
155       ResetCellADC();
156       treeD->GetEntry(imodule); 
157       Int_t nentries = fDigits->GetLast();
158       for (Int_t ient = 0; ient < nentries+1; ient++)
159         {
160           pmddigit = (AliPMDdigit*)fDigits->UncheckedAt(ient);
161           
162           det    = pmddigit->GetDetector();
163           smn    = pmddigit->GetSMNumber();
164           cellno = pmddigit->GetCellNumber();
165           adc    = pmddigit->GetADC();
166           //Int_t trno   = pmddigit->GetTrackNumber();
167
168           xpos = cellno/fCol;
169           ypos = cellno - xpos*fCol;
170           fCellADC[xpos][ypos] = (Double_t) adc;
171         }
172
173       idet = det;
174       isup = smn;
175       pmdclust->DoClust(fCellADC,pmdcont);
176       
177       Int_t nentries1 = pmdcont->GetEntries();
178       cout << " nentries1 = " << nentries1 << endl;
179       for (Int_t ient1 = 0; ient1 < nentries1; ient1++)
180         {
181           clusdata[0] = (Float_t) idet;
182           clusdata[1] = (Float_t) isup;
183               
184           pmdcl = (AliPMDcluster*)pmdcont->UncheckedAt(ient1);
185               
186           clusdata[2] = pmdcl->GetClusX();
187           clusdata[3] = pmdcl->GetClusY();
188           clusdata[4] = pmdcl->GetClusADC();
189           clusdata[5] = pmdcl->GetClusCells();
190           clusdata[6] = pmdcl->GetClusRadius();
191           
192           AddRecPoint(clusdata);
193         }
194       pmdcont->Clear();
195       
196       treeR->Fill();
197       ResetRecpoint();
198
199     } // modules
200
201   ResetCellADC();
202   
203   pmdloader->WriteRecPoints("OVERWRITE");
204
205   //   delete the pointers
206   delete pmdclust;
207   delete pmdcont;
208     
209   //  cout << " ***** End::Digits2RecPoints *****" << endl;
210 }
211
212 void AliPMDClusterFinder::SetCellEdepCut(Float_t ecut)
213 {
214   fEcut = ecut;
215 }
216 void AliPMDClusterFinder::SetDebug(Int_t idebug)
217 {
218   fDebug = idebug;
219 }
220
221 void AliPMDClusterFinder::AddRecPoint(Float_t *clusdata)
222 {
223   TClonesArray &lrecpoints = *fRecpoints;
224   AliPMDrecpoint1 *newrecpoint;
225   newrecpoint = new AliPMDrecpoint1(clusdata);
226   new(lrecpoints[fNpoint++]) AliPMDrecpoint1(newrecpoint);
227   delete newrecpoint;
228 }
229 void AliPMDClusterFinder::ResetCellADC()
230 {
231   for(Int_t irow = 0; irow < fRow; irow++)
232     {
233       for(Int_t icol = 0; icol < fCol; icol++)
234         {
235           fCellADC[irow][icol] = 0.;
236         }
237     }
238 }
239
240 void AliPMDClusterFinder::ResetRecpoint()
241 {
242   fNpoint = 0;
243   if (fRecpoints) fRecpoints->Clear();
244 }
245 void AliPMDClusterFinder::UnLoad(Option_t *option)
246 {
247   const char *cR = strstr(option,"R");
248
249   fRunLoader->UnloadgAlice();
250   fRunLoader->UnloadHeader();
251   fRunLoader->UnloadKinematics();
252
253   if (cR)
254     {
255       pmdloader->UnloadDigits();
256     }
257 }