/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /*********************************************** Lambda Analysis Module ---------------------- This Class enables the analysis of output files created with AliAnalysisTaskExtractV0 and AliAnalysisTaskExtractPerformanceV0 grid tasks. It constructs corrected Lambda, AntiLambda and K0Short spectra. This version: 27th April 2012 To be compiled as a library (.L AliV0Module.cxx++ or something to that effect) --- David Dobrigkeit Chinellato daviddc@ifi.unicamp.br ***********************************************/ //--- For C++ ---- #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //--- For ROOT --- #include "AliV0Module.h" AliV0Module::AliV0Module() { //Dummy Constructor that sets some default values //so that nothing too horrible will happen (hopefully) fWhichParticle = "Lambda"; //Default fCINT1BoverINELratio = 1; fRapidityBoundary = 0.5; fRealDataFile = ""; fMCDataFile = ""; fFeedDownDataFile = ""; fOutputDataFile = ""; //Selections fCutV0Radius = -1; fCutDCANegToPV = -1; fCutDCAPosToPV = -1; fCutDCAV0Daughters = 1000; fCutV0CosPA = -2; fCutProperLifetime = 1e+6; fCutTPCPIDNSigmas = 1e+6; fCutNSigmasForSignalExtraction = 5; fCutLeastNumberOfCrossedRows = 70; fCutDaughterEta = 0.8; fCutCompetingV0Rejection = -1; //Set Feeddown Treatment fFDSwitch = "UseMCRatio"; //Default: Use bin counting fFitBackgroundSwitch = kFALSE; //Default: Min-Bias fPerformMultiplicityStudy = kFALSE; fLoMultBound = -1; fHiMultBound = 10000; //Default: no cut in Armenteros fSpecialArmenterosCutK0s = kFALSE; //Pt Bins: undefined fptbinnumb = -1; } AliV0Module::AliV0Module(TString fParticleType) { // Allows definition of Particle Type in analysis. // Possible Options are "Lambda", "AntiLambda" and "K0Short". // If some other string is given, this constructor will // default to "Lambda". fWhichParticle = fParticleType; if(fWhichParticle!="Lambda"&&fWhichParticle!="AntiLambda"&&fWhichParticle!="K0Short"){ cout<<"Particle Type "< No Feeddown correction will be performed."< Feeddown performed by doubling charged Xi correction."< Feeddown performed by using MC neutral/charged Xi."< par[2] && x[0] < par[3]) { TF1::RejectPoint(); return 0; } return par[0] + par[1]*x[0]; } Double_t AliV0Module::MyBgPolToEval1(const Double_t *x, const Double_t *par) { //Just a plain linear function. return par[0] + par[1]*x[0]; } Double_t AliV0Module::RoundToThousandth( const Double_t lToRound ){ //Round any number to a hundredth... //Well, within machine precision... return TMath::Nint( 1000 * lToRound ) * 0.001; } void AliV0Module::DoAnalysis(){ //---------------------- // V0 Analysis Function //---------------------- // //Consists of the following steps: // // (1) Loop over Real data candidates, acquire peak position and widths. // (2) Loop over Real data candidates, extract signal with variable extraction // areas. Two loops: totally avoids binning data, allowing for sub-MeV/c^2 // granularity in signal extraction areas. // (3) Loop over MC data reconstructed candidates, find associated-to-MC primary // candidates for efficiency numerator. // (4) (if Lambda or AntiLambda) Perform Geant3/Fluka correction. // (5) Get generated primary V0 histograms from MC file for efficiency denominator. // (6) (if Lambda or AntiLambda + FD correction enabled) Open MC file for feeddown // subtraction. Loop over candidates, find Lambda associated with primary Xi // to fill feeddown matrix. Scale the feeddown contribution according to real-life // measured Xi- production under specified feeddown subtraction scheme (see // function SetFeeddownTreatment). Perform subtraction of raw Lambda or AntiLambda // count estimated to be coming from charged or neutral Xi. // (7) Perform detection efficiency correction and compute final corrected spectra. // // // Normalization: // --- Number of Inelastic Events estimated to be: // / // // --- Efficiency denominator: filled at pre-physics selection stage. All signal // losses are therefore estimated from Monte Carlo. // // --- Pileup: not included in MC. Fraction of events removed by IsPileupFromSPD // is artificially removed from Number of Inelastic Events as well. // // Output: written to specified file (with SetOutputFile(...)). // --- includes spectra and efficiencies in base directory. // --- includes a number of different subdirectories storing plots such as // such as invariant mass histos, signal extraction, pt resolution, G3/F // related distributions, feeddown related distributions, and so on. //Set Batch Mode: Ignore all canvases in this section gROOT->SetBatch (kTRUE); cout<<"======================================"< Let's Remember the limits of the data we're analyzing! ---> Important so that we don't try signal extraction outside ---> the bundaries of available data in the Tree object. From AliAnalysisTaskExtractV0.cxx //Second Selection: rough 20-sigma band, parametric. //K0Short: Enough to parametrize peak broadening with linear function. Double_t UpperLimitK0Short = (5.63707e-01) + (1.14979e-02)*tree_lPt; Double_t LowerLimitK0Short = (4.30006e-01) - (1.10029e-02)*tree_lPt; //Lambda: Linear (for higher pt) plus exponential (for low-pt broadening) //[0]+[1]*x+[2]*TMath::Exp(-[3]*x) Double_t UpperLimitLambda = (1.13688e+00) + (5.27838e-03)*tree_lPt + (8.42220e-02)*TMath::Exp(-(3.80595e+00)*tree_lPt); Double_t LowerLimitLambda = (1.09501e+00) - (5.23272e-03)*tree_lPt - (7.52690e-02)*TMath::Exp(-(3.46339e+00)*tree_lPt); ********************************************************/ TF1 *fKDataUpper = new TF1("fKDataUpper","[0]+[1]*x",0,20); TF1 *fKDataLower = new TF1("fKDataLower","[0]+[1]*x",0,20); TF1 *fLDataUpper = new TF1("fLDataUpper","[0]+[1]*x+[2]*TMath::Exp([3]*x)",0,20); TF1 *fLDataLower = new TF1("fLDataLower","[0]+[1]*x+[2]*TMath::Exp([3]*x)",0,20); fKDataUpper->SetParameter(0, 5.63707e-01); fKDataUpper->SetParameter(1, 1.14979e-02); fKDataLower->SetParameter(0, 4.30006e-01); fKDataLower->SetParameter(1,-1.10029e-02); fLDataUpper->SetParameter(0, 1.13688e+00); fLDataUpper->SetParameter(1, 5.27838e-03); fLDataUpper->SetParameter(2, 8.42220e-02); fLDataUpper->SetParameter(3,-3.80595e+00); fLDataLower->SetParameter(0, 1.09501e+00); fLDataLower->SetParameter(1,-5.23272e-03); fLDataLower->SetParameter(2,-7.52690e-02); fLDataLower->SetParameter(3,-3.46339e+00); Int_t lWeAreAtBin = 0; Double_t lParticleMass = -1; //needed for proper lifetime selection Double_t lCompetingParticleMass = -1; //needed for Competing V0 Rejection Double_t lHistoLowerBoundary = -1; Double_t lHistoUpperBoundary = -1; Long_t lHistoNBins = -1; if ( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ lParticleMass = 1.115683; lCompetingParticleMass = 0.4976; lHistoLowerBoundary = 1.116 - 0.1; lHistoUpperBoundary = 1.116 + 0.1; lHistoNBins = 200; //1MeV/c^2 binning } if ( fWhichParticle == "K0Short" ){ lParticleMass = 0.4976; lCompetingParticleMass = 1.115683; lHistoLowerBoundary = 0.498 - 0.15; lHistoUpperBoundary = 0.498 + 0.15; lHistoNBins = 300; //1MeV/c^2 binning } //Setting Up Base Histograms to use=============================== TH1F* lHistoFullV0[100]; TH1F* lHistoFullV0MC[100]; TCanvas* lCanvasHistoFullV0[100]; TCanvas* lCanvasHistoFullV0MC[100]; TH1F *lHistResolution[100]; TF1 *lHistResolutionGaussian[100]; char lHistResolutionName[100]; TH1F* fHistResolutionVsPt = new TH1F("fHistResolutionVsPt","Resolution vs p_{t};p_{t} (GeV/c);#Delta(p_{t}) = p_{t}-p_{t}^{true} (GeV/c)",fptbinnumb,fptbinlimits); TH1F* fHistResolutionVsPtDivByBinWidth = new TH1F("fHistResolutionVsPtDivByBinWidth","Resolution vs p_{t};p_{t} (GeV/c);#Delta(p_{t})/#Delta^{bin}(p_{t}) = (p_{t}-p_{t}^{true})/#Delta^{bin}(p_{t}) (GeV/c)",fptbinnumb,fptbinlimits); TH1F* fHistResolutionVsPtWithGaussians = new TH1F("fHistResolutionVsPtWithGaussians","Resolution vs p_{t};p_{t} (GeV/c);#Delta(p_{t}) = p_{t}-p_{t}^{true} (GeV/c)",fptbinnumb,fptbinlimits); TH1F* fHistResolutionVsPtDivByBinWidthWithGaussians = new TH1F("fHistResolutionVsPtDivByBinWidthWithGaussians","Resolution vs p_{t};p_{t} (GeV/c);#Delta(p_{t})/#Delta^{bin}(p_{t}) = (p_{t}-p_{t}^{true})/#Delta^{bin}(p_{t}) (GeV/c)",fptbinnumb,fptbinlimits); for(Int_t ibin=0;ibinSetTitle(bindescription); sprintf(histname,"lCanvasHistoFullV0%i",ihist); lCanvasHistoFullV0[ihist] = new TCanvas(histname, bindescription, 800, 600); lCanvasHistoFullV0[ihist] -> SetFillColor(kWhite); lCanvasHistoFullV0[ihist] -> SetLeftMargin( 0.175 ); lCanvasHistoFullV0[ihist] -> SetBottomMargin( 0.175 ); //Histo for MC sprintf(histname,"lHistoFullV0MC%i",ihist); if(fWhichParticle == "Lambda") bindescription="#Lambda, MC, bin #"; if(fWhichParticle == "AntiLambda") bindescription="#bar{#Lambda}, MC, bin #"; if(fWhichParticle == "K0Short") bindescription="K^{0}_{S}, MC, bin #"; bindescription.Append(IntToString( ihist )); if ( ihist < fptbinnumb ){ bindescription.Append(", "); bindescription.Append(DoubleToString(fptbinlimits[ ihist ])); bindescription.Append("-"); bindescription.Append(DoubleToString(fptbinlimits[ ihist+1 ])); bindescription.Append("GeV/c"); } lHistoFullV0MC[ihist] = new TH1F(histname,"Candidates;M(appropriate) (GeV/c^{2});Counts", lHistoNBins,lHistoLowerBoundary,lHistoUpperBoundary); lHistoFullV0MC[ihist]->SetTitle(bindescription); sprintf(histname,"lCanvasHistoFullV0MC%i",ihist); lCanvasHistoFullV0MC[ihist] = new TCanvas(histname, bindescription, 800, 600); lCanvasHistoFullV0MC[ihist] -> SetFillColor(kWhite); lCanvasHistoFullV0MC[ihist] -> SetLeftMargin( 0.175 ); lCanvasHistoFullV0MC[ihist] -> SetBottomMargin( 0.175 ); //Histo for resolution tests sprintf(lHistResolutionName,"lHistResolution%i",ihist); Long_t lNumberOfBinsResolution = 5000; if ( (fptbinlimits[ihist+1]+fptbinlimits[ihist])*0.5 > 5 ) lNumberOfBinsResolution = 500; if ( (fptbinlimits[ihist+1]+fptbinlimits[ihist])*0.5 > 10 ) lNumberOfBinsResolution = 50; lHistResolution[ihist] = new TH1F ( lHistResolutionName,bindescription,lNumberOfBinsResolution, -5, 5); //histo with 5MeV/c precision! sprintf(lHistResolutionName,"lHistResolutionGaussian%i",ihist); lHistResolutionGaussian[ihist] = new TF1(lHistResolutionName, "[0]*TMath::Gaus(x,[1],[2])",-5,5); } //================================================================ cout<cd("PWG2CheckLambda_PP"); TList* v0list = (TList*)file->FindObjectAny("clistV0"); TTree* lTree; TH1F* fHistV0MultiplicityForTrigEvt; TH1F* fHistV0MultiplicityForSelEvtNoTPCOnly; TH1F* fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup; lTree = (TTree*)file->FindObjectAny("fTree"); fHistV0MultiplicityForTrigEvt = (TH1F*)v0list->FindObject("fHistV0MultiplicityForTrigEvt"); fHistV0MultiplicityForSelEvtNoTPCOnly = (TH1F*)v0list->FindObject("fHistV0MultiplicityForSelEvtNoTPCOnly"); fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup = (TH1F*)v0list->FindObject("fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup"); Long_t lNCandidates = lTree->GetEntries(); Long_t lNEvents = fHistV0MultiplicityForTrigEvt->GetEntries(); Double_t lEvtFracAfterPileup = ((double)(fHistV0MultiplicityForSelEvtNoTPCOnlyNoPileup->GetEntries()))/ ((double)(fHistV0MultiplicityForSelEvtNoTPCOnly->GetEntries())); Double_t lNInelasticEvents = lEvtFracAfterPileup * (lNEvents / fCINT1BoverINELratio); cout<<" Number of CINT1B triggers.....: "<FindObject("fHistMultiplicityForTrigEvt"); TH1F* fHistMultiplicityBeforePileup = (TH1F*)v0list->FindObject("fHistMultiplicityNoTPCOnly"); TH1F* fHistMultiplicityAfterPileup = (TH1F*)v0list->FindObject("fHistMultiplicityNoTPCOnlyNoPileup"); for( Int_t ibin = fHistMultiplicity->FindBin(fLoMultBound); ibinFindBin(fHiMultBound)+1; ibin++){ lNInelasticEvents += fHistMultiplicity->GetBinContent(ibin); lNEventsBeforePileup += fHistMultiplicityBeforePileup->GetBinContent(ibin); lNEventsAfterPileup += fHistMultiplicityAfterPileup ->GetBinContent(ibin); } cout<<" Number of events, no pileup rejection..: "<SetBranchAddress("fTreeVariablePosEta",&lPosEta); lTree->SetBranchAddress("fTreeVariableNegEta",&lNegEta); lTree->SetBranchAddress("fTreeVariablePt",&lPt); if ( fWhichParticle == "Lambda" ) lTree->SetBranchAddress("fTreeVariableInvMassLambda",&lInvariantMass); if ( fWhichParticle == "AntiLambda" ) lTree->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMass); if ( fWhichParticle == "K0Short" ) lTree->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMass); if ( fWhichParticle == "Lambda" ){ //For symmetry of computation... lTree->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTree->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "AntiLambda" ){ //For symmetry of computation... lTree->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTree->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "K0Short" ){ lTree->SetBranchAddress("fTreeVariableInvMassLambda" ,&lInvariantMassCompetingOne); lTree->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ) lTree->SetBranchAddress("fTreeVariableRapLambda",&lRap); if ( fWhichParticle == "K0Short" ) lTree->SetBranchAddress("fTreeVariableRapK0Short",&lRap); lTree->SetBranchAddress("fTreeVariableDistOverTotMom",&lDistOverTotMom); lTree->SetBranchAddress("fTreeVariableLeastNbrCrossedRows",&lLeastNbrCrossedRows); lTree->SetBranchAddress("fTreeVariableLeastRatioCrossedRowsOverFindable",&lLeastNbrCrossedRowsOverFindable); //--- TPC dEdx Variables ------------------------------------------ lTree->SetBranchAddress("fTreeVariableNSigmasPosProton",&lNSigmasPosProton); lTree->SetBranchAddress("fTreeVariableNSigmasNegProton",&lNSigmasNegProton); lTree->SetBranchAddress("fTreeVariableNSigmasPosPion",&lNSigmasPosPion); lTree->SetBranchAddress("fTreeVariableNSigmasNegPion",&lNSigmasNegPion); //--- Topological selection variables ----------------------------- lTree->SetBranchAddress("fTreeVariableV0Radius",&lV0Radius); lTree->SetBranchAddress("fTreeVariableDcaNegToPrimVertex",&lDcaNegToPrimVertex); lTree->SetBranchAddress("fTreeVariableDcaPosToPrimVertex",&lDcaPosToPrimVertex); lTree->SetBranchAddress("fTreeVariableDcaV0Daughters",&lDcaV0Daughters); lTree->SetBranchAddress("fTreeVariableV0CosineOfPointingAngle",&lV0CosinePointingAngle); //--- Multiplicity Variable ---------------------------------------- lTree->SetBranchAddress("fTreeVariableMultiplicity",&lMultiplicity); //--- Armenteros-Podolansky ---------------------------------------- lTree->SetBranchAddress("fTreeVariableAlphaV0",&lArmAlpha); lTree->SetBranchAddress("fTreeVariablePtArmV0",&lArmPt); //================================================================ cout<<"--------------- Real Data File Loop 1 ------------------"<GetEntry(icand); if( icand % lOneTenthOfNCandidates == 0 ) cout<<" Currently at candidate........: "<= fCutV0Radius && lDcaNegToPrimVertex >= fCutDCANegToPV && lDcaPosToPrimVertex >= fCutDCAPosToPV && lDcaV0Daughters <= fCutDCAV0Daughters && lV0CosinePointingAngle >= fCutV0CosPA && lParticleMass*lDistOverTotMom <= fCutProperLifetime && lLeastNbrCrossedRows >= fCutLeastNumberOfCrossedRows && lLeastNbrCrossedRowsOverFindable >= fCutLeastNumberOfCrossedRowsOverFindable && TMath::Abs(lInvariantMassCompetingOne - lCompetingParticleMass) > fCutCompetingV0Rejection && TMath::Abs(lInvariantMassCompetingTwo - lCompetingParticleMass) > fCutCompetingV0Rejection && ( fSpecialArmenterosCutK0s == kFALSE || ( fSpecialArmenterosCutK0s == kTRUE && lArmPt*5>TMath::Abs(lArmAlpha) ) ) && ( //official response code ( fWhichParticle == "Lambda" && TMath::Abs(lNSigmasNegPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasPosProton) <= fCutTPCPIDNSigmas) || ( fWhichParticle == "AntiLambda" && TMath::Abs(lNSigmasPosPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasNegProton) <= fCutTPCPIDNSigmas) || ( fWhichParticle == "K0Short" && TMath::Abs(lNSigmasPosPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasNegPion) <= fCutTPCPIDNSigmas) ) && ( //Multiplicity Switch fPerformMultiplicityStudy == kFALSE || //No mult selection, or... (fPerformMultiplicityStudy == kTRUE && //inside mult bin lMultiplicity>=fLoMultBound && lMultiplicity<=fHiMultBound) ) ){ lWeAreAtBin = fHistPt->FindBin(lPt)-1; if(lWeAreAtBin == -1) lWeAreAtBin = 99; //UnderFlow, special treatment lHistoFullV0[lWeAreAtBin]->Fill(lInvariantMass); //fill with specific inv mass } } cout<<"--------------- Loop Completed -------------------------"< Peak Finding, bin #"<Eval( fHistPt->GetBinCenter(ibin+1) ) + fLDataUpper->Eval( fHistPt->GetBinCenter(ibin+1) ) ); lUpperFit = lMiddle + 0.7 * ( fLDataUpper->Eval( fHistPt->GetBinCenter(ibin+1) ) - lMiddle ); lLowerFit = lMiddle - 0.7 * ( lMiddle - fLDataLower->Eval( fHistPt->GetBinCenter(ibin+1) ) ); fgausPt[ibin]= new TF1(fgausname,"[0]*TMath::Gaus(x,[1],[2])+[3]*x+[4]", lLowerFit, lUpperFit ); fgausPt[ibin]->SetParameter(1,1.116); fgausPt[ibin]->SetParameter(2,0.0025); fgausPt[ibin]->SetParLimits(1,1,1.2); fgausPt[ibin]->SetParLimits(2,0.001,0.01); } if ( fWhichParticle == "K0Short"){ fgausPt[ibin]= new TF1(fgausname,"[0]*TMath::Gaus(x,[1],[2])+[3]*x+[4]",0.498-0.06,0.498+0.060); fgausPt[ibin]->SetParameter(1,0.498); fgausPt[ibin]->SetParameter(2,0.004); } fgausPt[ibin]->SetParameter(0,lHistoFullV0[ibin]->GetMaximum() * 0.9); fgausPt[ibin]->SetParameter(3,0); fgausPt[ibin]->SetParameter(4,lHistoFullV0[ibin]->GetMaximum() * 0.1); lHistoFullV0[ibin]->Fit(fgausname,"QREM0"); lPeakPosition[ibin] = fgausPt[ibin]->GetParameter(1); lPeakWidth[ibin] = TMath::Abs( fgausPt[ibin]->GetParameter(2) ); cout<<"---> ["<GetEntry(icand); if( icand % lOneTenthOfNCandidates == 0 ) cout<<" Currently at candidate........: "<= fCutV0Radius && lDcaNegToPrimVertex >= fCutDCANegToPV && lDcaPosToPrimVertex >= fCutDCAPosToPV && lDcaV0Daughters <= fCutDCAV0Daughters && lV0CosinePointingAngle >= fCutV0CosPA && lParticleMass*lDistOverTotMom <= fCutProperLifetime && lLeastNbrCrossedRows >= fCutLeastNumberOfCrossedRows && lLeastNbrCrossedRowsOverFindable >= fCutLeastNumberOfCrossedRowsOverFindable && TMath::Abs(lInvariantMassCompetingOne - lCompetingParticleMass) > fCutCompetingV0Rejection && TMath::Abs(lInvariantMassCompetingTwo - lCompetingParticleMass) > fCutCompetingV0Rejection && ( fSpecialArmenterosCutK0s == kFALSE || ( fSpecialArmenterosCutK0s == kTRUE && lArmPt*5>TMath::Abs(lArmAlpha) ) ) && ( //official response code ( fWhichParticle == "Lambda" && TMath::Abs(lNSigmasNegPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasPosProton) <= fCutTPCPIDNSigmas) || ( fWhichParticle == "AntiLambda" && TMath::Abs(lNSigmasPosPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasNegProton) <= fCutTPCPIDNSigmas) || ( fWhichParticle == "K0Short" && TMath::Abs(lNSigmasPosPion) <= fCutTPCPIDNSigmas && TMath::Abs(lNSigmasNegPion) <= fCutTPCPIDNSigmas) ) && ( //Multiplicity Switch fPerformMultiplicityStudy == kFALSE || //No mult selection, or... (fPerformMultiplicityStudy == kTRUE && //inside mult bin lMultiplicity>=fLoMultBound && lMultiplicity<=fHiMultBound) ) ){ // Start Entry Loop lWeAreAtBin = fHistPt->FindBin(lPt)-1; if(lWeAreAtBin == -1) lWeAreAtBin = 99; //UnderFlow, special treatment //Extract left and right background areas and peak //--- Left Background Sample if(lInvariantMass>lLeftBgLeftLimit[lWeAreAtBin] && lInvariantMasslRightBgLeftLimit[lWeAreAtBin] && lInvariantMasslPeakLeftLimit[lWeAreAtBin] && lInvariantMassDelete(); delete v0list; } file->Close("R"); file->Delete(); delete file; cout< FixParameter(2,RoundToThousandth ( lLeftBgRightLimit[i] ) ); lfitNoise[i] -> FixParameter(3,RoundToThousandth ( lRightBgLeftLimit[i] ) ); lfitNoise[i] -> SetParameter(0,lLeftPlusRightBgV0[i] * lHistoFullV0[i]->GetBinWidth(5) / (lRightBgLeftLimit[i]-lLeftBgRightLimit[i] + 1e-6 ) ); lfitNoise[i] -> SetParameter(1,0); cout<<"Guessed Parameter 0 fot "<GetBinWidth(5) / (lRightBgLeftLimit[i]-lLeftBgRightLimit[i] + 1e-6 )< Fit(lFitNameOne,"LLrie+0"); lSampleNoise[i]->SetParameter(0, lfitNoise[i]->GetParameter(0) ); lSampleNoise[i]->SetParameter(1, lfitNoise[i]->GetParameter(1) ); } for(long i=0; iIntegral( lPeakLeftLimit[i], lPeakRightLimit[i] )/lHistoFullV0[i]->GetBinWidth(5)<Integral( lPeakLeftLimit[i], lPeakRightLimit[i] )/lHistoFullV0[i]->GetBinWidth(5); } cout<<"--------------- Fitting Finished! ----------------------"<SetBinContent(ipoint+1, (lSigPlusCenterBgV0[ipoint] - lLeftPlusRightBgV0[ipoint])/lLeftPlusRightBgV0[ipoint] ); }else{ fHistSigToNoise->SetBinContent(ipoint+1, -1) ; //-1 means: no background } } //============================================================= cout<<"--------------- Extracted Signal -----------------------"< ["<SetTitle(bindescription); } //MC File Acquisition============================================= cout<<"--------------- Opening MC file ------------------------"<cd("PWG2CheckPerformanceLambda_PP_MC"); TList* v0listMC = (TList*)fileMC->FindObjectAny("clistV0MC"); TTree *lTreeMC; TH1F* fHistMultiplicityBeforeTrigSelMC; lTreeMC = (TTree*)fileMC->FindObjectAny("fTree"); fHistMultiplicityBeforeTrigSelMC = (TH1F*)v0listMC->FindObject("fHistMultiplicityBeforeTrigSel"); Long_t lNCandidatesMC = lTreeMC->GetEntries(); Long_t lNEventsMC = fHistMultiplicityBeforeTrigSelMC->GetEntries(); cout<<" MC Events (before trig sel)...: "<SetBranchAddress("fTreeVariablePosEta",&lPosEta); lTreeMC->SetBranchAddress("fTreeVariableNegEta",&lNegEta); lTreeMC->SetBranchAddress("fTreeVariablePrimaryStatus",&lPrimaryStatus); lTreeMC->SetBranchAddress("fTreeVariablePrimaryStatusMother",&lPrimaryStatusMother); lTreeMC->SetBranchAddress("fTreeVariablePt",&lPt); lTreeMC->SetBranchAddress("fTreeVariablePtXiMother",&lPtMother); lTreeMC->SetBranchAddress("fTreeVariablePtMC",&lPtMC); if ( fWhichParticle == "Lambda" ) lTreeMC->SetBranchAddress("fTreeVariableInvMassLambda",&lInvariantMass); if ( fWhichParticle == "AntiLambda" ) lTreeMC->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMass); if ( fWhichParticle == "K0Short" ) lTreeMC->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMass); if ( fWhichParticle == "Lambda" ){ //For symmetry of computation... lTreeMC->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTreeMC->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "AntiLambda" ){ //For symmetry of computation... lTreeMC->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTreeMC->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "K0Short" ){ lTreeMC->SetBranchAddress("fTreeVariableInvMassLambda" ,&lInvariantMassCompetingOne); lTreeMC->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMassCompetingTwo); } //if ( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ) // lTreeMC->SetBranchAddress("fTreeVariableRapLambda",&lRap); //if ( fWhichParticle == "K0Short" ) // lTreeMC->SetBranchAddress("fTreeVariableRapK0Short",&lRap); lTreeMC->SetBranchAddress("fTreeVariableRapMC",&lRap); lTreeMC->SetBranchAddress("fTreeVariableLeastNbrCrossedRows",&lLeastNbrCrossedRows); lTreeMC->SetBranchAddress("fTreeVariableLeastRatioCrossedRowsOverFindable",&lLeastNbrCrossedRowsOverFindable); //--- Topological selection variables ----------------------------- lTreeMC->SetBranchAddress("fTreeVariableV0Radius",&lV0Radius); lTreeMC->SetBranchAddress("fTreeVariableDcaNegToPrimVertex",&lDcaNegToPrimVertex); lTreeMC->SetBranchAddress("fTreeVariableDcaPosToPrimVertex",&lDcaPosToPrimVertex); lTreeMC->SetBranchAddress("fTreeVariableDcaV0Daughters",&lDcaV0Daughters); lTreeMC->SetBranchAddress("fTreeVariableV0CosineOfPointingAngle",&lV0CosinePointingAngle); lTreeMC->SetBranchAddress("fTreeVariableDistOverTotMom",&lDistOverTotMom); //---- Extra Information Available in MC only -------------------- lTreeMC->SetBranchAddress("fTreeVariableNegTransvMomentumMC",&lNegTransvMomentumMC); lTreeMC->SetBranchAddress("fTreeVariablePosTransvMomentumMC",&lPosTransvMomentumMC); lTreeMC->SetBranchAddress("fTreeVariablePID",&lPID); lTreeMC->SetBranchAddress("fTreeVariablePIDMother",&lPIDMother); lTreeMC->SetBranchAddress("fTreeVariablePIDPositive",&lPIDPositive); lTreeMC->SetBranchAddress("fTreeVariablePIDNegative",&lPIDNegative); //--- Multiplicity ------------------------------------------------ lTreeMC->SetBranchAddress("fTreeVariableMultiplicity",&lMultiplicity); //--- Armenteros-Podolansky ---------------------------------------- lTreeMC->SetBranchAddress("fTreeVariableAlphaV0",&lArmAlpha); lTreeMC->SetBranchAddress("fTreeVariablePtArmV0",&lArmPt); //================================================================ //================================================================ cout<GetEntry(icand); if( icand % lOneTenthOfNCandidatesMC == 0 ) cout<<" Currently at candidate........: "<= fCutV0Radius && lDcaNegToPrimVertex >= fCutDCANegToPV && lDcaPosToPrimVertex >= fCutDCAPosToPV && lDcaV0Daughters <= fCutDCAV0Daughters && lV0CosinePointingAngle >= fCutV0CosPA && lParticleMass*lDistOverTotMom <= fCutProperLifetime && lLeastNbrCrossedRows >= fCutLeastNumberOfCrossedRows && lLeastNbrCrossedRowsOverFindable >= fCutLeastNumberOfCrossedRowsOverFindable && TMath::Abs(lInvariantMassCompetingOne - lCompetingParticleMass) > fCutCompetingV0Rejection && TMath::Abs(lInvariantMassCompetingTwo - lCompetingParticleMass) > fCutCompetingV0Rejection && ( fSpecialArmenterosCutK0s == kFALSE || ( fSpecialArmenterosCutK0s == kTRUE && lArmPt*5>TMath::Abs(lArmAlpha) ) ) && ( //perfect PID association, IsPhysicalPrimary association ( fWhichParticle == "Lambda" && lPID == 3122 //V0 is a Lambda && lPIDPositive == 2212 //Pos Daughter is p && lPIDNegative == -211 //Neg Daughter is pi- && lPrimaryStatus == 1 ) || ( fWhichParticle == "AntiLambda" && lPID == -3122 //V0 is an AntiLambda && lPIDPositive == 211 //Pos Daughter is pi+ && lPIDNegative == -2212 //Neg Daughter is antiproton && lPrimaryStatus == 1 ) || ( fWhichParticle == "K0Short" && lPID == 310 //V0 is an AntiLambda && lPIDPositive == 211 //Pos Daughter is pi+ && lPIDNegative == -211 //Neg Daughter is pi- && lPrimaryStatus == 1 //K0Short is a primary ) ) && ( //Multiplicity Switch fPerformMultiplicityStudy == kFALSE || //No mult selection, or... (fPerformMultiplicityStudy == kTRUE && //inside mult bin lMultiplicity>=fLoMultBound && lMultiplicity<=fHiMultBound) ) ){ // Start Entry Loop lWeAreAtBin = fHistPt->FindBin(lPtMC)-1; if(lWeAreAtBin == -1) lWeAreAtBin = 99; //UnderFlow, special treatment lHistoFullV0MC[lWeAreAtBin]->Fill(lInvariantMass); //fill with specific inv mass f2dHistPtResolution->Fill(lPt,lPtMC); //Extract left and right background areas and peak //--- Left Background Sample if(lInvariantMass>lLeftBgLeftLimit[lWeAreAtBin] && lInvariantMasslRightBgLeftLimit[lWeAreAtBin] && lInvariantMasslPeakLeftLimit[lWeAreAtBin] && lInvariantMassFill( lPosTransvMomentumMC ); if ( fWhichParticle == "AntiLambda" ) lProtonMomentum[lWeAreAtBin]->Fill( lNegTransvMomentumMC ); //--- Resolution tests lHistResolution[lWeAreAtBin]->Fill(lPt - lPtMC); } // End Entry Loop } cout<<"--------------- Loop Completed -------------------------"< Peak Finding, bin #"<SetParameter(1,1.116); fgausPtMC[ibin]->SetParameter(2,0.0025); fgausPtMC[ibin]->SetParLimits(1,1.1,1.2); fgausPtMC[ibin]->SetParLimits(2,0.001,0.02); } if ( fWhichParticle == "K0Short"){ fgausPtMC[ibin]= new TF1(fgausnameMC,"[0]*TMath::Gaus(x,[1],[2])",0.498-0.06,0.498+0.060); fgausPtMC[ibin]->SetParameter(1,0.498); fgausPtMC[ibin]->SetParameter(2,0.004); } fgausPtMC[ibin]->SetParameter(0,lHistoFullV0MC[ibin]->GetMaximum() * 0.9); //fgausPtMC[ibin]->SetParameter(3,0); //fgausPtMC[ibin]->SetParameter(4,HistoFullV0MC[ibin]->GetMaximum() * 0.1); lHistoFullV0MC[ibin]->Fit(fgausnameMC,"QREM0"); lPeakPositionMC[ibin] = TMath::Abs( fgausPtMC[ibin]->GetParameter(1) ); lPeakWidthMC[ibin] = fgausPtMC[ibin]->GetParameter(2); cout<<"---> ["< FixParameter(2,RoundToThousandth ( lLeftBgRightLimit[i] ) ); lfitNoiseMC[i] -> FixParameter(3,RoundToThousandth ( lRightBgLeftLimit[i] ) ); lfitNoiseMC[i] -> SetParameter(0,lLeftPlusRightBgV0MC[i]*lHistoFullV0MC[i]->GetMaximum() / (lSigPlusCenterBgV0MC[i]+1e-6) ); lfitNoiseMC[i] -> SetParameter(1,0); sprintf(lFitNameOneMC,"lSampleNoiseMC%i",(int)i); //Define Function to Sample Background cout<<"creating sample "< Fit(lFitNameOneMC,"LLrie+0"); lSampleNoiseMC[i]->SetParameter(0, lfitNoiseMC[i]->GetParameter(0) ); lSampleNoiseMC[i]->SetParameter(1, lfitNoiseMC[i]->GetParameter(1) ); } for(long i=0; iIntegral( lPeakLeftLimit[i], lPeakRightLimit[i] )/lHistoFullV0MC[i]->GetBinWidth(5)<Integral( lPeakLeftLimit[i], lPeakRightLimit[i] )/lHistoFullV0MC[i]->GetBinWidth(5); } cout<<"--------------- Fitting Finished! ----------------------"<SetBinContent(ipoint+1, (lSigPlusCenterBgV0MC[ipoint] - lLeftPlusRightBgV0MC[ipoint])/lLeftPlusRightBgV0MC[ipoint] ); }else{ fHistSigToNoiseMC->SetBinContent(ipoint+1, -1) ; //-1 means: no background } } //============================================================= cout<<"--------------- Extracted Signal (MC) ------------------"< ["<FindObject("f3dHistPrimRawPtVsYVsMultLambda"); if(fWhichParticle == "AntiLambda") f3dHistGenPtVsYVsMultV0 = (TH3F*)v0listMC->FindObject("f3dHistPrimRawPtVsYVsMultAntiLambda"); if(fWhichParticle == "K0Short") f3dHistGenPtVsYVsMultV0 = (TH3F*)v0listMC->FindObject("f3dHistPrimRawPtVsYVsMultK0Short"); TH1D *fHistDummyV0 = 0x0; if( fPerformMultiplicityStudy == kFALSE ){ fHistDummyV0 = f3dHistGenPtVsYVsMultV0->ProjectionX("fHistDummyV0", f3dHistGenPtVsYVsMultV0->GetYaxis()->FindBin(-fRapidityBoundary+1e-2), //avoid taking previous bin f3dHistGenPtVsYVsMultV0->GetYaxis()->FindBin(+fRapidityBoundary-1e-2), //avoid taking next bin f3dHistGenPtVsYVsMultV0->GetZaxis()->FindBin(-1), //Not interested in Multiplicity so far, integrate f3dHistGenPtVsYVsMultV0->GetZaxis()->FindBin(101) //Not interested in Multiplicity so far, integrate ); } if( fPerformMultiplicityStudy == kTRUE ){ fHistDummyV0 = f3dHistGenPtVsYVsMultV0->ProjectionX("fHistDummyV0", f3dHistGenPtVsYVsMultV0->GetYaxis()->FindBin(-fRapidityBoundary+1e-2), //avoid taking previous bin f3dHistGenPtVsYVsMultV0->GetYaxis()->FindBin(+fRapidityBoundary-1e-2), //avoid taking next bin f3dHistGenPtVsYVsMultV0->GetZaxis()->FindBin(fLoMultBound), //Interested in Multiplicity! f3dHistGenPtVsYVsMultV0->GetZaxis()->FindBin(fHiMultBound) //Interested in Multiplicity! ); } TH1F *fHistMCCountbyptV0 = new TH1F("fHistMCCountbyptV0","V0 MC count;p_{T} (GeV/c);Counts",fptbinnumb,fptbinlimits); Double_t temppt; for(long i = 1; iGetNbinsX()+1;i++){ temppt = fHistDummyV0->GetXaxis()->GetBinCenter(i); for(long filling = 0; fillingGetBinContent(i);filling++){ fHistMCCountbyptV0->Fill(temppt); } } cout<<"--------------- Generated V0 Dump ----------------------"< ["<GetBinContent(ipoint+1)<<" +/- "<GetBinContent(ipoint+1))<SetParameter(0, lHistResolution[ibin]->GetMaximum() ); lHistResolutionGaussian[ibin]->SetParameter(1, lHistResolution[ibin]->GetMean() ); lHistResolutionGaussian[ibin]->SetParameter(2, lHistResolution[ibin]->GetRMS() ); sprintf(lHistResolutionName,"lHistResolutionGaussian%i",ibin); lHistResolution[ibin]->Fit(lHistResolutionName,"IREM0"); } Double_t lTotSigMCPtMC[100]; Double_t lTotSigMCPtMCXCheck[100]; Double_t lTotSigMCPtReco[100]; Double_t lTotSigMCPtRecoXCheck[100]; for(Int_t ibin=0;ibin<100;ibin++){ lTotSigMCPtMC[ibin] = 0; lTotSigMCPtReco[ibin] = 0; lTotSigMCPtRecoXCheck[ibin] = 0; } for(Int_t ibin=0; ibinGetBinContent(ibin+1,jbin+1)); lTotSigMCPtReco[ibin] += ((double)f2dHistPtResolution->GetBinContent(ibin+1,jbin+1)); } } TMatrixD fResolutionMatrix(fptbinnumb,fptbinnumb); for(Int_t ibin=0; ibinGetBinContent(ibin+1,jbin+1)) / lTotSigMCPtMC[jbin] ; f2dHistPtBlur->SetBinContent(ibin+1,jbin+1,(float)fResolutionMatrix[ibin][jbin]); } } fResolutionMatrix.Print(); cout<<"---> Debug Test 1: Check if fResolutionMatrix * lTotSigMCPtMC is lTotSigMCPtReco"< Multiplying... "< Compare for Cross-check!..."< bin #"< 1e-5){ cout<<"Determinant is different from zero enough to do inversion."< 1 ){ fResolutionMatrix[ibin][jbin] = 0; } } } fResolutionMatrix.Invert(); fResolutionMatrix.Print(); } fResolutionMatrix.Print(); cout<<"---> Debug Test 2: Check if fResolutionMatrix^-1 * lTotSigMCPtReco is lTotSigMCPtMC"< AKA \"the big test\"!"< Multiplying... "< Compare for Cross-check!..."< bin #"<SetBinContent(ibin+1,jbin+1,(float)fResolutionMatrix[ibin][jbin]); } } Double_t lTempSigRealV0[100]; for(Int_t ibin=0; ibinGetBinContent(ipoint+1); lEfficiencyError[ipoint] = ErrorInRatio( lSigMCV0[ipoint], lSigErrMCV0[ipoint], fHistMCCountbyptV0->GetBinContent(ipoint+1), TMath::Sqrt(fHistMCCountbyptV0->GetBinContent(ipoint+1)) ); } //============================================================= cout<Delete(); fHistMCCountbyptV0->Delete(); v0listMC->Delete(); delete v0listMC; fileMC->Close("R"); fileMC->Delete(); delete fileMC; cout<SetTitle("K^{0}_{S} Efficiency"); if( fWhichParticle == "Lambda" ) fHistPureEfficiency->SetTitle("#Lambda Efficiency (no G3/F corr.)"); if( fWhichParticle == "AntiLambda" ) fHistPureEfficiency->SetTitle("#bar{#Lambda} Efficiency (no G3/F corr.)"); if( fWhichParticle == "Lambda" ) fHistEfficiency->SetTitle("#Lambda Efficiency (with G3/F corr.)"); if( fWhichParticle == "AntiLambda" ) fHistEfficiency->SetTitle("#bar{#Lambda} Efficiency (with G3/F corr.)"); for(Int_t ipoint = 0; ipoint ["<SetBinContent(ipoint+1, lEfficiency[ipoint]); fHistPureEfficiency->SetBinError(ipoint+1, lEfficiencyError[ipoint]); } cout<<"--------------------------------------------------------"<Get("gHistCorrectionForCrossSectionProtons") ); TH2D* h2dCorrCrossSectionAntiProtons = (TH2D*) ( fileCorrGeanT3FlukaPanos->Get("gHistCorrectionForCrossSectionAntiProtons") ); //Find bins... //TH2D* h2dAsMCPtBaryonVsPtCasc = 0x0; TH2D* h2dCorrCrossSection = 0x0; if( fWhichParticle == "Lambda" ) h2dCorrCrossSection = h2dCorrForCrossSectionProtons; if( fWhichParticle == "AntiLambda" ) h2dCorrCrossSection = h2dCorrCrossSectionAntiProtons; Int_t myFirstYBinPanos = h2dCorrCrossSection ->GetXaxis()->FindBin(-fRapidityBoundary); Int_t myLastYBinPanos = h2dCorrCrossSection ->GetXaxis()->FindBin(+fRapidityBoundary-1e-3); cout<<"Check limiting bins: "<GetXaxis()->GetBinLowEdge(myFirstYBinPanos), h2dCorrCrossSection ->GetXaxis()->GetBinUpEdge(myFirstYBinPanos) ); Printf(" - Bin %d = %f to %f", myLastYBinPanos, h2dCorrCrossSection ->GetXaxis()->GetBinLowEdge(myLastYBinPanos ), h2dCorrCrossSection ->GetXaxis()->GetBinUpEdge(myLastYBinPanos) ); // B.1.a. h1dPanosCorrections = h2dCorrCrossSection->ProjectionY("h1dPanosCorrections", myFirstYBinPanos, myLastYBinPanos, "e" ); // ~mid-rapidity h1dPanosCorrections->SetDirectory(0); //means manual cleanup later h1dPanosCorrections->Scale( (Double_t) (1.0/(myLastYBinPanos - myFirstYBinPanos +1.0)) ); h1dPanosCorrections->SetYTitle("#epsilon_{GEANT3} / #epsilon_{FLUKA}"); //TF1 *fitGeant3FlukaCorr = 0x0; declared outside this scope if(fWhichParticle == "Lambda") fitGeant3FlukaCorr = new TF1("fitGeant3FlukaCorr", this, &AliV0Module::MyGeant3FlukaCorrectionForProtons, 0.25, 1.1, 3, "AliV0Module","MyGeant3FlukaCorrectionForProtons"); if(fWhichParticle == "AntiLambda") fitGeant3FlukaCorr = new TF1("fitGeant3FlukaCorr", this, &AliV0Module::MyGeant3FlukaCorrectionForAntiProtons, 0.25, 1.1, 4, "AliV0Module", "MyGeant3FlukaCorrectionForAntiProtons"); h1dPanosCorrections->Fit("fitGeant3FlukaCorr","rime+0"); // Chi2 Printf("Test fit function..."); Printf(" - fitGeant3FlukaCorr for pt = .25 GeV/c : %f", fitGeant3FlukaCorr->Eval( .25) ); Printf(" - fitGeant3FlukaCorr for pt = .5 GeV/c : %f", fitGeant3FlukaCorr->Eval( .5) ); Printf(" - fitGeant3FlukaCorr for pt = 1 GeV/c : %f", fitGeant3FlukaCorr->Eval( 1.0) ); Printf(" - fitGeant3FlukaCorr for pt = 2 GeV/c : %f", fitGeant3FlukaCorr->Eval( 2.0) ); Printf(" - fitGeant3FlukaCorr for pt = 5 GeV/c : %f", fitGeant3FlukaCorr->Eval( 5.0) ); Printf(" - fitGeant3FlukaCorr for pt = 7 GeV/c : %f", fitGeant3FlukaCorr->Eval( 7.0) ); Printf(" - fitGeant3FlukaCorr for pt = 8 GeV/c : %f", fitGeant3FlukaCorr->Eval( 8.0) ); Printf(" - fitGeant3FlukaCorr for pt = 10 GeV/c : %f", fitGeant3FlukaCorr->Eval(10.0) ); cout<<"--------------- Embedding G3/F in Efficiencies ---------"<Eval( lProtonMomentum[ipoint]->GetMean() ) ; lEfficiencyError[ipoint] /= fitGeant3FlukaCorr->Eval( lProtonMomentum[ipoint]->GetMean() ) ; } cout<<"--------------- G3/F Corrected Efficiencies ------------"< ["<SetBinContent(ipoint+1, lEfficiency[ipoint]); fHistEfficiency->SetBinError(ipoint+1, lEfficiencyError[ipoint]); } cout<<"--------------------------------------------------------"<Close(); fileCorrGeanT3FlukaPanos->Delete(); delete fileCorrGeanT3FlukaPanos; } //end Geant3/fluka correction if //Declaring outside Feeddown scope to keep in memory TH2F *f2dFeedDownMatrix = 0x0; TH2F *f2dFeedDownEfficiency = 0x0; TH2F *f2dFeedDownEfficiencyGFCorrected = 0x0; TH1F *fHistFeeddownSubtraction = 0x0; //========================================================================= // --- Feeddown correction section if( fFDSwitch != "NoFD" && fWhichParticle != "K0Short"){ cout<<"--------------- Feeddown Correction --------------------"<cd("PWG2CheckPerformanceLambda_PP_MC"); TList* v0listMCFD = (TList*)fileMCFD->FindObjectAny("clistV0MC"); TTree* lTreeMCFD; TH1F* fHistMultiplicityBeforeTrigSelMCFD; lTreeMCFD = (TTree*)fileMCFD->FindObjectAny("fTree"); fHistMultiplicityBeforeTrigSelMCFD = (TH1F*)v0listMCFD->FindObject("fHistMultiplicityBeforeTrigSel"); Long_t lNCandidatesMCFD = lTreeMCFD->GetEntries(); Long_t lNEventsMCFD = fHistMultiplicityBeforeTrigSelMCFD->GetEntries(); cout<<" MC Events (before trig sel)...: "<SetBranchAddress("fTreeVariablePosEta",&lPosEta); lTreeMCFD->SetBranchAddress("fTreeVariableNegEta",&lNegEta); lTreeMCFD->SetBranchAddress("fTreeVariablePrimaryStatus",&lPrimaryStatus); lTreeMCFD->SetBranchAddress("fTreeVariablePrimaryStatusMother",&lPrimaryStatusMother); lTreeMCFD->SetBranchAddress("fTreeVariablePt",&lPt); lTreeMCFD->SetBranchAddress("fTreeVariablePtMC",&lPtMC); lTreeMCFD->SetBranchAddress("fTreeVariablePtXiMother",&lPtMother); if ( fWhichParticle == "Lambda" ) lTreeMCFD->SetBranchAddress("fTreeVariableInvMassLambda",&lInvariantMass); if ( fWhichParticle == "AntiLambda" ) lTreeMCFD->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMass); if ( fWhichParticle == "K0Short" ) lTreeMCFD->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMass); if ( fWhichParticle == "Lambda" ){ //For symmetry of computation... lTreeMCFD->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTreeMCFD->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "AntiLambda" ){ //For symmetry of computation... lTreeMCFD->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingOne); lTreeMCFD->SetBranchAddress("fTreeVariableInvMassK0s",&lInvariantMassCompetingTwo); } if ( fWhichParticle == "K0Short" ){ lTreeMCFD->SetBranchAddress("fTreeVariableInvMassLambda" ,&lInvariantMassCompetingOne); lTreeMCFD->SetBranchAddress("fTreeVariableInvMassAntiLambda",&lInvariantMassCompetingTwo); } //if ( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ) // lTreeMCFD->SetBranchAddress("fTreeVariableRapLambda",&lRap); //if ( fWhichParticle == "K0Short" ) // lTreeMCFD->SetBranchAddress("fTreeVariableRapK0Short",&lRap); lTreeMCFD->SetBranchAddress("fTreeVariableRapMC",&lRap); lTreeMCFD->SetBranchAddress("fTreeVariableLeastNbrCrossedRows",&lLeastNbrCrossedRows); lTreeMCFD->SetBranchAddress("fTreeVariableLeastRatioCrossedRowsOverFindable",&lLeastNbrCrossedRowsOverFindable); //--- Topological selection variables ----------------------------- lTreeMCFD->SetBranchAddress("fTreeVariableV0Radius",&lV0Radius); lTreeMCFD->SetBranchAddress("fTreeVariableDcaNegToPrimVertex",&lDcaNegToPrimVertex); lTreeMCFD->SetBranchAddress("fTreeVariableDcaPosToPrimVertex",&lDcaPosToPrimVertex); lTreeMCFD->SetBranchAddress("fTreeVariableDcaV0Daughters",&lDcaV0Daughters); lTreeMCFD->SetBranchAddress("fTreeVariableV0CosineOfPointingAngle",&lV0CosinePointingAngle); lTreeMCFD->SetBranchAddress("fTreeVariableDistOverTotMom",&lDistOverTotMom); //---- Extra Information Available in MC only -------------------- lTreeMCFD->SetBranchAddress("fTreeVariableNegTransvMomentumMC",&lNegTransvMomentumMC); lTreeMCFD->SetBranchAddress("fTreeVariablePosTransvMomentumMC",&lPosTransvMomentumMC); lTreeMCFD->SetBranchAddress("fTreeVariablePID",&lPID); lTreeMCFD->SetBranchAddress("fTreeVariablePIDMother",&lPIDMother); lTreeMCFD->SetBranchAddress("fTreeVariablePIDPositive",&lPIDPositive); lTreeMCFD->SetBranchAddress("fTreeVariablePIDNegative",&lPIDNegative); //---- Multiplicity info ------------------------------------------- lTreeMCFD->SetBranchAddress("fTreeVariableMultiplicity",&lMultiplicity); //--- Armenteros-Podolansky ---------------------------------------- lTreeMCFD->SetBranchAddress("fTreeVariableAlphaV0",&lArmAlpha); lTreeMCFD->SetBranchAddress("fTreeVariablePtArmV0",&lArmPt); //================================================================ //================================================================ // Define Feeddown matrix Double_t lFeedDownMatrix [100][100]; // FeedDownMatrix [Lambda Bin][Xi Bin]; for(Int_t ilb = 0; ilb<100; ilb++){ for(Int_t ixb = 0; ixb<100; ixb++){ lFeedDownMatrix[ilb][ixb]=0; } } //Define Xi Binning Double_t xibinlimits[] = { 0.00, 0.20, 0.40, 0.60, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.70, 1.90, 2.20, 2.60, 3.10, 3.90, 4.90, 6.00, 7.20, 8.50 ,10.00, 12.00 }; Long_t xibinnumb = sizeof(xibinlimits)/sizeof(Double_t) - 1; TH1F* fHistPtXiReference = new TH1F("fHistPtXiReference","#Xi candidates uncorrected p_{T};p_{T} (GeV/c);Counts",xibinnumb,xibinlimits); //Feeddown: will use a double-coordinate system: // ( lambda bin, xi bin ) all the time! lWeAreAtBin = 0; // Lambda bin Int_t lWeAreAtXiBin = 0; // Xi Bin cout<<"--------------- MC Data File Loop, Feeddown -----------"<GetEntry(icand); if( icand % lOneTenthOfNCandidatesMCFD == 0 ) cout<<" Currently at candidate........: "<= fCutV0Radius && lDcaNegToPrimVertex >= fCutDCANegToPV && lDcaPosToPrimVertex >= fCutDCAPosToPV && lDcaV0Daughters <= fCutDCAV0Daughters && lV0CosinePointingAngle >= fCutV0CosPA && lParticleMass*lDistOverTotMom <= fCutProperLifetime && lLeastNbrCrossedRows >= fCutLeastNumberOfCrossedRows && lLeastNbrCrossedRowsOverFindable >= fCutLeastNumberOfCrossedRowsOverFindable && TMath::Abs(lInvariantMassCompetingOne - lCompetingParticleMass) > fCutCompetingV0Rejection && TMath::Abs(lInvariantMassCompetingTwo - lCompetingParticleMass) > fCutCompetingV0Rejection && ( fSpecialArmenterosCutK0s == kFALSE || ( fSpecialArmenterosCutK0s == kTRUE && lArmPt*5>TMath::Abs(lArmAlpha) ) ) && ( //perfect PID association, IsPhysicalPrimary association ( fWhichParticle == "Lambda" && lPID == 3122 //V0 is a Lambda && lPIDPositive == 2212 //Pos Daughter is p && lPIDNegative == -211 //Neg Daughter is pi- && (lPIDMother == 3312 || (lPIDMother == 3322 && fFDSwitch=="UseMCRatio") ) && lPrimaryStatusMother == 1 //Xi is actually a primary (should matter little) ) || ( fWhichParticle == "AntiLambda" && lPID == -3122 //V0 is an AntiLambda && lPIDPositive == 211 //Pos Daughter is pi+ && lPIDNegative == -2212 //Neg Daughter is antiproton && (lPIDMother ==-3312 || (lPIDMother ==-3322 && fFDSwitch=="UseMCRatio") ) && lPrimaryStatusMother == 1 //Xi is actually a primary (should matter little) ) ) && ( //Multiplicity Switch fPerformMultiplicityStudy == kFALSE || //No mult selection, or... (fPerformMultiplicityStudy == kTRUE && //inside mult bin lMultiplicity>=fLoMultBound && lMultiplicity<=fHiMultBound) ) ){ // Start Entry Loop lWeAreAtBin = fHistPt->FindBin(lPtMC)-1; if(lWeAreAtBin == -1) lWeAreAtBin = 99; //UnderFlow, special treatment lWeAreAtXiBin = fHistPtXiReference->FindBin(lPtMother)-1; if(lWeAreAtXiBin == -1) lWeAreAtXiBin = 99; //UnderFlow, special treatment //Populate Feeddown Matrix //cout<<" Populate at coordinates "<FindObject("f3dHistGenPtVsYVsMultXiMinus"); if (fWhichParticle == "AntiLambda" ) f3dHistGenPtVsYVsMultV0FeedDown = (TH3F*)v0listMCFD->FindObject("f3dHistGenPtVsYVsMultXiPlus"); TH1D *fHistDummyV0FeedDown = f3dHistGenPtVsYVsMultV0FeedDown->ProjectionX("fHistDummyV0FeedDown", f3dHistGenPtVsYVsMultV0FeedDown->GetYaxis()->FindBin(-fRapidityBoundary+1e-2), //avoid taking previous bin f3dHistGenPtVsYVsMultV0FeedDown->GetYaxis()->FindBin(+fRapidityBoundary-1e-2), //avoid taking next bin f3dHistGenPtVsYVsMultV0FeedDown->GetZaxis()->FindBin(-1), f3dHistGenPtVsYVsMultV0FeedDown->GetZaxis()->FindBin(101) ); TH1F *fHistMCCountbyptXiFeedDown = new TH1F("fHistMCCountbyptXiFeedDown","#Xi MC count;p_{T} (GeV/c);Counts",xibinnumb,xibinlimits); //Double_t temppt, y; --- declared before for(long i = 1; iGetNbinsX()+1;i++){ temppt = fHistDummyV0FeedDown->GetXaxis()->GetBinCenter(i); for(long filling = 0; fillingGetBinContent(i);filling++){ fHistMCCountbyptXiFeedDown->Fill(temppt); } } if(fWhichParticle == "Lambda") cout<<"--------------- Generated Xi- Dump ---------------------"< ["<GetBinContent(ipoint+1)<<" +/- "<GetBinContent(ipoint+1))<GetBinContent(ixb+1)!= 0 ){ //avoid div by zero lFeedDownEfficiency[ilb][ixb]=((double)(lFeedDownMatrix[ilb][ixb])) / ((double)( fHistMCCountbyptXiFeedDown->GetBinContent(ixb+1) )) ; lFeedDownEfficiencyError[ilb][ixb]=ErrorInRatio( ((double)(lFeedDownMatrix[ilb][ixb])), TMath::Sqrt((double)(lFeedDownMatrix[ilb][ixb])), ((double)( fHistMCCountbyptXiFeedDown->GetBinContent(ixb+1) )), TMath::Sqrt((double)( fHistMCCountbyptXiFeedDown->GetBinContent(ixb+1) )) ); }else{ lFeedDownEfficiency[ilb][ixb] = 0; lFeedDownEfficiencyError[ilb][ixb] = 0; } } } //Beware: the feeddown correction efficiency is computed with MC, //Which has the geant3/fluka problem. Thus, we actually geant3/fluka //correct the Feeddown efficiencies, too... for(Int_t ipoint = 0; ipointEval( lProtonMomentum[ipoint]->GetMean() ) ; lFeedDownEfficiencyGFCorrectedError[ipoint][ixb] = lFeedDownEfficiencyError[ipoint][ixb]/fitGeant3FlukaCorr->Eval( lProtonMomentum[ipoint]->GetMean() ) ; } } //Create FD TH2Fs for storing f2dFeedDownMatrix = new TH2F("f2dFeedDownMatrix","",fptbinnumb,fptbinlimits,xibinnumb,xibinlimits); f2dFeedDownEfficiency = new TH2F("f2dFeedDownEfficiency","",fptbinnumb,fptbinlimits,xibinnumb,xibinlimits); f2dFeedDownEfficiencyGFCorrected = new TH2F("f2dFeedDownEfficiencyGFCorrected","",fptbinnumb,fptbinlimits,xibinnumb,xibinlimits); f2dFeedDownMatrix->SetDirectory(0); f2dFeedDownEfficiency->SetDirectory(0); f2dFeedDownEfficiencyGFCorrected->SetDirectory(0); for(Int_t ilb = 0; ilbSetBinContent(ilb+1,ixb+1,lFeedDownMatrix[ilb][ixb]); f2dFeedDownEfficiency->SetBinContent(ilb+1,ixb+1,lFeedDownEfficiency[ilb][ixb]); f2dFeedDownEfficiency->SetBinError(ilb+1,ixb+1,lFeedDownEfficiencyError[ilb][ixb]); f2dFeedDownEfficiencyGFCorrected->SetBinContent(ilb+1,ixb+1,lFeedDownEfficiencyGFCorrected[ilb][ixb]); f2dFeedDownEfficiencyGFCorrected->SetBinError(ilb+1,ixb+1,lFeedDownEfficiencyGFCorrectedError[ilb][ixb]); } } Double_t lProducedXi[100]; TF1 *lLevyFitXiFeedDown = new TF1("LevyFitXiFeedDown",this ,&AliV0Module::MyLevyPtXi, 0.0,15,3, "AliV0Module","MyLevyPXi"); //Set Parameters Adequately, as in paper //FIXME: These are the 7TeV Xi- parameters!!! //FIXME: Use points vs fit function (should matter little if Xi- fit is good) if(fWhichParticle == "Lambda"){ lLevyFitXiFeedDown->SetParameter(0, 7.98e-03); lLevyFitXiFeedDown->SetParameter(1, 3.4429e-1); lLevyFitXiFeedDown->SetParameter(2, 1.0787e+1); } if(fWhichParticle == "AntiLambda"){ lLevyFitXiFeedDown->SetParameter(0, 7.79e-03); lLevyFitXiFeedDown->SetParameter(1, 3.3934e-1); lLevyFitXiFeedDown->SetParameter(2, 1.0428e+1); } //If you want me to double charged Xi feeddown, I'll do it here if( fFDSwitch == "DoubleChargedXi" ){ lLevyFitXiFeedDown->SetParameter(0, lLevyFitXiFeedDown->GetParameter(0)*2 ); } for(Int_t ixb = 0; ixbIntegral(xibinlimits[ixb],xibinlimits[ixb+1]); } if(fWhichParticle == "Lambda") cout<<"--------------- Generated Xi- Dump (real-corrected) ----"<SetDirectory(0); for(Int_t ilb = 0; ilbSetBinContent( ilb+1 , ((double)(lFeedDownToSubtract[ilb])) / ((double)(lSigRealV0[ilb]) ) ); fHistFeeddownSubtraction->SetBinError ( ilb+1 , ErrorInRatio( ((double)(lFeedDownToSubtract[ilb])), ((double)(lFeedDownToSubtractError[ilb])), ((double)(lSigRealV0[ilb]) ), ((double)(lSigErrRealV0[ilb]) ) ) ); } cout<<"--------------- FD Subtraction Fraction ----------------"< ["<GetBinContent(ilb+1)<<"\t+/-\t"<GetBinError(ilb+1)<Delete(); v0listMCFD->Delete(); delete v0listMCFD; fileMCFD->Close("R"); fileMCFD->Delete(); delete fileMCFD; cout< At this stage, everthing's just ready for the actual spectrum //---> computation to occur! Double_t lSpectrum[100]; Double_t lSpectrumError[100]; for(Int_t ibin=0;ibinSetBinContent( ibin+1, lSpectrum[ibin] ); fHistPtLambda->SetBinError ( ibin+1, lSpectrumError[ibin] ); } if(fWhichParticle == "AntiLambda" ){ fHistPtAntiLambda->SetBinContent( ibin+1, lSpectrum[ibin] ); fHistPtAntiLambda->SetBinError ( ibin+1, lSpectrumError[ibin] ); } if(fWhichParticle == "K0Short" ){ fHistPtK0Short->SetBinContent( ibin+1, lSpectrum[ibin] ); fHistPtK0Short->SetBinError ( ibin+1, lSpectrumError[ibin] ); } } //========================================================================= cout<<"--------------- Result Output --------------------------"< Writing information to "<IsOpen()){ cout<<"Error! Couldn't open file!"<SetFillColor(kWhite); cSigExtRange->SetLeftMargin(0.17); cSigExtRange->SetRightMargin(0.17); cSigExtRange->cd(); fHistSignalExtractionRange->SetFillColor(18); fHistSignalExtractionRange->SetMarkerStyle(20); if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ fHistSignalExtractionRange->GetYaxis()->SetRangeUser(1.115-0.08,1.115+0.08); } if( fWhichParticle == "K0Short" ){ fHistSignalExtractionRange->GetYaxis()->SetRangeUser(0.498-0.15,0.498+0.15); } fHistSignalExtractionRange->Draw("E2"); if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ fLDataUpper->Draw("same"); fLDataLower->Draw("same"); } if( fWhichParticle == "K0Short" ){ fKDataUpper->Draw("same"); fKDataLower->Draw("same"); } //Saving Invariant Mass Plots (real data) lResultsFile->cd(); TDirectoryFile *lInvMassReal = new TDirectoryFile("lInvMassReal","Invariant Mass Plots (Real Data)"); lInvMassReal->cd(); cSigExtRange->Write(); for(Int_t ibin = 0; ibin Write(); } TDirectoryFile *lInvMassRealRawData = new TDirectoryFile("lInvMassRealRawData","Objects for Inv Mass Plots (Real Data)"); lInvMassRealRawData->cd(); fHistSignalExtractionRange->Write(); fHistPeakPosition->Write(); fHistSigToNoise->Write(); for(Int_t ibin = 0; ibin Write(); fgausPt[ibin] -> Write(); if( fFitBackgroundSwitch ) lfitNoise[ibin] -> Write(); } if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ fLDataUpper->Write(); fLDataLower->Write(); } if( fWhichParticle == "K0Short" ){ fKDataUpper->Write(); fKDataLower->Write(); } //Saving Invariant Mass Plots (MC) lResultsFile->cd(); TDirectoryFile *lInvMassMC = new TDirectoryFile("lInvMassMC","Invariant Mass Plots (Monte Carlo)"); lInvMassMC->cd(); for(Int_t ibin = 0; ibin Write(); } TDirectoryFile *lInvMassMCRawData = new TDirectoryFile("lInvMassMCRawData","Objects for Inv Mass Plots (MC)"); lInvMassMCRawData->cd(); fHistPeakPositionMC->Write(); fHistSigToNoiseMC->Write(); f2dHistPtResolution->Write(); f2dHistPtBlur->Write(); f2dHistPtSharpen->Write(); for(Int_t ibin = 0; ibinWrite(); fgausPtMC[ibin] ->Write(); if( fFitBackgroundSwitch ) lfitNoiseMC[ibin] -> Write(); } //Saving Geant3/Fluka Correction Data (MC) if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ lResultsFile->cd(); TDirectoryFile *lGFCorrection = new TDirectoryFile("lGFCorrection","Geant3/Fluka Correction Histograms"); lGFCorrection->cd(); h1dPanosCorrections->Write(); fitGeant3FlukaCorr->Write(); for(Int_t ibin = 0; ibinWrite(); } } //Saving Feeddown Correction information, if needed if( (fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda")&&fFDSwitch!="NoFD" ){ lResultsFile->cd(); TDirectoryFile *lFeeddown = new TDirectoryFile("lFeeddown","Feeddown Subtraction Information"); lFeeddown->cd(); f2dFeedDownMatrix->Write(); f2dFeedDownEfficiency->Write(); f2dFeedDownEfficiencyGFCorrected->Write(); fHistFeeddownSubtraction->Write(); } //Saving Resolution Information //preparing... for(Int_t ibin=0; ibinSetBinContent(ibin+1,lHistResolution[ibin]->GetMean()); fHistResolutionVsPt->SetBinError(ibin+1,lHistResolution[ibin]->GetRMS()); fHistResolutionVsPtDivByBinWidth->SetBinContent(ibin+1,lHistResolution[ibin]->GetMean() / (fptbinlimits[ibin+1]-fptbinlimits[ibin]) ); fHistResolutionVsPtDivByBinWidth->SetBinError(ibin+1,lHistResolution[ibin]->GetRMS() / (fptbinlimits[ibin+1]-fptbinlimits[ibin]) ); fHistResolutionVsPtWithGaussians->SetBinContent(ibin+1,lHistResolutionGaussian[ibin]->GetParameter(1)); fHistResolutionVsPtWithGaussians->SetBinError(ibin+1,lHistResolutionGaussian[ibin]->GetParameter(2)); fHistResolutionVsPtDivByBinWidthWithGaussians->SetBinContent(ibin+1,lHistResolutionGaussian[ibin]->GetParameter(1) / (fptbinlimits[ibin+1]-fptbinlimits[ibin]) ); fHistResolutionVsPtDivByBinWidthWithGaussians->SetBinError(ibin+1,lHistResolutionGaussian[ibin]->GetParameter(2) / (fptbinlimits[ibin+1]-fptbinlimits[ibin]) ); } lResultsFile->cd(); TDirectoryFile *lDirResolution = new TDirectoryFile("lInfoResolution","Resolution Information"); lDirResolution->cd(); fHistResolutionVsPt->Write(); fHistResolutionVsPtDivByBinWidth->Write(); fHistResolutionVsPtWithGaussians->Write(); fHistResolutionVsPtDivByBinWidthWithGaussians->Write(); for(Int_t ibin = 0; ibinWrite(); lHistResolutionGaussian[ibin]->Write(); } lResultsFile->cd(); if( fWhichParticle == "K0Short") fHistPureEfficiency->Write(); if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ fHistPureEfficiency->Write(); fHistEfficiency->Write(); } if(fWhichParticle == "Lambda" ){ fHistPtLambda -> Write(); } if(fWhichParticle == "AntiLambda" ){ fHistPtAntiLambda -> Write(); } if(fWhichParticle == "K0Short" ){ fHistPtK0Short -> Write(); } lResultsFile->Write(); lResultsFile->Close(); delete lResultsFile; //================================================ //Manual Cleanup of all created Histograms //================================================ // needed if you want to re-run the whole thing without // memory leaks (systematics, etc) //switch on if you want large amounts of printout Bool_t lDebugCleaningProcess = kFALSE; if (lDebugCleaningProcess) cout<<"fHistPt->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fHistPeakPosition->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fHistPeakPositionMC->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fHistSigToNoise->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fHistSigToNoiseMC->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fHistSignalExtractionRange->Delete()"<Delete(); if (lDebugCleaningProcess) cout<<"fKData*->Delete()"<Delete(); fKDataLower->Delete(); fLDataUpper->Delete(); fLDataLower->Delete(); if(lDebugCleaningProcess) cout<<"f2dHistPtResolution->Delete()"<Delete(); if(lDebugCleaningProcess) cout<<"lfitNoise*[*]->Delete(); lSampleNoise*[*]->Delete()"< Delete(); lSampleNoise[i] -> Delete(); lfitNoiseMC[i] -> Delete(); lSampleNoiseMC[i] -> Delete(); } } //pt-by-pt histos fHistResolutionVsPt->Delete(); fHistResolutionVsPtDivByBinWidth->Delete(); fHistResolutionVsPtWithGaussians->Delete(); fHistResolutionVsPtDivByBinWidthWithGaussians->Delete(); f2dHistPtBlur->Delete(); f2dHistPtSharpen->Delete(); if (lDebugCleaningProcess) cout<<"lHistoFullV0*[*]->Delete()"<Delete(); lHistoFullV0MC[ihist]->Delete(); lHistResolution[ihist]->Delete(); lHistResolutionGaussian[ihist]->Delete(); } if (lDebugCleaningProcess) cout<<"lLine*[*]->Delete()"<Delete(); lLineLeft[ibin] ->Delete(); lLineRight[ibin] ->Delete(); lLineRightMost[ibin]->Delete(); lLineLeftMostMC[ibin] ->Delete(); lLineLeftMC[ibin] ->Delete(); lLineRightMC[ibin] ->Delete(); lLineRightMostMC[ibin]->Delete(); if ( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ fgausPt[ibin]->Delete(); fgausPtMC[ibin]->Delete(); } if ( fWhichParticle == "K0Short"){ fgausPt[ibin]->Delete(); fgausPtMC[ibin]->Delete(); } } if (lDebugCleaningProcess) cout<<"lCanvasHistoFullV0*[*]->Delete()"<Close(); lCanvasHistoFullV0MC[ihist]->Close(); delete lCanvasHistoFullV0[ihist]; delete lCanvasHistoFullV0MC[ihist]; } if (lDebugCleaningProcess) cout<<"cSigExtRange->Delete()"<Close(); delete cSigExtRange; if (lDebugCleaningProcess) cout<<"lProtonMomentum[*]->Delete()"<Delete(); } if (lDebugCleaningProcess) cout<<"fHist*Efficiency->Delete()"<Delete(); fHistEfficiency->Delete(); //data for G3/F, continued if( fWhichParticle == "Lambda" || fWhichParticle == "AntiLambda" ){ h1dPanosCorrections->Delete(); fitGeant3FlukaCorr->Delete(); } //histograms, feeddown if (lDebugCleaningProcess) cout<<"f2dFeedDown*->Delete()"<Delete(); //fHistMCCountbyptXiFeedDown->Delete(); f2dFeedDownMatrix->Delete(); f2dFeedDownEfficiency->Delete(); f2dFeedDownEfficiencyGFCorrected->Delete(); fHistFeeddownSubtraction->Delete(); } if (lDebugCleaningProcess) cout<<"fHistPt*->Delete()"<Delete(); fHistPtAntiLambda->Delete(); fHistPtK0Short->Delete(); //Exit Batch Mode gROOT->SetBatch (kFALSE); cout<<"--------------------------------------------------------"<