]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PHOS/AliPHOSTrackSegmentMakerv1.cxx
Algorithm optimization (F.Bellini)
[u/mrichter/AliRoot.git] / PHOS / AliPHOSTrackSegmentMakerv1.cxx
CommitLineData
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$ */
702ab87e 16
17/* History of cvs commits:
18 *
19 * $Log$
04236e67 20 * Revision 1.93 2007/10/10 09:05:10 schutz
21 * Changing name QualAss to QA
22 *
b8274834 23 * Revision 1.92 2007/08/28 12:55:08 policheh
24 * Loaders removed from the reconstruction code (C.Cheshkov)
25 *
9a2cdbdf 26 * Revision 1.91 2007/08/07 14:12:03 kharlov
27 * Quality assurance added (Yves Schutz)
28 *
ddd1a39c 29 * Revision 1.90 2007/07/11 13:43:30 hristov
30 * New class AliESDEvent, backward compatibility with the old AliESD (Christian)
31 *
af885e0f 32 * Revision 1.89 2007/07/03 08:13:04 kharlov
33 * Bug fix in CPV local coordinates
34 *
b22f5347 35 * Revision 1.88 2007/06/27 09:11:07 kharlov
36 * Bug fix for CPV-EMC distance
37 *
78881c42 38 * Revision 1.87 2007/05/04 14:49:29 policheh
39 * AliPHOSRecPoint inheritance from AliCluster
40 *
9ee9f78d 41 * Revision 1.86 2007/04/02 15:00:16 cvetan
42 * No more calls to gAlice in the reconstruction
43 *
999f9a8f 44 * Revision 1.85 2007/03/28 19:18:15 kharlov
45 * RecPoints recalculation in TSM removed
46 *
8c1fb709 47 * Revision 1.84 2007/03/07 07:01:21 hristov
48 * Fixing copy/paste erro. Additional protections
49 *
b89c16b2 50 * Revision 1.83 2007/03/06 21:07:37 kharlov
51 * DP: xz CPV-EMC distance filled to TS
52 *
d7ddbb70 53 * Revision 1.82 2007/03/06 06:54:48 kharlov
54 * DP:Calculation of cluster properties dep. on vertex added
55 *
e84d3def 56 * Revision 1.81 2007/02/05 10:02:40 kharlov
57 * Module numbering is corrected
58 *
a2ee5b34 59 * Revision 1.80 2006/08/28 10:01:56 kharlov
60 * Effective C++ warnings fixed (Timur Pocheptsov)
61 *
3663622c 62 * Revision 1.79 2006/04/25 12:41:15 hristov
63 * Moving non-persistent data to AliESDfriend (Yu.Belikov)
64 *
15e85efa 65 * Revision 1.78 2005/11/18 13:04:51 hristov
66 * Bug fix
67 *
a494460a 68 * Revision 1.77 2005/11/17 23:34:36 hristov
69 * Corrected logics
70 *
f74a631d 71 * Revision 1.76 2005/11/17 22:29:12 hristov
72 * Faster version, no attempt to match tracks outside the PHOS acceptance
73 *
0d9aa319 74 * Revision 1.75 2005/11/17 12:35:27 hristov
75 * Use references instead of objects. Avoid to create objects when they are not really needed
76 *
7b51037f 77 * Revision 1.74 2005/07/08 14:01:36 hristov
78 * Tracking in non-uniform nmagnetic field (Yu.Belikov)
79 *
c84a5e9e 80 * Revision 1.73 2005/05/28 14:19:05 schutz
81 * Compilation warnings fixed by T.P.
82 *
702ab87e 83 */
84
d15a28e7 85//_________________________________________________________________________
b2a60966 86// Implementation version 1 of algorithm class to construct PHOS track segments
f035f6ce 87// Track segment for PHOS is list of
194f9939 88// EMC RecPoint + (possibly) CPV RecPoint
a4e98857 89// To find TrackSegments we do the following:
90// for each EMC RecPoints we look at
194f9939 91// CPV RecPoints in the radious fRcpv.
a4e98857 92// If there is such a CPV RecPoint,
194f9939 93// we make "Link" it is just indexes of EMC and CPV RecPoint and distance
a4e98857 94// between them in the PHOS plane.
95// Then we sort "Links" and starting from the
96// least "Link" pointing to the unassined EMC and CPV RecPoints assing them to
97// new TrackSegment.
194f9939 98// If there is no CPV RecPoint we make TrackSegment
a4e98857 99// consisting from EMC alone. There is no TrackSegments without EMC RecPoint.
f444a19f 100//// In principle this class should be called from AliPHOSReconstructor, but
a4e98857 101// one can use it as well in standalone mode.
102// Use case:
fc12304f 103// root [0] AliPHOSTrackSegmentMakerv1 * t = new AliPHOSTrackSegmentMaker("galice.root", "tracksegmentsname", "recpointsname")
a4e98857 104// Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
fc12304f 105// // reads gAlice from header file "galice.root", uses recpoints stored in the branch names "recpointsname" (default = "Default")
106// // and saves recpoints in branch named "tracksegmentsname" (default = "recpointsname")
a4e98857 107// root [1] t->ExecuteTask()
a4e98857 108// root [3] t->SetTrackSegmentsBranch("max distance 5 cm")
109// root [4] t->ExecuteTask("deb all time")
f035f6ce 110//
fc12304f 111//*-- Author: Dmitri Peressounko (RRC Ki & SUBATECH) & Yves Schutz (SUBATECH)
b2a60966 112//
d15a28e7 113
114// --- ROOT system ---
f96711b8 115#include "TVector3.h"
2731cd1e 116#include "TTree.h"
2731cd1e 117#include "TBenchmark.h"
d15a28e7 118
21cd0c07 119// --- Standard library ---
194f9939 120#include "Riostream.h"
d15a28e7 121// --- AliRoot header files ---
e957fea8 122#include "AliPHOSGeometry.h"
d15a28e7 123#include "AliPHOSTrackSegmentMakerv1.h"
124#include "AliPHOSTrackSegment.h"
125#include "AliPHOSLink.h"
af885e0f 126#include "AliESDEvent.h"
aa0b9641 127#include "AliESDtrack.h"
9a2cdbdf 128#include "AliPHOSEmcRecPoint.h"
129#include "AliPHOSCpvRecPoint.h"
96351742 130#include "AliLog.h"
f96711b8 131#include "AliMagF.h"
c5a539a3 132#include "AliMagF.h"
133#include "AliTracker.h"
134#include "AliGeomManager.h"
135#include "AliCluster.h"
136#include "AliKalmanTrack.h"
137#include "AliGlobalQADataMaker.h"
138#include "AliVParticle.h"
139
d15a28e7 140
141ClassImp( AliPHOSTrackSegmentMakerv1)
142
143
144//____________________________________________________________________________
3663622c 145AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1() :
146 AliPHOSTrackSegmentMaker(),
147 fDefaultInit(kTRUE),
148 fWrite(kFALSE),
149 fNTrackSegments(0),
150 fRcpv(0.f),
151 fRtpc(0.f),
ddd1a39c 152 fVtx(0.f),
3663622c 153 fLinkUpArray(0),
154 fEmcFirst(0),
155 fEmcLast(0),
156 fCpvFirst(0),
157 fCpvLast(0),
158 fModule(0),
9a2cdbdf 159 fTrackSegments(NULL)
d15a28e7 160{
7b7c1533 161 // default ctor (to be used mainly by Streamer)
8d0f3f77 162 InitParameters() ;
d15a28e7 163}
7b7c1533 164
9f616d61 165//____________________________________________________________________________
9a2cdbdf 166AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(AliPHOSGeometry *geom) :
167 AliPHOSTrackSegmentMaker(geom),
3663622c 168 fDefaultInit(kFALSE),
169 fWrite(kFALSE),
170 fNTrackSegments(0),
171 fRcpv(0.f),
172 fRtpc(0.f),
ddd1a39c 173 fVtx(0.f),
3663622c 174 fLinkUpArray(0),
175 fEmcFirst(0),
176 fEmcLast(0),
177 fCpvFirst(0),
178 fCpvLast(0),
179 fModule(0),
9a2cdbdf 180 fTrackSegments(NULL)
2731cd1e 181{
182 // ctor
8d0f3f77 183 InitParameters() ;
7b7c1533 184 Init() ;
aa0b9641 185 fESD = 0;
2731cd1e 186}
98cbd830 187
3663622c 188
189AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(const AliPHOSTrackSegmentMakerv1 & tsm) :
190 AliPHOSTrackSegmentMaker(tsm),
191 fDefaultInit(kFALSE),
192 fWrite(kFALSE),
193 fNTrackSegments(0),
194 fRcpv(0.f),
195 fRtpc(0.f),
ddd1a39c 196 fVtx(0.f),
3663622c 197 fLinkUpArray(0),
198 fEmcFirst(0),
199 fEmcLast(0),
200 fCpvFirst(0),
201 fCpvLast(0),
202 fModule(0),
9a2cdbdf 203 fTrackSegments(NULL)
3663622c 204{
205 // cpy ctor: no implementation yet
206 // requested by the Coding Convention
207 Fatal("cpy ctor", "not implemented") ;
208}
209
210
2731cd1e 211//____________________________________________________________________________
212 AliPHOSTrackSegmentMakerv1::~AliPHOSTrackSegmentMakerv1()
213{
214 // dtor
92f521a9 215 // fDefaultInit = kTRUE if TrackSegmentMaker created by default ctor (to get just the parameters)
88cb7938 216 if (!fDefaultInit)
217 delete fLinkUpArray ;
9a2cdbdf 218 if (fTrackSegments) {
219 fTrackSegments->Delete();
220 delete fTrackSegments;
221 }
fc12304f 222}
223
d15a28e7 224//____________________________________________________________________________
2731cd1e 225void AliPHOSTrackSegmentMakerv1::FillOneModule()
9f616d61 226{
f035f6ce 227 // Finds first and last indexes between which
228 // clusters from one PHOS module are
88cb7938 229
2731cd1e 230 //First EMC clusters
9a2cdbdf 231 Int_t totalEmc = fEMCRecPoints->GetEntriesFast() ;
2731cd1e 232 for(fEmcFirst = fEmcLast; (fEmcLast < totalEmc) &&
9a2cdbdf 233 ((dynamic_cast<AliPHOSRecPoint *>(fEMCRecPoints->At(fEmcLast)))->GetPHOSMod() == fModule );
2731cd1e 234 fEmcLast ++) ;
235
2731cd1e 236 //Now CPV clusters
9a2cdbdf 237 Int_t totalCpv = fCPVRecPoints->GetEntriesFast() ;
6ad0bfa0 238
2731cd1e 239 for(fCpvFirst = fCpvLast; (fCpvLast < totalCpv) &&
9a2cdbdf 240 ((dynamic_cast<AliPHOSRecPoint *>(fCPVRecPoints->At(fCpvLast)))->GetPHOSMod() == fModule );
88cb7938 241 fCpvLast ++) ;
9688c1dd 242
d15a28e7 243}
7b7c1533 244
d15a28e7 245//____________________________________________________________________________
e84d3def 246void AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,
247 AliPHOSCpvRecPoint * cpvClu,
248 Int_t &trackindex,
249 Float_t &dx, Float_t &dz) const
d15a28e7 250{
194f9939 251 // Calculates the distance between the EMC RecPoint and the CPV RecPoint
e44c41e9 252 // If no CPV, calculates the distance between the EMC RecPoint and the track
253 // prolongation to the PHOS module plane.
a4e98857 254 // Clusters are sorted in "rows" and "columns" of width 1 cm
f035f6ce 255
e84d3def 256// Float_t delta = 1 ; // Width of the rows in sorting of RecPoints (in cm)
257// // if you change this value, change it as well in xxxRecPoint::Compare()
194f9939 258
146aa588 259 trackindex = -1;
260 dx = 999.;
261 dz = 999.;
262
e44c41e9 263 if(!cpvClu) {
96351742 264
96351742 265 if(!emcClu) {
266 return;
267 }
e44c41e9 268
f96711b8 269 // *** Start the matching
270 Int_t nt=fESD->GetNumberOfTracks();
271 Int_t iPHOSMod = emcClu->GetPHOSMod() ;
272 //Calculate actual distance to PHOS module
273 TVector3 globaPos ;
274 fGeom->Local2Global(iPHOSMod, 0.,0., globaPos) ;
4efbcb95 275 const Double_t rPHOS = globaPos.Pt() ; //Distance to center of PHOS module
f96711b8 276 const Double_t kYmax = 72.+10. ; //Size of the module (with some reserve) in phi direction
277 const Double_t kZmax = 64.+10. ; //Size of the module (with some reserve) in z direction
72e230ec 278 const Double_t kAlpha0=330./180.*TMath::Pi() ; //First PHOS module angular direction
4efbcb95 279 const Double_t kAlpha= 20./180.*TMath::Pi() ; //PHOS module angular size
f96711b8 280 Double_t minDistance = 1.e6;
281
4efbcb95 282 TVector3 vecEmc ; // Local position of EMC recpoint
283 emcClu->GetLocalPosition(vecEmc) ;
f96711b8 284
4efbcb95 285 Double_t gposTrack[3] ;
415ea4fe 286 Double_t bz = AliTracker::GetBz() ; //B-Field for approximate matching
f96711b8 287 Double_t b[3];
288 for (Int_t i=0; i<nt; i++) {
289 AliESDtrack *esdTrack=fESD->GetTrack(i);
290
4efbcb95 291 // Skip the tracks having "wrong" status (has to be checked/tuned)
292 ULong_t status = esdTrack->GetStatus();
293 if ((status & AliESDtrack::kTPCout) == 0) continue;
f96711b8 294// if ((status & AliESDtrack::kTRDout) == 0) continue;
295// if ((status & AliESDtrack::kTRDrefit) == 1) continue;
296
4efbcb95 297 //Continue extrapolation from TPC outer surface
298 const AliExternalTrackParam *outerParam=esdTrack->GetOuterParam();
299 if (!outerParam) continue;
300 AliExternalTrackParam t(*outerParam);
f96711b8 301
4efbcb95 302 t.GetBxByBz(b) ;
303 //Direction to the current PHOS module
72e230ec 304 Double_t phiMod=kAlpha0-kAlpha*iPHOSMod ;
4efbcb95 305 if(!t.Rotate(phiMod))
306 continue ;
307
f96711b8 308 Double_t y; // Some tracks do not reach the PHOS
309 if (!t.GetYAt(rPHOS,bz,y)) continue; // because of the bending
310
4efbcb95 311 Double_t z;
312 if(!t.GetZAt(rPHOS,bz,z))
313 continue ;
314 if (TMath::Abs(z) > kZmax)
315 continue; // Some tracks miss the PHOS in Z
316 if(TMath::Abs(y) < kYmax){
317 t.PropagateToBxByBz(rPHOS,b); // Propagate to the matching module
b2e9b669 318 //t.CorrectForMaterial(...); // Correct for the TOF material, if needed
4efbcb95 319 t.GetXYZ(gposTrack) ;
320 TVector3 globalPositionTr(gposTrack) ;
321 TVector3 localPositionTr ;
322 fGeom->Global2Local(localPositionTr,globalPositionTr,iPHOSMod) ;
323 Double_t ddx = vecEmc.X()-localPositionTr.X();
324 Double_t ddz = vecEmc.Z()-localPositionTr.Z();
325 Double_t d2 = ddx*ddx + ddz*ddz;
326 if(d2 < minDistance) {
327 dx = ddx ;
328 dz = ddz ;
329 trackindex=i;
330 minDistance=d2 ;
331 }
b2e9b669 332 }
4efbcb95 333 } //Scanned all tracks
b2e9b669 334 return ;
335 }
f96711b8 336
337
b2e9b669 338 TVector3 emcGlobal;
339 fGeom->GetGlobalPHOS((AliPHOSRecPoint*)emcClu,emcGlobal);
96351742 340
b2e9b669 341 // Radius from IP to current point
342 Double_t rEMC = TMath::Abs(emcGlobal.Pt());
96351742 343
b2e9b669 344 // Extrapolate the global track direction to EMC
345 // and find the closest track
96351742 346
b2e9b669 347 Int_t nTracks = fESD->GetNumberOfTracks();
e44c41e9 348
b2e9b669 349 AliESDtrack *track;
350 Double_t xyz[] = {-1,-1,-1};
351 Double_t pxyz[3];
352 Double_t zEMC,xEMC;
353 Int_t module;
354 TVector3 vecP;
355 TVector3 locClu;
356
357 Float_t minDistance = 1.e6;
358 Float_t dr;
359
360 for (Int_t iTrack=0; iTrack<nTracks; iTrack++) {
361 track = fESD->GetTrack(iTrack);
362 if (!track->GetXYZAt(rEMC, fESD->GetMagneticField(), xyz)) continue;
363
364 AliDebug(1,Form("Event %d, iTrack: %d, (%.3f,%.3f,%.3f)",
365 fESD->GetEventNumberInFile(),iTrack,xyz[0],xyz[1],xyz[2]));
96351742 366
b2e9b669 367 if (track->GetPxPyPzAt(rEMC,fESD->GetMagneticField(),pxyz)) {
96351742 368
b2e9b669 369 vecP.SetXYZ(pxyz[0],pxyz[1],pxyz[2]);
370 fGeom->ImpactOnEmc(xyz,vecP.Theta(),vecP.Phi(),module,zEMC,xEMC) ;
96351742 371
b2e9b669 372 if(!module) continue;
373 AliDebug(1,Form("\t\tTrack hit PHOS! Module: %d, (x,z)=(%.3f,%.3f)",module,xEMC,zEMC));
96351742 374
b2e9b669 375 if(emcClu->GetPHOSMod() != module) continue;
96351742 376
b2e9b669 377 // match track to EMC cluster
378 emcClu->GetLocalPosition(locClu);
96351742 379
b2e9b669 380 Float_t delta_x = xEMC - locClu.X();
381 Float_t delta_z = zEMC - locClu.Z();
382 dr = TMath::Sqrt(delta_x*delta_x + delta_z*delta_z);
383 AliDebug(1,Form("\tMatch iTrack=%d: (dx,dz)=(%.3f,%.3f)",iTrack,delta_x,delta_z));
96351742 384
b2e9b669 385 if(dr<minDistance) {
386 trackindex = iTrack;
387 minDistance = dr;
388 dx = delta_x;
389 dz = delta_z;
e44c41e9 390 }
391 }
b2e9b669 392
e44c41e9 393 }
b2e9b669 394
395 if(trackindex>=0)
396 AliDebug(1,Form("\t\tBest match for (xClu,zClu,eClu)=(%.3f,%.3f,%.3f): iTrack=%d, dR=%.3f",
397 locClu.X(),locClu.Z(),emcClu->GetEnergy(),
398 trackindex,TMath::Sqrt(dx*dx+dz*dz)));
399 return;
e44c41e9 400
401 Float_t distance2Track = fRtpc ;
402
194f9939 403 trackindex = -1 ; // closest track within fRCpv
b2e9b669 404
aa0b9641 405 TVector3 vecEmc ; // Local position of EMC recpoint
e84d3def 406 TVector3 vecPloc ; // Momentum direction at CPV plain
2731cd1e 407
194f9939 408 //toofar = kTRUE ;
e84d3def 409 if(emcClu->GetPHOSMod() != cpvClu->GetPHOSMod()){
410 dx=999. ;
411 dz=999. ;
412 return ;
413 }
b2e9b669 414
e84d3def 415 emcClu->GetLocalPosition(vecEmc) ;
b2e9b669 416
e84d3def 417 Double_t xCPV,zCPV ; //EMC-projected coordinates of CPV cluster
418 TVector3 cpvGlobal; // Global position of the CPV recpoint
9a2cdbdf 419 fGeom->GetGlobalPHOS((AliPHOSRecPoint*)cpvClu,cpvGlobal);
e84d3def 420 Double_t vtxCPV[3]={cpvGlobal.X(),cpvGlobal.Y(),cpvGlobal.Z()} ;
78881c42 421 Int_t dummyMod ;
e84d3def 422
423 if (fESD == 0x0) {
b2e9b669 424 //if no track information available, assume straight line from IP to emcal
425 fGeom->ImpactOnEmc(vtxCPV,cpvGlobal.Theta(),cpvGlobal.Phi(),dummyMod,zCPV,xCPV) ;
426 dx=xCPV - vecEmc.X() ;
427 dz=zCPV - vecEmc.Z() ;
428 return ;
e84d3def 429 }
b2e9b669 430
e84d3def 431 //if there is ESD try to correct distance using TPC information on particle direct in CPV
432 if (fESD != 0x0) {
0d9aa319 433
e84d3def 434 Double_t rCPV = cpvGlobal.Pt() ;// Radius from IP to current point
435
436 // Extrapolate the global track direction if any to CPV and find the closest track
e84d3def 437 Int_t iClosestTrack = -1;
e84d3def 438 TVector3 inPHOS ;
439
e84d3def 440 for (Int_t iTrack=0; iTrack<nTracks; iTrack++) {
441 track = fESD->GetTrack(iTrack);
442 if (!track->GetXYZAt(rCPV, fESD->GetMagneticField(), xyz))
b2e9b669 443 continue; //track coord on the cylinder of PHOS radius
e84d3def 444 if ((TMath::Abs(xyz[0])+TMath::Abs(xyz[1])+TMath::Abs(xyz[2]))<=0)
b2e9b669 445 continue;
e84d3def 446 //Check if this track hits PHOS
447 inPHOS.SetXYZ(xyz[0],xyz[1],xyz[2]);
448 distance2Track = inPHOS.Angle(cpvGlobal) ;
449 // Find the closest track to the CPV recpoint
450 if (distance2Track < minDistance) {
b2e9b669 451 minDistance = distance2Track;
452 iClosestTrack = iTrack;
aa0b9641 453 }
e84d3def 454 }
aa0b9641 455
e84d3def 456 if (iClosestTrack != -1) {
457 track = fESD->GetTrack(iClosestTrack);
458 if (track->GetPxPyPzAt(rCPV, fESD->GetMagneticField(), pxyz)) { // track momentum ibid.
459 vecP.SetXYZ(pxyz[0],pxyz[1],pxyz[2]);
9a2cdbdf 460 fGeom->ImpactOnEmc(vtxCPV,vecP.Theta(),vecP.Phi(),dummyMod,zCPV,xCPV) ;
aa0b9641 461 }
e84d3def 462 }
194f9939 463
e84d3def 464 if(minDistance < fRtpc ){
465 trackindex = iClosestTrack ;
aa0b9641 466 }
bfc17d18 467 }
e84d3def 468 if(trackindex!=-1){
78881c42 469 // If the closest global track is found, calculate EMC-CPV distance from it
e84d3def 470 dx=xCPV - vecEmc.X() ;
471 dz=zCPV - vecEmc.Z() ;
472 }
473 else{
78881c42 474 // If no global track was found, just take the nearest CPV point
9a2cdbdf 475 fGeom->ImpactOnEmc(vtxCPV,cpvGlobal.Theta(),cpvGlobal.Phi(),dummyMod,zCPV,xCPV) ;
78881c42 476 dx=xCPV - vecEmc.X() ;
477 dz=zCPV - vecEmc.Z() ;
e84d3def 478 }
479 return ;
d15a28e7 480}
7b7c1533 481//____________________________________________________________________________
482void AliPHOSTrackSegmentMakerv1::Init()
483{
484 // Make all memory allocations that are not possible in default constructor
485
7b7c1533 486 fLinkUpArray = new TClonesArray("AliPHOSLink", 1000);
9a2cdbdf 487 fTrackSegments = new TClonesArray("AliPHOSTrackSegment",100);
488 fTrackSegments->SetName("TRACKS");
7b7c1533 489}
490
8d0f3f77 491//____________________________________________________________________________
492void AliPHOSTrackSegmentMakerv1::InitParameters()
493{
e957fea8 494 //Initializes parameters
743cb288 495 fRcpv = 10. ;
496 fRtpc = 4. ;
8d0f3f77 497 fEmcFirst = 0 ;
498 fEmcLast = 0 ;
499 fCpvFirst = 0 ;
500 fCpvLast = 0 ;
501 fLinkUpArray = 0 ;
adcca1e6 502 fWrite = kTRUE ;
8d0f3f77 503}
504
505
d15a28e7 506//____________________________________________________________________________
baef0810 507void AliPHOSTrackSegmentMakerv1::MakeLinks()const
d15a28e7 508{
194f9939 509 // Finds distances (links) between all EMC and CPV clusters,
fbf811ec 510 // which are not further apart from each other than fRcpv
f035f6ce 511 // and sort them in accordance with this distance
9688c1dd 512
2731cd1e 513 fLinkUpArray->Clear() ;
2731cd1e 514
2bb500e5 515 AliPHOSCpvRecPoint * cpv ;
92862013 516 AliPHOSEmcRecPoint * emcclu ;
28c3a259 517
d15a28e7 518 Int_t iLinkUp = 0 ;
519
28c3a259 520 Int_t iEmcRP;
2731cd1e 521 for(iEmcRP = fEmcFirst; iEmcRP < fEmcLast; iEmcRP++ ) {
9a2cdbdf 522 emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(iEmcRP)) ;
2731cd1e 523
194f9939 524 //Bool_t toofar ;
2731cd1e 525 Int_t iCpv = 0 ;
526 for(iCpv = fCpvFirst; iCpv < fCpvLast;iCpv++ ) {
28c3a259 527
9a2cdbdf 528 cpv = dynamic_cast<AliPHOSCpvRecPoint *>(fCPVRecPoints->At(iCpv)) ;
194f9939 529 Int_t track = -1 ;
e84d3def 530 Float_t dx,dz ;
531 GetDistanceInPHOSPlane(emcclu, cpv, track,dx,dz) ;
532 if(TMath::Sqrt(dx*dx+dz*dz) < fRcpv ){
533 new ((*fLinkUpArray)[iLinkUp++]) AliPHOSLink(dx, dz, iEmcRP, iCpv, track) ;
28c3a259 534 }
d15a28e7 535 }
28c3a259 536 }
d15a28e7 537
9688c1dd 538 fLinkUpArray->Sort() ; //first links with smallest distances
d15a28e7 539}
28c3a259 540
d15a28e7 541//____________________________________________________________________________
2731cd1e 542void AliPHOSTrackSegmentMakerv1::MakePairs()
6ad0bfa0 543{
f035f6ce 544 // Using the previously made list of "links", we found the smallest link - i.e.
a4e98857 545 // link with the least distance between EMC and CPV and pointing to still
f035f6ce 546 // unassigned RecParticles. We assign these RecPoints to TrackSegment and
547 // remove them from the list of "unassigned".
88cb7938 548
01a599c9 549 //Make arrays to mark clusters already chosen
2731cd1e 550 Int_t * emcExist = 0;
551 if(fEmcLast > fEmcFirst)
552 emcExist = new Int_t[fEmcLast-fEmcFirst] ;
553
554 Int_t index;
555 for(index = 0; index <fEmcLast-fEmcFirst; index ++)
556 emcExist[index] = 1 ;
557
558 Bool_t * cpvExist = 0;
559 if(fCpvLast > fCpvFirst)
560 cpvExist = new Bool_t[fCpvLast-fCpvFirst] ;
561 for(index = 0; index <fCpvLast-fCpvFirst; index ++)
562 cpvExist[index] = kTRUE ;
563
2731cd1e 564
565 // Finds the smallest links and makes pairs of CPV and EMC clusters with smallest distance
2731cd1e 566 TIter nextUp(fLinkUpArray) ;
d15a28e7 567
d15a28e7 568 AliPHOSLink * linkUp ;
9688c1dd 569
2bb500e5 570 AliPHOSCpvRecPoint * nullpointer = 0 ;
9688c1dd 571
29b077b5 572 while ( (linkUp = static_cast<AliPHOSLink *>(nextUp()) ) ){
9688c1dd 573
194f9939 574 if(emcExist[linkUp->GetEmc()-fEmcFirst] != -1){
d15a28e7 575
194f9939 576 if(cpvExist[linkUp->GetCpv()-fCpvFirst]){ //CPV still exist
d7ddbb70 577 Float_t dx,dz ;
578 linkUp->GetXZ(dx,dz) ;
9a2cdbdf 579 new ((* fTrackSegments)[fNTrackSegments])
580 AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(linkUp->GetEmc())) ,
581 dynamic_cast<AliPHOSCpvRecPoint *>(fCPVRecPoints->At(linkUp->GetCpv())) ,
d7ddbb70 582 linkUp->GetTrack(),dx,dz) ;
194f9939 583
9a2cdbdf 584 (dynamic_cast<AliPHOSTrackSegment *>(fTrackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
88cb7938 585 fNTrackSegments++ ;
88cb7938 586 emcExist[linkUp->GetEmc()-fEmcFirst] = -1 ; //Mark emc that Cpv was found
587 //mark CPV recpoint as already used
194f9939 588 cpvExist[linkUp->GetCpv()-fCpvFirst] = kFALSE ;
589 } //if CpvUp still exist
28c3a259 590 }
88cb7938 591 }
28c3a259 592
194f9939 593 //look through emc recPoints left without CPV
2731cd1e 594 if(emcExist){ //if there is emc rec point
595 Int_t iEmcRP ;
596 for(iEmcRP = 0; iEmcRP < fEmcLast-fEmcFirst ; iEmcRP++ ){
597 if(emcExist[iEmcRP] > 0 ){
e44c41e9 598 Int_t track = -1 ;
599 Float_t dx,dz ;
600 AliPHOSEmcRecPoint *emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(iEmcRP+fEmcFirst));
601 GetDistanceInPHOSPlane(emcclu, 0, track,dx,dz);
602 if(track<0)
603 new ((*fTrackSegments)[fNTrackSegments]) AliPHOSTrackSegment(emcclu,nullpointer) ;
604 else
605 new ((*fTrackSegments)[fNTrackSegments]) AliPHOSTrackSegment(emcclu,0,track,dx,dz);
606 (dynamic_cast<AliPHOSTrackSegment *>(fTrackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
607 fNTrackSegments++;
2731cd1e 608 }
d15a28e7 609 }
d15a28e7 610 }
780a31c1 611 delete [] emcExist ;
612 delete [] cpvExist ;
d15a28e7 613}
614
615//____________________________________________________________________________
9a2cdbdf 616void AliPHOSTrackSegmentMakerv1::Clusters2TrackSegments(Option_t *option)
d15a28e7 617{
9a2cdbdf 618 // Steering method to perform track segment construction for the current event
619 // Returns an array with the found track-segments.
88cb7938 620
2731cd1e 621 if(strstr(option,"tim"))
b3f97575 622 gBenchmark->Start("PHOSTSMaker");
7b7c1533 623
624 if(strstr(option,"print")) {
88cb7938 625 Print() ;
7b7c1533 626 return ;
627 }
88cb7938 628
9a2cdbdf 629 //Make some initializations
630 fNTrackSegments = 0 ;
631 fEmcFirst = 0 ;
632 fEmcLast = 0 ;
633 fCpvFirst = 0 ;
634 fCpvLast = 0 ;
55ea5766 635
9a2cdbdf 636 fTrackSegments->Clear();
7b7c1533 637
9a2cdbdf 638 // if(!ReadRecPoints(ievent)) continue; //reads RecPoints for event ievent
f96711b8 639
9a2cdbdf 640 for(fModule = 1; fModule <= fGeom->GetNModules() ; fModule++ ) {
641 FillOneModule() ;
642 MakeLinks() ;
643 MakePairs() ;
2731cd1e 644 }
9a2cdbdf 645
646 if(strstr(option,"deb"))
647 PrintTrackSegments(option);
648
2731cd1e 649 if(strstr(option,"tim")){
650 gBenchmark->Stop("PHOSTSMaker");
9a2cdbdf 651 Info("Exec", "took %f seconds for making TS",
652 gBenchmark->GetCpuTime("PHOSTSMaker"));
653 }
d15a28e7 654}
7b7c1533 655
d15a28e7 656//____________________________________________________________________________
702ab87e 657void AliPHOSTrackSegmentMakerv1::Print(const Option_t *)const
a4e98857 658{
baef0810 659 // Print TrackSegmentMaker parameters
660
21cd0c07 661 TString message("") ;
7b7c1533 662 if( strcmp(GetName(), "") != 0 ) {
21cd0c07 663 message = "\n======== AliPHOSTrackSegmentMakerv1 ========\n" ;
664 message += "Making Track segments\n" ;
665 message += "with parameters:\n" ;
194f9939 666 message += " Maximal EMC - CPV distance (cm) %f\n" ;
21cd0c07 667 message += "============================================\n" ;
668 Info("Print", message.Data(),fRcpv) ;
2731cd1e 669 }
670 else
21cd0c07 671 Info("Print", "AliPHOSTrackSegmentMakerv1 not initialized ") ;
d15a28e7 672}
7b7c1533 673
2731cd1e 674//____________________________________________________________________________
a4e98857 675void AliPHOSTrackSegmentMakerv1::PrintTrackSegments(Option_t * option)
676{
f035f6ce 677 // option deb - prints # of found TrackSegments
678 // option deb all - prints as well indexed of found RecParticles assigned to the TS
9688c1dd 679
88cb7938 680 Info("PrintTrackSegments", "Results from TrackSegmentMaker:") ;
9a2cdbdf 681 printf(" Found %d TrackSegments\n", fTrackSegments->GetEntriesFast() );
88cb7938 682
2731cd1e 683 if(strstr(option,"all")) { // printing found TS
88cb7938 684 printf("TrackSegment # EMC RP# CPV RP#\n") ;
2731cd1e 685 Int_t index;
9a2cdbdf 686 for (index = 0 ; index <fTrackSegments->GetEntriesFast() ; index++) {
687 AliPHOSTrackSegment * ts = (AliPHOSTrackSegment * )fTrackSegments->At(index) ;
88cb7938 688 printf(" %d %d %d \n", ts->GetIndexInList(), ts->GetEmcIndex(), ts->GetCpvIndex() ) ;
2731cd1e 689 }
d15a28e7 690 }
2731cd1e 691}
f96711b8 692