// --- ROOT system --- #include "TBenchmark.h" #include "TROOT.h" // --- Standard library --- #include #include // --- AliRoot header files --- #include "AliPHOSClusterizerv2.h" #include "AliPHOSGetter.h" #include "TFolder.h" #include "AliPHOSEvalRecPoint.h" #include "AliPHOSRecCpvManager.h" #include "AliPHOSRecEmcManager.h" ClassImp(AliPHOSClusterizerv2) AliPHOSClusterizerv2::AliPHOSClusterizerv2() : AliPHOSClusterizerv1() {} AliPHOSClusterizerv2::AliPHOSClusterizerv2(const char * headerFile, const char * name, const Bool_t toSplit): AliPHOSClusterizerv1(headerFile,name,toSplit) {} void AliPHOSClusterizerv2::GetNumberOfClustersFound(int* numb) const { AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; numb[0] = gime->EmcRecPoints()->GetEntries(); numb[1] = gime->CpvRecPoints()->GetEntries(); } void AliPHOSClusterizerv2::Exec(Option_t* option) { if(strstr(option,"tim")) gBenchmark->Start("PHOSClusterizer"); if(strstr(option,"print")) Print("") ; AliPHOSGetter * gime = AliPHOSGetter::GetInstance() ; TFolder* storage = dynamic_cast(gROOT->FindObjectAny("Folders/Run/Event/RecData/RecPoints/PHOS")); TFolder* wPoolF = storage->AddFolder("SmP","SmartRecPoints for PHOS"); TObjArray* wPool = new TObjArray(400); wPool->SetName("SmartPoints"); wPoolF->Add(wPool); wPoolF->Add(this); Int_t nevents = (Int_t) gAlice->TreeE()->GetEntries() ; Int_t ievent ; for(ievent = 0; ieventGetEvent(ievent) ; gAlice->SetEvent(ievent) ; gime->Event(ievent,"D") ; // if(!ReadDigits(ievent)) //reads digits for event fEvent // continue; cout<<" MakeClusters invoked.."; MakeClusters() ; cout<<" done."<Add(recCpv); Int_t iPoint; //loop variable for(iPoint=0; iPointCpvRecPoints()->GetEntriesFast(); iPoint++) { rp = new AliPHOSEvalRecPoint(iPoint,AliPHOSEvalRecPoint::cpv); rp->MakeJob(); } AliPHOSEvalRecPoint pt; pt.UpdateWorkingPool(); TObjArray * cpvRecPoints = gime->CpvRecPoints() ; Int_t nOldCpv = cpvRecPoints->GetEntries(); cpvRecPoints->Delete(); cpvRecPoints->Compress(); Int_t i; //loop variable for(i=0; iGetEntries(); i++) cpvRecPoints->Add(wPool->At(i)); wPool->Clear(); wPool->Compress(); wPoolF->Remove(recCpv); delete recCpv; cout<<" "<CpvRecPoints()->GetEntries()<GetEntries()<<" cpvRecPoints."<Add(recEmc); for(iPoint=0; iPointEmcRecPoints()->GetEntriesFast(); iPoint++) { rp = new AliPHOSEvalRecPoint(iPoint,(Bool_t)AliPHOSEvalRecPoint::emc); rp->MakeJob(); } pt.UpdateWorkingPool(); TObjArray * emcRecPoints = gime->EmcRecPoints() ; Int_t nOldEmc = emcRecPoints->GetEntries(); emcRecPoints->Delete(); emcRecPoints->Compress(); for(i=0; iGetEntries(); i++) emcRecPoints->Add(wPool->At(i)); wPool->Clear(); wPool->Compress(); wPoolF->Remove(recEmc); delete recEmc; cout<<" "<CpvRecPoints()->GetEntries()<GetEntries()<<" cpvRecPoints."<EmcRecPoints()->GetEntries()<GetEntries()<<" emcRecPoints."<Stop("PHOSClusterizer"); cout << "AliPHOSClusterizer:" << endl ; cout << " took " << gBenchmark->GetCpuTime("PHOSClusterizer") << " seconds for Clusterizing " << endl; cout << endl ; } } //--------------------------------------------------------------------------------- Int_t AliPHOSClusterizerv2::AreNeighbours(AliPHOSDigit* d1, AliPHOSDigit* d2) const { // Points are neighbours if they have common edge. // Points with common vertex are NOT neighbours. // This treatment of neighbourship is the part of // IHEP algorithm of clusterization. // Gives the neighbourness of two digits = 0 are not neighbour but continue searching // = 1 are neighbour // = 2 are not neighbour but do not continue searching // The order of d1 and d2 is important: first (d1) should be a digit already in a cluster // which is compared to a digit (d2) not yet in a cluster const AliPHOSGeometry * geom = AliPHOSGetter::GetInstance()->PHOSGeometry(); Int_t rv = 0 ; Int_t relid1[4] ; geom->AbsToRelNumbering(d1->GetId(), relid1) ; Int_t relid2[4] ; geom->AbsToRelNumbering(d2->GetId(), relid2) ; if ( (relid1[0] == relid2[0]) && (relid1[1]==relid2[1]) ) { // inside the same PHOS module and the same PPSD Module Int_t rowdiff = TMath::Abs( relid1[2] - relid2[2] ) ; Int_t coldiff = TMath::Abs( relid1[3] - relid2[3] ) ; if ( ( (coldiff < 1) && (rowdiff <= 1) ) || ( ( coldiff <= 1 ) && ( rowdiff < 1 ) ) ){ rv = 1 ; } else { if((relid2[2] > relid1[2]) && (relid2[3] > relid1[3]+1)) rv = 2; // Difference in row numbers is too large to look further } } else { if( (relid1[0] < relid2[0]) || (relid1[1] < relid2[1]) ) rv=2 ; } return rv ; }