void KVGVList::CalculateGlobalVariables(KVEvent* e) { // This method will calculate all global variables defined in the list for the event 'e'. // - all 1-body variables will be calculated in a single loop over the particles; // - all 2-body variables will be calculated in a single loop over particle pairs; // - all N-body variables will be calculated // 1st step: Reset global variables Reset(); //2nd step: loop over accepted particles // and fill global variables KVNucleus* n1 = 0; // calculate 1-body variables if (Has1BodyVariables()) { while ((n1 = e->GetNextParticle("ok"))) { Fill(n1); } } KVNucleus* n2 = 0; // calculate 2-body variables // we use every pair of particles (including identical pairs) in the event if (Has2BodyVariables()) { Int_t N = e->GetMult(); for (int i1 = 1; i1 <= N ; i1++) { for (int i2 = 1 ; i2 <= N ; i2++) { n1 = e->GetParticle(i1); n2 = e->GetParticle(i2); if (n1->IsOK() && n2->IsOK()) Fill2(n1, n2); } } } // calculate N-body variables if (HasNBodyVariables()) FillN(e); }
int main(int argc, char**argv) { FILE *fIn; TFile *fOut; struct pre_event_struct *event; struct event_struct *Evt; struct event_struct *EvtOld; int GEvtCnt; int i, j, irc; long long tbegin, tsum; int EvWin; time_t systime; int Cnt[20]; const char *CntName[20] = {"Events read", "Time defined", "In diff time cut", "In energy cuts", "Global events", "Global events+2", "Global events+3", "Veto", "Full selection", "", "", "", "", "", "", "", "", "", "", ""}; Evt = NULL; event = NULL; fIn = NULL; fOut = NULL; tsum = 0; memset(Cnt, 0, sizeof(Cnt)); memset(Hist.obj, 0, sizeof(Hist)); if (ReadMap("danss_map.txt")) return 10; // Initializing files and memory if (argc < 2) { printf("Usage: ./danal2 file.rdat ...\n"); return 20; } printf("%d files requested\n", argc - 1); fOut = OpenRootFile(argv[1]); if (!fOut->IsOpen()) { printf("Can not open output root file for %s\n", argv[1]); goto fin; } Evt = (struct event_struct *) malloc(EESIZE); EvtOld = (struct event_struct *) malloc(EESIZE); event = (struct pre_event_struct *) malloc(ESIZE); if (!event || !Evt || !EvtOld) { printf("Allocation failure: %m\n"); goto fin; } // Book histogramms and trees BookHist(); for (j=1; j<argc; j++) { GEvtCnt = 0; fIn = fopen(argv[j], "rb"); if (!fIn) { printf("Can not open input file %s: %m\n", argv[j]); continue; } EvtOld->gtime = -125000000; tbegin = -1; EvWin = 0; for(;!feof(fIn);) { irc = fread(event, sizeof(int), 1, fIn); if (irc != 1) break; if (event->len > ESIZE || event->len < sizeof(struct pre_event_struct)) { printf("Odd block size: %d\n", event->len); break; } irc = fread(&event->systime, event->len - sizeof(int), 1, fIn); if (irc != 1) { printf("Unexpected EOF - %m\n"); break; } systime = event->systime; if (tbegin < 0) { printf("File %s. Start: %s", argv[j], ctime(&systime)); tbegin = event->gtime; } Cnt[0]++; memset(Evt, 0, sizeof(struct event_struct)); Evt->t = FindEventTime(event); if (Evt->t < 0) continue; Cnt[1]++; FilterAndCopy(Evt, event); CalculateEventParameters(Evt); Hist.h.hT[0]->Fill((Evt->gtime - EvtOld->gtime) / FREQ); Hist.h.hEN[0]->Fill(Evt->ns, Evt->es); Hist.h.hESEP[0]->Fill(Evt->es, Evt->ep); FillXYZ(Evt, 0); Hist.h.hV->Fill(Evt->ev); Hist.h.mXZ[0]->Fill(Evt->x, Evt->z); Hist.h.mYZ[0]->Fill(99-Evt->y, Evt->z); if (Evt->ev >= VETOEMIN || Evt->nv >= VETONMIN) { Cnt[7]++; continue; } if (Evt->gtime - EvtOld->gtime <= MAXTDIFF * FREQ) { Cnt[2]++; if (Evt->ep > E2MIN && Evt->es > E2MIN) { Cnt[3]++; switch (EvWin) { case 0: Hist.h.hT[1]->Fill((Evt->gtime - EvtOld->gtime) / FREQ); Hist.h.hEN[1]->Fill(EvtOld->ns, EvtOld->es); Hist.h.hESEP[1]->Fill(EvtOld->es, EvtOld->ep); Hist.h.mXZ[1]->Fill(EvtOld->x, EvtOld->z); Hist.h.mYZ[1]->Fill(99-EvtOld->y, EvtOld->z); FillXYZ(EvtOld, 1); Hist.h.hEN[2]->Fill(Evt->ns, Evt->es); Hist.h.hESEP[2]->Fill(Evt->es, Evt->ep); FillXYZ(Evt, 2); Hist.h.mXZ[2]->Fill(Evt->x, Evt->z); Hist.h.mYZ[2]->Fill(99-Evt->y, Evt->z); FillN(event, Evt->t, 0); FillR(Evt, EvtOld); Hist.h.hE->Fill(EvtOld->ee); Hist.h.hNG->Fill(EvtOld->ng); Hist.h.hNC->Fill(EvtOld->nc); FillEMaxN(Evt); Cnt[4]++; GEvtCnt++; if (FinalSelection(Evt, EvtOld)) { Hist.h.hEE->Fill(EvtOld->ee); Hist.h.hNE->Fill(Evt->en); Hist.h.hNR->Fill(Evt->rn); Cnt[8]++; } break; case 1: Hist.h.hT[2]->Fill((Evt->gtime - EvtOld->gtime) / FREQ); Hist.h.hEN[3]->Fill(Evt->ns, Evt->es); Hist.h.hESEP[3]->Fill(Evt->es, Evt->ep); FillXYZ(Evt, 3); Hist.h.mXZ[3]->Fill(Evt->x, Evt->z); Hist.h.mYZ[3]->Fill(99-Evt->y, Evt->z); FillN(event, Evt->t, 1); Cnt[5]++; break; case 2: Hist.h.hT[3]->Fill((Evt->gtime - EvtOld->gtime) / FREQ); Hist.h.hEN[4]->Fill(Evt->ns, Evt->es); Hist.h.hESEP[4]->Fill(Evt->es, Evt->ep); FillXYZ(Evt, 4); Hist.h.mXZ[4]->Fill(Evt->x, Evt->z); Hist.h.mYZ[4]->Fill(99-Evt->y, Evt->z); FillN(event, Evt->t, 2); Cnt[6]++; break; } EvWin++; } } else { TryAsPositron(Evt); if (Evt->ep > E1MIN && Evt->es > E1MIN && Evt->ee > E1MIN) memcpy(EvtOld, Evt, EESIZE); Hist.h.hM->Fill(1.0 * EvWin); EvWin = 0; } } printf("%d events. End: %s", GEvtCnt, ctime(&systime)); tsum += event->gtime - tbegin; fclose(fIn); } printf("Total time %f s.\n", tsum / (FREQ*1000000.0)); printf("Counters:\n"); for (i = 0; i < sizeof(Cnt)/sizeof(Cnt[0]); i++) if (Cnt[i]) printf("%50s: %10d\n", CntName[i], Cnt[i]); for (i = 0; i< sizeof(Hist) / sizeof(Hist.obj[0]); i++) if (Hist.obj[i]) { Hist.obj[i]->Write(); delete Hist.obj[i]; } fin: if (event) free(event); if (Evt) free(Evt); if (EvtOld) free(EvtOld); if (fOut && fOut->IsOpen()) { fOut->Close(); delete fOut; } return 0; }