Implementation of new ClusterFinder
[u/mrichter/AliRoot.git] / RICH / AliRICHClusterFinder.cxx
CommitLineData
8265fa96 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
8265fa96 16
17#include "AliRICHClusterFinder.h"
237c933d 18#include "AliRICH.h"
543d5224 19#include "AliRICHMap.h"
543d5224 20#include "AliRICHParam.h"
cbaf35fb 21#include <AliLoader.h>
22#include <AliRun.h>
8265fa96 23
8265fa96 24
25ClassImp(AliRICHClusterFinder)
543d5224 26//__________________________________________________________________________________________________
27AliRICHClusterFinder::AliRICHClusterFinder(AliRICH *pRICH)
28{//main ctor
29 Info("main ctor","Start.");
30
cbaf35fb 31 fRICH = pRICH;
543d5224 32
cbaf35fb 33 fHitMap = 0;
543d5224 34
543d5224 35}//main ctor
36//__________________________________________________________________________________________________
cbaf35fb 37void AliRICHClusterFinder::FindLocalMaxima(AliRICHcluster *pRawCluster)
543d5224 38{// Split the cluster according to the number of maxima inside
6ce834b4 39 Info("SplitbyLocalMaxima","Start.");
cbaf35fb 40 Int_t Nlocal = 0;
41 Int_t localX[100],localY[100];
42 for(Int_t iDig1=0;iDig1<pRawCluster->Size();iDig1++) {
43 Int_t iNotMax = 0;
44 AliRICHdigit *pDig1 = (AliRICHdigit *)pRawCluster->Digits()->At(iDig1);
45 Int_t padX1 = pDig1->X();
46 Int_t padY1 = pDig1->Y();
47 Double_t padQ1 = pDig1->Q();
48 for(Int_t iDig2=0;iDig2<pRawCluster->Size();iDig2++) {
49 AliRICHdigit *pDig2 = (AliRICHdigit *)pRawCluster->Digits()->At(iDig2);
50 Int_t padX2 = pDig2->X();
51 Int_t padY2 = pDig2->Y();
52 Double_t padQ2 = pDig2->Q();
53 if(iDig1==iDig2) continue;
54 Int_t diffx = TMath::Sign(padX1-padX2,1);
55 Int_t diffy = TMath::Sign(padY1-padY2,1);
56 if((diffx+diffy)<=1) {
57 if(padQ2>padQ1) iNotMax++;
58 }
8265fa96 59 }
cbaf35fb 60 if(iNotMax==0) {
61 localX[Nlocal] = padX1;
62 localY[Nlocal] = padY1;
63 Nlocal++;
8265fa96 64 }
cbaf35fb 65 }
66}//FindLocalMaxima()
543d5224 67//__________________________________________________________________________________________________
68void AliRICHClusterFinder::Exec()
237c933d 69{
543d5224 70 Info("Exec","Start.");
71
cbaf35fb 72
543d5224 73 Rich()->GetLoader()->LoadDigits();
74
75 for(Int_t iEventN=0;iEventN<gAlice->GetEventsPerRun();iEventN++){//events loop
76 gAlice->GetRunLoader()->GetEvent(iEventN);
237c933d 77
543d5224 78 Rich()->GetLoader()->MakeTree("R"); Rich()->MakeBranch("R");
cbaf35fb 79 Rich()->ResetDigits(); Rich()->ResetClusters();
543d5224 80
81 Rich()->GetLoader()->TreeD()->GetEntry(0);
cbaf35fb 82 for(Int_t iChamber=1;iChamber<=kNCH;iChamber++){//chambers loop
83 FindRawClusters(iChamber);
543d5224 84
85 }//chambers loop
86
87 Rich()->GetLoader()->TreeR()->Fill();
88 Rich()->GetLoader()->WriteRecPoints("OVERWRITE");
89 }//events loop
90 Rich()->GetLoader()->UnloadDigits(); Rich()->GetLoader()->UnloadRecPoints();
cbaf35fb 91 Rich()->ResetDigits(); Rich()->ResetClusters();
543d5224 92 Info("Exec","Stop.");
93}//Exec()
94//__________________________________________________________________________________________________
cbaf35fb 95void AliRICHClusterFinder::FindRawClusters(Int_t iChamber)
96{//finds neighbours and fill the tree with raw clusters
97 Info("FindRawClusters","Start for Chamber %i.",iChamber);
98
99 Int_t nDigits=Rich()->Digits(iChamber)->GetEntriesFast();
100 if(nDigits==0)return;
101
102 fHitMap=new AliRICHMap(Rich()->Digits(iChamber));
103
104 AliRICHcluster *pRawCluster;
105
106 for(Int_t iDig=0;iDig<nDigits;iDig++){
107 AliRICHdigit *dig=(AliRICHdigit*)Rich()->Digits(iChamber)->UncheckedAt(iDig);
108 Int_t i=dig->X(); Int_t j=dig->Y();
109 if(fHitMap->TestHit(i,j)==kUsed) continue;
110
111 pRawCluster = new AliRICHcluster;
112 FormRawCluster(i,j,pRawCluster);
113
114 if(AliRICHParam::IsResolveClusters()) {
115 ResolveCluster(pRawCluster); // ResolveCluster serialization will happen inside
116 } else {
117 WriteRawCluster(pRawCluster); // simply output of the RawCluster found without deconvolution
118 }
119 delete pRawCluster;
120
121 }//digits loop
122
123 delete fHitMap;
124 Info("FindRawClusters","Stop.");
125
126}//FindRawClusters()
127//__________________________________________________________________________________________________
128void AliRICHClusterFinder::FormRawCluster(Int_t i, Int_t j, AliRICHcluster *pCluster)
129{// Builder of the final Raw Cluster (before deconvolution)
130 Info("FormRawCluster","Start with digit(%i,%i)",i,j);
131
132// Int_t idx = fHitMap->GetHitIndex(i,j);
133 AliRICHdigit* pDigit = (AliRICHdigit*) fHitMap->GetHit(i,j);
134 pCluster->AddDigit(pDigit);
135
136 fHitMap->FlagHit(i,j);// Flag hit as taken
137
138 Int_t listX[4], listY[4]; // Now look recursively for all neighbours
139 for (Int_t iNeighbour=0;iNeighbour<Rich()->Param()->PadNeighbours(i,j,listX,listY);iNeighbour++)
140 if(fHitMap->TestHit(listX[iNeighbour],listY[iNeighbour])==kUnused)
141 FormRawCluster(listX[iNeighbour],listY[iNeighbour],pCluster);
142}//AddDigit2Cluster()
143//__________________________________________________________________________________________________
144void AliRICHClusterFinder::ResolveCluster(AliRICHcluster *pRawCluster)
145{// Decluster algorithm
146 Info("ResolveCluster","Start.");
147
148 pRawCluster->SetStatus(kRaw);// just dummy to compile...
149
150}//ResolveCluster()
151//__________________________________________________________________________________________________
152void AliRICHClusterFinder::WriteRawCluster(AliRICHcluster *pRawCluster)
153{// out the current RawCluster
154 Info("ResolveCluster","Start.");
155
156 pRawCluster->SetStatus(kRaw);
157
158
159}//WriteRawCluster()
160//__________________________________________________________________________________________________