#include "AliLog.h"
#include "TObjArray.h"
#include "TClonesArray.h"
#include "AliMFTDigit.h"
#include "AliMFTCluster.h"
#include "AliMFTSegmentation.h"
#include "TTree.h"
#include "TMath.h"
#include "AliMFTConstants.h"
#include "AliMFTClusterFinder.h"
#include "TRandom.h"
const Double_t AliMFTClusterFinder::fCutForAvailableDigits = AliMFTConstants::fCutForAvailableDigits;
const Double_t AliMFTClusterFinder::fCutForAttachingDigits = AliMFTConstants::fCutForAttachingDigits;
const Double_t AliMFTClusterFinder::fMisalignmentMagnitude = AliMFTConstants::fMisalignmentMagnitude;
ClassImp(AliMFTClusterFinder)
AliMFTClusterFinder::AliMFTClusterFinder() :
TObject(),
fDigitsInCluster(0),
fCurrentDigit(0),
fCurrentCluster(0),
fSegmentation(0),
fNPlanes(0),
fApplyMisalignment(kFALSE),
fStopWatch(0)
{
for (Int_t iPlane=0; iPlane<fNMaxPlanes; iPlane++) fClustersPerPlane[iPlane] = NULL;
fDigitsInCluster = new TClonesArray("AliMFTDigit", fNMaxDigitsPerCluster);
fDigitsInCluster -> SetOwner(kTRUE);
fStopWatch = new TStopwatch();
fStopWatch -> Reset();
}
AliMFTClusterFinder::~AliMFTClusterFinder() {
AliDebug(1, "Deleting AliMFTClusterFinder...");
for (Int_t iPlane=0; iPlane<fNMaxPlanes; iPlane++) {
if (fClustersPerPlane[iPlane]) fClustersPerPlane[iPlane]->Delete(); delete fClustersPerPlane[iPlane]; fClustersPerPlane[iPlane] = 0x0;
}
if (fDigitsInCluster) fDigitsInCluster->Delete(); delete fDigitsInCluster; fDigitsInCluster = NULL;
delete fSegmentation; fSegmentation=NULL;
delete fStopWatch;
AliDebug(1, "... done!");
}
void AliMFTClusterFinder::Clear(const Option_t* ) {
AliDebug(1, "Clearing AliMFTClusterFinder...");
for (Int_t iPlane=0; iPlane<fNMaxPlanes; iPlane++) {
if(fClustersPerPlane[iPlane]) fClustersPerPlane[iPlane]->Clear("C");
}
if(fDigitsInCluster) fDigitsInCluster->Clear("C");
fSegmentation->Clear("C");
AliDebug(1, "... done!");
}
void AliMFTClusterFinder::Init(const Char_t *nameGeomFile) {
fSegmentation = new AliMFTSegmentation(nameGeomFile);
fNPlanes = fSegmentation -> GetNPlanes();
}
void AliMFTClusterFinder::StartEvent() {
AliDebug(1, "Starting Event...");
for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
fClustersPerPlane[iPlane]->Delete();
}
AliDebug(1, "... done!");
}
void AliMFTClusterFinder::DigitsToClusters(const TObjArray *pDigitList) {
AliInfo("Starting Clusterization for MFT");
AliDebug(1, Form("nPlanes = %d", fNPlanes));
if (!fStopWatch) fStopWatch = new TStopwatch();
fStopWatch -> Reset();
StartEvent();
Bool_t isDigAvailableForNewCluster = kTRUE;
TClonesArray *myDigitList = 0;
for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
AliDebug(1, Form("Plane %02d", iPlane));
Int_t nDetElem = fSegmentation->GetPlane(iPlane)->GetNActiveElements();
TClonesArray *clustersPerDetElem[fNMaxDetElemPerPlane] = {0};
for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) clustersPerDetElem[iDetElem] = new TClonesArray("AliMFTCluster");
myDigitList = (TClonesArray*) pDigitList->At(iPlane);
AliDebug(1, Form("myDigitList->GetEntries() = %d", myDigitList->GetEntries()));
Int_t cycleOverDigits = 0;
Double_t myCutForAvailableDigits = 0;
Int_t currentDetElem = -1;
Int_t currentDetElemLocal = -1;
Bool_t areThereSkippedDigits = kFALSE;
fStopWatch -> Start();
while (myDigitList->GetEntries()) {
for (Int_t iDig=0; iDig<myDigitList->GetEntries(); iDig++) {
fCurrentDigit = (AliMFTDigit*) myDigitList->At(iDig);
if (!iDig) {
if (fCurrentDigit->GetDetElemID() != currentDetElem) {
currentDetElem = fCurrentDigit->GetDetElemID();
currentDetElemLocal = fSegmentation->GetDetElemLocalID(currentDetElem);
cycleOverDigits = 0;
myCutForAvailableDigits = fCutForAvailableDigits;
}
else if (fCurrentDigit->GetDetElemID()==currentDetElem && areThereSkippedDigits) {
cycleOverDigits++;
myCutForAvailableDigits -= 0.5;
}
areThereSkippedDigits = kFALSE;
}
else {
areThereSkippedDigits = kTRUE;
if (fCurrentDigit->GetDetElemID() != currentDetElem) break;
}
isDigAvailableForNewCluster = kTRUE;
for (Int_t iCluster=0; iCluster<clustersPerDetElem[currentDetElemLocal]->GetEntries(); iCluster++) {
fCurrentCluster = (AliMFTCluster*) clustersPerDetElem[currentDetElemLocal]->At(iCluster);
if (fCurrentCluster->GetDistanceFromPixel(fCurrentDigit) < fCutForAttachingDigits) {
fCurrentCluster->AddPixel(fCurrentDigit);
myDigitList->Remove(fCurrentDigit);
myDigitList->Compress();
iDig--;
isDigAvailableForNewCluster = kFALSE;
break;
}
if (fCurrentCluster->GetDistanceFromPixel(fCurrentDigit) < myCutForAvailableDigits) isDigAvailableForNewCluster=kFALSE;
}
if (isDigAvailableForNewCluster) {
AliMFTCluster *newCluster = new AliMFTCluster();
newCluster->AddPixel(fCurrentDigit);
myDigitList->Remove(fCurrentDigit);
myDigitList->Compress();
iDig--;
new ((*clustersPerDetElem[currentDetElemLocal])[clustersPerDetElem[currentDetElemLocal]->GetEntries()]) AliMFTCluster(*newCluster);
delete newCluster;
}
}
}
fStopWatch -> Print("m");
printf("Plane %d: clusters found in %f seconds\n",iPlane,fStopWatch->CpuTime());
fStopWatch->Start();
Double_t misalignmentPhi = 2.*TMath::Pi()*gRandom->Rndm();
Double_t misalignmentX = fMisalignmentMagnitude*TMath::Cos(misalignmentPhi);
Double_t misalignmentY = fMisalignmentMagnitude*TMath::Sin(misalignmentPhi);
AliMFTCluster *newCluster = NULL;
for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) {
for (Int_t iCluster=0; iCluster<clustersPerDetElem[iDetElem]->GetEntries(); iCluster++) {
newCluster = (AliMFTCluster*) (clustersPerDetElem[iDetElem]->At(iCluster));
newCluster -> TerminateCluster();
newCluster -> SetClusterEditable(kTRUE);
if (TMath::Abs(newCluster->GetZ())<TMath::Abs(fSegmentation->GetPlane(iPlane)->GetZCenter())) newCluster->SetClusterFront(kTRUE);
else newCluster->SetClusterFront(kFALSE);
if (fApplyMisalignment) {
newCluster -> SetX(newCluster->GetX()+misalignmentX);
newCluster -> SetY(newCluster->GetY()+misalignmentY);
}
newCluster -> SetClusterEditable(kFALSE);
new ((*fClustersPerPlane[iPlane])[fClustersPerPlane[iPlane]->GetEntries()]) AliMFTCluster(*newCluster);
}
}
printf("%d Clusters in plane %02d merged in %f seconds\n", fClustersPerPlane[iPlane]->GetEntries(), iPlane, fStopWatch->CpuTime());
for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) {
clustersPerDetElem[iDetElem] -> Delete();
delete clustersPerDetElem[iDetElem];
}
myDigitList -> Delete();
}
}
void AliMFTClusterFinder::MakeClusterBranch(TTree *treeCluster) {
AliDebug(1, "Making Cluster Branch");
CreateClusters();
if (treeCluster) {
for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
AliDebug(1, Form("Setting Branch Plane_%02d for treeCluster",iPlane));
if (treeCluster->GetBranch(Form("Plane_%02d",iPlane))) continue;
AliDebug(1, Form("Branch Plane_%02d does not exist, creating!",iPlane));
treeCluster->Branch(Form("Plane_%02d",iPlane), &(fClustersPerPlane[iPlane]));
}
}
}
void AliMFTClusterFinder::SetClusterTreeAddress(TTree *treeCluster) {
if (treeCluster && treeCluster->GetBranch("Plane_00")) {
CreateClusters();
for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
if (treeCluster->GetBranch(Form("Plane_%02d",iPlane))) {
treeCluster->SetBranchAddress(Form("Plane_%02d",iPlane), &(fClustersPerPlane[iPlane]));
}
else AliError(Form("No branch available with name Plane_%02d", iPlane));
}
}
}
void AliMFTClusterFinder::CreateClusters() {
AliDebug(1, Form("Creating clusters list: nPlanes = %d",fNPlanes));
if (fClustersPerPlane[0]) return;
for(Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
AliDebug(1, Form("plane %02d", iPlane));
fClustersPerPlane[iPlane] = new TClonesArray("AliMFTCluster");
fClustersPerPlane[iPlane] -> SetOwner(kTRUE);
}
}
AliMFTClusterFinder.cxx:1 AliMFTClusterFinder.cxx:2 AliMFTClusterFinder.cxx:3 AliMFTClusterFinder.cxx:4 AliMFTClusterFinder.cxx:5 AliMFTClusterFinder.cxx:6 AliMFTClusterFinder.cxx:7 AliMFTClusterFinder.cxx:8 AliMFTClusterFinder.cxx:9 AliMFTClusterFinder.cxx:10 AliMFTClusterFinder.cxx:11 AliMFTClusterFinder.cxx:12 AliMFTClusterFinder.cxx:13 AliMFTClusterFinder.cxx:14 AliMFTClusterFinder.cxx:15 AliMFTClusterFinder.cxx:16 AliMFTClusterFinder.cxx:17 AliMFTClusterFinder.cxx:18 AliMFTClusterFinder.cxx:19 AliMFTClusterFinder.cxx:20 AliMFTClusterFinder.cxx:21 AliMFTClusterFinder.cxx:22 AliMFTClusterFinder.cxx:23 AliMFTClusterFinder.cxx:24 AliMFTClusterFinder.cxx:25 AliMFTClusterFinder.cxx:26 AliMFTClusterFinder.cxx:27 AliMFTClusterFinder.cxx:28 AliMFTClusterFinder.cxx:29 AliMFTClusterFinder.cxx:30 AliMFTClusterFinder.cxx:31 AliMFTClusterFinder.cxx:32 AliMFTClusterFinder.cxx:33 AliMFTClusterFinder.cxx:34 AliMFTClusterFinder.cxx:35 AliMFTClusterFinder.cxx:36 AliMFTClusterFinder.cxx:37 AliMFTClusterFinder.cxx:38 AliMFTClusterFinder.cxx:39 AliMFTClusterFinder.cxx:40 AliMFTClusterFinder.cxx:41 AliMFTClusterFinder.cxx:42 AliMFTClusterFinder.cxx:43 AliMFTClusterFinder.cxx:44 AliMFTClusterFinder.cxx:45 AliMFTClusterFinder.cxx:46 AliMFTClusterFinder.cxx:47 AliMFTClusterFinder.cxx:48 AliMFTClusterFinder.cxx:49 AliMFTClusterFinder.cxx:50 AliMFTClusterFinder.cxx:51 AliMFTClusterFinder.cxx:52 AliMFTClusterFinder.cxx:53 AliMFTClusterFinder.cxx:54 AliMFTClusterFinder.cxx:55 AliMFTClusterFinder.cxx:56 AliMFTClusterFinder.cxx:57 AliMFTClusterFinder.cxx:58 AliMFTClusterFinder.cxx:59 AliMFTClusterFinder.cxx:60 AliMFTClusterFinder.cxx:61 AliMFTClusterFinder.cxx:62 AliMFTClusterFinder.cxx:63 AliMFTClusterFinder.cxx:64 AliMFTClusterFinder.cxx:65 AliMFTClusterFinder.cxx:66 AliMFTClusterFinder.cxx:67 AliMFTClusterFinder.cxx:68 AliMFTClusterFinder.cxx:69 AliMFTClusterFinder.cxx:70 AliMFTClusterFinder.cxx:71 AliMFTClusterFinder.cxx:72 AliMFTClusterFinder.cxx:73 AliMFTClusterFinder.cxx:74 AliMFTClusterFinder.cxx:75 AliMFTClusterFinder.cxx:76 AliMFTClusterFinder.cxx:77 AliMFTClusterFinder.cxx:78 AliMFTClusterFinder.cxx:79 AliMFTClusterFinder.cxx:80 AliMFTClusterFinder.cxx:81 AliMFTClusterFinder.cxx:82 AliMFTClusterFinder.cxx:83 AliMFTClusterFinder.cxx:84 AliMFTClusterFinder.cxx:85 AliMFTClusterFinder.cxx:86 AliMFTClusterFinder.cxx:87 AliMFTClusterFinder.cxx:88 AliMFTClusterFinder.cxx:89 AliMFTClusterFinder.cxx:90 AliMFTClusterFinder.cxx:91 AliMFTClusterFinder.cxx:92 AliMFTClusterFinder.cxx:93 AliMFTClusterFinder.cxx:94 AliMFTClusterFinder.cxx:95 AliMFTClusterFinder.cxx:96 AliMFTClusterFinder.cxx:97 AliMFTClusterFinder.cxx:98 AliMFTClusterFinder.cxx:99 AliMFTClusterFinder.cxx:100 AliMFTClusterFinder.cxx:101 AliMFTClusterFinder.cxx:102 AliMFTClusterFinder.cxx:103 AliMFTClusterFinder.cxx:104 AliMFTClusterFinder.cxx:105 AliMFTClusterFinder.cxx:106 AliMFTClusterFinder.cxx:107 AliMFTClusterFinder.cxx:108 AliMFTClusterFinder.cxx:109 AliMFTClusterFinder.cxx:110 AliMFTClusterFinder.cxx:111 AliMFTClusterFinder.cxx:112 AliMFTClusterFinder.cxx:113 AliMFTClusterFinder.cxx:114 AliMFTClusterFinder.cxx:115 AliMFTClusterFinder.cxx:116 AliMFTClusterFinder.cxx:117 AliMFTClusterFinder.cxx:118 AliMFTClusterFinder.cxx:119 AliMFTClusterFinder.cxx:120 AliMFTClusterFinder.cxx:121 AliMFTClusterFinder.cxx:122 AliMFTClusterFinder.cxx:123 AliMFTClusterFinder.cxx:124 AliMFTClusterFinder.cxx:125 AliMFTClusterFinder.cxx:126 AliMFTClusterFinder.cxx:127 AliMFTClusterFinder.cxx:128 AliMFTClusterFinder.cxx:129 AliMFTClusterFinder.cxx:130 AliMFTClusterFinder.cxx:131 AliMFTClusterFinder.cxx:132 AliMFTClusterFinder.cxx:133 AliMFTClusterFinder.cxx:134 AliMFTClusterFinder.cxx:135 AliMFTClusterFinder.cxx:136 AliMFTClusterFinder.cxx:137 AliMFTClusterFinder.cxx:138 AliMFTClusterFinder.cxx:139 AliMFTClusterFinder.cxx:140 AliMFTClusterFinder.cxx:141 AliMFTClusterFinder.cxx:142 AliMFTClusterFinder.cxx:143 AliMFTClusterFinder.cxx:144 AliMFTClusterFinder.cxx:145 AliMFTClusterFinder.cxx:146 AliMFTClusterFinder.cxx:147 AliMFTClusterFinder.cxx:148 AliMFTClusterFinder.cxx:149 AliMFTClusterFinder.cxx:150 AliMFTClusterFinder.cxx:151 AliMFTClusterFinder.cxx:152 AliMFTClusterFinder.cxx:153 AliMFTClusterFinder.cxx:154 AliMFTClusterFinder.cxx:155 AliMFTClusterFinder.cxx:156 AliMFTClusterFinder.cxx:157 AliMFTClusterFinder.cxx:158 AliMFTClusterFinder.cxx:159 AliMFTClusterFinder.cxx:160 AliMFTClusterFinder.cxx:161 AliMFTClusterFinder.cxx:162 AliMFTClusterFinder.cxx:163 AliMFTClusterFinder.cxx:164 AliMFTClusterFinder.cxx:165 AliMFTClusterFinder.cxx:166 AliMFTClusterFinder.cxx:167 AliMFTClusterFinder.cxx:168 AliMFTClusterFinder.cxx:169 AliMFTClusterFinder.cxx:170 AliMFTClusterFinder.cxx:171 AliMFTClusterFinder.cxx:172 AliMFTClusterFinder.cxx:173 AliMFTClusterFinder.cxx:174 AliMFTClusterFinder.cxx:175 AliMFTClusterFinder.cxx:176 AliMFTClusterFinder.cxx:177 AliMFTClusterFinder.cxx:178 AliMFTClusterFinder.cxx:179 AliMFTClusterFinder.cxx:180 AliMFTClusterFinder.cxx:181 AliMFTClusterFinder.cxx:182 AliMFTClusterFinder.cxx:183 AliMFTClusterFinder.cxx:184 AliMFTClusterFinder.cxx:185 AliMFTClusterFinder.cxx:186 AliMFTClusterFinder.cxx:187 AliMFTClusterFinder.cxx:188 AliMFTClusterFinder.cxx:189 AliMFTClusterFinder.cxx:190 AliMFTClusterFinder.cxx:191 AliMFTClusterFinder.cxx:192 AliMFTClusterFinder.cxx:193 AliMFTClusterFinder.cxx:194 AliMFTClusterFinder.cxx:195 AliMFTClusterFinder.cxx:196 AliMFTClusterFinder.cxx:197 AliMFTClusterFinder.cxx:198 AliMFTClusterFinder.cxx:199 AliMFTClusterFinder.cxx:200 AliMFTClusterFinder.cxx:201 AliMFTClusterFinder.cxx:202 AliMFTClusterFinder.cxx:203 AliMFTClusterFinder.cxx:204 AliMFTClusterFinder.cxx:205 AliMFTClusterFinder.cxx:206 AliMFTClusterFinder.cxx:207 AliMFTClusterFinder.cxx:208 AliMFTClusterFinder.cxx:209 AliMFTClusterFinder.cxx:210 AliMFTClusterFinder.cxx:211 AliMFTClusterFinder.cxx:212 AliMFTClusterFinder.cxx:213 AliMFTClusterFinder.cxx:214 AliMFTClusterFinder.cxx:215 AliMFTClusterFinder.cxx:216 AliMFTClusterFinder.cxx:217 AliMFTClusterFinder.cxx:218 AliMFTClusterFinder.cxx:219 AliMFTClusterFinder.cxx:220 AliMFTClusterFinder.cxx:221 AliMFTClusterFinder.cxx:222 AliMFTClusterFinder.cxx:223 AliMFTClusterFinder.cxx:224 AliMFTClusterFinder.cxx:225 AliMFTClusterFinder.cxx:226 AliMFTClusterFinder.cxx:227 AliMFTClusterFinder.cxx:228 AliMFTClusterFinder.cxx:229 AliMFTClusterFinder.cxx:230 AliMFTClusterFinder.cxx:231 AliMFTClusterFinder.cxx:232 AliMFTClusterFinder.cxx:233 AliMFTClusterFinder.cxx:234 AliMFTClusterFinder.cxx:235 AliMFTClusterFinder.cxx:236 AliMFTClusterFinder.cxx:237 AliMFTClusterFinder.cxx:238 AliMFTClusterFinder.cxx:239 AliMFTClusterFinder.cxx:240 AliMFTClusterFinder.cxx:241 AliMFTClusterFinder.cxx:242 AliMFTClusterFinder.cxx:243 AliMFTClusterFinder.cxx:244 AliMFTClusterFinder.cxx:245 AliMFTClusterFinder.cxx:246 AliMFTClusterFinder.cxx:247 AliMFTClusterFinder.cxx:248 AliMFTClusterFinder.cxx:249 AliMFTClusterFinder.cxx:250 AliMFTClusterFinder.cxx:251 AliMFTClusterFinder.cxx:252 AliMFTClusterFinder.cxx:253 AliMFTClusterFinder.cxx:254 AliMFTClusterFinder.cxx:255 AliMFTClusterFinder.cxx:256 AliMFTClusterFinder.cxx:257 AliMFTClusterFinder.cxx:258 AliMFTClusterFinder.cxx:259 AliMFTClusterFinder.cxx:260 AliMFTClusterFinder.cxx:261 AliMFTClusterFinder.cxx:262 AliMFTClusterFinder.cxx:263 AliMFTClusterFinder.cxx:264 AliMFTClusterFinder.cxx:265 AliMFTClusterFinder.cxx:266 AliMFTClusterFinder.cxx:267 AliMFTClusterFinder.cxx:268 AliMFTClusterFinder.cxx:269 AliMFTClusterFinder.cxx:270 AliMFTClusterFinder.cxx:271 AliMFTClusterFinder.cxx:272 AliMFTClusterFinder.cxx:273 AliMFTClusterFinder.cxx:274 AliMFTClusterFinder.cxx:275 AliMFTClusterFinder.cxx:276 AliMFTClusterFinder.cxx:277 AliMFTClusterFinder.cxx:278 AliMFTClusterFinder.cxx:279 AliMFTClusterFinder.cxx:280 AliMFTClusterFinder.cxx:281 AliMFTClusterFinder.cxx:282 AliMFTClusterFinder.cxx:283 AliMFTClusterFinder.cxx:284 AliMFTClusterFinder.cxx:285 AliMFTClusterFinder.cxx:286 AliMFTClusterFinder.cxx:287 AliMFTClusterFinder.cxx:288 AliMFTClusterFinder.cxx:289 AliMFTClusterFinder.cxx:290 AliMFTClusterFinder.cxx:291 AliMFTClusterFinder.cxx:292 AliMFTClusterFinder.cxx:293 AliMFTClusterFinder.cxx:294 AliMFTClusterFinder.cxx:295 AliMFTClusterFinder.cxx:296 AliMFTClusterFinder.cxx:297 AliMFTClusterFinder.cxx:298 AliMFTClusterFinder.cxx:299 AliMFTClusterFinder.cxx:300 AliMFTClusterFinder.cxx:301 AliMFTClusterFinder.cxx:302 AliMFTClusterFinder.cxx:303 AliMFTClusterFinder.cxx:304 AliMFTClusterFinder.cxx:305 AliMFTClusterFinder.cxx:306 AliMFTClusterFinder.cxx:307 AliMFTClusterFinder.cxx:308 AliMFTClusterFinder.cxx:309 AliMFTClusterFinder.cxx:310 AliMFTClusterFinder.cxx:311 AliMFTClusterFinder.cxx:312 AliMFTClusterFinder.cxx:313 AliMFTClusterFinder.cxx:314 AliMFTClusterFinder.cxx:315 AliMFTClusterFinder.cxx:316 AliMFTClusterFinder.cxx:317