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 **************************************************************************/
16 //Class to calculate the intrinsic efficiency of the detection elements of the
17 //MUON tracking chambers in function of the position in the detection element.
18 //Author: Nicolas LE BRIS - SUBATECH Nantes
27 #include <TClonesArray.h>
31 #include "Riostream.h"
34 #include "AliAnalysisManager.h"
35 #include "AliAnalysisTask.h"
38 #include "AliESDEvent.h"
39 #include "AliESDMuonTrack.h"
40 #include "AliESDInputHandler.h"
42 #include "AliTracker.h"
43 #include "AliAnalysisManager.h"
46 #include "AliAnalysisTaskMuonTrackingEff.h"
47 #include "AliCheckMuonDetEltResponse.h"
50 #include "AliMUONGeometryTransformer.h"
51 #include "AliMUONTrackExtrap.h"
53 ClassImp(AliAnalysisTaskMuonTrackingEff)
55 const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfDetectionElt = 156;
56 const Int_t AliAnalysisTaskMuonTrackingEff::fTotNbrOfChamber = 10;
58 //________________________________________________________________________
59 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff()
64 fDetEltEffHistList(0x0),
65 fDetEltTDHistList(0x0),
66 fDetEltTTHistList(0x0),
67 fChamberEffHistList(0x0),
68 fChamberTDHistList(0x0),
69 fChamberTTHistList(0x0),
73 /// Default constructor
75 //________________________________________________________________________
76 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const AliAnalysisTaskMuonTrackingEff& src)
81 fDetEltEffHistList(0x0),
82 fDetEltTDHistList(0x0),
83 fDetEltTTHistList(0x0),
84 fChamberEffHistList(0x0),
85 fChamberTDHistList(0x0),
86 fChamberTTHistList(0x0),
93 //________________________________________________________________________
94 AliAnalysisTaskMuonTrackingEff& AliAnalysisTaskMuonTrackingEff::operator=(const AliAnalysisTaskMuonTrackingEff& src)
96 /// assignement operator
104 //________________________________________________________________________
105 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const char* name,
106 const AliMUONGeometryTransformer* transformer,
109 AliAnalysisTask(name, "AnalysisTaskESD"),
112 fDetEltEffHistList(0x0),
113 fDetEltTDHistList(0x0),
114 fDetEltTTHistList(0x0),
115 fChamberEffHistList(0x0),
116 fChamberTDHistList(0x0),
117 fChamberTTHistList(0x0),
119 fIsCosmicData(kFALSE)
124 fIsCosmicData = isCosmic;
125 fTransformer = transformer;
127 //Define detection element efficiency histograms
128 //----------------------------------------------
130 fDetEltEffHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 3); //!<+3 for: 1.the total efficiency chamber by chamber histogram.
131 //!< 2.the total number of tracks detected by the tracking system.
132 //!< 3.the number of track used for the efficiency calculation chamber by chamber
133 fDetEltTDHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
134 fDetEltTTHistList = new TClonesArray("TH2F",fTotNbrOfDetectionElt + 1);
137 fChamberEffHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 3);
138 fChamberTDHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
139 fChamberTTHistList = new TClonesArray("TH1F", fTotNbrOfChamber + 1);
143 for (Int_t i = 0; i<fTotNbrOfDetectionElt; ++i)
146 if (i<16) iDetElt = 100*(i/4+1) + i - int(i/4)*4;
147 else if (i<52) iDetElt = 100*((i-16)/18+5) + i - (int((i-16)/18)*18 + 16);
148 if (i>51) iDetElt = 100*((i-52)/26+7) + i - (int((i-52)/26)*26 + 52);
150 Char_t histName[255];
151 Char_t histTitle[255];
153 sprintf(histName,"Eff_detEltNbr%d",iDetElt);
154 sprintf(histTitle,"detEltNbr %d",iDetElt);
155 if(i<16) new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
156 else new((*fDetEltEffHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
158 sprintf(histName,"TD_detEltNbr%d",iDetElt);
159 if(i<16) new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110);//!<Stations 1 & 2.
160 else new((*fDetEltTDHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
162 sprintf(histName,"TT_detEltNbr%d",iDetElt);
163 if(i<16) new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,12,-10,110,12,-10,110); //!<Stations 1 & 2.
164 else new((*fDetEltTTHistList)[i]) TH2F(histName,histTitle,28,-140,140,8,-40,40); //!<Stations 3 -> 5.
166 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitle("X (cm)");
167 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitle("Y (cm)");
168 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitle("Efficiency (%)");
169 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetXaxis() -> SetTitleOffset(1.8);
170 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetYaxis() -> SetTitleOffset(1.8);
171 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> GetZaxis() -> SetTitleOffset(1.2);
172 ((TH2F*) fDetEltEffHistList->UncheckedAt(i)) -> SetOption("LEGO");
175 for (Int_t j = 0; j < fTotNbrOfChamber; j++)
177 Char_t histName[255];
178 Char_t histTitle[255];
181 sprintf(histName,"Eff_ChamberNbr%d",j+1);
182 sprintf(histTitle,"ChamberNbr %d",j+1);
183 if (j<4) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
184 else if (j<6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
185 if (j>=6) new ((*fChamberEffHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
187 sprintf(histName,"TD_ChamberNbr%d",j+1);
188 if (j<4) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
189 else if (j<6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
190 if (j>=6) new ((*fChamberTDHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
192 sprintf(histName,"TT_ChamberNbr%d",j+1);
193 if (j<4) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 4, 0.0, 4.0);
194 else if (j<6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 18, 0.0, 18.0);
195 if (j>=6) new ((*fChamberTTHistList)[j]) TH1F(histName, histTitle, 26, 0.0, 26.0);
197 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitle("DetElement");
198 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitle("Efficiency (%)");
199 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetXaxis() -> SetTitleOffset(1.8);
200 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> GetYaxis() -> SetTitleOffset(1.8);
201 ((TH1F*) fChamberEffHistList->UncheckedAt(j)) -> Sumw2();
205 new((*fDetEltTDHistList )[fTotNbrOfDetectionElt]) TH2F("TD_Chamber" ,"TD_Chamber" ,10,0,10,1,0,1); //!<Detected tracks.
206 new((*fDetEltTTHistList )[fTotNbrOfDetectionElt]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number.
207 new((*fDetEltEffHistList)[fTotNbrOfDetectionElt]) TH2F("fChamberEff","fChamberEff",10,0,10,1,0,1); //!<Chamber efficiency.
209 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitle("Chamber number");
210 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitle("");
211 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitle("Efficiency (%)");
212 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitleOffset(1.8);
213 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitleOffset(1.8);
214 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitleOffset(1.2);
215 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt)) -> SetOption("LEGO");
217 new((*fDetEltEffHistList)[157]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number by chamber.
219 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitle("Chamber number");
220 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitle("");
221 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitle("Number of tracks");
222 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
223 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
224 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitleOffset(1.2);
225 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 1)) -> SetOption("LEGO");
227 new((*fDetEltEffHistList)[158]) TH2F("Total_Number_of_Tracks" ,"Total_Number_of_Tracks" ,1,0,1,1,0,1); //!<Tracks total number.
229 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitle("");
230 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitle("");
231 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitle("Number of tracks");
232 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
233 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
234 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitleOffset(1.2);
235 ((TH2F*) fDetEltEffHistList->UncheckedAt(fTotNbrOfDetectionElt + 2)) -> SetOption("LEGO");
238 new((*fChamberTDHistList )[fTotNbrOfChamber]) TH1F("TD_Chamber_2" ,"TD_Chamber_2" ,10,0,10); //!<Detected tracks.
239 new((*fChamberTTHistList )[fTotNbrOfChamber]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number.
240 new((*fChamberEffHistList)[fTotNbrOfChamber]) TH1F("fChamberEff_2","fChamberEff_2",10,0,10); //!<Chamber efficiency.
242 ((TH1F*) fChamberTDHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
243 ((TH1F*) fChamberTTHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
245 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitle("Chamber number");
246 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitle("");
247 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetXaxis() -> SetTitleOffset(1.8);
248 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> GetYaxis() -> SetTitleOffset(1.8);
249 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> Sumw2();
250 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber)) -> SetOption("");
252 new((*fChamberEffHistList)[11]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number by chamber.
254 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitle("Chamber number");
255 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitle("");
256 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
257 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
258 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> Sumw2();
259 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 1)) -> SetOption("");
261 new((*fChamberEffHistList)[12]) TH1F("Total_Number_of_Tracks_2" ,"Total_Number_of_Tracks_2" ,1,0,1); //!<Tracks total number.
263 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitle("");
264 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitle("");
265 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
266 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
267 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> Sumw2();
268 ((TH1F*) fChamberEffHistList->UncheckedAt(fTotNbrOfChamber + 2)) -> SetOption("");
272 //fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
276 //Define input & output
277 //---------------------
279 // -Input slot 0 works with a TChain:
280 DefineInput(0, TChain::Class());
282 // -Output slots 0 to 5 writes into a TClonesArray:
283 DefineOutput(0, TClonesArray::Class());
284 DefineOutput(1, TClonesArray::Class());
285 DefineOutput(2, TClonesArray::Class());
286 DefineOutput(3, TClonesArray::Class());
287 DefineOutput(4, TClonesArray::Class());
288 DefineOutput(5, TClonesArray::Class());
293 //______________________________________________________________________________
294 AliAnalysisTaskMuonTrackingEff::~AliAnalysisTaskMuonTrackingEff()
297 delete fDetEltEffHistList;
298 delete fDetEltTDHistList;
299 delete fDetEltTTHistList;
300 delete fChamberEffHistList;
301 delete fChamberTDHistList;
302 delete fChamberTTHistList;
308 //________________________________________________________________________
309 void AliAnalysisTaskMuonTrackingEff::CreateOutputObjects()
316 //________________________________________________________________________
317 void AliAnalysisTaskMuonTrackingEff::ConnectInputData(Option_t */*option*/)
320 //Set Field Map for track extrapolation
321 AliMUONTrackExtrap::SetField();
324 AliESDInputHandler* esdHandler = (AliESDInputHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
327 Printf("ERROR: Could not get ESDInputHandler");
329 else fESD = esdHandler->GetEvent();
333 //________________________________________________________________________
334 void AliAnalysisTaskMuonTrackingEff::Exec(Option_t */*option*/)
336 //Execute analysis for current event
338 if (fChamberEff == 0x0)
339 fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
340 fChamberEff->CheckDetEltResponse();
343 for( Int_t i = 0; i<156; ++i)
345 ((TH2F*) fDetEltEffHistList->UncheckedAt(i))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(i),
346 (TH2F*) fDetEltTTHistList->UncheckedAt(i), 100., 1.);
349 for (Int_t j = 0; j < 10; j++)
351 ((TH1F*) fChamberEffHistList->UncheckedAt(j))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(j),
352 (TH1F*) fChamberTTHistList->UncheckedAt(j), 100., 1.);
356 ((TH2F*) fDetEltEffHistList->UncheckedAt(156))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(156),
357 (TH2F*) fDetEltTTHistList->UncheckedAt(156), 100., 1.);
360 ((TH2F*) fDetEltEffHistList->UncheckedAt(157))-> Add ( (TH2F*) fDetEltTTHistList ->UncheckedAt(156),
361 (TH2F*) fDetEltEffHistList->UncheckedAt(157), 1., 0.);
364 ((TH2F*) fDetEltEffHistList->UncheckedAt(158))-> Fill(0., 0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
367 ((TH1F*) fChamberEffHistList->UncheckedAt(10))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(10),
368 (TH1F*) fChamberTTHistList->UncheckedAt(10), 100., 1.);
371 ((TH1F*) fChamberEffHistList->UncheckedAt(11))-> Add ( (TH1F*) fChamberTTHistList ->UncheckedAt(10),
372 (TH1F*) fChamberEffHistList->UncheckedAt(11), 1., 0.);
375 ((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
379 //Post the output data:
380 PostData(0, fDetEltTDHistList);
381 PostData(1, fDetEltTTHistList);
382 PostData(2, fDetEltEffHistList);
383 PostData(3, fChamberTDHistList);
384 PostData(4, fChamberTTHistList);
385 PostData(5, fChamberEffHistList);
390 //________________________________________________________________________
391 void AliAnalysisTaskMuonTrackingEff::Terminate(Option_t */*option*/)
398 //________________________________________________________________________
399 void AliAnalysisTaskMuonTrackingEff::ComputeErrors()
401 // Compute error on the efficiency
403 // error = max {1/Ntt, sqrt(eff*(1-eff)/Ntt)}
405 for (Int_t ii = 0; ii < 10; ii++)
407 Int_t NumberOfBins = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetNbinsX();
408 for (Int_t jj = 1; jj <= NumberOfBins; jj++)
410 Double_t Ntd = ((TH1F*) fChamberTDHistList->UncheckedAt(ii))->GetBinContent(jj);
411 Double_t Ntt = ((TH1F*) fChamberTTHistList->UncheckedAt(ii))->GetBinContent(jj);
413 if (Ntt > 0.0 && Ntd > 0.0)
415 Double_t eff = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetBinContent(jj)/100.0;
416 Double_t err1 = 1.0/Ntt;
417 Double_t err2 = TMath::Sqrt(eff*(1.0 - eff)/Ntt);
418 Double_t error = TMath::Max(err1, err2);
420 ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->SetBinError(jj, error*100.0);