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
24 #include <TClonesArray.h>
28 #include "AliAnalysisManager.h"
31 #include "AliESDEvent.h"
32 #include "AliESDMuonTrack.h"
33 #include "AliESDInputHandler.h"
35 #include "AliTracker.h"
36 #include "AliAnalysisManager.h"
37 #include "AliGeomManager.h"
40 //PWG3/muondep includes
41 #include "AliAnalysisTaskMuonTrackingEff.h"
42 #include "AliCheckMuonDetEltResponse.h"
45 #include "AliMUONTrackExtrap.h"
46 #include "AliMUONGeometryTransformer.h"
48 ClassImp(AliAnalysisTaskMuonTrackingEff)
50 const Int_t AliAnalysisTaskMuonTrackingEff::fgkTotNbrOfDetectionElt = 156;
51 const Int_t AliAnalysisTaskMuonTrackingEff::fgkTotNbrOfChamber = 10;
53 //________________________________________________________________________
54 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff()
59 fDetEltEffHistList(0x0),
60 fDetEltTDHistList(0x0),
61 fDetEltTTHistList(0x0),
62 fChamberEffHistList(0x0),
63 fChamberTDHistList(0x0),
64 fChamberTTHistList(0x0),
68 /// Default constructor
70 //________________________________________________________________________
71 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const AliAnalysisTaskMuonTrackingEff& src)
76 fDetEltEffHistList(0x0),
77 fDetEltTDHistList(0x0),
78 fDetEltTTHistList(0x0),
79 fChamberEffHistList(0x0),
80 fChamberTDHistList(0x0),
81 fChamberTTHistList(0x0),
88 //________________________________________________________________________
89 AliAnalysisTaskMuonTrackingEff& AliAnalysisTaskMuonTrackingEff::operator=(const AliAnalysisTaskMuonTrackingEff& src)
91 /// assignement operator
99 //________________________________________________________________________
100 AliAnalysisTaskMuonTrackingEff::AliAnalysisTaskMuonTrackingEff(const char* name,
103 AliAnalysisTask(name, "AnalysisTaskESD"),
106 fDetEltEffHistList(0x0),
107 fDetEltTDHistList(0x0),
108 fDetEltTTHistList(0x0),
109 fChamberEffHistList(0x0),
110 fChamberTDHistList(0x0),
111 fChamberTTHistList(0x0),
113 fIsCosmicData(kFALSE)
118 fIsCosmicData = isCosmic;
121 if (!AliGeomManager::GetGeometry())
122 AliGeomManager::LoadGeometry();
123 fTransformer = new AliMUONGeometryTransformer();
124 fTransformer->LoadGeometryData();
127 //Define detection element efficiency histograms
128 //----------------------------------------------
130 fDetEltEffHistList = new TClonesArray("TH2F",fgkTotNbrOfDetectionElt + 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",fgkTotNbrOfDetectionElt + 1);
134 fDetEltTTHistList = new TClonesArray("TH2F",fgkTotNbrOfDetectionElt + 1);
137 fChamberEffHistList = new TClonesArray("TH1F", fgkTotNbrOfChamber + 3);
138 fChamberTDHistList = new TClonesArray("TH1F", fgkTotNbrOfChamber + 1);
139 fChamberTTHistList = new TClonesArray("TH1F", fgkTotNbrOfChamber + 1);
143 for (Int_t i = 0; i<fgkTotNbrOfDetectionElt; ++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 < fgkTotNbrOfChamber; 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();
204 new((*fDetEltTDHistList )[fgkTotNbrOfDetectionElt]) TH2F("TD_Chamber" ,"TD_Chamber" ,10,0,10,1,0,1); //!<Detected tracks.
205 new((*fDetEltTTHistList )[fgkTotNbrOfDetectionElt]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number.
206 new((*fDetEltEffHistList)[fgkTotNbrOfDetectionElt]) TH2F("fChamberEff","fChamberEff",10,0,10,1,0,1); //!<Chamber efficiency.
208 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitle("Chamber number");
209 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitle("");
210 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitle("Efficiency (%)");
211 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetXaxis() -> SetTitleOffset(1.8);
212 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetYaxis() -> SetTitleOffset(1.8);
213 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> GetZaxis() -> SetTitleOffset(1.2);
214 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt)) -> SetOption("LEGO");
216 new((*fDetEltEffHistList)[157]) TH2F("TT_Chamber" ,"TT_Chamber" ,10,0,10,1,0,1); //!<Tracks total number by chamber.
218 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitle("Chamber number");
219 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitle("");
220 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitle("Number of tracks");
221 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
222 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
223 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> GetZaxis() -> SetTitleOffset(1.2);
224 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 1)) -> SetOption("LEGO");
226 new((*fDetEltEffHistList)[158]) TH2F("Total_Number_of_Tracks" ,"Total_Number_of_Tracks" ,1,0,1,1,0,1); //!<Tracks total number.
228 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitle("");
229 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitle("");
230 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitle("Number of tracks");
231 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
232 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
233 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> GetZaxis() -> SetTitleOffset(1.2);
234 ((TH2F*) fDetEltEffHistList->UncheckedAt(fgkTotNbrOfDetectionElt + 2)) -> SetOption("LEGO");
237 new((*fChamberTDHistList )[fgkTotNbrOfChamber]) TH1F("TD_Chamber_2" ,"TD_Chamber_2" ,10,0,10); //!<Detected tracks.
238 new((*fChamberTTHistList )[fgkTotNbrOfChamber]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number.
239 new((*fChamberEffHistList)[fgkTotNbrOfChamber]) TH1F("fChamberEff_2","fChamberEff_2",10,0,10); //!<Chamber efficiency.
241 ((TH1F*) fChamberTDHistList->UncheckedAt(fgkTotNbrOfChamber)) -> Sumw2();
242 ((TH1F*) fChamberTTHistList->UncheckedAt(fgkTotNbrOfChamber)) -> Sumw2();
244 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> GetXaxis() -> SetTitle("Chamber number");
245 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> GetYaxis() -> SetTitle("");
246 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> GetXaxis() -> SetTitleOffset(1.8);
247 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> GetYaxis() -> SetTitleOffset(1.8);
248 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> Sumw2();
249 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber)) -> SetOption("");
251 new((*fChamberEffHistList)[11]) TH1F("TT_Chamber_2" ,"TT_Chamber_2" ,10,0,10); //!<Tracks total number by chamber.
253 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitle("Chamber number");
254 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitle("");
255 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> GetXaxis() -> SetTitleOffset(1.8);
256 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> GetYaxis() -> SetTitleOffset(1.8);
257 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> Sumw2();
258 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 1)) -> SetOption("");
260 new((*fChamberEffHistList)[12]) TH1F("Total_Number_of_Tracks_2" ,"Total_Number_of_Tracks_2" ,1,0,1); //!<Tracks total number.
262 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitle("");
263 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitle("");
264 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> GetXaxis() -> SetTitleOffset(1.8);
265 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> GetYaxis() -> SetTitleOffset(1.8);
266 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> Sumw2();
267 ((TH1F*) fChamberEffHistList->UncheckedAt(fgkTotNbrOfChamber + 2)) -> SetOption("");
273 //Define input & output
274 //---------------------
276 // -Input slot 0 works with a TChain:
277 DefineInput(0, TChain::Class());
279 // -Output slots 0 to 5 writes into a TClonesArray:
280 DefineOutput(0, TClonesArray::Class());
281 DefineOutput(1, TClonesArray::Class());
282 DefineOutput(2, TClonesArray::Class());
283 DefineOutput(3, TClonesArray::Class());
284 DefineOutput(4, TClonesArray::Class());
285 DefineOutput(5, TClonesArray::Class());
290 //______________________________________________________________________________
291 AliAnalysisTaskMuonTrackingEff::~AliAnalysisTaskMuonTrackingEff()
295 delete fDetEltEffHistList;
296 delete fDetEltTDHistList;
297 delete fDetEltTTHistList;
298 delete fChamberEffHistList;
299 delete fChamberTDHistList;
300 delete fChamberTTHistList;
306 //________________________________________________________________________
307 void AliAnalysisTaskMuonTrackingEff::CreateOutputObjects()
314 //________________________________________________________________________
315 void AliAnalysisTaskMuonTrackingEff::ConnectInputData(Option_t */*option*/)
318 //Set Field Map for track extrapolation
319 AliMUONTrackExtrap::SetField();
322 AliESDInputHandler* esdHandler = (AliESDInputHandler*) ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
325 Printf("ERROR: Could not get ESDInputHandler");
327 else fESD = esdHandler->GetEvent();
331 //________________________________________________________________________
332 void AliAnalysisTaskMuonTrackingEff::Exec(Option_t */*option*/)
334 //Execute analysis for current event
335 if (fChamberEff == 0x0)
336 fChamberEff = new AliCheckMuonDetEltResponse(fTransformer, fESD, fDetEltTDHistList, fDetEltTTHistList, fChamberTDHistList, fChamberTTHistList);
337 fChamberEff->CheckDetEltResponse();
339 for( Int_t i = 0; i<156; ++i)
341 ((TH2F*) fDetEltEffHistList->UncheckedAt(i))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(i),
342 (TH2F*) fDetEltTTHistList->UncheckedAt(i), 100., 1.);
345 for (Int_t j = 0; j < 10; j++)
347 ((TH1F*) fChamberEffHistList->UncheckedAt(j))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(j),
348 (TH1F*) fChamberTTHistList->UncheckedAt(j), 100., 1.);
352 ((TH2F*) fDetEltEffHistList->UncheckedAt(156))-> Divide( (TH2F*) fDetEltTDHistList->UncheckedAt(156),
353 (TH2F*) fDetEltTTHistList->UncheckedAt(156), 100., 1.);
356 ((TH2F*) fDetEltEffHistList->UncheckedAt(157))-> Add ( (TH2F*) fDetEltTTHistList ->UncheckedAt(156),
357 (TH2F*) fDetEltEffHistList->UncheckedAt(157), 1., 0.);
360 ((TH2F*) fDetEltEffHistList->UncheckedAt(158))-> Fill(0., 0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
363 ((TH1F*) fChamberEffHistList->UncheckedAt(10))-> Divide( (TH1F*) fChamberTDHistList->UncheckedAt(10),
364 (TH1F*) fChamberTTHistList->UncheckedAt(10), 100., 1.);
367 ((TH1F*) fChamberEffHistList->UncheckedAt(11))-> Add ( (TH1F*) fChamberTTHistList ->UncheckedAt(10),
368 (TH1F*) fChamberEffHistList->UncheckedAt(11), 1., 0.);
371 ((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fChamberEff -> GetNbrUsableTracks()));
372 fChamberEff->SetNbrUsableTracks(0);
373 //((TH1F*) fChamberEffHistList->UncheckedAt(12))-> Fill(0., ((Double_t)fESD -> GetNumberOfMuonTracks()));
377 //Post the output data:
378 PostData(0, fDetEltTDHistList);
379 PostData(1, fDetEltTTHistList);
380 PostData(2, fDetEltEffHistList);
381 PostData(3, fChamberTDHistList);
382 PostData(4, fChamberTTHistList);
383 PostData(5, fChamberEffHistList);
388 //________________________________________________________________________
389 void AliAnalysisTaskMuonTrackingEff::Terminate(Option_t */*option*/)
396 //________________________________________________________________________
397 void AliAnalysisTaskMuonTrackingEff::ComputeErrors()
399 // Compute error on the efficiency
401 // error = max {1/Ntt, sqrt(eff*(1-eff)/Ntt)}
403 for (Int_t ii = 0; ii <= 10; ii++)
405 Int_t NumberOfBins = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetNbinsX();
406 for (Int_t jj = 1; jj <= NumberOfBins; jj++)
408 Double_t Ntd = ((TH1F*) fChamberTDHistList->UncheckedAt(ii))->GetBinContent(jj);
409 Double_t Ntt = ((TH1F*) fChamberTTHistList->UncheckedAt(ii))->GetBinContent(jj);
411 if (Ntt > 0.0 && Ntd > 0.0)
413 Double_t eff = ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->GetBinContent(jj)/100.0;
414 Double_t err1 = 1.0/Ntt;
415 Double_t err2 = TMath::Sqrt(eff*(1.0 - eff)/Ntt);
416 Double_t error = TMath::Max(err1, err2);
418 ((TH1F*) fChamberEffHistList->UncheckedAt(ii))->SetBinError(jj, error*100.0);