2 // Process ESD tracks -
3 // Extract TPC tracks - write them to tree
8 AnalyzeESDtracks(567); // process tracks
9 // Tracks are written to the file "TPCtracks.root"
10 // Now yo can analyze it
11 TFile fesd("AliESDs.root");
12 TTree * treeE = (TTree*)fesd.Get("esdTree");
13 TFile f("TPCtracks.root")
14 TTree * tree =(TTree*)f.Get("Tracks");
15 AliComparisonDraw comp;
23 .L AnalyzeESDtracks.C+
26 //AnalyzeESDtracks(567);
29 TFile fesd("AliESDs.root");
30 TTree * treeE = (TTree*)fesd.Get("esdTree");
31 TFile f("TPCtracks.root")
32 TTree * tree =(TTree*)f.Get("Tracks");
33 AliComparisonDraw comp;
36 TFile fs("TPCsignal.root");
37 TTree *treeB =(TTree*)fs.Get("SignalB");
38 TTree *treeN =(TTree*)fs.Get("SignalN");
39 TTree *treeS =(TTree*)fs.Get("Signal");
40 TTree *treef =(TTree*)fs.Get("Fit");
43 FitSignals(treeB,"Max-Median>100&&RMS06<2.5")
44 TFile ffit("FitSignal.root");
45 TTree * treeF = (TTree*)ffit->Get("Fit");
48 TChain chaincl("TreeR","TreeR")
49 chaincl.Add("TPC.RecPoints.root/Event0/TreeR")
50 chaincl.Add("TPC.RecPoints1.root/Event1/TreeR")
51 chaincl.Add("TPC.RecPoints2.root/Event2/TreeR")
52 chaincl.Add("TPC.RecPoints3.root/Event3/TreeR")
63 #include "TTreeStream.h"
64 #include "TEventList.h"
68 #include "TRobustEstimator.h"
69 #include "TTimeStamp.h"
75 #include "AliESDfriend.h"
76 #include "AliESDtrack.h"
77 #include "AliTracker.h"
78 #include "AliTPCseed.h"
79 #include "AliTPCclusterMI.h"
80 #include "AliTPCParamSR.h"
81 #include "AliTPCROC.h"
84 #include "TTreeStream.h"
87 #include "AliSignalProcesor.h"
91 void FitSignals(TTree * treeB, TCut cut="Max-Median>150&&RMS06<2&&abs(Median-Mean09)<0.5", Int_t maxS=100);
92 void LaserCalib(TTreeSRedirector & cstream, TTree * chain, Float_t tmin, Float_t tmax, Float_t fraction=0.7);
94 void AnalyzeESDtracks(Int_t run){
97 TTreeSRedirector * pcstream = new TTreeSRedirector("TPCtracks.root");
98 TTreeSRedirector &cstream = *pcstream;
100 TFile f("AliESDs.root");
101 TTree * tree =(TTree*)f.Get("esdTree");
103 tree->SetBranchAddress("ESD",&esd);
105 tree->AddFriend("esdFriendTree","AliESDfriends.root");
106 tree->SetBranchAddress("ESDfriend",&evf);
108 Int_t nevents = tree->GetEntries();
109 TClonesArray *clusters = new TClonesArray("AliTPCclusterMI",160);
110 for (Int_t irow=0; irow<160; irow++){
111 new ((*clusters)[irow]) AliTPCclusterMI; // iitial dummy clusters
114 for (Int_t ievent=0; ievent<nevents; ievent++){
115 tree->GetEntry(ievent);
118 esd->SetESDfriend(evf); //Attach the friend to the ESD
119 for (Int_t itrack =0; itrack<esd->GetNumberOfTracks(); itrack++){
121 if (esd->GetTrack(itrack)->GetFriendTrack()==0) continue;
122 AliESDtrack * etrack = esd->GetTrack(itrack);
123 AliESDfriendTrack * ftrack = (AliESDfriendTrack *)esd->GetTrack(itrack)->GetFriendTrack();
124 AliTPCseed * seed = (AliTPCseed*)(ftrack->GetCalibObject(0));
126 for (Int_t irow=0; irow<160; irow++){
127 if (seed->GetClusterFast(irow)){
128 AliTPCclusterMI * cl = new ((*clusters)[irow]) AliTPCclusterMI(*(seed->GetClusterFast(irow)));
129 cl->SetLabel(itrack,0);
132 AliTPCclusterMI * cl = (AliTPCclusterMI*)clusters->At(irow);
133 cl->SetX(0); cl->SetY(0); cl->SetZ(0); cl->SetQ(0); cl->SetLabel(-1,0);
136 Float_t dEdx = seed->GetdEdx();
137 Float_t dEdxI = seed->CookdEdx(0.05,0.6,0,77);
138 Float_t dEdxO = seed->CookdEdx(0.05,0.6,78,155);
139 Int_t ncl = seed->GetNumberOfClusters();
157 TFile fs("TPCsignal.root");
158 TTree *treeB =(TTree*)fs.Get("SignalB");
160 // Fit central electrode part
162 TTreeSRedirector * pcestream = new TTreeSRedirector("TimeRoot.root");
163 TTree * treece = (TTree*)fs.Get("Signalce");
165 LaserCalib(*pcestream, treece, 800,1000, 0.7);
168 FitSignals(treeB,"Max-Median>150&&RMS06<1.0&&RMS09<1.5&&abs(Median-Mean09)<0.2&&abs(Mean06-Mean09)<0.2",1000);
173 void FitSignals(TTree * treeB, TCut cut, Int_t max){
174 AliSignalProcesor proc;
175 TF1 * f1 = proc.GetAsymGauss();
176 TTreeSRedirector cstream("FitSignal.root");
177 TFile *f = cstream.GetFile();
180 sprintf(lname,"Fit%s", cut.GetTitle());
181 TEventList *list = new TEventList(lname,lname);
182 sprintf(lname,">>Fit%s", cut.GetTitle());
183 treeB->Draw(lname,cut);
184 treeB->SetEventList(list);
186 for (Int_t ievent=0; ievent<list->GetN(); ievent++){
187 if (nFits>max) break;
188 if (nFits%50==0) printf("%d\n",nFits);
190 sprintf(ename,"Fit%d", ievent);
191 Double_t nsample = treeB->Draw("Graph.fY-Mean09:Graph.fX","","",1,ievent);
192 Double_t * signal = treeB->GetV1();
193 Double_t * time = treeB->GetV2();
196 for (Int_t ipos = 0; ipos<nsample; ipos++){
197 if (signal[ipos]>max){
203 Int_t first = TMath::Max(maxpos-10,0.);
204 Int_t last = TMath::Min(maxpos+60, nsample);
207 TH1F his(ename,ename,last-first,first,last);
208 for (Int_t ipos=0; ipos<last-first; ipos++){
209 his.SetBinContent(ipos+1,signal[ipos+first]);
211 treeB->Draw("Sector:Row:Pad","","",1,ievent);
212 Double_t sector = treeB->GetV1()[0];
213 Double_t row = treeB->GetV2()[0];
214 Double_t pad = treeB->GetV3()[0];
215 // TGraph graph(last-first,&time[first],&signal[first]);
216 f1->SetParameters(0.75*max,maxpos,1.1,0.8,0.25,0.2);
217 // TH1F * his = (TH1F*)graph.GetHistogram();
224 for (Int_t ipar=0; ipar<6; ipar++) params[ipar] = f1->GetParameters()[ipar];
225 Double_t chi2 = TFitter::GetFitter()->Chisquare(6,params);
227 cov.SetMatrixArray(TFitter::GetFitter()->GetCovarianceMatrix());
234 for (Int_t ipos=0; ipos<last-first; ipos++){
235 x0[ipos] = signal[ipos+first];
237 proc.TailCancelationALTRO1(x0,x1,0.85*0.339,0.09,last-first);
238 proc.TailCancelationALTRO1(x1,x2,0.85,0.789,last-first);
240 sprintf(ename,"Cancel1_%d", ievent);
241 TH1F his1(ename,ename,last-first,first,last);
242 for (Int_t ipos=0; ipos<last-first; ipos++){
243 his1.SetBinContent(ipos+1,x1[ipos]);
246 sprintf(ename,"Cancel2_%d", ievent);
247 TH1F his2(ename,ename,last-first,first,last);
248 for (Int_t ipos=0; ipos<last-first; ipos++){
249 his2.SetBinContent(ipos+1,x1[ipos]);
251 f1->SetParameters(0.75*max,maxpos,1.1,0.8,0.25,0.2);
255 for (Int_t ipar=0; ipar<6; ipar++) params2[ipar] = f1->GetParameters()[ipar];
256 Double_t chi22 = TFitter::GetFitter()->Chisquare(6,params2);
258 cov2.SetMatrixArray(TFitter::GetFitter()->GetCovarianceMatrix());
260 TGraph gr0(last-first, &time[first],x0);
261 TGraph gr1(last-first, &time[first],x1);
262 TGraph gr2(last-first, &time[first],x2);
298 void LaserCalib(TTreeSRedirector & cstream, TTree * chain, Float_t tmin, Float_t tmax, Float_t fraction){
302 const Double_t kMaxDelta=10;
305 TFile fce("TPCsignal.root");
306 TTree * treece =(TTree*)fce.Get("Signalce");
307 if (chain) treece=chain;
309 TBranch * brsector = treece->GetBranch("Sector");
310 TBranch * brpad = treece->GetBranch("Pad");
311 TBranch * brrow = treece->GetBranch("Row");
312 TBranch * brTimeStamp = treece->GetBranch("TimeStamp");
314 TBranch * brtime = treece->GetBranch("Time");
315 TBranch * brrms = treece->GetBranch("RMS06");
316 TBranch * brmax = treece->GetBranch("Max");
317 TBranch * brsum = treece->GetBranch("Qsum");
319 Int_t sector, pad, row=0;
320 Double_t time=0, rms=0, qMax=0, qSum=0;
322 brsector->SetAddress(§or);
323 brrow->SetAddress(&row);
324 brpad->SetAddress(&pad);
325 brTimeStamp->SetAddress(&timeStamp);
327 brtime->SetAddress(&time);
328 brrms->SetAddress(&rms);
329 brmax->SetAddress(&qMax);
330 brsum->SetAddress(&qSum);
333 brsector->GetEntry(0);
335 Int_t firstSector = sector;
336 Int_t lastSector = sector;
340 // find time offset for differnt events
343 Double_t padTimes[500000];
344 TRobustEstimator restim;
345 Double_t meanS[72], sigmaS[72];
346 Int_t firstS[72], lastS[72];
347 Double_t sectorsID[72];
348 for (Int_t isector=0;isector<72; isector++){
352 TH1F hisT("hisT","hisT",100,tmin,tmax);
353 treece->Draw("Time>>hisT","");
354 Float_t cbin = hisT.GetBinCenter(hisT.GetMaximumBin());
356 for (Int_t ientry=0; ientry<treece->GetEntriesFast(); ientry++){
357 treece->GetEvent(ientry);
359 if (sector!=lastSector && sector==firstSector){
360 //if (sector!=lastSector){
362 TTimeStamp stamp(timeStamp);
364 printf("\nEvent\t%d\tFirst\t%d\tLast\t%d\t%d\n",count, fentry, lentry, lentry-fentry);
368 for (Int_t ientry2=fentry; ientry2<lentry; ientry2++){
369 // brtime->GetEvent(ientry2);
370 // brsector->GetEvent(ientry2);
371 treece->GetEvent(ientry2);
372 if (time>tmin&&time<tmax && TMath::Abs(time-cbin)<kMaxDelta){
373 padTimes[ngood]=time;
375 if (firstS[sector]<0) firstS[sector]= ngood;
376 if (firstS[sector]>=0) lastS[sector] = ngood;
382 restim.EvaluateUni(ngood,padTimes,mean, sigma,int(float(ngood)*fraction));
383 printf("Event\t%d\t%f\t%f\n",count, mean, sigma);
384 for (Int_t isector=0; isector<72; isector++){
385 sectorsID[isector]=sector;
386 if (firstS[isector]>=0 &&lastS[isector]>=0 && lastS[isector]>firstS[isector] ){
387 Int_t ngoodS = lastS[isector]-firstS[isector];
388 restim.EvaluateUni(ngoodS, &padTimes[firstS[isector]],meanS[isector],
389 sigmaS[isector],int(float(ngoodS)*fraction));
392 TGraph graphM(72,sectorsID,meanS);
393 TGraph graphS(72,sectorsID,sigmaS);
402 for (Int_t ientry2=fentry; ientry2<lentry-1; ientry2++){
403 treece->GetEvent(ientry2);
404 Double_t x = param.GetPadRowRadii(sector,row);
405 Int_t maxpad = AliTPCROC::Instance()->GetNPads(sector,row);
406 Double_t y = (pad - 2.5 - 0.5*maxpad)*param.GetPadPitchWidth(sector);
407 Double_t alpha = TMath::DegToRad()*(10.+20.*(sector%18));
408 Double_t gx = x*TMath::Cos(alpha)-y*TMath::Sin(alpha);
409 Double_t gy = y*TMath::Cos(alpha)+x*TMath::Sin(alpha);
411 Int_t npadS = lastS[sector]-firstS[sector];
414 "TimeStamp="<<timeStamp<<
427 "TimeS0="<<meanS[sector]<<
428 "SigmaS0="<<sigmaS[sector]<<
435 treece->GetEvent(ientry);
438 for (Int_t isector=0;isector<72; isector++){
450 TChain *MakeChainCL(Int_t first, Int_t last){
451 TChain *chaincl = new TChain("TreeR","TreeR");
454 for (Int_t i=first;i<last; i++){
455 if (i>0) sprintf(fname,"TPC.RecPoints%d.root/Event%d/TreeR",i,i);
456 if (i==0) sprintf(fname,"TPC.RecPoints.root/Event%d/TreeR",i);
462 TTree* GetTree(Int_t ievent){
465 if (ievent>0) sprintf(fname,"TPC.RecPoints%d.root",ievent);
466 if (ievent==0) sprintf(fname,"TPC.RecPoints.root");
467 sprintf(tname,"Event%d/TreeR",ievent);
468 TFile * f = new TFile(fname);
469 TTree * tree = (TTree*)f->Get(tname);