Bugfix in event mixing, addition of some features in output
authorpulvir <pulvir@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 31 Aug 2011 14:11:04 +0000 (14:11 +0000)
committerpulvir <pulvir@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 31 Aug 2011 14:11:04 +0000 (14:11 +0000)
PWG2/RESONANCES/AliRsnMiniAnalysisTask.cxx
PWG2/RESONANCES/AliRsnMiniEvent.h
PWG2/RESONANCES/AliRsnMiniMonitor.cxx
PWG2/RESONANCES/AliRsnMiniMonitor.h
PWG2/RESONANCES/AliRsnMiniOutput.cxx
PWG2/RESONANCES/AliRsnMiniOutput.h

index ba5c0ca..033aae6 100644 (file)
@@ -213,7 +213,7 @@ void AliRsnMiniAnalysisTask::UserCreateOutputObjects()
 //
 
    // reset counter
-   fEvNum = 0;
+   fEvNum = -1;
    
    // message
    AliInfo(Form("Selected event characterization: %s (%s)", (fUseCentrality ? "centrality" : "multiplicity"), fCentralityType.Data()));
@@ -270,9 +270,9 @@ void AliRsnMiniAnalysisTask::UserExec(Option_t *)
 // The real histogram filling is done at the end, in "FinishTaskOutput".
 //
 
-   // event counter
+   // increment event counter
    fEvNum++;
-   
+
    // check current event
    Char_t check = CheckCurrentEvent();
    if (!check) return;
@@ -295,8 +295,15 @@ void AliRsnMiniAnalysisTask::UserExec(Option_t *)
          FillTrueMotherAOD(fMiniEvent);
    }
    
-   // store event
-   fEvBuffer->Fill();
+   // if the event is not empty, store it
+   if (fMiniEvent->IsEmpty()) {
+      AliDebugClass(2, Form("Rejecting empty event #%d", fEvNum));
+   } else {
+      Int_t id = fEvBuffer->GetEntries();
+      AliDebugClass(2, Form("Adding event #%d with ID = %d", fEvNum, id));
+      fMiniEvent->ID() = id;
+      fEvBuffer->Fill();
+   }
    
    // post data for computed stuff
    PostData(1, fOutput);
@@ -337,24 +344,24 @@ void AliRsnMiniAnalysisTask::FinishTaskOutput()
          // execute computation in the appropriate way
          switch (compType) {
             case AliRsnMiniOutput::kEventOnly:
-               AliDebugClass(1, Form("Event %d, def '%s': event-value histogram filling", ievt, def->GetName()));
+               //AliDebugClass(1, Form("Event %d, def '%s': event-value histogram filling", ievt, def->GetName()));
                ifill = 1;
                def->FillEvent(fMiniEvent, &fValues);
                break;
             case AliRsnMiniOutput::kTruePair:
-               AliDebugClass(1, Form("Event %d, def '%s': true-pair histogram filling", ievt, def->GetName()));
+               //AliDebugClass(1, Form("Event %d, def '%s': true-pair histogram filling", ievt, def->GetName()));
                ifill = def->FillPair(fMiniEvent, fMiniEvent, &fValues);
                break;
             case AliRsnMiniOutput::kTrackPair:
-               AliDebugClass(1, Form("Event %d, def '%s': pair-value histogram filling", ievt, def->GetName()));
+               //AliDebugClass(1, Form("Event %d, def '%s': pair-value histogram filling", ievt, def->GetName()));
                ifill = def->FillPair(fMiniEvent, fMiniEvent, &fValues);
                break;
             case AliRsnMiniOutput::kTrackPairRotated1:
-               AliDebugClass(1, Form("Event %d, def '%s': rotated (1) background histogram filling", ievt, def->GetName()));
+               //AliDebugClass(1, Form("Event %d, def '%s': rotated (1) background histogram filling", ievt, def->GetName()));
                ifill = def->FillPair(fMiniEvent, fMiniEvent, &fValues);
                break;
             case AliRsnMiniOutput::kTrackPairRotated2:
-               AliDebugClass(1, Form("Event %d, def '%s': rotated (2) background histogram filling", ievt, def->GetName()));
+               //AliDebugClass(1, Form("Event %d, def '%s': rotated (2) background histogram filling", ievt, def->GetName()));
                ifill = def->FillPair(fMiniEvent, fMiniEvent, &fValues);
                break;
             default:
@@ -375,14 +382,16 @@ void AliRsnMiniAnalysisTask::FinishTaskOutput()
    }
    
    // initialize mixing counter
-   TString *matched = new TString[nEvents];
+   Int_t    nmatched[nEvents];
+   TString *smatched = new TString[nEvents];
    for (ievt = 0; ievt < nEvents; ievt++) {
-      matched[ievt] = "|";
+      smatched[ievt] = "|";
+      nmatched[ievt] = 0;
    }
    
    // search for good matchings
    for (ievt = 0; ievt < nEvents; ievt++) {
-      ifill = 0;
+      if (nmatched[ievt] >= fNMix) continue;
       fEvBuffer->GetEntry(ievt);
       AliRsnMiniEvent evMain(*fMiniEvent);
       for (iloop = 1; iloop < nEvents; iloop++) {
@@ -394,13 +403,16 @@ void AliRsnMiniAnalysisTask::FinishTaskOutput()
          // skip if events are not matched
          if (!EventsMatch(&evMain, fMiniEvent)) continue;
          // check that the array of good matches for mixed does not already contain main event
-         if (matched[imix].Contains(Form("|%d|", ievt))) continue;
+         if (smatched[imix].Contains(Form("|%d|", ievt))) continue;
+         // check that the found good events has not enough matches already
+         if (nmatched[imix] >= fNMix) continue;
          // add new mixing candidate
-         matched[ievt].Append(Form("%d|", imix));
-         ifill++;
-         if (ifill >= fNMix) break;
+         smatched[ievt].Append(Form("%d|", imix));
+         nmatched[ievt]++;
+         nmatched[imix]++;
+         if (nmatched[ievt] >= fNMix) break;
       }
-      AliDebugClass(1, Form("Matches for event %5d = %s", ievt, matched[ievt].Data()));
+      AliDebugClass(1, Form("Matches for event %5d = %d [%s] (missing are declared above)", evMain.ID(), nmatched[ievt], smatched[ievt].Data()));
    }
    
    // perform mixing
@@ -410,7 +422,7 @@ void AliRsnMiniAnalysisTask::FinishTaskOutput()
       ifill = 0;
       fEvBuffer->GetEntry(ievt);
       AliRsnMiniEvent evMain(*fMiniEvent);
-      list = matched[ievt].Tokenize("|");
+      list = smatched[ievt].Tokenize("|");
       TObjArrayIter next(list);
       while ( (os = (TObjString*)next()) ) {
          imix = os->GetString().Atoi();
@@ -420,13 +432,16 @@ void AliRsnMiniAnalysisTask::FinishTaskOutput()
             if (!def) continue;
             if (!def->IsTrackPairMix()) continue;
             ifill += def->FillPair(&evMain, fMiniEvent, &fValues, kTRUE);
-            if (!def->IsSymmetric()) ifill += def->FillPair(fMiniEvent, &evMain, &fValues, kFALSE);
+            if (!def->IsSymmetric()) {
+               AliDebugClass(2, "Reflecting non symmetric pair");
+               ifill += def->FillPair(fMiniEvent, &evMain, &fValues, kFALSE);
+            }
          }
       }
       delete list;
    }
    
-   delete [] matched;
+   delete [] smatched;
       
    /*
    OLD   
@@ -606,7 +621,7 @@ Char_t AliRsnMiniAnalysisTask::CheckCurrentEvent()
    }
    
    // if the above exit point is not taken, the event is accepted
-   AliDebugClass(2, Form("Stats for event %d: %s", fEvNum, msg.Data()));
+   AliDebugClass(2, Form("Stats: %s", msg.Data()));
    if (isSelected) {
       fHEventStat->Fill(3.1);
       return output;
@@ -626,7 +641,6 @@ void AliRsnMiniAnalysisTask::FillMiniEvent(Char_t evType)
    // assign event-related values
    if (fMiniEvent) delete fMiniEvent;
    fMiniEvent = new AliRsnMiniEvent;
-   fMiniEvent->ID()    = fEvNum;
    fMiniEvent->Vz()    = fInputEvent->GetPrimaryVertex()->GetZ();
    fMiniEvent->Angle() = ComputeAngle();
    fMiniEvent->Mult()  = ComputeCentrality((evType == 'E'));
@@ -846,11 +860,24 @@ Bool_t AliRsnMiniAnalysisTask::EventsMatch(AliRsnMiniEvent *event1, AliRsnMiniEv
 
    if (!event1 || !event2) return kFALSE;
    Int_t ivz1, ivz2, imult1, imult2, iangle1, iangle2;
+   Double_t dv, dm, da;
    
    if (fContinuousMix) {
-      if (TMath::Abs(event1->Vz()    - event2->Vz()   ) > fMaxDiffVz   ) return kFALSE;
-      if (TMath::Abs(event1->Mult()  - event2->Mult() ) > fMaxDiffMult ) return kFALSE;
-      if (TMath::Abs(event1->Angle() - event2->Angle()) > fMaxDiffAngle) return kFALSE;
+      dv = TMath::Abs(event1->Vz()    - event2->Vz()   );
+      dm = TMath::Abs(event1->Mult()  - event2->Mult() );
+      da = TMath::Abs(event1->Angle() - event2->Angle());
+      if (dv > fMaxDiffVz) {
+         //AliDebugClass(2, Form("Events #%4d and #%4d don't match due to a too large diff in Vz = %f", event1->ID(), event2->ID(), dv));
+         return kFALSE;
+      }
+      if (dm > fMaxDiffMult ) {
+         //AliDebugClass(2, Form("Events #%4d and #%4d don't match due to a too large diff in Mult = %f", event1->ID(), event2->ID(), dm));
+         return kFALSE;
+      }
+      if (da > fMaxDiffAngle) {
+         //AliDebugClass(2, Form("Events #%4d and #%4d don't match due to a too large diff in Angle = %f", event1->ID(), event2->ID(), da));
+         return kFALSE;
+      }
       return kTRUE;
    } else {
       ivz1 = (Int_t)(event1->Vz() / fMaxDiffVz);
index 1ebb3f1..f6fdfc6 100644 (file)
@@ -24,6 +24,7 @@ public:
    Float_t&            Mult()      {return fMult;}
    Float_t&            Angle()     {return fAngle;}
    TClonesArray&       Particles() {return fParticles;}
+   Bool_t              IsEmpty()   {return fParticles.IsEmpty();}
    
    TArrayI             CountParticles(Char_t charge = 0, Int_t cutID = -1);
    AliRsnMiniParticle* GetParticle(Int_t i);
index 20c6d88..0b02864 100644 (file)
@@ -59,6 +59,7 @@ AliRsnMiniMonitor::AliRsnMiniMonitor() :
    TNamed(), 
    fType(kTypes), 
    fCutID(-1), 
+   fCharge(0),
    fListID(-1), 
    fList(0x0)
 {
@@ -72,6 +73,7 @@ AliRsnMiniMonitor::AliRsnMiniMonitor(const char *name, EType type, Int_t cutID)
    TNamed(name, ""), 
    fType(type), 
    fCutID(cutID), 
+   fCharge(0),
    fListID(-1), 
    fList(0x0)
 {
@@ -85,6 +87,7 @@ AliRsnMiniMonitor::AliRsnMiniMonitor(const AliRsnMiniMonitor& copy) :
    TNamed(copy), 
    fType(copy.fType), 
    fCutID(copy.fCutID), 
+   fCharge(copy.fCharge),
    fListID(copy.fListID), 
    fList(copy.fList)
 {
@@ -103,6 +106,7 @@ AliRsnMiniMonitor& AliRsnMiniMonitor::operator=(const AliRsnMiniMonitor& copy)
    TNamed::operator=(copy); 
    fType = copy.fType; 
    fCutID = copy.fCutID; 
+   fCharge = copy.fCharge;
    fListID = copy.fListID; 
    fList = copy.fList; 
    
@@ -132,6 +136,11 @@ Bool_t AliRsnMiniMonitor::Init(const char *name, TList *list)
    TH1 *histogram = 0x0;
 
    switch (fType) {
+      case kTrackPt:
+         sname += "_TrackPt_cut";
+         sname += fCutID;
+         histogram = new TH1F(sname.Data(), "", 100, 0.0, 10.0);
+         break;
       case kdEdxTPCvsP: 
          sname += "_TPCsignal";
          histogram = new TH2F(sname.Data(), "", 500, 0.0, 5.0, 1000, 0.0, 1000.0);
@@ -187,6 +196,17 @@ Bool_t AliRsnMiniMonitor::Fill(AliRsnDaughter *track, AliRsnEvent *event)
    AliPIDResponse *pid = event->GetPIDResponse();
 
    switch (fType) {
+      case kTrackPt: 
+         if (!vtrack) {
+            AliWarning("Required vtrack for this value");
+            return kFALSE;
+         }
+         if (fCharge == '+' && vtrack->Charge() <= 0) return kFALSE;
+         if (fCharge == '-' && vtrack->Charge() >= 0) return kFALSE;
+         if (fCharge == '0' && vtrack->Charge() != 0) return kFALSE;
+         valueX = vtrack->Pt();
+         ((TH1F*)obj)->Fill(valueX);
+         return kTRUE;
       case kdEdxTPCvsP: 
          if (!vtrack) {
             AliWarning("Required vtrack for this value");
index 8433c12..686ef6a 100644 (file)
@@ -19,6 +19,7 @@ class AliRsnMiniMonitor : public TNamed {
 public:
 
    enum EType {
+      kTrackPt,           // pt spectrum of single tracks with a given cut ID and charge
       kdEdxTPCvsP,        // TPC signal vs. momentum
       ktimeTOFvsPKaon,    // TOF time vs. momentum
       ktimeTOFvsPPion,    // TOF time vs. momentum
@@ -34,10 +35,12 @@ public:
 
    EType              GetType()   {return fType;}
    Int_t              GetCutID()  {return fCutID;}
+   Char_t             GetCharge() {return fCharge;}
    Int_t              GetListID() {return fListID;}
    
    void               SetType(EType type)  {fType = type;}
    void               SetCutID(Int_t id)   {fCutID = id;}
+   void               SetCharge(Char_t ch) {fCharge = ch;}
 
    static const char* Label(EType type); 
    Bool_t             Init(const char *name, TList *list);
@@ -47,6 +50,7 @@ protected:
 
    EType      fType;     //  monitor type
    Int_t      fCutID;    //  ID for cut to be used
+   Char_t     fCharge;   //  charge to be used
    Int_t      fListID;   //  histogram ID in the list
    TList     *fList;     //! global output list
                                        
index 90e9b15..a6ea67b 100644 (file)
@@ -484,12 +484,7 @@ Int_t AliRsnMiniOutput::FillPair(AliRsnMiniEvent *event1, AliRsnMiniEvent *event
          }
          // check pair against cuts
          if (fPairCuts) {
-            if (!fPairCuts->IsSelected(&fPair)) {
-               AliDebugClass(2, Form("Pair rapidity = %f --> too large", fPair.Y(0)));
-               continue;
-            } else {
-               AliDebugClass(2, Form("Pair rapidity = %f --> ok", fPair.Y(0)));
-            }
+            if (!fPairCuts->IsSelected(&fPair)) continue;
          }
          // get computed values & fill histogram
          nadded++;
index 75c31e2..21607c3 100644 (file)
@@ -59,7 +59,9 @@ public:
    Bool_t          IsDefined()          const {return (IsEventOnly() || IsTrackPair() || IsTrackPairMix() || IsTruePair() || IsMother());}
    Bool_t          IsLikeSign()         const {return (fCharge[0] == fCharge[1]);}
    Bool_t          IsSameCut()          const {return (fCutID[0] == fCutID[1]);}
-   Bool_t          IsSymmetric()        const {return (IsLikeSign() && IsSameCut());}
+   Bool_t          IsSameDaughter()     const {return (fDaughter[0] == fDaughter[1]);}
+   //Bool_t          IsSymmetric()        const {return (IsLikeSign() && IsSameCut());}
+   Bool_t          IsSymmetric()        const {return (IsLikeSign() && IsSameDaughter());}
                                         
    EOutputType     GetOutputType()      const {return fOutputType;}
    EComputation    GetComputation()     const {return fComputation;}