1 // ---- ROOT system ---
2 #include "TDirectory.h"
8 // --- AliRoot header files ---
10 #include "AliPHOSClusterizer.h"
11 #include "AliPHOSEvalRecPoint.h"
13 #include "AliPHOSLoader.h"
14 #include "AliPHOSRecCpvManager.h"
15 #include "AliPHOSRecEmcManager.h"
16 #include "AliPHOSDigitizer.h"
18 // --- Standard library ---
21 ClassImp(AliPHOSEvalRecPoint)
23 AliPHOSEvalRecPoint::AliPHOSEvalRecPoint(): fEventFolderName(AliConfig::fgkDefaultEventFolderName)
31 AliPHOSEvalRecPoint::AliPHOSEvalRecPoint(Bool_t cpv, AliPHOSEvalRecPoint* parent)
32 : fEventFolderName(AliConfig::fgkDefaultEventFolderName)
39 TObjArray* wPool = (TObjArray*)GetWorkingPool();
41 Error("AliPHOSEvalRecPoint", "Couldn't find working pool. Exit.") ;
45 fParent = wPool->IndexOf((TObject*)parent);
46 fChi2Dof = parent->Chi2Dof();
57 // Add itself to working pool
58 AddToWorkingPool((TObject*)this);
62 AliPHOSEvalRecPoint::AliPHOSEvalRecPoint(Int_t i, Bool_t cpv) : fEventFolderName(AliConfig::fgkDefaultEventFolderName)
68 AliPHOSEmcRecPoint* rp=0;
70 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
73 rp = (AliPHOSCpvRecPoint*)fLoader->CpvRecPoints()->At(i);
78 rp = (AliPHOSEmcRecPoint*)fLoader->EmcRecPoints()->At(i);
83 Int_t* Digits = rp->GetDigitsList();
84 Float_t* Energies = rp->GetEnergiesList();
85 Int_t nDigits = rp->GetMultiplicity();
87 for(Int_t iDigit=0; iDigit<nDigits; iDigit++) {
88 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
89 Float_t eDigit = Energies[iDigit];
90 this->AddDigit(*digit,eDigit);
94 rp->GetLocalPosition(locpos);
97 // Add itself to working pool
98 AddToWorkingPool((TObject*)this);
102 AliPHOSClusterizer* AliPHOSEvalRecPoint::GetClusterizer()
104 TFolder* aliceF = (TFolder*)gROOT->FindObjectAny("YSAlice");
105 TFolder* wPoolF = (TFolder*)aliceF->FindObject("WhiteBoard/RecPoints/PHOS/SmP");
106 AliPHOSClusterizer* clu = (AliPHOSClusterizer*)wPoolF->FindObject("PHOS:clu-v1");
108 Error("GetClusterizer", "Couldn't find Clusterizer. Exit.") ;
115 Bool_t AliPHOSEvalRecPoint::TooClose(AliPHOSRecPoint* pt) const
119 pt->GetLocalPosition(her_pos);
120 this->GetLocalPosition(my_pos);
121 Float_t dx = her_pos.X() - my_pos.X();
122 Float_t dz = her_pos.Z() - my_pos.Z();
123 Float_t dr = TMath::Sqrt(dx*dx + dz*dz);
125 if(dr<GetReconstructionManager()->MergeGammasMinDistanceCut())
132 Bool_t AliPHOSEvalRecPoint::NeedToSplit() const
137 void AliPHOSEvalRecPoint::DeleteParent()
142 void AliPHOSEvalRecPoint::UpdateWorkingPool()
145 Int_t i; //loop variable
147 for(i=0; i<this->InWorkingPool(); i++) {
148 AliPHOSEvalRecPoint* parent = (AliPHOSEvalRecPoint*)GetFromWorkingPool(i);
150 Int_t nChild = parent->HasChild(children);
151 for(Int_t iChild=0; iChild<nChild; iChild++)
153 ((AliPHOSEvalRecPoint*)children.At(iChild))->DeleteParent();
157 RemoveFromWorkingPool(parent);
163 for(i=0; i<this->InWorkingPool(); i++) {
164 AliPHOSEvalRecPoint* weak = (AliPHOSEvalRecPoint*)GetFromWorkingPool(i);
165 if (weak->KillWeakPoint()) delete weak;
168 for(i=0; i<this->InWorkingPool(); i++) {
169 AliPHOSEvalRecPoint* close = (AliPHOSEvalRecPoint*)GetFromWorkingPool(i);
170 close->MergeClosePoint();
173 for(i=0; i<this->InWorkingPool(); i++)
174 ((AliPHOSEvalRecPoint*)AliPHOSEvalRecPoint::GetFromWorkingPool(i))->SetIndexInList(i);
178 Int_t AliPHOSEvalRecPoint::HasChild(TObjArray& children)
180 for(Int_t iChild=0; iChild<InWorkingPool(); iChild++)
182 AliPHOSEvalRecPoint* child = (AliPHOSEvalRecPoint*)GetFromWorkingPool(iChild);
183 TObject* parent = (TObject*)child->Parent();
184 TObject* me = (TObject*)this;
185 if(parent==me) children.Add(child);
188 return children.GetEntries();
191 void AliPHOSEvalRecPoint::Init()
194 AliPHOSClusterizer* clusterizer = GetClusterizer();
196 Error("Init", "Cannot get clusterizer. Exit.") ;
200 TClonesArray* digits = AliPHOSLoader::GetPHOSLoader(fEventFolderName)->Digits();
204 LogWeight = clusterizer->GetEmcLogWeight();
207 LogWeight = clusterizer->GetCpvLogWeight();
210 EvalLocalPosition(LogWeight,digits); // evaluate initial position
214 void AliPHOSEvalRecPoint::MakeJob()
216 // Reconstruction algoritm implementation.
218 AliPHOSRecManager* recMng = GetReconstructionManager();
225 Int_t nChild = HasChild(children);
229 if(Chi2Dof()>recMng->OneGamChisqCut()) SplitMergedShowers();
232 for(Int_t iChild=0; iChild<nChild; iChild++) {
233 AliPHOSEvalRecPoint* child = (AliPHOSEvalRecPoint*)children.At(iChild);
234 child->EvaluatePosition();
236 if(child->Chi2Dof()>recMng->OneGamChisqCut())
237 child->SplitMergedShowers();
242 void AliPHOSEvalRecPoint::InitTwoGam(Float_t* gamma1, Float_t* gamma2)
244 //Compute start values for two gamma fit algorithm.
245 // gamma1[0], gamma1[1], gamma1[2] are Energy,x,z of the reconstructed "gammas".
248 TVector3 lpos; // start point choosing.
249 GetLocalPosition(lpos);
250 Float_t xx = lpos.Z();
251 Float_t yy = lpos.X();
252 Float_t E = GetEnergy();
254 Info("InitTwoGam", "(x,z,E)[old] = (%f, %f, %f)", yy, xx, E) ;
261 AliPHOSDigit * digit ;
262 Int_t nDigits = GetMultiplicity();
263 Int_t * Digits = GetDigitsList();
264 Float_t * Energies = GetEnergiesList();
276 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
277 const AliPHOSGeometry* fGeom = fLoader->PHOSGeometry();
279 Int_t iDigit; //loop variable
281 for(iDigit = 0 ; iDigit < nDigits ; iDigit ++)
283 digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
284 eDigit = Energies[iDigit];
285 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
286 fGeom->RelPosInModule(relid, iy, ix);
288 Float_t dx = ix - xx;
289 Float_t dy = iy - yy;
296 sqr = TMath::Sqrt(4.*exy*exy + (exx-eyy)*(exx-eyy));
297 Float_t euu = (exx+eyy+sqr)/2.;
298 if(sqr>1.e-10) cos2fi = (exx - eyy)/sqr;
299 Float_t cosfi = TMath::Sqrt((1.+cos2fi)/2.);
300 Float_t sinfi = TMath::Sqrt((1.-cos2fi)/2.);
301 if(exy<0) sinfi = -sinfi;
304 for(iDigit = 0 ; iDigit < nDigits ; iDigit ++)
306 digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
307 eDigit = Energies[iDigit];
308 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
309 fGeom->RelPosInModule(relid, iy, ix);
311 Float_t dx = ix - xx;
312 Float_t dy = iy - yy;
313 Float_t du = dx*cosfi + dy*sinfi;
314 eu3 += eDigit*du*du*du;
317 Float_t c = E*eu3*eu3/(euu*euu*euu)/2.;
319 if(eu3<0) sign = -1.;
320 Float_t r = 1.+ c + sign*TMath::Sqrt(2.*c + c*c);
322 if(TMath::Abs(r-1.)>0.1) u = eu3/euu*(r+1.)/(r-1.);
323 if(TMath::Abs(r-1.)<0.1) u = TMath::Sqrt(sqr/E/r)*(1.+r);
325 Float_t e2c = E/(1.+r);
327 Float_t u1 = -u/(1.+r);
330 Float_t x1c = xx+u1*cosfi;
331 Float_t y1c = yy+u1*sinfi;
332 Float_t x2c = xx+u2*cosfi;
333 Float_t y2c = yy+u2*sinfi;
335 // printf("e1c -> %f\n",e1c);
336 // printf("x1c -> %f\n",x1c);
337 // printf("y1c -> %f\n",y1c);
338 // printf("e2c -> %f\n",e2c);
339 // printf("x2c -> %f\n",x2c);
340 // printf("y2c -> %f\n",y2c);
352 void AliPHOSEvalRecPoint::TwoGam(Float_t* gamma1, Float_t* gamma2)
354 //Fitting algorithm for the two very closed gammas
355 //that merged into the cluster with one maximum.
356 // Starting points gamma1 and gamma2 must be provided before ( see InitTwoGam)
357 //Set chisquare of the fit.
360 Float_t st0 = GetReconstructionManager()->TwoGamInitialStep();
361 Float_t chmin = GetReconstructionManager()->TwoGamChisqMin();
362 Float_t emin = GetReconstructionManager()->TwoGamEmin();
363 Float_t stpmin = GetReconstructionManager()->TwoGamStepMin();
364 Int_t Niter = GetReconstructionManager()->TwoGamNumOfIterations(); // Number of iterations.
366 Float_t chisq = 100.; //Initial chisquare.
368 Int_t nadc = GetMultiplicity();
372 Int_t dof = nadc - 5;
374 Float_t chstop = chmin*dof;
384 Float_t ee1=0,xx1=0,yy1=0,ee2=0,xx2=0,yy2=0,cosi;
386 Float_t e1c = gamma1[0];
387 Float_t y1c = gamma1[1];
388 Float_t x1c = gamma1[2];
390 Float_t e2c = gamma2[0];
391 Float_t y2c = gamma2[1];
392 Float_t x2c = gamma2[2];
394 Float_t E = GetEnergy();
397 AliPHOSDigit * digit ;
398 Int_t nDigits = GetMultiplicity();
399 Int_t * Digits = GetDigitsList();
400 Float_t * Energies = GetEnergiesList();
406 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
407 const AliPHOSGeometry* fGeom = fLoader->PHOSGeometry();
409 for(Int_t Iter=0; Iter<Niter; Iter++)
418 for(Int_t iDigit = 0 ; iDigit < nDigits ; iDigit ++)
420 digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
421 eDigit = Energies[iDigit];
422 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
423 fGeom->RelPosInModule(relid, iy, ix);
428 Float_t dx1 = x1c - ix;
429 Float_t dy1 = y1c - iy;
430 // Info("TwoGam", "Mult %d dx1 %f dy1 %f", nDigits, dx1, dy1) ;
431 // AG(e1c,dx1,dy1,a1,gx1,gy1);
432 GetReconstructionManager()->AG(e1c,dx1,dy1,a1,gx1,gy1);
434 Float_t dx2 = x2c - ix;
435 Float_t dy2 = y2c - iy;
436 // Info("TwoGam", " dx2 %f dy2 %f", dx2, dy2) ;
437 // AG(e2c,dx2,dy2,a2,gx2,gy2);
438 GetReconstructionManager()->AG(e2c,dx2,dy2,a2,gx2,gy2);
441 // Float_t D = Const*A*(1. - A/E);
444 // // D = 9.; // ????
446 // Float_t da = A - eDigit;
447 // chisqc += da*da/D;
448 // Float_t dd = da/D;
449 // dd = dd*(2.-dd*Const*(1.-2.*A/E));
452 chisqc += GetReconstructionManager()->TwoGamChi2(A,eDigit,E,dd);
458 grec += (a1/e1c - a2/e2c)*E*dd;
462 Float_t grc = TMath::Sqrt(grx1c*grx1c + gry1c*gry1c + grx2c*grx2c + gry2c*gry2c);
463 if(grc<1.e-10) grc=1.e-10;
465 Float_t sc = 1. + chisqc/ch;
470 cosi = (grx1*grx1c + gry1*gry1c + grx2*grx2c + gry2*gry2c + gre*grec)/gr/grc;
471 st = st*sc/(1.4 - cosi);
493 Float_t step = st*gr;
495 Info("TwoGam", "Iteration %d dof %d chisq/dof %f chstop/dof %f step %d stpmin %d",
496 Iter, dof, ch/dof, chstop/dof, step, stpmin) ;
502 Float_t de = st*gre*E;
506 if( (e1c>emin) && (e2c>emin) )
522 // if(ch>chisq*(nadc-2)-delch)
534 Float_t x1_new = yy1;
535 Float_t z1_new = xx1;
536 Float_t e1_new = ee1;
537 Float_t x2_new = yy2;
538 Float_t z2_new = xx2;
539 Float_t e2_new = ee2;
542 message = " (x,z,E)[1 fit] = (%f, %f, %f)\n" ;
543 message = " (x,z,E)[2 fit] = (%f, %f, %f)\n" ;
544 Info("TwoGam", message.Data(),
545 x1_new, z1_new, e1_new,
546 x2_new, z2_new, e2_new) ;
552 void AliPHOSEvalRecPoint::UnfoldTwoMergedPoints(Float_t* gamma1, Float_t* gamma2)
554 //Unfold TWO merged rec. points in the case when cluster has only one maximum,
555 //but it's fitting to the one gamma shower is too bad.
556 // Use TwoGam() to estimate the positions and energies of merged points.
562 Int_t* Digits = GetDigitsList();
563 Int_t nDigits = GetMultiplicity();
564 Float_t* Energies = GetEnergiesList();
565 Float_t* eFit = new Float_t[nDigits];
567 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
568 const AliPHOSGeometry* fGeom = fLoader->PHOSGeometry();
570 for(Int_t iDigit=0; iDigit<nDigits; iDigit++)
572 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
574 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
576 fGeom->RelPosInModule(relid, x, z);
579 for(Int_t iMax=0; iMax<Nmax; iMax++)
586 Float_t eMax = gamma[0];
587 Float_t xMax = gamma[1];
588 Float_t zMax = gamma[2];
590 Float_t dx = xMax - x;
591 Float_t dz = zMax - z;
593 GetReconstructionManager()->AG(eMax,dz,dx,Amp,gx,gy);
601 for( Int_t iMax=0; iMax<Nmax; iMax++)
608 Float_t eMax = gamma[0];
609 Float_t xMax = gamma[1];
610 Float_t zMax = gamma[2];
612 AliPHOSEvalRecPoint* newRP = new AliPHOSEvalRecPoint(IsCPV(),this);
613 TVector3 newpos(xMax,0,zMax);
614 newRP->SetLocalPosition(newpos);
616 for( Int_t iDigit = 0 ; iDigit < nDigits ; iDigit ++)
618 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
619 Float_t eDigit = Energies[iDigit];
621 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
623 fGeom->RelPosInModule(relid, ix, iz);
625 Float_t dx = xMax - ix;
626 Float_t dz = zMax - iz;
627 Float_t single_shower_gain,gxMax,gyMax;
628 GetReconstructionManager()->AG(eMax,dz,dx,single_shower_gain,gxMax,gyMax);
629 Float_t total_gain = eFit[iDigit];
630 Float_t ratio = single_shower_gain/total_gain;
631 eDigit = eDigit*ratio;
632 newRP->AddDigit(*digit,eDigit);
634 Info("UnfoldTwoMergedPoints", "======= Split: daughter rec point %d =================", iMax) ;
645 void AliPHOSEvalRecPoint::EvaluatePosition()
647 // One gamma fit algorithm.
648 // Set chisq/dof of the fit.
649 // gamma1[0], gamma1[1], gamma1[2] are Energy,x,z of the reconstructed gamma, respectively.
651 Int_t nDigits = GetMultiplicity();
655 Int_t Niter = GetReconstructionManager()->OneGamNumOfIterations(); // number of iterations
656 Float_t St0 = GetReconstructionManager()->OneGamInitialStep(); // initial step
657 // const Float_t Stpmin = 0.005;
658 Float_t Stpmin = GetReconstructionManager()->OneGamStepMin();
659 Float_t chmin = GetReconstructionManager()->OneGamChisqMin();
667 GetLocalPosition(locpos);
668 Float_t E = GetEnergy();
669 Float_t xc = locpos.Z();
670 Float_t yc = locpos.X();
671 Float_t dx,dy,gx,gy,grxc,gryc;
673 Float_t chisq = 1.e+20;
677 Int_t dof = GetMultiplicity() - 2;
680 Float_t chstop = chmin*dof;
681 Float_t cosi,x1=0,y1=0;
684 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
685 const AliPHOSGeometry* fGeom = fLoader->PHOSGeometry();
687 for(Int_t Iter=0; Iter<Niter; Iter++)
693 for(Int_t iDigit = 0 ; iDigit < nDigits ; iDigit ++)
696 Float_t* Energies = GetEnergiesList();
697 Int_t* Digits = GetDigitsList();
698 digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
699 eDigit = Energies[iDigit];
700 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
701 fGeom->RelPosInModule(relid, iy, ix);
710 GetReconstructionManager()->AG(E,dx,dy,A,gx,gy);
712 Info("EvaluatePosition", " (ix iy xc yc dx dy) %f %f %f %f %f %f", ix, iy, xc, yc, dx, dy) ;
713 Float_t chi2dg = GetReconstructionManager()->OneGamChi2(A,eDigit,E,dd);
715 // Exclude digit with too large chisquare.
716 if(chi2dg > 10) { continue; }
724 Float_t grc = TMath::Sqrt(grxc*grxc + gryc*gryc);
725 if(grc<1.e-10) grc=1.e-10;
726 Float_t sc = 1. + chisqc/chisq;
727 Info("EvaluatePosition", " chisq: %f", chisq) ;
731 cosi = (grx*grxc + gry*gryc)/gr/grc;
732 st = st*sc/(1.4 - cosi);
744 Float_t step = st*gr;
746 Info("EvaluatePosition", " Iteration %d dof %d chisq/dof %f chstop/dof %f step %d Stpmin %d",
747 Iter, dof, chisq/dof, chisq/dof, chstop/dof, step, Stpmin) ;
772 TVector3 newpos(gamma1[1],0,gamma1[2]);
773 //SetLocalPosition(newpos);
779 // RP->GetLocalPosition(pos);
788 Bool_t AliPHOSEvalRecPoint::KillWeakPoint()
790 // Remove this point from further procession
791 // if it's energy is too small.
793 Float_t Thr0 = GetReconstructionManager()->KillGamMinEnergy();
795 if(GetEnergy()<Thr0) {
796 Info("KillWeakPoint", "+++++++ Killing this rec point ++++++++++") ;
797 RemoveFromWorkingPool(this);
805 void AliPHOSEvalRecPoint::SplitMergedShowers()
807 // Split two very close rec. points.
809 if(GetMultiplicity()<2)
815 InitTwoGam(gamma1,gamma2); // start points for fit
816 TwoGam(gamma1,gamma2); // evaluate the positions and energies
817 UnfoldTwoMergedPoints(gamma1,gamma2); // make the job
822 void AliPHOSEvalRecPoint::MergeClosePoint()
825 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
826 // AliPHOSDigitizer* digitizer = fLoader->Digitizer();
827 // Float_t fPedestal = digitizer->GetPedestal(); // YVK 30.09.2001
828 // Float_t fSlope = digitizer->GetSlope();
830 for (Int_t i=0;i<InWorkingPool(); i++)
832 TObject* obj = GetFromWorkingPool(i);
833 if(!((TObject*)this)->IsEqual(obj))
835 AliPHOSRecPoint* rp = (AliPHOSRecPoint*)obj;
836 if(GetPHOSMod() == rp->GetPHOSMod())
840 Info("MergeClosePoint", "+++++++ Merging point 1: ++++++") ;
842 Info("MergeClosePoint", "+++++++ and point 2: ++++++++++") ;
843 ((AliPHOSEvalRecPoint*)rp)->Print("");
845 //merge two rec. points
848 this->GetLocalPosition(lpos1);
849 rp->GetLocalPosition(lpos2);
851 Int_t* Digits = rp->GetDigitsList();
852 Float_t dE = rp->GetEnergy()/(rp->GetEnergy()+this->GetEnergy());
853 Float_t new_x = lpos1.X()*dE + lpos2.X()*(1.-dE);
854 Float_t new_z = lpos1.Z()*dE + lpos2.Z()*(1.-dE);
855 Float_t new_E = rp->GetEnergy()+this->GetEnergy();
856 Float_t* Energies = ((AliPHOSEmcRecPoint*)rp)->GetEnergiesList();
858 for(Int_t iDigit=0; iDigit<rp->GetDigitsMultiplicity(); iDigit++)
860 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At(Digits[iDigit]);
861 Float_t eDigit = Energies[iDigit];
862 this->AddDigit(*digit,eDigit);
865 TVector3 newpos(new_x,0,new_z);
868 RemoveFromWorkingPool(rp);
871 Info("MergeClosePoint", "++++++ Resulting point: ++++++++") ;
882 Int_t AliPHOSEvalRecPoint::UnfoldLocalMaxima()
884 // Make unfolding in the reconstruction point with several local maxima.
885 // Return the number of local maxima.
887 // if multiplicity less then 2 - nothing to unfold
888 if(GetMultiplicity()<2) return 1;
890 AliPHOSDigit * maxAt[1000];
891 Float_t maxAtEnergy[1000];
892 Float_t LocMaxCut, LogWeight;
897 // AliPHOSClusterizer* clusterizer = fLoader->Clusterizer("PHOSclu-v1");
898 AliPHOSClusterizer* clusterizer = GetClusterizer();
900 Error("UnfoldLocalMaxima", "Cannot get clusterizer. Exit.") ;
905 LocMaxCut = clusterizer->GetEmcLocalMaxCut();
906 LogWeight = clusterizer->GetEmcLogWeight();
909 LocMaxCut = clusterizer->GetCpvLocalMaxCut();
910 LogWeight = clusterizer->GetCpvLogWeight();
913 AliPHOSLoader* fLoader = AliPHOSLoader::GetPHOSLoader(fEventFolderName);
914 const AliPHOSGeometry* fGeom = fLoader->PHOSGeometry();
915 TClonesArray* digits = fLoader->Digits();
917 // if number of local maxima less then 2 - nothing to unfold
918 Int_t Nmax = GetNumberOfLocalMax(maxAt,maxAtEnergy,LocMaxCut,digits);
919 if(Nmax<2) return Nmax;
921 Int_t* Digits = GetDigitsList();
922 Int_t nDigits = GetMultiplicity();
923 Float_t* Energies = GetEnergiesList();
924 Float_t* eFit = new Float_t[nDigits];
926 Int_t iDigit; //loop variable
928 for(iDigit=0; iDigit<nDigits; iDigit++)
933 for(iDigit=0; iDigit<nDigits; iDigit++)
936 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
937 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
939 fGeom->RelPosInModule(relid, x, z);
941 for(Int_t iMax=0; iMax<Nmax; iMax++)
943 AliPHOSDigit* digitMax = maxAt[iMax];
944 Float_t eMax = maxAtEnergy[iMax];
945 fGeom->AbsToRelNumbering(digitMax->GetId(), relid) ;
946 fGeom->RelPosInModule(relid, xMax, zMax);
947 Float_t dx = xMax - x;
948 Float_t dz = zMax - z;
950 GetReconstructionManager()->AG(eMax,dz,dx,Amp,gx,gy);
957 for(Int_t iMax=0; iMax<Nmax; iMax++)
959 AliPHOSDigit* digitMax = maxAt[iMax];
960 fGeom->AbsToRelNumbering(digitMax->GetId(), relid) ;
961 fGeom->RelPosInModule(relid, xMax, zMax);
962 Float_t eMax = maxAtEnergy[iMax];
964 AliPHOSEvalRecPoint* newRP = new AliPHOSEvalRecPoint(IsCPV(),this);
965 newRP->AddDigit(*digitMax,maxAtEnergy[iMax]);
967 //Neighbous ( matrix 3x3 around the local maximum)
968 for(Int_t iDigit=0; iDigit<nDigits; iDigit++)
970 AliPHOSDigit* digit = (AliPHOSDigit*)fLoader->Digits()->At( Digits[iDigit] );
971 Float_t eDigit = Energies[iDigit];
972 fGeom->AbsToRelNumbering(digit->GetId(), relid) ;
974 fGeom->RelPosInModule(relid, ix, iz);
976 if(AreNeighbours(digitMax,digit))
978 Float_t dx = xMax - ix;
979 Float_t dz = zMax - iz;
980 Float_t single_shower_gain,gxMax,gyMax;
981 GetReconstructionManager()->AG(eMax,dz,dx,single_shower_gain,gxMax,gyMax);
982 Float_t total_gain = eFit[iDigit];
983 Float_t ratio = single_shower_gain/total_gain;
984 Info("UnfoldLocalMaxima", " ratio -> %f", ratio) ;
985 eDigit = eDigit*ratio;
986 newRP->AddDigit(*digit,eDigit);
990 newRP->EvalLocalPosition(LogWeight,digits);
991 Info("UnfoldLocalMaxima", "======= Unfold: daughter rec point %d =================", iMax) ;
995 // RemoveFromWorkingPool(this);
1003 void AliPHOSEvalRecPoint::PrintPoint(Option_t* opt)
1005 AliPHOSCpvRecPoint::Print(opt);
1008 GetLocalPosition(lpos);
1011 message = " Chi2/dof = %f" ;
1012 message += " Local (x,z) = (%f, %f) in module %d" ;
1013 Info("Print", message.Data(), Chi2Dof(), lpos.X(), lpos.Z(), GetPHOSMod()) ;
1017 AliPHOSRecManager* AliPHOSEvalRecPoint::GetReconstructionManager() const
1020 TFolder* aliceF = (TFolder*)gROOT->FindObjectAny("YSAlice");
1021 TFolder* wPoolF = (TFolder*)aliceF->FindObject("WhiteBoard/RecPoints/PHOS/SmP");
1022 AliPHOSRecManager* recMng = (AliPHOSRecManager*)wPoolF->FindObject("AliPHOSRecManager");
1024 Error("GetReconstructionManager", "Couldn't find Reconstruction Manager. Exit.") ;
1032 AliPHOSRecPoint* AliPHOSEvalRecPoint::Parent()
1034 if(fParent<0) return NULL;
1036 return (AliPHOSRecPoint*)GetFromWorkingPool(fParent);
1040 Float_t AliPHOSEvalRecPoint::Chi2Dof() const
1045 const TObject* AliPHOSEvalRecPoint::GetWorkingPool()
1048 TFolder* aliceF = (TFolder*)gROOT->FindObjectAny("YSAlice");
1049 TFolder* wPoolF = (TFolder*)aliceF->FindObject("WhiteBoard/RecPoints/PHOS/SmP");
1050 TObject* wPool = wPoolF->FindObject("SmartPoints");
1052 Error("GetWorkingPool", "Couldn't find Working Pool. Exit.") ;
1059 void AliPHOSEvalRecPoint::AddToWorkingPool(TObject* obj)
1061 ((TObjArray*)GetWorkingPool())->Add(obj);
1064 TObject* AliPHOSEvalRecPoint::GetFromWorkingPool(Int_t i)
1066 // return fWorkingPool->At(i);
1067 return ((TObjArray*)GetWorkingPool())->At(i);
1070 Int_t AliPHOSEvalRecPoint::InWorkingPool()
1072 return ((TObjArray*)GetWorkingPool())->GetEntries();
1075 void AliPHOSEvalRecPoint::RemoveFromWorkingPool(TObject* obj)
1077 ((TObjArray*)GetWorkingPool())->Remove(obj);
1078 ((TObjArray*)GetWorkingPool())->Compress();
1081 void AliPHOSEvalRecPoint::PrintWorkingPool()
1083 ((TObjArray*)GetWorkingPool())->Print("");
1086 void AliPHOSEvalRecPoint::SetEventFolderName(const char* evfname)
1087 {//Sets event folder name
1088 fEventFolderName = evfname;