d15a28e7 |
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 | **************************************************************************/ |
b2a60966 |
15 | /* $Id$ */ |
d15a28e7 |
16 | //_________________________________________________________________________ |
b2a60966 |
17 | // Implementation version 1 of algorithm class to construct PHOS track segments |
f035f6ce |
18 | // Track segment for PHOS is list of |
19 | // EMC RecPoint + (possibly) CPV RecPoint + (possibly) PPSD RecPoint |
a4e98857 |
20 | // To find TrackSegments we do the following: |
21 | // for each EMC RecPoints we look at |
22 | // CPV/PPSD RecPoints in the radious fR0. |
23 | // If there is such a CPV RecPoint, |
24 | // we make "Link" it is just indexes of EMC and CPV/PPSD RecPoint and distance |
25 | // between them in the PHOS plane. |
26 | // Then we sort "Links" and starting from the |
27 | // least "Link" pointing to the unassined EMC and CPV RecPoints assing them to |
28 | // new TrackSegment. |
29 | // If there is no CPV/PPSD RecPoint we make TrackSegment |
30 | // consisting from EMC alone. There is no TrackSegments without EMC RecPoint. |
f035f6ce |
31 | // |
32 | // In principle this class should be called from AliPHOSReconstructioner, but |
a4e98857 |
33 | // one can use it as well in standalone mode. |
34 | // Use case: |
fc12304f |
35 | // root [0] AliPHOSTrackSegmentMakerv1 * t = new AliPHOSTrackSegmentMaker("galice.root", "tracksegmentsname", "recpointsname") |
a4e98857 |
36 | // Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated |
fc12304f |
37 | // // reads gAlice from header file "galice.root", uses recpoints stored in the branch names "recpointsname" (default = "Default") |
38 | // // and saves recpoints in branch named "tracksegmentsname" (default = "recpointsname") |
a4e98857 |
39 | // root [1] t->ExecuteTask() |
40 | // root [2] t->SetMaxEmcPpsdDistance(5) |
41 | // root [3] t->SetTrackSegmentsBranch("max distance 5 cm") |
42 | // root [4] t->ExecuteTask("deb all time") |
f035f6ce |
43 | // |
fc12304f |
44 | //*-- Author: Dmitri Peressounko (RRC Ki & SUBATECH) & Yves Schutz (SUBATECH) |
b2a60966 |
45 | // |
d15a28e7 |
46 | |
47 | // --- ROOT system --- |
2731cd1e |
48 | #include "TROOT.h" |
49 | #include "TFile.h" |
7b7c1533 |
50 | #include "TFolder.h" |
2731cd1e |
51 | #include "TTree.h" |
52 | #include "TSystem.h" |
53 | #include "TBenchmark.h" |
d15a28e7 |
54 | // --- Standard library --- |
55 | |
de9ec31b |
56 | #include <iostream.h> |
2731cd1e |
57 | #include <iomanip.h> |
d15a28e7 |
58 | |
59 | // --- AliRoot header files --- |
60 | |
61 | #include "AliPHOSTrackSegmentMakerv1.h" |
2731cd1e |
62 | #include "AliPHOSClusterizerv1.h" |
d15a28e7 |
63 | #include "AliPHOSTrackSegment.h" |
2aca7d46 |
64 | #include "AliPHOSCpvRecPoint.h" |
d15a28e7 |
65 | #include "AliPHOSLink.h" |
7b7c1533 |
66 | #include "AliPHOSGetter.h" |
baef0810 |
67 | #include "AliPHOS.h" |
d15a28e7 |
68 | #include "AliRun.h" |
69 | |
70 | ClassImp( AliPHOSTrackSegmentMakerv1) |
71 | |
72 | |
73 | //____________________________________________________________________________ |
2bd5457f |
74 | AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1() : AliPHOSTrackSegmentMaker() |
d15a28e7 |
75 | { |
7b7c1533 |
76 | // default ctor (to be used mainly by Streamer) |
77 | |
8d0f3f77 |
78 | InitParameters() ; |
7b7c1533 |
79 | fHeaderFileName = "" ; |
80 | fRecPointsBranchTitle = "" ; |
81 | fTrackSegmentsBranchTitle = "" ; |
fc12304f |
82 | fFrom = "" ; |
83 | |
2b60655b |
84 | fTrackSegmentsInRun = 0 ; |
92f521a9 |
85 | |
86 | fDefaultInit = kTRUE ; |
d15a28e7 |
87 | } |
7b7c1533 |
88 | |
9f616d61 |
89 | //____________________________________________________________________________ |
fc12304f |
90 | AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(const char * headerFile, const char * name, const char * from) : AliPHOSTrackSegmentMaker(headerFile, name) |
2731cd1e |
91 | { |
92 | // ctor |
2731cd1e |
93 | |
8d0f3f77 |
94 | InitParameters() ; |
7b7c1533 |
95 | fHeaderFileName = GetTitle() ; |
96 | fRecPointsBranchTitle = GetName() ; |
97 | fTrackSegmentsBranchTitle = GetName() ; |
2b60655b |
98 | fTrackSegmentsInRun = 0 ; |
99 | |
fc12304f |
100 | if ( from == 0 ) |
101 | fFrom = name ; |
102 | else |
103 | fFrom = from ; |
7b7c1533 |
104 | Init() ; |
92f521a9 |
105 | |
106 | fDefaultInit = kFALSE ; |
107 | |
2731cd1e |
108 | } |
98cbd830 |
109 | |
2731cd1e |
110 | //____________________________________________________________________________ |
111 | AliPHOSTrackSegmentMakerv1::~AliPHOSTrackSegmentMakerv1() |
112 | { |
113 | // dtor |
92f521a9 |
114 | // fDefaultInit = kTRUE if TrackSegmentMaker created by default ctor (to get just the parameters) |
79bb1b62 |
115 | |
92f521a9 |
116 | if (!fDefaultInit) { |
117 | delete fLinkUpArray ; |
118 | |
119 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; |
120 | |
79bb1b62 |
121 | // remove the task from the folder list |
122 | gime->RemoveTask("T",GetName()) ; |
123 | TString name(GetName()) ; |
124 | name.ReplaceAll("tsm", "clu") ; |
125 | gime->RemoveTask("C",name) ; |
126 | |
127 | // remove the data from the folder list |
128 | name = GetName() ; |
129 | name.Remove(name.Index(":")) ; |
130 | gime->RemoveObjects("RE", name) ; // EMCARecPoints |
131 | gime->RemoveObjects("RC", name) ; // CPVRecPoints |
132 | gime->RemoveObjects("T", name) ; // TrackSegments |
133 | |
134 | // Delete gAlice |
135 | gime->CloseFile() ; |
136 | |
137 | fSplitFile = 0 ; |
138 | } |
d15a28e7 |
139 | } |
9f616d61 |
140 | |
8d0f3f77 |
141 | |
fc12304f |
142 | //____________________________________________________________________________ |
143 | const TString AliPHOSTrackSegmentMakerv1::BranchName() const |
144 | { |
145 | TString branchName(GetName() ) ; |
146 | branchName.Remove(branchName.Index(Version())-1) ; |
147 | return branchName ; |
148 | } |
149 | |
d15a28e7 |
150 | //____________________________________________________________________________ |
2731cd1e |
151 | void AliPHOSTrackSegmentMakerv1::FillOneModule() |
9f616d61 |
152 | { |
f035f6ce |
153 | // Finds first and last indexes between which |
154 | // clusters from one PHOS module are |
fc12304f |
155 | |
7b7c1533 |
156 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; |
fc12304f |
157 | TObjArray * emcRecPoints = gime->EmcRecPoints(fFrom) ; |
158 | TObjArray * cpvRecPoints = gime->CpvRecPoints(fFrom) ; |
9688c1dd |
159 | |
2731cd1e |
160 | //First EMC clusters |
7b7c1533 |
161 | Int_t totalEmc = emcRecPoints->GetEntriesFast() ; |
2731cd1e |
162 | for(fEmcFirst = fEmcLast; (fEmcLast < totalEmc) && |
29b077b5 |
163 | ((dynamic_cast<AliPHOSRecPoint *>(emcRecPoints->At(fEmcLast)))->GetPHOSMod() == fModule ); |
2731cd1e |
164 | fEmcLast ++) ; |
165 | |
2731cd1e |
166 | //Now CPV clusters |
7b7c1533 |
167 | Int_t totalCpv = cpvRecPoints->GetEntriesFast() ; |
6ad0bfa0 |
168 | |
2731cd1e |
169 | for(fCpvFirst = fCpvLast; (fCpvLast < totalCpv) && |
29b077b5 |
170 | ((dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(fCpvLast)))->GetPHOSMod() == fModule ); |
2731cd1e |
171 | fCpvLast ++) ; |
9688c1dd |
172 | |
d15a28e7 |
173 | } |
7b7c1533 |
174 | |
d15a28e7 |
175 | //____________________________________________________________________________ |
baef0810 |
176 | Float_t AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,AliPHOSRecPoint * cpvClu, Bool_t &toofar)const |
d15a28e7 |
177 | { |
b2a60966 |
178 | // Calculates the distance between the EMC RecPoint and the PPSD RecPoint |
a4e98857 |
179 | // Clusters are sorted in "rows" and "columns" of width 1 cm |
f035f6ce |
180 | |
2731cd1e |
181 | Float_t delta = 1 ; // Width of the rows in sorting of RecPoints (in cm) |
182 | // if you change this value, change it as well in xxxRecPoint::Compare() |
92862013 |
183 | Float_t r = fR0 ; |
d15a28e7 |
184 | |
185 | TVector3 vecEmc ; |
2731cd1e |
186 | TVector3 vecCpv ; |
187 | |
188 | emcClu->GetLocalPosition(vecEmc) ; |
189 | cpvClu->GetLocalPosition(vecCpv) ; |
190 | |
191 | if(emcClu->GetPHOSMod() == cpvClu->GetPHOSMod()){ |
192 | if(vecCpv.X() <= vecEmc.X() + fR0 + 2*delta ){ |
193 | |
194 | vecCpv = vecCpv - vecEmc ; |
195 | r = vecCpv.Mag() ; |
92862013 |
196 | toofar = kFALSE ; |
2731cd1e |
197 | |
198 | } // if xPpsd >= xEmc + ... |
199 | else |
200 | toofar = kTRUE ; |
d15a28e7 |
201 | } |
202 | else |
92862013 |
203 | toofar = kTRUE ; |
7956ec10 |
204 | |
205 | //toofar = kFALSE ; |
206 | |
d15a28e7 |
207 | |
92862013 |
208 | return r ; |
d15a28e7 |
209 | } |
210 | |
7b7c1533 |
211 | //____________________________________________________________________________ |
212 | void AliPHOSTrackSegmentMakerv1::Init() |
213 | { |
214 | // Make all memory allocations that are not possible in default constructor |
215 | |
216 | if ( strcmp(GetTitle(), "") == 0 ) |
217 | SetTitle("galice.root") ; |
9688c1dd |
218 | |
fc12304f |
219 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance(GetTitle(), fFrom.Data()) ; |
7b7c1533 |
220 | if ( gime == 0 ) { |
221 | cerr << "ERROR: AliPHOSTrackSegmentMakerv1::Init -> Could not obtain the Getter object !" << endl ; |
222 | return ; |
223 | } |
224 | |
7b7c1533 |
225 | fLinkUpArray = new TClonesArray("AliPHOSLink", 1000); |
226 | |
227 | //add Task to //YSAlice/tasks/Reconstructioner/PHOS |
55ea5766 |
228 | gime->PostTrackSegmentMaker(this) ; |
7b7c1533 |
229 | |
55ea5766 |
230 | // create a folder on the white board //YSAlice/WhiteBoard/RecPoints/PHOS/trackSegmentsName |
fc12304f |
231 | gime->PostTrackSegments(BranchName()) ; |
7b7c1533 |
232 | |
233 | } |
234 | |
8d0f3f77 |
235 | //____________________________________________________________________________ |
236 | void AliPHOSTrackSegmentMakerv1::InitParameters() |
237 | { |
238 | fR0 = 10. ; |
239 | fEmcFirst = 0 ; |
240 | fEmcLast = 0 ; |
241 | fCpvFirst = 0 ; |
242 | fCpvLast = 0 ; |
243 | fLinkUpArray = 0 ; |
244 | TString tsmName( GetName()) ; |
245 | if (tsmName.IsNull() ) |
246 | tsmName = "Default" ; |
247 | tsmName.Append(":") ; |
248 | tsmName.Append(Version()) ; |
249 | SetName(tsmName) ; |
250 | } |
251 | |
252 | |
d15a28e7 |
253 | //____________________________________________________________________________ |
baef0810 |
254 | void AliPHOSTrackSegmentMakerv1::MakeLinks()const |
d15a28e7 |
255 | { |
f035f6ce |
256 | // Finds distances (links) between all EMC and PPSD clusters, |
257 | // which are not further apart from each other than fR0 |
258 | // and sort them in accordance with this distance |
9688c1dd |
259 | |
7b7c1533 |
260 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; |
fc12304f |
261 | TObjArray * emcRecPoints = gime->EmcRecPoints(fFrom) ; |
262 | TObjArray * cpvRecPoints = gime->CpvRecPoints(fFrom) ; |
7b7c1533 |
263 | |
2731cd1e |
264 | fLinkUpArray->Clear() ; |
2731cd1e |
265 | |
2731cd1e |
266 | AliPHOSRecPoint * cpv ; |
92862013 |
267 | AliPHOSEmcRecPoint * emcclu ; |
28c3a259 |
268 | |
d15a28e7 |
269 | Int_t iLinkUp = 0 ; |
270 | |
28c3a259 |
271 | Int_t iEmcRP; |
2731cd1e |
272 | for(iEmcRP = fEmcFirst; iEmcRP < fEmcLast; iEmcRP++ ) { |
29b077b5 |
273 | emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(iEmcRP)) ; |
2731cd1e |
274 | |
9688c1dd |
275 | Bool_t toofar ; |
2731cd1e |
276 | Int_t iCpv = 0 ; |
277 | for(iCpv = fCpvFirst; iCpv < fCpvLast;iCpv++ ) { |
28c3a259 |
278 | |
29b077b5 |
279 | cpv = dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(iCpv)) ; |
2731cd1e |
280 | Float_t r = GetDistanceInPHOSPlane(emcclu, cpv, toofar) ; |
d15a28e7 |
281 | |
92862013 |
282 | if(toofar) |
d15a28e7 |
283 | break ; |
83974468 |
284 | if(r < fR0) { |
2731cd1e |
285 | new ((*fLinkUpArray)[iLinkUp++]) AliPHOSLink(r, iEmcRP, iCpv) ; |
28c3a259 |
286 | } |
d15a28e7 |
287 | } |
28c3a259 |
288 | } |
d15a28e7 |
289 | |
9688c1dd |
290 | fLinkUpArray->Sort() ; //first links with smallest distances |
d15a28e7 |
291 | } |
28c3a259 |
292 | |
d15a28e7 |
293 | //____________________________________________________________________________ |
2731cd1e |
294 | void AliPHOSTrackSegmentMakerv1::MakePairs() |
6ad0bfa0 |
295 | { |
f035f6ce |
296 | // Using the previously made list of "links", we found the smallest link - i.e. |
a4e98857 |
297 | // link with the least distance between EMC and CPV and pointing to still |
f035f6ce |
298 | // unassigned RecParticles. We assign these RecPoints to TrackSegment and |
299 | // remove them from the list of "unassigned". |
6ad0bfa0 |
300 | |
7b7c1533 |
301 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; |
fc12304f |
302 | TObjArray * emcRecPoints = gime->EmcRecPoints(fFrom) ; |
303 | TObjArray * cpvRecPoints = gime->CpvRecPoints(fFrom) ; |
304 | TClonesArray * trackSegments = gime->TrackSegments(BranchName()) ; |
9688c1dd |
305 | |
01a599c9 |
306 | //Make arrays to mark clusters already chosen |
2731cd1e |
307 | Int_t * emcExist = 0; |
308 | if(fEmcLast > fEmcFirst) |
309 | emcExist = new Int_t[fEmcLast-fEmcFirst] ; |
310 | |
311 | Int_t index; |
312 | for(index = 0; index <fEmcLast-fEmcFirst; index ++) |
313 | emcExist[index] = 1 ; |
314 | |
315 | Bool_t * cpvExist = 0; |
316 | if(fCpvLast > fCpvFirst) |
317 | cpvExist = new Bool_t[fCpvLast-fCpvFirst] ; |
318 | for(index = 0; index <fCpvLast-fCpvFirst; index ++) |
319 | cpvExist[index] = kTRUE ; |
320 | |
2731cd1e |
321 | |
322 | // Finds the smallest links and makes pairs of CPV and EMC clusters with smallest distance |
2731cd1e |
323 | TIter nextUp(fLinkUpArray) ; |
d15a28e7 |
324 | |
d15a28e7 |
325 | AliPHOSLink * linkUp ; |
9688c1dd |
326 | |
2731cd1e |
327 | AliPHOSRecPoint * nullpointer = 0 ; |
9688c1dd |
328 | |
29b077b5 |
329 | while ( (linkUp = static_cast<AliPHOSLink *>(nextUp()) ) ){ |
9688c1dd |
330 | |
2731cd1e |
331 | if(emcExist[linkUp->GetEmc()-fEmcFirst] != -1){ //without ppsd Up yet |
d15a28e7 |
332 | |
2731cd1e |
333 | if(cpvExist[linkUp->GetPpsd()-fCpvFirst]){ //CPV still exist |
7956ec10 |
334 | |
9688c1dd |
335 | new ((* trackSegments)[fNTrackSegments]) |
29b077b5 |
336 | AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(linkUp->GetEmc())) , |
337 | dynamic_cast<AliPHOSRecPoint *>(cpvRecPoints->At(linkUp->GetPpsd()))) ; |
338 | (dynamic_cast<AliPHOSTrackSegment *>(trackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments); |
9688c1dd |
339 | fNTrackSegments++ ; |
340 | |
2731cd1e |
341 | emcExist[linkUp->GetEmc()-fEmcFirst] = -1 ; //Mark emc that Cpv was found |
342 | //mark CPV recpoint as already used |
9688c1dd |
343 | cpvExist[linkUp->GetPpsd()-fCpvFirst] = kFALSE ; |
7956ec10 |
344 | } //if ppsdUp still exist |
28c3a259 |
345 | } |
346 | } |
347 | |
2731cd1e |
348 | //look through emc recPoints left without CPV/PPSD |
349 | if(emcExist){ //if there is emc rec point |
350 | Int_t iEmcRP ; |
351 | for(iEmcRP = 0; iEmcRP < fEmcLast-fEmcFirst ; iEmcRP++ ){ |
352 | if(emcExist[iEmcRP] > 0 ){ |
9688c1dd |
353 | new ((*trackSegments)[fNTrackSegments]) |
29b077b5 |
354 | AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(emcRecPoints->At(iEmcRP+fEmcFirst)), |
9688c1dd |
355 | nullpointer) ; |
29b077b5 |
356 | (dynamic_cast<AliPHOSTrackSegment *>(trackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments); |
2731cd1e |
357 | fNTrackSegments++; |
358 | } |
d15a28e7 |
359 | } |
d15a28e7 |
360 | } |
780a31c1 |
361 | delete [] emcExist ; |
362 | delete [] cpvExist ; |
d15a28e7 |
363 | } |
364 | |
365 | //____________________________________________________________________________ |
2731cd1e |
366 | void AliPHOSTrackSegmentMakerv1::Exec(Option_t * option) |
d15a28e7 |
367 | { |
a4e98857 |
368 | // STEERing method |
28c3a259 |
369 | |
7b7c1533 |
370 | if( strcmp(GetName(), "")== 0 ) |
371 | Init() ; |
6ad0bfa0 |
372 | |
2731cd1e |
373 | if(strstr(option,"tim")) |
b3f97575 |
374 | gBenchmark->Start("PHOSTSMaker"); |
7b7c1533 |
375 | |
376 | if(strstr(option,"print")) { |
377 | Print("") ; |
378 | return ; |
379 | } |
d15a28e7 |
380 | |
55ea5766 |
381 | gAlice->GetEvent(0) ; |
9688c1dd |
382 | //check, if the branch with name of this" already exits? |
8d0f3f77 |
383 | if (gAlice->TreeR()) { |
384 | TObjArray * lob = static_cast<TObjArray*>(gAlice->TreeR()->GetListOfBranches()) ; |
385 | TIter next(lob) ; |
386 | TBranch * branch = 0 ; |
387 | Bool_t phostsfound = kFALSE, tracksegmentmakerfound = kFALSE ; |
388 | |
389 | TString branchname = GetName() ; |
390 | branchname.Remove(branchname.Index(Version())-1) ; |
391 | |
392 | while ( (branch = static_cast<TBranch*>(next())) && (!phostsfound || !tracksegmentmakerfound) ) { |
393 | if ( (strcmp(branch->GetName(), "PHOSTS")==0) && (strcmp(branch->GetTitle(), branchname.Data())==0) ) |
394 | phostsfound = kTRUE ; |
395 | |
396 | else if ( (strcmp(branch->GetName(), "AliPHOSTrackSegmentMaker")==0) && (strcmp(branch->GetTitle(), GetName())==0) ) |
397 | tracksegmentmakerfound = kTRUE ; |
398 | } |
7b7c1533 |
399 | |
8d0f3f77 |
400 | if ( phostsfound || tracksegmentmakerfound ) { |
401 | cerr << "WARNING: AliPHOSTrackSegmentMakerv1::Exec -> TrackSegments and/or TrackSegmentMaker branch with name " |
402 | << branchname.Data() << " already exits" << endl ; |
403 | return ; |
404 | } |
7b7c1533 |
405 | } |
406 | |
9688c1dd |
407 | AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; |
55ea5766 |
408 | const AliPHOSGeometry * geom = gime->PHOSGeometry() ; |
7b7c1533 |
409 | Int_t nevents = (Int_t) gAlice->TreeE()->GetEntries() ; |
410 | Int_t ievent ; |
411 | |
412 | for(ievent = 0; ievent < nevents; ievent++){ |
01a599c9 |
413 | |
55ea5766 |
414 | gime->Event(ievent,"R") ; |
55ea5766 |
415 | //Make some initializations |
416 | fNTrackSegments = 0 ; |
417 | fEmcFirst = 0 ; |
418 | fEmcLast = 0 ; |
419 | fCpvFirst = 0 ; |
420 | fCpvLast = 0 ; |
fc12304f |
421 | gime->TrackSegments(BranchName())->Clear() ; |
55ea5766 |
422 | |
9688c1dd |
423 | // if(!ReadRecPoints(ievent)) continue; //reads RecPoints for event ievent |
424 | |
7b7c1533 |
425 | for(fModule = 1; fModule <= geom->GetNModules() ; fModule++ ){ |
2731cd1e |
426 | |
427 | FillOneModule() ; |
428 | |
429 | MakeLinks() ; |
430 | |
431 | MakePairs() ; |
432 | |
433 | } |
28c3a259 |
434 | |
7b7c1533 |
435 | WriteTrackSegments(ievent) ; |
436 | |
2731cd1e |
437 | if(strstr(option,"deb")) |
438 | PrintTrackSegments(option) ; |
94de8339 |
439 | |
440 | //increment the total number of track segments per run |
fc12304f |
441 | fTrackSegmentsInRun += gime->TrackSegments(BranchName())->GetEntriesFast() ; |
7b7c1533 |
442 | |
2731cd1e |
443 | } |
9f616d61 |
444 | |
2731cd1e |
445 | if(strstr(option,"tim")){ |
446 | gBenchmark->Stop("PHOSTSMaker"); |
447 | cout << "AliPHOSTSMaker:" << endl ; |
448 | cout << " took " << gBenchmark->GetCpuTime("PHOSTSMaker") << " seconds for making TS " |
7b7c1533 |
449 | << gBenchmark->GetCpuTime("PHOSTSMaker")/nevents << " seconds per event " << endl ; |
2731cd1e |
450 | cout << endl ; |
451 | } |
7b7c1533 |
452 | |
d15a28e7 |
453 | } |
7b7c1533 |
454 | |
d15a28e7 |
455 | //____________________________________________________________________________ |
baef0810 |
456 | void AliPHOSTrackSegmentMakerv1::Print(Option_t * option)const |
a4e98857 |
457 | { |
baef0810 |
458 | // Print TrackSegmentMaker parameters |
459 | |
7b7c1533 |
460 | if( strcmp(GetName(), "") != 0 ) { |
2731cd1e |
461 | cout << "======== AliPHOSTrackSegmentMakerv1 ========" << endl ; |
462 | cout << "Making Track segments "<< endl ; |
f035f6ce |
463 | cout << " Headers file: " << fHeaderFileName.Data() << endl ; |
464 | cout << " RecPoints branch file name: " << fRecPointsBranchTitle.Data() << endl ; |
7b7c1533 |
465 | cout << " TrackSegments Branch file name: " << fTrackSegmentsBranchTitle.Data() << endl ; |
2731cd1e |
466 | cout << "with parameters: " << endl ; |
f035f6ce |
467 | cout << " Maximal EMC - CPV (PPSD) distance (cm)" << fR0 << endl ; |
2731cd1e |
468 | cout << "============================================" << endl ; |
469 | } |
470 | else |
471 | cout << "AliPHOSTrackSegmentMakerv1 not initialized " << endl ; |
d15a28e7 |
472 | } |
7b7c1533 |
473 | |
d15a28e7 |
474 | //____________________________________________________________________________ |
7b7c1533 |
475 | void AliPHOSTrackSegmentMakerv1::WriteTrackSegments(Int_t event) |
a4e98857 |
476 | { |
f035f6ce |
477 | // Writes found TrackSegments to TreeR. Creates branches |
478 | // "PHOSTS" and "AliPHOSTrackSegmentMaker" with the same title. |
479 | // In the former branch found TrackSegments are stored, while |
480 | // in the latter all parameters, with which TS were made. |
481 | // ROOT does not allow overwriting existing branches, therefore |
a4e98857 |
482 | // first we check, if branches with the same title already exist. |
f035f6ce |
483 | // If yes - exits without writing. |
2731cd1e |
484 | |
7b7c1533 |
485 | AliPHOSGetter *gime = AliPHOSGetter::GetInstance() ; |
55ea5766 |
486 | |
fc12304f |
487 | TClonesArray * trackSegments = gime->TrackSegments(BranchName()) ; |
55ea5766 |
488 | trackSegments->Expand(trackSegments->GetEntriesFast()) ; |
8d0f3f77 |
489 | TTree * treeR = gAlice->TreeR(); |
9f616d61 |
490 | |
8d0f3f77 |
491 | if (!treeR) |
492 | gAlice->MakeTree("R", fSplitFile); |
493 | treeR = gAlice->TreeR(); |
d15a28e7 |
494 | |
2731cd1e |
495 | //First TS |
496 | Int_t bufferSize = 32000 ; |
8d0f3f77 |
497 | TBranch * tsBranch = treeR->Branch("PHOSTS",&trackSegments,bufferSize); |
fc12304f |
498 | tsBranch->SetTitle(BranchName()); |
8d0f3f77 |
499 | |
2731cd1e |
500 | //Second -TSMaker |
501 | Int_t splitlevel = 0 ; |
502 | AliPHOSTrackSegmentMakerv1 * ts = this ; |
8d0f3f77 |
503 | TBranch * tsMakerBranch = treeR->Branch("AliPHOSTrackSegmentMaker","AliPHOSTrackSegmentMakerv1", |
2731cd1e |
504 | &ts,bufferSize,splitlevel); |
fc12304f |
505 | tsMakerBranch->SetTitle(BranchName()); |
8d0f3f77 |
506 | |
761e34c0 |
507 | tsBranch->Fill() ; |
508 | tsMakerBranch->Fill() ; |
eec3ac52 |
509 | |
8d0f3f77 |
510 | treeR->AutoSave() ; //Write(0,kOverwrite) ; |
2731cd1e |
511 | |
512 | } |
98cbd830 |
513 | |
98cbd830 |
514 | |
2731cd1e |
515 | //____________________________________________________________________________ |
a4e98857 |
516 | void AliPHOSTrackSegmentMakerv1::PrintTrackSegments(Option_t * option) |
517 | { |
f035f6ce |
518 | // option deb - prints # of found TrackSegments |
519 | // option deb all - prints as well indexed of found RecParticles assigned to the TS |
55ea5766 |
520 | TString taskName(GetName()) ; |
521 | taskName.Remove(taskName.Index(Version())-1) ; |
522 | |
523 | TClonesArray * trackSegments = AliPHOSGetter::GetInstance()->TrackSegments(taskName) ; |
9688c1dd |
524 | |
2731cd1e |
525 | |
01a599c9 |
526 | cout << "AliPHOSTrackSegmentMakerv1: event "<<gAlice->GetEvNumber() << endl ; |
7b7c1533 |
527 | cout << " Found " << trackSegments->GetEntriesFast() << " trackSegments " << endl ; |
2731cd1e |
528 | |
529 | if(strstr(option,"all")) { // printing found TS |
9688c1dd |
530 | cout << "TrackSegment # " << " EMC RP# " << " CPV RP# " << endl ; |
2731cd1e |
531 | |
532 | Int_t index; |
7b7c1533 |
533 | for (index = 0 ; index <trackSegments->GetEntriesFast() ; index++) { |
534 | AliPHOSTrackSegment * ts = (AliPHOSTrackSegment * )trackSegments->At(index) ; |
2731cd1e |
535 | cout<<" "<< setw(4) << ts->GetIndexInList() << " " |
536 | <<setw(4) << ts->GetEmcIndex()<< " " |
9688c1dd |
537 | <<setw(4) << ts->GetCpvIndex()<< " " << endl ; |
2731cd1e |
538 | } |
539 | |
540 | cout << "-------------------------------------------------------"<< endl ; |
d15a28e7 |
541 | } |
2731cd1e |
542 | } |