4 extern AliTPCParam *gTPCParam;
5 extern AliTPCClustersArray * gCalcClusters;
6 extern AliTPCClustersArray * gDifClusters;
7 AliTPCDigitsArray * GetDigitsArray();
8 AliTPCClustersArray * GetExactClustersArray();
9 AliTPCClustersArray * GetCalcClustersArray(Bool_t newtree=kFALSE);
10 AliTPCClustersArray * GetDifClustersArray(Bool_t newtree=kFALSE);
11 TClonesArray * CompareClusters(TClonesArray *calcclusters,TClonesArray *exactclusters,
12 TClonesArray *diffclusters, Float_t shx, Float_t shy);
15 void TPCDigits2Clusters(AliTPCDigitsArray * digarr, AliTPCClustersArray *calcarr,
16 AliTPCClustersArray *exarr=0, AliTPCClustersArray *difarr=0)
19 //calculate clusters position from digits information
23 //initialisation of cluster finder
25 cf.SetThreshold(gTPCParam->GetZeroSup());
26 cf.SetDetectorParam(gTPCParam);
28 cf.GetMinuit()->SetPrintLevel(-1);
29 cf.GetMinuit()->SetMaxIterations(20);
31 if (digarr ==0) digarr = GetDigitsArray();
32 if ( (digarr == 0) || (digarr->GetTree()==0)) return;
33 if (exarr==0) exarr =GetExactClustersArray();
34 if ((exarr!=0)&&(difarr==0)) difarr= GetDifClustersArray();
36 if (calcarr==0) calcarr = GetCalcClustersArray(kTRUE);
37 //loop over all writen digits segments
38 Int_t nsegment = (Int_t)digarr->GetTree()->GetEntries();
40 for (segment = 0; segment<nsegment;segment++){
41 //load segment with index (TTree internal) number segment
42 AliSimDigits *digrow= (AliSimDigits*)digarr->LoadEntry(segment);
44 ((AliTPCParam*)digarr->GetParam())->AdjustSectorRow(digrow->GetID(),sector,row);
46 AliTPCClustersRow * clrow = calcarr->CreateRow(sector,row);
47 AliTPCClustersRow * difrow= difarr->CreateRow(sector,row);
48 AliTPCClustersRow * exrow = exarr->GetRow(sector,row);
49 if (exrow==0) exrow = exarr->LoadRow(sector,row);
50 TH2F *his = (TH2F*)digrow->GenerHisto();
51 digrow->ExpandTrackBuffer();
54 //set current index for cluster finder
55 Int_t index[3]= {0,sector,row};
57 cf.SetDetectorIndex(index);
58 cf.FindPeaks3(clrow->GetArray());
60 //get cluster tracks ID
61 Int_t ncl = clrow->GetArray()->GetEntriesFast();
62 for (Int_t icl = 0 ;icl<ncl; icl++)
64 AliDigitCluster * cl =(AliDigitCluster*)clrow->GetArray()->UncheckedAt(icl);
65 Int_t i = (Int_t)cl->fMaxX;
66 Int_t j = (Int_t)cl->fMaxY;
67 cl->fTracks[0]=digrow->GetTrackIDFast(i,j,0);
68 cl->fTracks[1]=digrow->GetTrackIDFast(i,j,1);
69 cl->fTracks[2]=digrow->GetTrackIDFast(i,j,2);
71 Float_t shx = gTPCParam->GetZOffset()/gTPCParam->GetZWidth()+0.5;
73 CompareClusters(clrow->GetArray(),exrow->GetArray(),difrow->GetArray(),shx,shy);
74 calcarr->StoreRow(sector,row);
75 difarr->StoreRow(sector,row);
76 digarr->ClearRow(sector,row);
80 sprintf(treeName,"TreeCCalc_%s",gTPCParam->GetTitle());
81 calcarr->GetTree()->Write(treeName);
84 sprintf(treeName,"TreeCDif_%s",gTPCParam->GetTitle());
85 difarr->GetTree()->Write(treeName);
91 AliTPCClustersArray * GetCalcClustersArray(Bool_t newtree=kFALSE, const char* name=0)
94 //construct AliTPCClusters Array object
96 AliTPCClustersArray * arr=0;
97 // if ( (gAlice!=0) && (gAlice->GetDetector("TPC")!=0) ) {
98 // arr = ((AliTPC*)gAlice->GetDetector("TPC"))->GetClustersArray();
99 // if (arr!=0) arr->Update();
102 arr = new AliTPCClustersArray;
103 TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject("galice.root");
104 if (file==0) file = TFile::Open("rfio:galice.root","update");
105 arr->SetClusterType("AliDigitCluster");
106 arr->Setup(gTPCParam);
107 cout<<"Update status : "<<arr->Update()<<"\n";
110 sprintf(treeName,"TreeCExact_%s",gTPCParam->GetTitle());
112 sprintf(treeName,"TreeCCalc_%s",gTPCParam->GetTitle());
114 cout<<"Connect tree status : "<<arr->ConnectTree(treeName)<<"\n";
125 AliTPCClustersArray * GetDifClustersArray(Bool_t newtree=kFALSE, const char* name=0)
128 //construct AliTPCClusters Array object
130 AliTPCClustersArray * arr=0;
131 // if ( (gAlice!=0) && (gAlice->GetDetector("TPC")!=0) ) {
132 // arr = ((AliTPC*)gAlice->GetDetector("TPC"))->GetClustersArray();
133 // if (arr!=0) arr->Update();
136 arr = new AliTPCClustersArray;
137 TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject("galice.root");
138 if (file==0) file = TFile::Open("rfio:galice.root","update");
139 arr->SetClusterType("AliDifCluster");
140 arr->Setup(gTPCParam);
141 cout<<"Update status : "<<arr->Update()<<"\n";
144 sprintf(treeName,"TreeCExact_%s",gTPCParam->GetTitle());
146 sprintf(treeName,"TreeCDif_%s",gTPCParam->GetTitle());
148 cout<<"Connect tree status : "<<arr->ConnectTree(treeName)<<"\n";
160 TClonesArray * CompareClusters(TClonesArray *calcclusters,TClonesArray *exactclusters,
161 TClonesArray *diffclusters, Float_t shx, Float_t shy)
163 if (calcclusters==0) return 0;
164 if (exactclusters==0) return 0;
165 if (diffclusters==0) return 0;
166 TClonesArray & diff=*diffclusters;
169 Int_t nclusters2 = calcclusters->GetEntriesFast();
170 Int_t nclusters1 = exactclusters->GetEntriesFast();
172 for(Int_t i=0; i<nclusters1; i++){
173 AliCluster * cl1 = (AliCluster*)exactclusters->UncheckedAt(i);
174 AliDigitCluster *cl2;
179 for (Int_t j=0; j<nclusters2;j++){
180 cl2 = (AliDigitCluster*)calcclusters->UncheckedAt(j);
181 if ( (cl2!=0)&& (cl1!=0)){
182 Float_t ddx = (cl2->fX-shx)-cl1->fX;
183 Float_t ddy = (cl2->fY-shy)-cl1->fY;
184 if ((ddx*ddx+ddy*ddy)<(dx*dx+dy*dy)){
192 cl2 = (AliDigitCluster*)calcclusters->UncheckedAt(index);
197 diffc.fAngleX = cl1->fSigmaX2;
198 diffc.fAngleY = cl1->fSigmaY2;
199 diffc.fTracks[0] = cl2->fTracks[0];
200 diffc.fTracks[1] = cl2->fTracks[1];
201 diffc.fTracks[2] = cl2->fTracks[2];
202 diffc.fGenerTrack= cl1->fTracks[0];
206 diffc.fNx = cl2->fNx;
207 diffc.fNy = cl2->fNy;
209 diffc.fOrigQ = cl1->fQ;
210 diffc.fSigmaX2 = cl2->fSigmaX2;
211 diffc.fSigmaY2 = cl2->fSigmaY2;
212 diffc.fArea = cl2->fArea;
213 diffc.fMax = cl2->fMax;
215 else cout<<"pici[ici/n";
217 new(diff[i]) AliDifCluster(diffc);