2 Bool_t kPrint = kFALSE;
3 Bool_t kSimulation = kFALSE;
4 Bool_t kUseKinematics = kFALSE;
5 Bool_t kOutputAOD = kFALSE;
6 Bool_t kEventSelection= kFALSE;
7 Bool_t kExotic = kTRUE;
8 Bool_t kNonLinearity = kFALSE;
10 TString kCollisions = "pp";
11 TString kTrig = "EMC7" ;
12 TString kClusterArray = "";
13 TString kData = ""; // MC or deltaAOD
14 TString kInputDataType = "ESD";
15 TString kCalorimeter = "EMCAL";
17 Bool_t kRecalTM = kTRUE;
23 Bool_t kHadronAN = kFALSE;
24 Bool_t kCalibE = kTRUE;
25 Bool_t kCalibT = kTRUE;
26 Bool_t kBadMap = kTRUE;
27 Bool_t kTender = kFALSE;
29 Int_t kRunNumber = -1;
31 AliAnalysisTaskCaloTrackCorrelation *AddTaskCaloTrackCorr(const TString data = "",
32 const TString calorimeter = "EMCAL",
33 const Bool_t simulation = kFALSE,
34 const Bool_t eventsel = kFALSE,
35 const Bool_t exotic = kTRUE,
36 const Bool_t nonlin = kFALSE,
37 TString outputfile = "",
38 const Int_t year = 2010,
39 const TString col = "pp",
40 const TString trigger = "MB",
41 const TString clustersArray = "V1",
42 const Bool_t mix = kTRUE,
43 const Bool_t recaltm = kTRUE,
44 const Bool_t tm = kTRUE,
45 const Int_t minCen = -1,
46 const Int_t maxCen = -1,
47 const Bool_t qaan = kFALSE,
48 const Bool_t hadronan = kFALSE,
49 const Bool_t calibE = kTRUE,
50 const Bool_t badmap = kTRUE,
51 const Bool_t calibT = kTRUE,
52 const Bool_t tender = kFALSE,
53 const Bool_t outputAOD = kFALSE,
54 const Bool_t printSettings = kFALSE,
55 const Double_t scaleFactor = -1,
56 const Int_t runNumber = -1
59 // Creates a CaloTrackCorr task, configures it and adds it to the analysis manager.
61 kPrint = printSettings;
62 kSimulation = simulation;
66 kNonLinearity = nonlin;
68 kClusterArray = clustersArray;
70 kCalorimeter = calorimeter;
71 kOutputAOD = outputAOD;
76 kEventSelection= eventsel;
84 kRunNumber = runNumber;
86 // Get the pointer to the existing analysis manager via the static access method.
88 AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
91 ::Error("AddTask", "No analysis manager to connect to.");
95 // Check the analysis type using the event handlers connected to the analysis manager.
97 if (!mgr->GetInputEventHandler())
99 ::Error("AddTask", "This task requires an input event handler");
103 // Make sure the B field is enabled for track selection, some cuts need it
104 ((AliInputEventHandler*)mgr->GetInputEventHandler())->SetNeedField(kTRUE);
106 kInputDataType = "AOD";
107 if(!kData.Contains("delta"))
108 kInputDataType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
112 kUseKinematics = (mgr->GetMCtruthEventHandler())?kTRUE:kFALSE;
113 if (!kUseKinematics && data=="AOD" && kInputDataType != "ESD") kUseKinematics = kTRUE; //AOD primary should be available ...
116 cout<<"********* ACCESS KINE? "<<kUseKinematics<<endl;
118 // Name for containers
120 kName = Form("%s_Trig%s_Cl%s_TM%d",kCalorimeter.Data(), kTrig.Data(),kClusterArray.Data(),kTM);
122 if(kCollisions=="PbPb" && kMaxCen>=0) kName+=Form("Cen%d_%d",kMinCen,kMaxCen);
124 printf("<<<< NAME: %s >>>>>\n",kName.Data());
126 // #### Configure analysis ####
128 AliAnaCaloTrackCorrMaker * maker = new AliAnaCaloTrackCorrMaker();
130 maker->SetScaleFactor(scaleFactor); // for MC, negative (not scaled) by default
132 // General frame setting and configuration
133 maker->SetReader (ConfigureReader() );
134 maker->SetCaloUtils(ConfigureCaloUtils());
136 // Analysis tasks setting and configuration
137 Int_t n = 0;//Analysis number, order is important
139 // Isolation settings
140 Int_t partInCone = AliIsolationCut::kNeutralAndCharged; // kOnlyCharged;
141 Int_t thresType = AliIsolationCut::kPtThresIC;// AliIsolationCut::kSumPtFracIC ;
147 maker->AddAnalysis(ConfigurePhotonAnalysis(), n++); // Photon cluster selection
149 // Invariant mass analysis Put here to tag selected photons as decay
150 maker->AddAnalysis(ConfigurePi0EbEAnalysis("Pi0", AliAnaPi0EbE::kIMCalo), n++); // Pi0 event by event selection, invariant mass and photon tagging from decay
151 maker->AddAnalysis(ConfigurePi0EbEAnalysis("Eta", AliAnaPi0EbE::kIMCalo), n++); // Eta event by event selection, invariant mass and photon tagging from decay
154 maker->AddAnalysis(ConfigureIsolationAnalysis("Photon", partInCone,thresType,cone, pth), n++); // Photon isolation
155 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Photon",kFALSE), n++); // Gamma hadron correlation
156 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Photon",kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated gamma hadron correlation
157 //maker->AddAnalysis(ConfigureIsolationAnalysis("Photon", partInCone,thresType,kTRUE), n++); // Photon multi isolation, leave it the last
160 // Split cluster analysis
161 if(kCalorimeter == "EMCAL")
163 maker->AddAnalysis(ConfigurePi0EbEAnalysis("Pi0", AliAnaPi0EbE::kSSCalo), n++); // Pi0 event by event selection, cluster splitting
164 maker->AddAnalysis(ConfigureIsolationAnalysis("Pi0SS", partInCone,thresType,cone, pth), n++); // Pi0 isolation, cluster splits
165 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0SS" ,kFALSE), n++); // Pi0 hadron correlation
166 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0SS" ,kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated pi0 hadron correlation
167 //maker->AddAnalysis(ConfigureIsolationAnalysis("Pi0SS", partInCone,thresType,kTRUE), n++); // Pi0 multi isolation, split cluster
168 maker->AddAnalysis(ConfigureInClusterIMAnalysis(kTRUE , kTRUE ), n++);
171 // Invariant mass analysis
172 maker->AddAnalysis(ConfigurePi0EbEAnalysis("Pi0SideBand", AliAnaPi0EbE::kIMCalo), n++); // Pi0 event by event selection, and photon tagging from decay
173 maker->AddAnalysis(ConfigureIsolationAnalysis("Pi0", partInCone,thresType,cone, pth), n++); // Pi0 isolation, invariant mass
174 maker->AddAnalysis(ConfigureIsolationAnalysis("Pi0SideBand", partInCone,thresType,cone, pth), n++); // Pi0 isolation, side band
175 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0" ,kFALSE), n++); // Pi0 hadron correlation
176 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0" ,kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated pi0 hadron correlation
177 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0SideBand" ,kFALSE), n++); // Pi0 hadron correlation
178 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Pi0SideBand" ,kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated pi0 hadron correlation
179 //maker->AddAnalysis(ConfigureIsolationAnalysis("Pi0", partInCone,thresType,kTRUE), n++); // Pi0 multi isolation, invariant mass, leave it the last
183 maker->AddAnalysis(ConfigureChargedAnalysis(), n++); // track selection
184 maker->AddAnalysis(ConfigureIsolationAnalysis("Hadron",AliIsolationCut::kOnlyCharged,thresType,cone, pth), n++); // track isolation
185 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Hadron",kFALSE), n++); // track-track correlation
186 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("Hadron",kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated track-track correlation
187 //maker->AddAnalysis(ConfigureIsolationAnalysis("Hadron",partInCone,thresType,kTRUE), n++);// Hadron multi isolation
190 // Analysis with ghost triggers, only for Min Bias like events
191 if( kTrig.Contains("INT") || kTrig.Contains("Central") || kTrig.Contains("MB") )
193 maker->AddAnalysis(ConfigureRandomTriggerAnalysis(), n++);
194 maker->AddAnalysis(ConfigureIsolationAnalysis(Form("RandomTrigger%s",kCalorimeter.Data()), partInCone,thresType,cone, pth), n++); // Ghost trigger isolation
195 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis(Form("RandomTrigger%s",kCalorimeter.Data()),kFALSE), n++); // Ghost trigger hadron correlation
196 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis(Form("RandomTrigger%s",kCalorimeter.Data()),kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated ghost hadron correlation
197 //maker->AddAnalysis(ConfigureIsolationAnalysis(Form("RandomTrigger%s",kCalorimeter.Data()), partInCone,thresType,kTRUE), n++); // Ghost multi isolation
201 maker->AddAnalysis(ConfigureRandomTriggerAnalysis("CTS"), n++); // track selection
202 maker->AddAnalysis(ConfigureIsolationAnalysis("RandomTriggerCTS",AliIsolationCut::kOnlyCharged,thresType,cone, pth), n++); // track isolation
203 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("RandomTriggerCTS",kFALSE), n++); // track-track correlation
204 maker->AddAnalysis(ConfigureHadronCorrelationAnalysis("RandomTriggerCTS",kTRUE,partInCone,thresType, cone, pth) , n++); // Isolated track-track correlation
205 //maker->AddAnalysis(ConfigureIsolationAnalysis("RandomTriggerCTS",AliIsolationCut::kOnlyCharged,thresType,kTRUE), n++); // Ghost multi isolation
209 if(kQA) maker->AddAnalysis(ConfigureQAAnalysis(),n++);
211 maker->SetAnaDebug(kDebug) ;
212 maker->SwitchOnHistogramsMaker() ;
213 if(kData.Contains("delta")) maker->SwitchOffAODsMaker() ;
214 else maker->SwitchOnAODsMaker() ;
216 if(kPrint) maker->Print("");
218 if(kSimulation) maker->SwitchOffDataControlHistograms();
220 printf("<< End Configuration of %d analysis for calorimeter %s >>\n",n, kCalorimeter.Data());
224 AliAnalysisTaskCaloTrackCorrelation * task = new AliAnalysisTaskCaloTrackCorrelation (Form("CaloTrackCorr%s",kName.Data()));
225 task->SetConfigFileName(""); //Don't configure the analysis via configuration file.
226 task->SetDebugLevel(kDebug);
227 task->SetBranches("ESD:AliESDRun.,AliESDHeader");
228 task->SetAnalysisMaker(maker);
233 if(outputfile.Length()==0) outputfile = AliAnalysisManager::GetCommonFileName();
235 AliAnalysisDataContainer *cout_pc = mgr->CreateContainer(kName, TList::Class(),
236 AliAnalysisManager::kOutputContainer,
237 Form("%s",outputfile.Data()));
239 AliAnalysisDataContainer *cout_cuts = mgr->CreateContainer(Form("Param_%s",kName.Data()), TList::Class(),
240 AliAnalysisManager::kParamContainer,
241 "AnalysisParameters.root");
243 // Create ONLY the output containers for the data produced by the task.
244 // Get and connect other common input/output containers via the manager as below
245 //==============================================================================
246 mgr->ConnectInput (task, 0, mgr->GetCommonInputContainer());
247 // AOD output slot will be used in a different way in future
248 if(!kData.Contains("delta") && outputAOD) mgr->ConnectOutput (task, 0, mgr->GetCommonOutputContainer());
249 mgr->ConnectOutput (task, 1, cout_pc);
250 mgr->ConnectOutput (task, 2, cout_cuts);
254 UInt_t mask = SetTriggerMaskFromName();
255 task->SelectCollisionCandidates(mask);
261 //____________________________________
262 AliCaloTrackReader * ConfigureReader()
265 AliCaloTrackReader * reader = 0;
266 if (kInputDataType == "ESD"&& kData=="MC" )
267 reader = new AliCaloTrackMCReader();
268 else if(kInputDataType=="AOD" || kData.Contains("AOD"))
269 reader = new AliCaloTrackAODReader();
270 else if(kInputDataType=="ESD")
271 reader = new AliCaloTrackESDReader();
273 printf("AliCaloTrackReader::ConfigureReader() - Data combination not known kData=%s, kInputData=%s\n",kData.Data(),kInputDataType.Data());
275 reader->SetDebug(kDebug);//10 for lots of messages
280 // Event rejection cuts for jet-jet simulations
281 reader->SetPtHardAndJetPtComparison(kTRUE);
282 reader->SetPtHardAndJetPtFactor(4);
284 reader->SetPtHardAndClusterPtComparison(kTRUE);
285 reader->SetPtHardAndClusterPtFactor(1.5);
290 //reader->SetDeltaAODFileName("");
291 if(kOutputAOD) reader->SwitchOnWriteDeltaAOD() ;
295 if(kInputDataType == "ESD"){
296 reader->SwitchOnStack();
297 reader->SwitchOffAODMCParticles();
299 else if(kInputDataType == "AOD"){
300 reader->SwitchOffStack();
301 reader->SwitchOnAODMCParticles();
305 //------------------------
306 // Detector input filling
307 //------------------------
309 //Min cluster/track E
310 reader->SetEMCALEMin(0.3);
311 reader->SetEMCALEMax(1000);
312 reader->SetPHOSEMin(0.3);
313 reader->SetPHOSEMax(1000);
314 reader->SetCTSPtMin(0.2);
315 reader->SetCTSPtMax(1000);
320 reader->SwitchOffUseTrackTimeCut();
321 reader->SwitchOffUseParametrizedTimeCut();
322 reader->SwitchOffUseEMCALTimeCut();
323 reader->SetEMCALTimeCut(-1e10,1e10); // Open time cut
329 printf("Set time cut parameters for run %d\n",kRunNumber);
330 reader->SwitchOnUseEMCALTimeCut();
331 reader->SwitchOnUseParametrizedTimeCut();
334 reader->SetEMCALTimeCut(-25,20);
337 if (kRunNumber >= 151636 && kRunNumber <= 155384 )
339 printf("Set time parameters for LHC11c");
340 reader->SetEMCALParametrizedMinTimeCut(0,-5 ); reader->SetEMCALParametrizedMinTimeCut(1,-1 ); reader->SetEMCALParametrizedMinTimeCut(2, 1.87); reader->SetEMCALParametrizedMinTimeCut(3, 0.4);
341 reader->SetEMCALParametrizedMaxTimeCut(0, 3.5); reader->SetEMCALParametrizedMaxTimeCut(1, 50); reader->SetEMCALParametrizedMaxTimeCut(2, 0.15); reader->SetEMCALParametrizedMaxTimeCut(3, 1.6);
343 else if(kRunNumber >= 156447 && kRunNumber <= 159635 )
345 printf("Set time parameters for LHC11d");
346 reader->SetEMCALParametrizedMinTimeCut(0,-5); reader->SetEMCALParametrizedMinTimeCut(1,-1 ); reader->SetEMCALParametrizedMinTimeCut(2, 3.5 ); reader->SetEMCALParametrizedMinTimeCut(3, 1. );
347 reader->SetEMCALParametrizedMaxTimeCut(0, 5); reader->SetEMCALParametrizedMaxTimeCut(1, 50); reader->SetEMCALParametrizedMaxTimeCut(2, 0.45); reader->SetEMCALParametrizedMaxTimeCut(3, 1.25);
351 reader->SwitchOffUseParametrizedTimeCut();
356 reader->SwitchOffUseParametrizedTimeCut();
357 reader->SwitchOffUseEMCALTimeCut();
358 reader->SetEMCALTimeCut(-1e10,1e10); // Open time cut
362 reader->SwitchOnFiducialCut();
363 reader->GetFiducialCut()->SetSimpleCTSFiducialCut(0.8, 0, 360) ;
366 reader->SwitchOnCTS();
367 reader->SwitchOffRejectNoTrackEvents();
369 reader->SwitchOffRecalculateVertexBC();
370 reader->SwitchOffVertexBCEventSelection();
372 reader->SwitchOffUseTrackTimeCut();
373 reader->SetTrackTimeCut(0,50);
375 reader->SwitchOffUseTrackDCACut();
376 //reader->SetTrackDCACut(0,0.0105);
377 //reader->SetTrackDCACut(1,0.035);
378 //reader->SetTrackDCACut(2,1.1);
380 if(kInputDataType=="ESD")
382 gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/CreateTrackCutsPWGJE.C");
383 //AliESDtrackCuts * esdTrackCuts = CreateTrackCutsPWGJE(10041004);
384 //reader->SetTrackCuts(esdTrackCuts);
385 //reader->SwitchOnConstrainTrackToVertex();
390 AliESDtrackCuts * esdTrackCuts = CreateTrackCutsPWGJE(10001008);
391 reader->SetTrackCuts(esdTrackCuts);
392 AliESDtrackCuts * esdTrackCuts2 = CreateTrackCutsPWGJE(10011008);
393 reader->SetTrackComplementaryCuts(esdTrackCuts2);
398 AliESDtrackCuts * esdTrackCuts = CreateTrackCutsPWGJE(10001006);
399 reader->SetTrackCuts(esdTrackCuts);
400 AliESDtrackCuts * esdTrackCuts2 = CreateTrackCutsPWGJE(10041006);
401 reader->SetTrackComplementaryCuts(esdTrackCuts2);
404 else if(kInputDataType=="AOD")
406 //reader->SetTrackFilterMask(128); // Filter bit, not mask, use if off hybrid
407 reader->SwitchOnAODHybridTrackSelection(); // Check that the AODs have Hybrids!!!!
408 reader->SetTrackStatus(AliVTrack::kITSrefit);
409 //reader->SwitchOnTrackHitSPDSelection(); // Check that the track has at least a hit on the SPD, not much sense to use for hybrid or TPC only tracks
414 reader->SetEMCALClusterListName(kClusterArray);
415 if(kClusterArray == "" && !kTender)
417 printf("**************** Standard EMCAL clusters branch analysis **************** \n");
418 reader->SwitchOnClusterRecalculation();
419 // Check in ConfigureCaloUtils that the recalibration and bad map are ON
423 printf("**************** Input for analysis is Clusterizer %s **************** \n", kClusterArray.Data());
424 reader->SwitchOffClusterRecalculation();
427 if(!kNonLinearity) reader->SwitchOffClusterELinearityCorrection();
429 //if(kCalorimeter == "EMCAL") {
430 reader->SwitchOnEMCALCells();
431 reader->SwitchOnEMCAL();
433 //if(kCalorimeter == "PHOS") {
434 reader->SwitchOnPHOSCells();
435 reader->SwitchOnPHOS();
438 // for case data="deltaAOD", no need to fill the EMCAL/PHOS cluster lists
439 if(kData.Contains("delta"))
441 reader->SwitchOffEMCAL();
442 reader->SwitchOffPHOS();
443 reader->SwitchOffEMCALCells();
444 reader->SwitchOffPHOSCells();
451 //reader->RejectFastClusterEvents() ;
453 // Event triggered selection settings
454 reader->SwitchOnTriggerPatchMatching();
455 reader->SwitchOnBadTriggerEventsRemoval(); // only if SwitchOnTriggerPatchMatching();
456 reader->SwitchOnUnMatchedTriggerEventsRemoval(); // only if SwitchOnBadTriggerEventsRemoval();
457 //reader->SwitchOffTriggerClusterTimeRecal() ;
459 reader->SetTriggerPatchTimeWindow(8,9); // L0
460 if (kRunNumber < 146861) reader->SetEventTriggerL0Threshold(3.);
461 else if(kRunNumber < 154000) reader->SetEventTriggerL0Threshold(4.);
462 else if(kRunNumber < 165000) reader->SetEventTriggerL0Threshold(5.5);
464 //redefine for other periods, triggers
466 //if(!kUseKinematics) reader->SetFiredTriggerClassName("CEMC7EGA-B-NOPF-CENTNOTRD"); // L1 Gamma
468 // For mixing with AliAnaParticleHadronCorrelation switch it off
471 reader->SwitchOffEventTriggerAtSE();
472 UInt_t mask = SetTriggerMaskFromName();
473 reader->SetEventTriggerMask(mask); // Only for mixing and SwitchOffEventTriggerAtSE();
474 //reader->SetMixEventTriggerMask(AliVEvent::kMB); // Careful, not all productions work with kMB, try kINT7, kINT1, kAnyINT
475 reader->SetMixEventTriggerMask(AliVEvent::kAnyINT); // Careful, not all productions work with kMB, try kINT7, kINT1, kAnyINT
477 printf("---Trigger selection done in AliCaloTrackReader!!!\n");
480 reader->SwitchOnEventTriggerAtSE();
482 reader->SetZvertexCut(10.); // Open cut
483 reader->SwitchOnPrimaryVertexSelection(); // and besides primary vertex
487 reader->SwitchOnEventPileUpRejection(); // remove pileup by default
488 reader->SwitchOnV0ANDSelection() ; // and besides v0 AND
492 reader->SwitchOffPileUpEventRejection();// remove pileup by default
493 reader->SwitchOffV0ANDSelection() ; // and besides v0 AND
496 if(kCollisions=="PbPb")
499 reader->SetCentralityClass("V0M");
500 reader->SetCentralityOpt(100); // 10 (c= 0-10, 10-20 ...), 20 (c= 0-5, 5-10 ...) or 100 (c= 1, 2, 3 ..)
501 reader->SetCentralityBin(kMinCen,kMaxCen); // Accept all events, if not select range
503 // Event plane (only used in Maker and mixing for AliAnaPi0/AliAnaHadronCorrelation for the moment)
504 reader->SetEventPlaneMethod("V0");
507 if(kPrint) reader->Print("");
513 //_______________________________________
514 AliCalorimeterUtils* ConfigureCaloUtils()
517 AliCalorimeterUtils *cu = new AliCalorimeterUtils;
518 cu->SetDebug(kDebug);
520 // Remove clusters close to borders, at least max energy cell is 1 cell away
521 cu->SetNumberOfCellsFromEMCALBorder(1);
522 cu->SetNumberOfCellsFromPHOSBorder(2);
524 // Search of local maxima in cluster
525 if(kCollisions=="pp")
527 cu->SetLocalMaximaCutE(0.1);
528 cu->SetLocalMaximaCutEDiff(0.03);
529 if(kName.Contains("150"))
531 printf("Reclusterize with 150 threshold, set PbPb settings\n");
532 cu->SetLocalMaximaCutE(0.2);
533 cu->SetLocalMaximaCutEDiff(0.03);
538 cu->SetLocalMaximaCutE(0.2);
539 cu->SetLocalMaximaCutEDiff(0.03);
542 cu->SwitchOffClusterPlot();
544 if(kRecalTM) cu->SwitchOnRecalculateClusterTrackMatching(); // Done in clusterization
545 else cu->SwitchOffRecalculateClusterTrackMatching();
547 cu->SwitchOnBadChannelsRemoval() ;
552 cu->SwitchOnLoadOwnEMCALGeometryMatrices();
554 AliEMCALRecoUtils * recou = cu->GetEMCALRecoUtils();
558 cu->SwitchOnRecalibration(); // Check the reader if it is taken into account during filtering
559 if(kClusterArray == "" && !kTender) cu->SwitchOnRunDepCorrection();
562 gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/ConfigureEMCALRecoUtils.C");
563 ConfigureEMCALRecoUtils(recou,
566 kTRUE,//kNonLinearity,
570 //recou->SetExoticCellDiffTimeCut(50.);
575 printf("ConfigureCaloUtils() - Apply non linearity to EMCAL\n");
576 cu->SwitchOnCorrectClusterLinearity();
579 printf("ConfigureCaloUtils() - EMCAL Recalibration ON? %d %d\n",recou->IsRecalibrationOn(), cu->IsRecalibrationOn());
580 printf("ConfigureCaloUtils() - EMCAL BadMap ON? %d %d\n",recou->IsBadChannelsRemovalSwitchedOn(), cu->IsBadChannelsRemovalSwitchedOn());
583 if(kCalorimeter=="PHOS")
585 if (kYears < 2014) cu->SetNumberOfSuperModulesUsed(3);
586 else cu->SetNumberOfSuperModulesUsed(4);
590 if (kYears == 2010) cu->SetNumberOfSuperModulesUsed(4); //EMCAL first year
591 else if (kYears < 2014) cu->SetNumberOfSuperModulesUsed(10);
592 else cu->SetNumberOfSuperModulesUsed(20);
596 cu->SwitchOffLoadOwnPHOSGeometryMatrices();
598 if(kPrint) cu->Print("");
604 //_____________________________________
605 AliAnaPhoton* ConfigurePhotonAnalysis()
608 AliAnaPhoton *ana = new AliAnaPhoton();
609 ana->SetDebug(kDebug); //10 for lots of messages
611 // cluster selection cuts
613 ana->SwitchOffFiducialCut();
615 ana->SetCalorimeter(kCalorimeter);
617 if(kCalorimeter == "PHOS")
619 ana->SetNCellCut(2);// At least 3 cells
621 ana->SetMinDistanceToBadChannel(2, 4, 5);
622 ana->SetTimeCut(-1e10,1e10); // open cut
626 ana->SetNCellCut(1);// At least 2 cells
627 ana->SetMinEnergy(0.3); // avoid mip peak at E = 260 MeV
628 ana->SetMaxEnergy(1000);
629 ana->SetTimeCut(-1e10,1e10); // open cut, usual time window of [425-825] ns if time recalibration is off
630 // restrict to less than 100 ns when time calibration is on
631 ana->SetMinDistanceToBadChannel(2, 4, 6);
633 // NLM cut, used in all, exclude clusters with more than 2 maxima
634 // Not needed if M02 cut is already strong or clusterizer V2
635 ana->SetNLMCut(1, 2) ;
640 ana->SwitchOnTrackMatchRejection() ;
641 ana->SwitchOffTMHistoFill() ;
645 ana->SwitchOffTrackMatchRejection() ;
646 ana->SwitchOnTMHistoFill() ;
649 //PID cuts (shower shape)
650 ana->SwitchOnCaloPID(); // do PID selection, unless specified in GetCaloPID, selection not based on bayesian
651 AliCaloPID* caloPID = ana->GetCaloPID();
652 //Not used in bayesian
655 caloPID->SetEMCALLambda0CutMax(0.27);
656 caloPID->SetEMCALLambda0CutMin(0.10);
658 caloPID->SetEMCALDEtaCut(0.025);
659 caloPID->SetEMCALDPhiCut(0.030);
662 caloPID->SetPHOSDispersionCut(2.5);
663 caloPID->SetPHOSRCut(2.);
664 if(kInputData=="AOD") caloPID->SetPHOSRCut(2000.); // Open cut since dX, dZ not stored
666 ana->SwitchOffFillShowerShapeHistograms(); // Filled before photon shower shape selection
667 if(!kSimulation)ana->SwitchOnFillPileUpHistograms();
668 //if(!kSimulation) ana->SwitchOnFillEMCALBCHistograms();
670 // Input / output delta AOD settings
672 if(!kData.Contains("delta"))
674 ana->SetOutputAODName(Form("Photon%s",kName.Data()));
675 ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
676 //ana->SetOutputAODClassName("AliAODPWG4Particle"); // use if no correlation done
678 else ana->SetInputAODName(Form("Photon%s",kName.Data()));
680 //Set Histograms name tag, bins and ranges
682 ana->AddToHistogramsName(Form("AnaPhoton_TM%d_",kTM));
683 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
685 // Number of particle type MC histograms
686 ana->FillNOriginHistograms(20);
687 ana->FillNPrimaryHistograms(20);
689 ana->SwitchOnRealCaloAcceptance(); // primary particle acceptance histograms
692 if(kPrint) ana->Print("");
698 //________________________________________________________________
699 AliAnaEMCALTriggerClusters* ConfigureEMCALTriggerClusterAnalysis()
701 // For filling all histograms meaninfully, in the reader, time cut must be off
702 // and bad triggered events not rejected, and of course analyze triggered events.
704 AliAnaEMCALTriggerClusters *ana = new AliAnaEMCALTriggerClusters();
705 ana->SetDebug(kDebug); //10 for lots of messages
707 // cluster selection cuts
709 ana->SwitchOffFiducialCut();
710 ana->SetNCellCut(1);// At least 2 cells
711 ana->SetMinEnergy(0.3); // avoid mip peak at E = 260 MeV
712 ana->SetMaxEnergy(1000);
714 ana->SwitchOnTrackMatchRejection() ;
716 ana->AddToHistogramsName("EMCTriggerClusters_");
717 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
719 if(kPrint) ana->Print("");
725 //___________________________________________________
726 AliAnaClusterPileUp* ConfigureClusterPileUpAnalysis()
728 // For filling all histograms meaninfully, in the reader, time cut must be off
729 // and bad triggered events in different BC not rejected
731 AliAnaClusterPileUp *ana = new AliAnaClusterPileUp();
732 ana->SetDebug(kDebug); //10 for lots of messages
734 // cluster selection cuts
736 ana->SwitchOffFiducialCut();
737 ana->SetNCellCut(1);// At least 2 cells
738 ana->SetMinEnergy(0.3); // avoid mip peak at E = 260 MeV
739 ana->SetMaxEnergy(1000);
741 ana->AddToHistogramsName("ClusterPileUp_");
742 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
744 if(kPrint) ana->Print("");
750 //________________________________________________________________________________
751 AliAnaElectron* ConfigureElectronAnalysis()
754 AliAnaElectron *ana = new AliAnaElectron();
755 ana->SetDebug(kDebug); //10 for lots of messages
757 if(kCalorimeter == "PHOS")
759 ana->SetNCellCut(2);// At least 2 cells
761 ana->SetMinDistanceToBadChannel(2, 4, 5);
765 ana->SetNCellCut(1);// At least 2 cells
766 ana->SetMinPt(0.5); // no effect minium EMCAL cut.
768 //ana->SetTimeCut(400,900);// Time window of [400-900] ns
769 ana->SetMinDistanceToBadChannel(2, 4, 6);
772 //Electron selection cuts with tracks
773 ana->SetEOverP(0.85, 1.2);
775 // TO DO, find a more suitable way to set this
776 if (kRunNumber < 146861) ana->SetdEdxCut(72, 90);
777 else if(kRunNumber < 154000) ana->SetdEdxCut(54, 70);
778 else ana->SetdEdxCut(74, 90);
780 if(kSimulation) ana->SetdEdxCut(80, 100);
782 ana->SetCalorimeter(kCalorimeter);
784 ana->SwitchOnCaloPID();
786 AliCaloPID* caloPID = ana->GetCaloPID();
788 caloPID->SetEMCALLambda0CutMax(0.27);
789 caloPID->SetEMCALLambda0CutMin(0.10);
791 ana->SwitchOffFillShowerShapeHistograms();
792 ana->SwitchOffFillWeightHistograms() ;
793 ana->SwitchOffFiducialCut();
795 //ana->FillAODWithHadrons();
797 if(!kData.Contains("delta"))
799 ana->SetOutputAODName(Form("Electron%s",kName.Data()));
800 ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
802 else ana->SetInputAODName(Form("Electron%s",kName.Data()));
804 //Set Histograms name tag, bins and ranges
806 ana->AddToHistogramsName(Form("AnaElectron_TM%d_",kTM));
807 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
811 if(kPrint) ana->Print("");
817 //__________________________________________________________________________________________
818 AliAnaRandomTrigger* ConfigureRandomTriggerAnalysis(TString detector = "")
821 AliAnaRandomTrigger *ana = new AliAnaRandomTrigger();
822 ana->SetDebug(kDebug); //10 for lots of messages
824 if(detector=="") detector = kCalorimeter;
825 ana->SetDetector(detector);
831 if (detector=="EMCAL")
833 ana->SetEtaCut(-0.71,0.71);
834 ana->SetPhiCut(100*TMath::DegToRad(), 160*TMath::DegToRad());
836 else if(detector=="PHOS")
838 ana->SetEtaCut(-0.13,0.13);
839 ana->SetPhiCut(260*TMath::DegToRad(), 320*TMath::DegToRad());
841 else if(detector=="CTS")
843 ana->SetEtaCut(-0.9,0.9);
844 ana->SetPhiCut(0, TMath::TwoPi());
848 if(!kData.Contains("delta"))
850 ana->SetOutputAODName(Form("RandomTrigger%s%s",detector.Data(),kName.Data()));
851 ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
854 ana->SetInputAODName(Form("RandomTrigger%s%s",detector.Data(),kName.Data()));
856 printf("Set RandomTrigger%s%s\n",detector.Data(),kName.Data());
858 //Set Histograms name tag, bins and ranges
860 ana->AddToHistogramsName(Form("AnaRandomTrigger%s_",detector.Data()));
862 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
866 ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
867 ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
870 if(kPrint) ana->Print("");
876 //__________________________________________________________________________________________
877 AliAnaInsideClusterInvariantMass* ConfigureInClusterIMAnalysis(Bool_t useSS = kTRUE, Bool_t useAsy = kFALSE)
879 AliAnaInsideClusterInvariantMass *ana = new AliAnaInsideClusterInvariantMass();
880 ana->SetDebug(kDebug); //10 for lots of messages
884 ana->SetMinEnergy(6);
885 ana->SetMaxEnergy(200.);
886 ana->SetMinNCells(6); // check same as in calopid
888 ana->SetCalorimeter(kCalorimeter);
889 ana->SwitchOnSplitClusterDistToBad();
891 ana->SwitchOffFillSSWeightHistograms() ;
892 ana->SetNWeightForShowerShape(0);
893 //ana->SetWeightForShowerShape(0, 4.6);
895 ana->SwitchOnFillNCellHistograms();
896 ana->SwitchOffFillEbinHistograms();
897 if(!useSS && !useAsy) ana->SwitchOnFillEbinHistograms();
901 ana->SwitchOnFillTMHistograms();
902 ana->SwitchOnFillTMResidualHistograms();
906 ana->SwitchOffFillTMHistograms();
907 ana->SwitchOffFillTMResidualHistograms();
910 //printf("Set correction slope for SS weight \n");
911 //ana->SetWCorrectionParameter(0.07);
912 //ana->SetNECellCutForShowerShape(0);
913 //ana->SetECellCutForShowerShape(0, 0.07);
914 //ana->SetECellCutForShowerShape(1, 0.1);
915 //ana->SetECellCutForShowerShape(2, 0.2);
919 ana->SwitchOnFillMCPrimaryHistograms() ;
920 ana->SwitchOffFillMCOverlapHistograms() ; // Off when possible
921 if(!useSS && !useAsy) ana->SwitchOnFillMCOverlapHistograms() ;
924 AliCaloPID* caloPID = ana->GetCaloPID();
925 caloPID->SetEMCALDEtaCut(0.025);
926 caloPID->SetEMCALDPhiCut(0.030);
927 caloPID->SetClusterSplittingM02Cut(0,100000); // use parametrized cut, not fixed
929 caloPID->SetPi0MassRange(0.11, 0.18);
930 caloPID->SetEtaMassRange(0.40, 0.60);
931 caloPID->SetPhotonMassRange(0.00, 0.08);
933 caloPID->SetSplitWidthSigma(3.); // cut at 3 sigma of the mean pi0 peak.
935 caloPID->SetClusterSplittingMinNCells(6);
937 if(kCollisions=="PbPb" || kName.Contains("150"))
939 caloPID->SetClusterSplittingMinNCells(4);
940 ana->SetMinNCells(4);
941 caloPID->SetPi0MassShiftHighECell(0.005);
942 if(kCollisions=="PbPb") ana->SwitchOnFillHighMultHistograms();
945 ana->AddToHistogramsName("AnaInClusterIM_");
949 caloPID->SwitchOnSplitAsymmetryCut() ;
953 printf("InClusterIM: Do not apply Asy cut on merged pi0 in cluster analysis \n");
954 caloPID->SwitchOffSplitAsymmetryCut() ;
955 ana->AddToHistogramsName("AnaInClusterIM_OpenAsy_");
960 printf("InClusterIM: Do not apply SS cut on merged pi0 in cluster analysis \n");
961 caloPID->SwitchOffSplitShowerShapeCut() ;
962 ana->AddToHistogramsName("AnaInClusterIM_OpenSS_");
964 else caloPID->SwitchOnSplitShowerShapeCut() ;
966 if(!useAsy && !useSS)
968 printf("InClusterIM: Do not apply SS and Asy cut on merged pi0 in cluster analysis \n");
969 ana->AddToHistogramsName("AnaInClusterIM_OpenSS_OpenAsy_");
972 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
976 if(kPrint) ana->Print("");
982 //_______________________________________________
983 AliAnaChargedParticles* ConfigureChargedAnalysis()
986 AliAnaChargedParticles *ana = new AliAnaChargedParticles();
987 ana->SetDebug(kDebug); //10 for lots of messages
992 ana->SwitchOnFiducialCut();
993 ana->GetFiducialCut()->SetSimpleCTSFiducialCut(0.8, 0, 360) ; //more restrictive cut in reader and after in isolation
995 ana->SwitchOnFillVertexBC0Histograms() ;
996 if(!kSimulation) ana->SwitchOnFillPileUpHistograms();
998 // Input / output delta AOD settings
1000 if(!kData.Contains("delta"))
1002 ana->SetOutputAODName(Form("Hadron%s",kName.Data()));
1003 ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
1004 //ana->SetOutputAODClassName("AliAODPWG4Particle"); // use if no correlation done
1007 ana->SetInputAODName(Form("Hadron%s",kName.Data()));
1008 printf("Set Hadron%s\n",kName.Data());
1010 //Set Histograms name tag, bins and ranges
1012 ana->AddToHistogramsName("AnaHadrons_");
1013 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
1015 ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
1016 ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
1020 if(kPrint) ana->Print("");
1027 //_____________________________________________________
1028 AliAnaPi0EbE* ConfigurePi0EbEAnalysis(TString particle,
1029 Int_t analysis, Bool_t useSS = kTRUE, Bool_t useAsy = kTRUE)
1032 AliAnaPi0EbE *ana = new AliAnaPi0EbE();
1033 ana->SetDebug(kDebug);//10 for lots of messages
1035 ana->SetAnalysisType(analysis);
1037 if(analysis == AliAnaPi0EbE::kIMCaloTracks) opt = "Conv";
1038 if(analysis == AliAnaPi0EbE::kSSCalo) opt = "SS";
1040 if(analysis == AliAnaPi0EbE::kIMCalo && kCalorimeter=="EMCAL" && !kSimulation) ana->SetPairTimeCut(100);
1041 if(analysis == AliAnaPi0EbE::kIMCaloTracks) ana->SetInputAODGammaConvName("PhotonsCTS");
1043 // Common settings for all 3 type of analysis
1045 ana->SwitchOnSelectedClusterHistoFill();
1047 ana->SetCalorimeter(kCalorimeter);
1049 //Set Histograms name tag, bins and ranges
1050 ana->AddToHistogramsName(Form("Ana%s%sEbE_TM%d_",particle.Data(),opt.Data(),kTM));
1052 // Specific settings for different type of analysis
1054 ana->SwitchOffFillWeightHistograms();
1055 if(!kSimulation) ana->SwitchOnFillPileUpHistograms();
1059 //printf("--->>>REMOVE MATCHED Pi0\n");
1060 ana->SwitchOnTrackMatchRejection() ;
1061 ana->SwitchOffTMHistoFill() ;
1065 //printf("---->>>ACCEPT MATCHED Pi0\n");
1066 ana->SwitchOffTrackMatchRejection() ;
1067 ana->SwitchOnTMHistoFill() ;
1070 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
1072 //ana->SwitchOnFillEMCALBCHistograms();
1074 if(kPrint) ana->Print("");
1078 if(!kInputDataType.Contains("delta"))
1080 ana->SetOutputAODName(Form("%s%s%s",particle.Data(), opt.Data(), kName.Data()));
1081 ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
1085 ana->SetInputAODName(Form("%s%s%s",particle.Data(),opt.Data(),kName.Data()));
1087 if(analysis!=AliAnaPi0EbE::kSSCalo)
1089 // Input / output delta AOD settings
1091 ana->SetInputAODName(Form("Photon%s",kName.Data()));
1093 AliNeutralMesonSelection *nms = ana->GetNeutralMesonSelection();
1094 nms->SetParticle(particle);
1096 // Tighten a bit mass cut with respect to default window
1097 if(particle=="Pi0") nms->SetInvMassCutRange(0.120,0.150);
1098 if(particle=="Eta") nms->SetInvMassCutRange(0.520,0.580);
1100 //if(!particle.Contains("SideBand")) nms->SwitchOnAngleSelection();
1101 //else nms->SwitchOnAngleSelection();
1103 nms->SwitchOffAngleSelection();
1104 if(particle.Contains("Pi0SideBand")) // For pi0, do not consider left band
1105 nms->SetSideBandCutRanges(-1,0,0.180,0.220);
1107 nms->KeepNeutralMesonSelectionHistos(kTRUE);
1108 //nms->SetAngleMaxParam(2,0.2);
1109 nms->SetHistoERangeAndNBins(0, 20, 80) ;
1110 //nms->SetHistoIMRangeAndNBins(0, 1, 400);
1113 { // cluster splitting settings
1114 ana->SetMinEnergy(6);
1115 ana->SetMaxEnergy(200.);
1117 ana->SetNLMMinEnergy(0, 10);
1118 ana->SetNLMMinEnergy(1, 6);
1119 ana->SetNLMMinEnergy(2, 6);
1121 ana->SetMinDistanceToBadChannel(2, 4, 6); // only use the first one
1122 ana->SwitchOnSplitClusterDistToBad();
1124 ana->SetTimeCut(-1e10,1e10); // Open time cut
1126 // NLM cut, used in all, exclude clusters with more than 2 maxima
1127 ana->SetNLMCut(1, 2) ;
1129 AliCaloPID* caloPID = ana->GetCaloPID();
1131 caloPID->SetSplitWidthSigma(3.); // cut at 3 sigma of the mean pi0 peak.
1135 printf("Do not apply SS cut on merged pi0 analysis \n");
1136 caloPID->SwitchOffSplitShowerShapeCut() ;
1137 ana->AddToHistogramsName(Form("Ana%s%sEbE_OpenSS_TM%d_",particle.Data(),opt.Data(),kTM));
1138 ana->SetOutputAODName(Form("%s%s%s_OpenSS",particle.Data(), opt.Data(), kName.Data()));
1139 caloPID->SetClusterSplittingM02Cut(0.1,10000);
1143 caloPID->SetClusterSplittingM02Cut(0.3,5); // Do the selection in the analysis class and not in the PID method to fill SS histograms
1144 caloPID->SwitchOnSplitShowerShapeCut() ;
1147 if(useAsy) caloPID->SwitchOnSplitAsymmetryCut() ;
1150 caloPID->SwitchOffSplitAsymmetryCut() ;
1153 ana->AddToHistogramsName(Form("Ana%s%sEbE_OpenSS_OpenAsy_TM%d_",particle.Data(),opt.Data(),kTM));
1154 ana->SetOutputAODName(Form("%s%s%s_OpenSS_OpenAsy",particle.Data(), opt.Data(), kName.Data()));
1158 ana->AddToHistogramsName(Form("Ana%s%sEbE_OpenAsy_TM%d_",particle.Data(),opt.Data(),kTM));
1159 ana->SetOutputAODName(Form("%s%s%s_OpenAsy",particle.Data(), opt.Data(), kName.Data()));
1163 //For Pi0 only if SwitchOnSimpleSplitMassCut()
1164 caloPID->SetPi0MassRange(0.10, 0.18);
1165 caloPID->SetEtaMassRange(0.40, 0.60);
1166 caloPID->SetPhotonMassRange(0.00, 0.08);
1168 caloPID->SetClusterSplittingMinNCells(6);
1170 //caloPID->SetSplitEnergyFractionMinimum(0, 0.95);
1171 //caloPID->SetSplitEnergyFractionMinimum(1, 0.95);
1172 //caloPID->SetSplitEnergyFractionMinimum(2, 0.8);
1174 if(kCollisions=="PbPb" || kName.Contains("150"))
1176 caloPID->SetClusterSplittingMinNCells(4);
1177 caloPID->SetPi0MassShiftHighECell(0.005);
1185 //____________________________________________________________________________________________________
1186 AliAnaParticleIsolation* ConfigureIsolationAnalysis(TString particle="Photon",
1187 Int_t partInCone = AliIsolationCut::kOnlyCharged,
1188 Int_t thresType = AliIsolationCut::kSumPtFracIC,
1191 Bool_t multi = kFALSE)
1194 AliAnaParticleIsolation *ana = new AliAnaParticleIsolation();
1195 //ana->SetDebug(kDebug);
1196 ana->SetDebug(kDebug);
1198 ana->SwitchOnFiducialCut();
1199 //Avoid borders of EMCal
1200 if(kCalorimeter=="EMCAL")
1201 ana->GetFiducialCut()->SetSimpleEMCALFiducialCut(0.6, 86, 174) ;
1203 // Same Eta as EMCal, cut in phi if EMCAL was triggering
1204 if(particle=="Hadron" || particle.Contains("CTS"))
1206 // if(kTrig.Contains("EMC"))
1207 // ana->GetFiducialCut()->SetSimpleCTSFiducialCut (0.6, 260, 360) ;
1209 ana->GetFiducialCut()->SetSimpleCTSFiducialCut (0.6, 0, 360) ;
1214 // Input / output delta AOD settings
1216 ana->SetInputAODName(Form("%s%s",particle.Data(),kName.Data()));
1217 ana->SetAODObjArrayName(Form("IC%s_%s",particle.Data(),kName.Data()));
1219 ana->SetCalorimeter(kCalorimeter);
1221 if(!kTM) ana->SwitchOnTMHistoFill();
1222 else ana->SwitchOffTMHistoFill();
1224 ana->SwitchOffSSHistoFill();
1225 if(!kSimulation) ana->SwitchOnFillPileUpHistograms();
1227 //Do settings for main isolation cut class
1228 AliIsolationCut * ic = ana->GetIsolationCut();
1229 ic->SetDebug(kDebug);
1231 if(cone >0 && pth > 0)
1233 ic->SetPtThreshold(pth);
1234 ic->SetConeSize(cone);
1238 if(kCollisions=="pp")
1240 ic->SetPtThreshold(0.5);
1241 ic->SetConeSize(0.4);
1243 if(kCollisions=="PbPb")
1245 ic->SetPtThreshold(3.);
1246 //ic->SetPtThreshold(1.);
1247 ic->SetConeSize(0.3);
1251 ic->SetPtFraction(0.1);
1252 ic->SetSumPtThreshold(1.0) ;
1253 ic->SetParticleTypeInCone(partInCone);
1254 ic->SetICMethod(thresType);
1256 //Do or not do isolation with previously produced AODs.
1257 //No effect if use of SwitchOnSeveralIsolation()
1258 ana->SwitchOffReIsolation();
1263 ic->SetConeSize(1.); // Take all for first iteration
1264 ic->SetPtThreshold(100);// Take all for first iteration
1265 ana->SwitchOnSeveralIsolation() ;
1266 ana->SetAODObjArrayName(Form("MultiIC%sTM%d",particle.Data(),kTM));
1269 ana->SetNPtThresFrac(4);
1270 ana->SetConeSizes(0,0.3); ana->SetConeSizes(1,0.4);
1271 ana->SetConeSizes(2,0.5); ana->SetConeSizes(3,0.6);
1272 ana->SetPtThresholds(0, 0.5); ana->SetPtThresholds(1, 1); ana->SetPtThresholds(2, 2);
1273 ana->SetPtFractions (0, 0.05) ; ana->SetPtFractions (1, 0.1); ana->SetPtFractions (2, 0.2) ; ana->SetPtFractions (3, 0.3) ;
1274 ana->SetSumPtThresholds(0, 1) ; ana->SetSumPtThresholds(1, 3) ; ana->SetSumPtThresholds(2, 5); ana->SetSumPtThresholds(3, 7) ;
1276 ana->SwitchOffTMHistoFill();
1277 ana->SwitchOffSSHistoFill();
1280 ana->SwitchOffSeveralIsolation() ;
1282 AliCaloPID* caloPID = ana->GetCaloPID();
1283 caloPID->SetEMCALDEtaCut(0.025);
1284 caloPID->SetEMCALDPhiCut(0.030);
1286 //Set Histograms name tag, bins and ranges
1288 if(!multi)ana->AddToHistogramsName(Form("AnaIsol%s_TM%d_",particle.Data(),kTM));
1289 else ana->AddToHistogramsName(Form("AnaMultiIsol%s_TM%d_",particle.Data(),kTM));
1291 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
1293 ana->SetHistoPtInConeRangeAndNBins(0, 50 , 250);
1294 ana->SetHistoPtSumRangeAndNBins (0, 100, 250);
1296 if(particle=="Hadron" || particle.Contains("CTS"))
1298 ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
1299 ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
1302 ana->SwitchOnRealCaloAcceptance(); // primary particle acceptance histograms
1305 if(kPrint) ic ->Print("");
1306 if(kPrint) ana->Print("");
1312 //___________________________________________________________________________________
1313 AliAnaParticleHadronCorrelation* ConfigureHadronCorrelationAnalysis(TString particle,
1315 Int_t partInCone = AliIsolationCut::kOnlyCharged,
1316 Int_t thresType = AliIsolationCut::kSumPtFracIC,
1321 AliAnaParticleHadronCorrelation *ana = new AliAnaParticleHadronCorrelation();
1322 ana->SetDebug(kDebug);
1324 ana->SetMinimumTriggerPt(5);
1325 ana->SetAssociatedPtRange(0.2,100);
1326 ana->SetDeltaPhiCutRange( TMath::Pi()/2,3*TMath::Pi()/2 ); //[90 deg, 270 deg]
1328 ana->SetNAssocPtBins(9);
1330 ana->SetAssocPtBinLimit(0, 0.2) ;
1331 ana->SetAssocPtBinLimit(1, 0.5) ;
1332 ana->SetAssocPtBinLimit(2, 1) ;
1333 ana->SetAssocPtBinLimit(3, 2) ;
1334 ana->SetAssocPtBinLimit(4, 3) ;
1335 ana->SetAssocPtBinLimit(5, 4) ;
1336 ana->SetAssocPtBinLimit(6, 6) ;
1337 ana->SetAssocPtBinLimit(7, 10) ;
1338 ana->SetAssocPtBinLimit(8, 30) ;
1339 ana->SetAssocPtBinLimit(9, 200) ;
1341 ana->SelectIsolated(bIsolated); // do correlation with isolated photons
1345 //Do settings for main isolation cut class
1346 AliIsolationCut * ic = ana->GetIsolationCut();
1347 ic->SetDebug(kDebug);
1349 if(cone >0 && pth > 0)
1351 ic->SetPtThreshold(pth);
1352 ic->SetConeSize(cone);
1356 if(kCollisions=="pp")
1358 ic->SetPtThreshold(0.5);
1359 ic->SetConeSize(0.4);
1361 if(kCollisions=="PbPb")
1363 ic->SetPtThreshold(3.);
1364 //ic->SetPtThreshold(1.);
1365 ic->SetConeSize(0.3);
1369 ic->SetPtFraction(0.1);
1370 ic->SetSumPtThreshold(1.0) ;
1371 ic->SetParticleTypeInCone(partInCone);
1372 ic->SetICMethod(thresType);
1376 ana->SwitchOnAbsoluteLeading(); // Select trigger leading particle of all the selected tracks
1377 ana->SwitchOffNearSideLeading(); // Select trigger leading particle of all the particles at +-90 degrees, default
1379 // Mixing with own pool
1382 ana->SwitchOnOwnMix();
1383 ana->SwitchOnFillNeutralInMixedEvent();
1386 ana->SwitchOffOwnMix();
1388 ana->SetNZvertBin(20);
1390 if(kCollisions=="pp")
1392 ana->SetNMaxEvMix(100);
1393 ana->SwitchOnTrackMultBins();
1394 ana->SetNCentrBin(9); // Fixed track mult values
1399 ana->SetNMaxEvMix(10);
1400 ana->SwitchOffTrackMultBins(); // centrality bins
1401 ana->SetNCentrBin(3);
1403 if(kName.Contains("60_90"))
1405 printf("*** Set mixing for peripheral\n");
1406 ana->SetNMaxEvMix(50);
1407 ana->SetNCentrBin(2);
1411 ana->SwitchOnFiducialCut();
1413 //Avoid borders of EMCal, same as for isolation
1414 if(kCalorimeter=="EMCAL")
1415 ana->GetFiducialCut()->SetSimpleEMCALFiducialCut(0.6, 86, 174) ;
1417 // Same Eta as EMCal, cut in phi if EMCAL was triggering
1418 if(particle=="Hadron" || particle.Contains("CTS"))
1420 //if(kTrig.Contains("EMC"))
1421 // ana->GetFiducialCut()->SetSimpleCTSFiducialCut (0.6, 260, 360) ;
1423 ana->GetFiducialCut()->SetSimpleCTSFiducialCut (0.6, 0, 360) ;
1426 // Input / output delta AOD settings
1428 ana->SetInputAODName(Form("%s%s",particle.Data(),kName.Data()));
1429 ana->SetAODObjArrayName(Form("%sHadronCorrIso%d_%s",particle.Data(),bIsolated,kName.Data()));
1431 // Fill extra plots on tagged decay photons
1432 // If trigger is pi0/eta found with invariant mass, get the decays
1433 // If trigger is photon, check if it was tagged as decay previously
1434 if(particle!="Hadron" )
1436 if(particle.Contains("Pi0") || particle.Contains("Eta"))
1438 ana->SwitchOffPi0TriggerDecayCorr();
1439 ana->SwitchOffDecayTriggerDecayCorr();
1443 ana->SwitchOffPi0TriggerDecayCorr();
1444 ana->SwitchOnDecayTriggerDecayCorr(); // Make sure pi0 decay tagging runs before this task
1449 ana->SwitchOffPi0TriggerDecayCorr();
1450 ana->SwitchOffDecayTriggerDecayCorr();
1453 if(particle=="Photon")
1455 printf("**** SET M02 limits *** \n");
1456 ana->SetM02Cut(0.1,0.27);
1459 // if triggering on PHOS and EMCAL is on
1460 //if(kCalorimeter=="PHOS") ana->SwitchOnNeutralCorr();
1461 ana->SwitchOffNeutralCorr(); // Do only correlation with TPC
1463 ana->SwitchOffHMPIDCorrelation();
1465 ana->SwitchOffFillBradHistograms();
1468 ana->SwitchOffEventSelection();
1469 ana->SwitchOnSeveralUECalculation();
1470 ana->SetUeDeltaPhiCutRange(TMath::Pi()/3, 2*TMath::Pi()/3);
1471 ana->SetMultiBin(1);
1473 //Set Histograms name tag, bins and ranges
1475 ana->AddToHistogramsName(Form("Ana%sHadronCorr_Iso%d_TM%d_",particle.Data(),bIsolated,kTM));
1476 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
1478 if(particle=="Hadron" || particle.Contains("CTS"))
1480 ana->GetHistogramRanges()->SetHistoPhiRangeAndNBins(0, TMath::TwoPi(), 200) ;
1481 ana->GetHistogramRanges()->SetHistoEtaRangeAndNBins(-1.5, 1.5, 300) ;
1486 if(kPrint) ana->Print("");
1492 //________________________________________
1493 AliAnaCalorimeterQA* ConfigureQAAnalysis()
1496 AliAnaCalorimeterQA *ana = new AliAnaCalorimeterQA();
1497 ana->SetDebug(kDebug); //10 for lots of messages
1498 ana->SetCalorimeter(kCalorimeter);
1500 ana->SetTimeCut(-1e10,1e10); // Open time cut
1502 // Study inter detector correlation (PHOS, EMCAL, Tracks, V0)
1503 if(kCalorimeter=="PHOS" && kTrig=="PHOS")
1504 ana->SwitchOnCorrelation(); // make sure you switch in the reader PHOS and EMCAL cells and clusters if option is ON
1505 if(kCalorimeter=="EMCAL" && kClusterArray=="")
1506 ana->SwitchOnCorrelation(); // make sure you switch in the reader PHOS and EMCAL cells and clusters if option is ON
1508 ana->SwitchOffCorrelation();
1510 // Study exotic clusters PHOS and EMCAL
1511 if(kClusterArray=="") ana->SwitchOnStudyBadClusters() ;
1512 else ana->SwitchOffStudyBadClusters() ;
1515 ana->SwitchOffFiducialCut();
1516 ana->SwitchOffFillAllTH3Histogram();
1517 ana->SwitchOffFillAllPositionHistogram();
1518 ana->SwitchOffFillAllPositionHistogram2();
1519 if(!kExotic)ana->SwitchOnStudyBadClusters();
1520 else ana->SwitchOffStudyBadClusters();
1521 ana->SwitchOffStudyClustersAsymmetry();
1522 ana->SwitchOffStudyWeight();
1523 ana->SwitchOnFillAllTrackMatchingHistogram();
1524 ana->SwitchOnFillAllCellTimeHisto() ;
1526 ana->AddToHistogramsName("QA_"); //Begining of histograms name
1527 SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
1531 if(kPrint) ana->Print("");
1537 //________________________________________________________
1538 void ConfigureMC(AliAnaCaloTrackCorrBaseClass* ana)
1540 if(kSimulation) ana->SwitchOnDataMC() ;//Access MC stack and fill more histograms, AOD MC not implemented yet.
1541 else ana->SwitchOffDataMC() ;
1543 //Set here generator name, default pythia
1544 //ana->GetMCAnalysisUtils()->SetMCGenerator("");
1547 //________________________________________________________
1548 void SetHistoRangeAndNBins (AliHistogramRanges* histoRanges)
1550 // Set common bins for all analysis and MC histograms filling
1552 histoRanges->SetHistoPtRangeAndNBins(0, 100, 200) ; // Energy and pt histograms
1554 if(kCalorimeter=="EMCAL")
1558 histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 122*TMath::DegToRad(), 78) ;
1559 histoRanges->SetHistoXRangeAndNBins(-230,90,120); // QA
1560 histoRanges->SetHistoYRangeAndNBins(370,450,40); // QA
1562 else if(kYears==2011)
1564 histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 182*TMath::DegToRad(), 108) ;
1565 histoRanges->SetHistoXRangeAndNBins(-600,90,200); // QA
1566 histoRanges->SetHistoYRangeAndNBins(100,450,100); // QA
1570 histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 190*TMath::DegToRad(), 122) ;
1571 histoRanges->SetHistoXRangeAndNBins(-100,90,200); // QA
1572 histoRanges->SetHistoYRangeAndNBins(50,450,100); // QA
1575 histoRanges->SetHistoEtaRangeAndNBins(-0.72, 0.72, 144) ;
1579 histoRanges->SetHistoPhiRangeAndNBins(260*TMath::DegToRad(), 320*TMath::DegToRad(), 60) ;
1580 histoRanges->SetHistoEtaRangeAndNBins(-0.13, 0.13, 130) ;
1583 histoRanges->SetHistoShowerShapeRangeAndNBins(-0.1, 4.9, 500);
1585 // Invariant mass histoRangeslysis
1586 histoRanges->SetHistoMassRangeAndNBins(0., 1., 200) ;
1587 histoRanges->SetHistoAsymmetryRangeAndNBins(0., 1. , 100) ;
1589 // check if time calibration is on
1590 histoRanges->SetHistoTimeRangeAndNBins(-1000.,1000,1000);
1591 histoRanges->SetHistoDiffTimeRangeAndNBins(-200, 200, 800);
1593 // track-cluster residuals
1594 histoRanges->SetHistoTrackResidualEtaRangeAndNBins(-0.15,0.15,300);
1595 histoRanges->SetHistoTrackResidualPhiRangeAndNBins(-0.15,0.15,300);
1596 histoRanges->SetHistodRRangeAndNBins(0.,0.15,150);//QA
1598 // QA, electron, charged
1599 histoRanges->SetHistoPOverERangeAndNBins(0, 2.5 ,500);
1600 histoRanges->SetHistodEdxRangeAndNBins (0.,250.0,500);
1603 histoRanges->SetHistoFinePtRangeAndNBins(0, 10, 200) ; // bining for fhAmpId
1604 histoRanges->SetHistoRatioRangeAndNBins(0.,2.,100);
1605 histoRanges->SetHistoVertexDistRangeAndNBins(0.,500.,500);
1606 histoRanges->SetHistoNClusterCellRangeAndNBins(0,50,50);
1607 histoRanges->SetHistoZRangeAndNBins(-400,400,200);
1608 histoRanges->SetHistoRRangeAndNBins(400,450,25);
1609 histoRanges->SetHistoV0SignalRangeAndNBins(0,5000,500);
1610 histoRanges->SetHistoV0MultiplicityRangeAndNBins(0,5000,500);
1611 histoRanges->SetHistoTrackMultiplicityRangeAndNBins(0,5000,500);
1615 //_____________________________
1616 UInt_t SetTriggerMaskFromName()
1620 printf("CaloTrackCorr trigger EMC7\n");
1621 return AliVEvent::kEMC7;
1623 else if (kTrig=="INT7")
1625 printf("CaloTrackCorr trigger INT7\n");
1626 return AliVEvent::kINT7;
1628 else if(kTrig=="EMC1")
1630 printf("CaloTrackCorr trigger EMC1\n");
1631 return AliVEvent::kEMC1;
1633 else if(kTrig=="MB")
1635 printf("CaloTrackCorr trigger MB\n");
1636 return AliVEvent::kMB;
1638 else if(kTrig=="PHOS")
1640 printf("CaloTrackCorr trigger PHOS\n");
1641 return AliVEvent::kPHI7;
1643 else if(kTrig=="PHOSPb")
1645 printf("CaloTrackCorr trigger PHOSPb\n");
1646 return AliVEvent::kPHOSPb;
1648 else if(kTrig=="AnyINT")
1650 printf("CaloTrackCorr trigger AnyINT\n");
1651 return AliVEvent::kAnyINT;
1653 else if(kTrig=="INT")
1655 printf("CaloTrackCorr trigger AnyINT\n");
1656 return AliVEvent::kAny;
1658 else if(kTrig=="EMCEGA")
1660 printf("CaloTrackCorr trigger EMC Gamma\n");
1661 return AliVEvent::kEMCEGA;
1663 else if(kTrig=="EMCEJE")
1665 printf("CaloTrackCorr trigger EMC Jet\n");
1666 return AliVEvent::kEMCEJE;
1668 else if(kTrig=="Central")
1670 printf("CaloTrackCorr trigger Central\n");
1671 return (AliVEvent::kCentral | AliVEvent::kMB);
1673 else if(kTrig=="CentralEGA")
1675 printf("CaloTrackCorr trigger Central+EMCEGA\n");
1676 return (AliVEvent::kCentral | AliVEvent::kEMCEGA);
1678 else if(kTrig=="SemiCentral")
1680 printf("CaloTrackCorr trigger SemiCentral\n");
1681 return (AliVEvent::kSemiCentral | AliVEvent::kMB);
1683 else if(kTrig=="SemiOrCentral")
1685 printf("CaloTrackCorr trigger SemiCentral Or Central\n");
1686 return (AliVEvent::kSemiCentral | AliVEvent::kCentral | AliVEvent::kMB);