1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 #include "AliRICHClusterFinder.h"
19 #include "AliRICHMap.h"
20 #include "AliRICHParam.h"
21 #include <AliLoader.h>
25 ClassImp(AliRICHClusterFinder)
26 //__________________________________________________________________________________________________
27 AliRICHClusterFinder::AliRICHClusterFinder(AliRICH *pRICH)
29 Info("main ctor","Start.");
36 //__________________________________________________________________________________________________
37 void AliRICHClusterFinder::FindLocalMaxima(AliRICHcluster *pRawCluster)
38 {// Split the cluster according to the number of maxima inside
39 Info("SplitbyLocalMaxima","Start.");
41 Int_t localX[100],localY[100];
42 for(Int_t iDig1=0;iDig1<pRawCluster->Size();iDig1++) {
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++;
61 localX[Nlocal] = padX1;
62 localY[Nlocal] = padY1;
67 //__________________________________________________________________________________________________
68 void AliRICHClusterFinder::Exec()
70 Info("Exec","Start.");
73 Rich()->GetLoader()->LoadDigits();
75 for(Int_t iEventN=0;iEventN<gAlice->GetEventsPerRun();iEventN++){//events loop
76 gAlice->GetRunLoader()->GetEvent(iEventN);
78 Rich()->GetLoader()->MakeTree("R"); Rich()->MakeBranch("R");
79 Rich()->ResetDigits(); Rich()->ResetClusters();
81 Rich()->GetLoader()->TreeD()->GetEntry(0);
82 for(Int_t iChamber=1;iChamber<=kNCH;iChamber++){//chambers loop
83 FindRawClusters(iChamber);
87 Rich()->GetLoader()->TreeR()->Fill();
88 Rich()->GetLoader()->WriteRecPoints("OVERWRITE");
90 Rich()->GetLoader()->UnloadDigits(); Rich()->GetLoader()->UnloadRecPoints();
91 Rich()->ResetDigits(); Rich()->ResetClusters();
94 //__________________________________________________________________________________________________
95 void AliRICHClusterFinder::FindRawClusters(Int_t iChamber)
96 {//finds neighbours and fill the tree with raw clusters
97 Info("FindRawClusters","Start for Chamber %i.",iChamber);
99 Int_t nDigits=Rich()->Digits(iChamber)->GetEntriesFast();
100 if(nDigits==0)return;
102 fHitMap=new AliRICHMap(Rich()->Digits(iChamber));
104 AliRICHcluster *pRawCluster;
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;
111 pRawCluster = new AliRICHcluster;
112 FormRawCluster(i,j,pRawCluster);
114 if(AliRICHParam::IsResolveClusters()) {
115 ResolveCluster(pRawCluster); // ResolveCluster serialization will happen inside
117 WriteRawCluster(pRawCluster); // simply output of the RawCluster found without deconvolution
124 Info("FindRawClusters","Stop.");
127 //__________________________________________________________________________________________________
128 void 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);
132 // Int_t idx = fHitMap->GetHitIndex(i,j);
133 AliRICHdigit* pDigit = (AliRICHdigit*) fHitMap->GetHit(i,j);
134 pCluster->AddDigit(pDigit);
136 fHitMap->FlagHit(i,j);// Flag hit as taken
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 //__________________________________________________________________________________________________
144 void AliRICHClusterFinder::ResolveCluster(AliRICHcluster *pRawCluster)
145 {// Decluster algorithm
146 Info("ResolveCluster","Start.");
148 pRawCluster->SetStatus(kRaw);// just dummy to compile...
151 //__________________________________________________________________________________________________
152 void AliRICHClusterFinder::WriteRawCluster(AliRICHcluster *pRawCluster)
153 {// out the current RawCluster
154 Info("ResolveCluster","Start.");
156 pRawCluster->SetStatus(kRaw);
160 //__________________________________________________________________________________________________