19 #include <TSQLServer.h> 20 #include <TSQLResult.h> 21 #include <TSQLStatement.h> 53 gStyle->SetTimeOffset(0);
55 Int_t apply_runlen = 1;
56 Int_t apply_empty = 1;
64 Double_t run_len = 1.00;
65 Double_t hits_up = 23.0;
66 Double_t hits_down = 13.0;
67 Double_t PixelsPerFEB = 26;
68 Double_t FEBsPerDCM = 56;
69 Double_t DCMsPerDB = 12;
70 Double_t MaxTopSideAsym = 0.5;
71 Double_t MinTopSideAsym = 0.1;
72 Double_t MinGoodDB = 2;
73 Double_t empty_cut = 100.0;
74 Double_t MaxTrkFrac2D = 0.15;
75 Double_t MinNumSlc = 1.2;
76 Double_t MaxNumSlc = 3.2;
80 float lowpixmip[7] = {13, 5, 4, 4, 2, 2, 1.5};
81 float highpixmip[7] = {31, 45, 36, 30, 26, 23, 20.};
83 float lowfebmip[7] = {400, 300, 200, 200, 100, 100, 100};
84 float highfebmip[7] = {1000, 1200, 1000, 850, 700, 600, 550};
91 procfile.open(
"listProcessedTemp.txt");
107 TFile *
outfile =
new TFile(
"MetricsNew.root",
"recreate");
110 TTree *
mytree =
new TTree(
"evts",
"");
111 mytree->Branch(
"run",&run,
"run/I");
112 mytree->Branch(
"subrun",&subrun,
"subrun/I");
113 mytree->Branch(
"par",&par,
"par/I");
114 mytree->Branch(
"nevents",&nevents,
"nevents/I");
115 mytree->Branch(
"firstsec",&firstsec,
"firstsec/I");
116 mytree->Branch(
"lastsec",&lastsec,
"lastsec/I");
117 mytree->Branch(
"ngoodpix",&ngoodpix,
"ngoodpix/I");
118 mytree->Branch(
"ngoodfeb",&ngoodfeb,
"ngoodfeb/I");
119 mytree->Branch(
"ngooddcm",&ngooddcm,
"ngooddcm/I");
120 mytree->Branch(
"ngooddb",&ngooddb,
"ngooddb/I");
121 mytree->Branch(
"ngoodmip",&ngoodmip,
"ngoodmip/I");
122 mytree->Branch(
"ngoodcdb",&ngoodcdb,
"ngoodcdb/I");
123 mytree->Branch(
"nactivefeb",&nactivefeb,
"nactivefeb/I");
124 mytree->Branch(
"nactivedcm",&nactivedcm,
"nactivedcm/I");
125 mytree->Branch(
"nactivedb",&nactivedb,
"nactivedb/I");
126 mytree->Branch(
"pass_runlen",&pass_runlen,
"pass_runlen/I");
127 mytree->Branch(
"pass_empty",&pass_empty,
"pass_empty/I");
128 mytree->Branch(
"pass_hits",&pass_hits,
"pass_hits/I");
129 mytree->Branch(
"pass_db",&pass_db,
"pass_db/I");
130 mytree->Branch(
"pass_time",&pass_time,
"pass_time/I");
131 mytree->Branch(
"pass_all",&pass_all,
"pass_all/I");
132 mytree->Branch(
"setsize",&setsize,
"setsize/I");
133 mytree->Branch(
"rectimesec",&rectimesec,
"rectimesec/D");
134 mytree->Branch(
"setlivetime",&setlivetime,
"setlivetime/D");
135 mytree->Branch(
"hitrate",&hitrate,
"hitrate/D");
136 mytree->Branch(
"midhitrate",&midhitrate,
"midhitrate/D");
137 mytree->Branch(
"miprate",&miprate,
"miprate/D");
138 mytree->Branch(
"midmiprate",&midmiprate,
"midmiprate/D");
139 mytree->Branch(
"mipratio",&mipratio,
"mipratio/D");
140 mytree->Branch(
"mipasym",&mipasym,
"mipasym/D");
141 mytree->Branch(
"nactivechannels",&nactivechannels,
"nactivechannels/D");
142 mytree->Branch(
"emptypercentage",&emptypercentage,
"emptypercentage/D");
144 mytree->Branch(
"dbencoded",&dbencoded,
"dbencoded/I");
145 mytree->Branch(
"dbaencoded",&dbaencoded,
"dbaencoded/I");
147 mytree->Branch(
"pass_reco",&pass_reco,
"pass_reco/I");
148 mytree->Branch(
"pass_slc",&pass_slc,
"pass_slc/I");
149 mytree->Branch(
"pass_trk",&pass_trk,
"pass_trk/I");
150 mytree->Branch(
"corrupted",&corrupted,
"corrupted/I");
151 mytree->Branch(
"procsec",&procsec,
"procsec/I");
152 mytree->Branch(
"numslc",&numslc,
"numslc/D");
153 mytree->Branch(
"trkfrac2D",&trkfrac2D,
"trkfrac2D/D");
155 mytree->Branch(
"preliminary",&preliminary,
"preliminary/I");
167 if(setvec.size()==0){
169 subrun = 0; par = 4; nevents = 0; pass_runlen = 0; pass_hits = 0;
170 pass_all = 0; pass_db = 0; pass_time = 0; pass_empty = 0;
171 firstsec = 0; lastsec = 0; ngoodpix = 0; ngoodfeb = 0;
172 ngooddcm = 0; ngooddb = 0; ngoodmip = 0; nactivefeb = 0;
173 nactivedcm = 0; nactivedb = 0; ngoodcdb = 0; dbencoded = 0;
174 dbaencoded = 0; setsize = 0;
176 hitrate = 0; nactivechannels = 0; rectimesec = 0; emptypercentage = 0;
177 setlivetime = 0; mipratio = 0; midhitrate = 0; midmiprate = 0;
178 mipasym = 0; miprate =0;
180 pass_reco = 0; pass_slc = 0; pass_trk = 0; corrupted = 0; procsec = 0;
181 numslc = 0; trkfrac2D = 0;
190 for(
int seti=0; seti<
int(setvec.size()); seti++){
193 vector< vector< TH2F* > > TotPixMapMip(14, vector< TH2F* >(12,0));
199 for(
int subruni=0; subruni<
int(setvec[seti].subrun.size()); subruni++){
202 TFile omFile(setvec[seti].fnames[subruni],
"read");
205 for(
int db=1;
db<=14;
db++){
221 if(!TotPixMapMip[
db-1][
dcm-1]){
222 TotPixMapMip[
db-1][
dcm-1] = (TH2F*)h2temp->Clone(
"");
225 TotPixMapMip[
db-1][
dcm-1]->Add(h2temp);
238 setlivetime += setvec[seti].livetime[subruni];
243 run = setvec[seti].run;
244 preliminary = setvec[seti].isIncomplete;
247 for(
int subruni=0; subruni<
int(setvec[seti].subrun.size()); subruni++){
250 subrun = setvec[seti].subrun[subruni];
251 setsize = setvec[seti].subrun.size();
254 rectimesec = setvec[seti].livetime[subruni];
256 bool isNewRelom = setvec[seti].isNewRelom[subruni];
259 double startHour, endHour;
262 UInt_t startYear, endYear;
263 UShort_t startMonth, endMonth;
264 UShort_t startDay, endDay;
266 TFile omFile(setvec[seti].fnames[subruni],
"read");
268 TTree *
header = (TTree*)omFile.Get(
"Header");
269 header->SetBranchAddress(
"Nevents",&Nevents);
270 header->SetBranchAddress(
"StartHour",&startHour);
271 header->SetBranchAddress(
"StartYear",&startYear);
272 header->SetBranchAddress(
"StartMonth",&startMonth);
273 header->SetBranchAddress(
"StartDay",&startDay);
274 header->SetBranchAddress(
"EndHour",&endHour);
275 header->SetBranchAddress(
"EndYear",&endYear);
276 header->SetBranchAddress(
"EndMonth",&endMonth);
277 header->SetBranchAddress(
"EndDay",&endDay);
279 if(isNewRelom) header->SetBranchAddress(
"Partition",&Partition);
287 double hour = startHour;
288 int hourInt =
int(hour);
289 int minutes =
int((hour - hourInt)*60);
290 int seconds =
int(((hour-hourInt)*60 - minutes)*60);
292 if(isNewRelom) startDate.Set(startYear,startMonth,startDay,hourInt,minutes,seconds);
293 else startDate.Set(startYear+1900,startMonth+1,startDay,hourInt,minutes,seconds);
297 minutes =
int((hour - hourInt)*60);
298 seconds =
int(((hour-hourInt)*60 - minutes)*60);
300 if(isNewRelom) endDate.Set(endYear,endMonth,endDay,hourInt,minutes,seconds);
301 else endDate.Set(endYear+1900,endMonth+1,endDay,hourInt,minutes,seconds);
303 firstsec = startDate.Convert();
304 lastsec = endDate.Convert();
308 bool connected =
false;
321 if(!connected)
continue;
324 TH2F *NhitVsHour = (TH2F*)omFile.Get(
"NhitVsHour");
326 int nemptyevents = NhitVsHour->Integral(61,1500,1,1);
327 int nallevents = NhitVsHour->Integral(61,1500);
328 if(nallevents!=0) emptypercentage = 100.0*nemptyevents/nallevents;
329 else emptypercentage = 0;
337 nactivefeb = 0; nactivedb = 0; nactivedcm = 0; ngoodcdb = 0;
338 ngoodpix = 0; ngoodfeb = 0; ngooddb = 0; ngooddcm = 0; ngoodmip = 0;
339 dbencoded = 0; dbaencoded = 0;
342 vector<float> allMipHitsTop;
343 vector<float> allMipHitsSide;
344 vector<float> allHitRates;
352 for(
int db=1;
db<=14;
db++){
355 int nGoodDCMInDB = 0;
358 vector<float> pixMipHitsTop;
359 vector<float> pixMipHitsSide;
368 if(!TotPixMapMip[
db-1][
dcm-1])
continue;
372 if(!PixelRate)
continue;
375 int nGoodFEBInDCM = 0;
384 int nGoodPixInFEB = 0;
390 double febmiphits = 0;
393 for(
int pix=0;pix<32;pix++){
396 int ix = (
feb%16)*4 + pix%4 + 1;
400 if( TotPixMapMip[
db-1][
dcm-1]->GetBinContent(ix,iy)==0 )
continue;
406 double pixhitrate = PixelRate->GetBinContent(ix,iy);
407 double pixmiphits = TotPixMapMip[
db-1][
dcm-1]->GetBinContent(ix,iy);
411 febmiphits += TMath::Min(pixmiphits, highpixmip[TMath::Max(
dcm-6,0)] * setlivetime * 4);
414 hitrate += pixhitrate;
415 allHitRates.push_back(pixhitrate);
416 if(
dcm<7) pixMipHitsTop.push_back(pixmiphits);
417 else pixMipHitsSide.push_back(pixmiphits);
420 if(pixhitrate<
pow(10,3.5) && pixhitrate>
pow(10,0.5) &&
421 TMath::Gamma(lowpixmip[TMath::Max(
dcm-6,0)] * setlivetime , pixmiphits) > 0.1 &&
422 TMath::Gamma(highpixmip[TMath::Max(
dcm-6,0)] * setlivetime , pixmiphits) < 0.9 ){
434 if(temppix < nactivechannels) nactivefeb++;
437 if(nGoodPixInFEB >= PixelsPerFEB &&
438 TMath::Gamma(lowfebmip[TMath::Max(
dcm-6,0)] * setlivetime , febmiphits) > 0.1 &&
439 TMath::Gamma(highfebmip[TMath::Max(
dcm-6,0)] * setlivetime , febmiphits) < 0.9 ){
451 if(tempfeb < nactivefeb) nactivedcm++;
454 if(nGoodFEBInDCM >= FEBsPerDCM){
467 if(tempdcm < nactivedcm){
470 dbaencoded +=
pow(2,
db-1);
474 allMipHitsTop.insert(allMipHitsTop.end(), pixMipHitsTop.begin(), pixMipHitsTop.end());
475 allMipHitsSide.insert(allMipHitsSide.end(), pixMipHitsSide.begin(), pixMipHitsSide.end());
478 double medianTop =
GetMedian(pixMipHitsTop);
479 double medianSide =
GetMedian(pixMipHitsSide);
482 if(medianTop + medianSide != 0) medianTop = (medianTop - medianSide) / (medianTop + medianSide);
486 if(nGoodDCMInDB >= DCMsPerDB){
490 if(medianTop < MaxTopSideAsym &&
491 medianTop > MinTopSideAsym ){
497 dbencoded +=
pow(2,
db-1);
506 if(tempdb > ngoodcdb) ngoodcdb = tempdb;
512 double medianAllTop =
GetMedian(allMipHitsTop);
513 double medianAllSide =
GetMedian(allMipHitsSide);
516 if(medianAllTop + medianAllSide != 0) mipasym = (medianAllTop - medianAllSide) / (medianAllTop + medianAllSide);
520 if(medianAllSide!=0) mipratio = medianAllTop / medianAllSide;
531 allMipHitsTop.insert(allMipHitsTop.end(), allMipHitsSide.begin(), allMipHitsSide.end());
540 for(
int i=0;
i<
int(allMipHitsTop.size());
i++){
541 miprate += allMipHitsTop[
i];
545 double chtime = allMipHitsTop.size() *
setlivetime;
546 if(chtime!=0) miprate /= chtime;
565 TString anaFileName = setvec[seti].rnames[subruni];
566 bool isNewRelana = setvec[seti].isNewRelana[subruni];
570 if(anaFileName ==
"") hasReco =
false;
574 procsec = procDate.Convert(kTRUE);
580 TFile recoFile(anaFileName,
"read");
583 TH1D* fNumSlices = (TH1D*)recoFile.Get(
"nearlineana/fNumSlices");
587 if(nactivechannels!=0){
591 pass_slc = ((MinNumSlc <
numslc) && (numslc < MaxNumSlc));
602 TH1D* fTrackFractionAll2D = (TH1D*)recoFile.Get(
"nearlineana/fTrackFractionAll2D");
604 if(fTrackFractionAll2D){
606 trkfrac2D = fTrackFractionAll2D->GetMean();
608 pass_trk = trkfrac2D < MaxTrkFrac2D;
613 delete fTrackFractionAll2D;
626 if(apply_reco) pass_reco = ( pass_trk &&
pass_slc );
629 if (apply_runlen) pass_runlen = ( setlivetime > run_len );
630 else pass_runlen = 1;
632 if (apply_empty) pass_empty = ( emptypercentage < empty_cut );
635 if (apply_hits) pass_hits = ( midmiprate < hits_up && midmiprate > hits_down );
639 if (apply_db) pass_db = ( (ngoodcdb >= MinGoodDB) || (par == 2 && ngoodcdb > 0) );
642 if (apply_time) pass_time = ( firstsec < lastsec && startDate.GetYear() >= 2013 && endDate.GetYear() >= 2013);
646 if ( pass_runlen && pass_hits && pass_db && pass_time && pass_empty && pass_reco ){
656 cout <<
"Run " << run <<
"." << subrun <<
" has failed: ";
657 if(!pass_runlen)
cout <<
"Run Live Time = " << setlivetime <<
" seconds; ";
658 if(!pass_empty)
cout <<
"Empty Percentage = " << emptypercentage <<
"%; ";
659 if(!pass_hits)
cout <<
"Median MIP/Hit Rate = " << midmiprate <<
"/" << midhitrate <<
"; ";
660 if(!pass_db)
cout <<
"Good MIP/DiBlocks = " << ngoodmip <<
"/" << ngooddb <<
"; ";
661 if(!pass_slc)
cout <<
"Num Slices / 1e4 Pixels = " << numslc <<
"; ";
662 if(!pass_trk)
cout <<
"Fraction of 2D tracks = " << trkfrac2D <<
"; ";
664 cout <<
"Bad timing => Diff = " << lastsec - firstsec <<
";" <<
endl;
692 mytree->Write(
"mytree");
703 vector<TString> fRel;
704 vector<TString> fTrigDir;
705 vector<TString> fForm;
706 vector<TString> fName;
707 vector<int> fRelType;
713 fDir =
"/nova/data/nearline-OnMon/FarDet/";
715 fRel.push_back(
"S15-02-05");
716 fRel.push_back(
"FA14-09-23");
717 fRel.push_back(
"S14-08-01");
718 fRel.push_back(
"S14-02-05");
719 fRel.push_back(
"S13-09-17");
721 fTrigDir.push_back(
"");
722 fTrigDir.push_back(
"t02-t00/");
724 fForm.push_back(
TString::Format(
"FDNL-onmon-endsubrun-%08d-%03d.root",run,subrun) );
725 fForm.push_back(
TString::Format(
"fardet_nearline_r%08d_s%03d.onmon.root",run,subrun) );
727 fName.push_back(fDir + fRel[0] + fSubDir + fTrigDir[1] + fForm[1]);
728 fName.push_back(fDir + fRel[1] + fSubDir + fTrigDir[1] + fForm[1]);
729 fName.push_back(fDir + fRel[2] + fSubDir + fTrigDir[0] + fForm[1]);
730 fName.push_back(fDir + fRel[3] + fSubDir + fTrigDir[0] + fForm[1]);
731 fName.push_back(fDir + fRel[4] + fSubDir + fTrigDir[0] + fForm[0]);
733 fRelType.push_back(2);
734 fRelType.push_back(2);
735 fRelType.push_back(2);
736 fRelType.push_back(2);
737 fRelType.push_back(1);
742 fDir =
"/nova/data/nearline-Ana/FarDet/";
744 fRel.push_back(
"S15-02-05");
745 fRel.push_back(
"FA14-09-23");
746 fRel.push_back(
"S14-08-01");
747 fRel.push_back(
"S14-02-24");
748 fRel.push_back(
"S14-01-20");
750 fTrigDir.push_back(
"");
751 fTrigDir.push_back(
"t02/");
753 fForm.push_back(
TString::Format(
"fardet_r%08d_s%02d_reco_hist_t02.root",run,subrun) );
755 fName.push_back(fDir + fRel[0] + fSubDir + fTrigDir[1] + fForm[0]);
756 fName.push_back(fDir + fRel[1] + fSubDir + fTrigDir[1] + fForm[0]);
757 fName.push_back(fDir + fRel[2] + fSubDir + fTrigDir[0] + fForm[0]);
758 fName.push_back(fDir + fRel[3] + fSubDir + fTrigDir[0] + fForm[0]);
759 fName.push_back(fDir + fRel[4] + fSubDir + fTrigDir[0] + fForm[0]);
761 fRelType.push_back(2);
762 fRelType.push_back(2);
763 fRelType.push_back(2);
764 fRelType.push_back(2);
765 fRelType.push_back(1);
772 while(!filetype && ntries <
int(fRel.size())){
774 filename = fName[ntries];
776 if(!gSystem->AccessPathName(filename)){
778 filetype = fRelType[ntries];
798 bool incomplete =
false;
808 bool isNewRelom =
false;
810 if(omfiletype == 0)
continue;
811 else if(omfiletype > 1) isNewRelom =
true;
817 if((run == 17647 &&
subrun > 25)
818 || (run == 18531 &&
subrun == 13))
825 TFile omFile(omFileName,
"read");
828 TDatime
tfile = omFile.GetCreationDate();
830 if(tnow.Convert() < tfile.Convert() + 4500){
835 TH1F *RecordedTime = (TH1F*)omFile.Get(
"RecordedTime");
837 if(RecordedTime) myrun.
livetime.push_back(RecordedTime->Integral()*500
e-9);
853 bool isNewRelana =
false;
855 if(anafiletype == 0){
857 if(tnow.Convert() < tfile.Convert() + 3600*24){
861 else if(anafiletype > 1) isNewRelana =
true;
864 myrun.
fnames.push_back(omFileName);
865 myrun.
rnames.push_back(anaFileName);
872 cout <<
"Run " << run <<
" is incomplete. Marking as preliminary..." <<
endl;
887 for(
int subruni=0; subruni<
nsubruns; subruni++){
888 remlt += wholerun.
livetime[subruni];
894 vector< RunInfo > setvec;
899 for(
int subruni=0; subruni<
nsubruns; subruni++){
911 if((setlt > run_len && remlt > run_len) || subruni == nsubruns-1){
912 if(subruni<nsubruns-1) thisset.
isLast =
false;
913 else thisset.
isLast =
true;
914 thisset.
run = wholerun.
run;
916 setvec.push_back(thisset);
917 thisset = emptystruct;
935 size_t size = scores.size();
937 if(size==0)
return 0;
939 sort(scores.begin(), scores.end());
943 median = (scores[size / 2 - 1] + scores[size / 2]) / 2;
947 median = scores[size / 2];
955 int nbins = hist->GetNbinsX();
957 double *
x =
new double[
nbins];
958 hist->GetXaxis()->GetCenter(x);
960 double *
y = hist->GetArray();
962 double out = TMath::Median(nbins,x,y);
977 t.open(gSystem->Getenv(
"NOVADBPWDFILE"));
982 dbpass =
new char [8];
983 strcpy(dbpass, buffer.c_str());
986 std::stringstream dbstream;
988 dbstream <<
"select run, partition from fardet.runs where run = " 990 <<
" order by run asc";
991 dbstring = dbstream.str();
994 dbcstr =
new char [dbstring.size()+1];
995 strcpy(dbcstr, dbstring.c_str());
996 TSQLServer *dbserv = TSQLServer::Connect(
"pgsql://ifdbprod.fnal.gov:5433/nova_prod",
"nova_reader", dbpass);
1000 while ( (dbserv==0 || !dbserv->IsConnected()) && attempts<100 ) {
1002 cout <<
"Try to connect again..." <<
endl;
1004 dbserv = TSQLServer::Connect(
"pgsql://ifdbprod.fnal.gov:5433/nova_prod",
"nova_reader", dbpass);
1010 bool connected =
false;
1012 if ( dbserv!=0 && dbserv->IsConnected() ) {
1016 TSQLStatement *
stmt = dbserv->Statement(dbcstr,1000);
1018 if(stmt->Process()) {
1020 stmt->StoreResult();
1021 while (stmt->NextResultRow()) {
1023 par = stmt->GetUInt(1);
1035 if(attempts>1 && connected)
cout <<
"Connected after " << attempts <<
" attempts." <<
endl;
1036 if(!connected)
cout <<
"Failed after " << attempts <<
" attempts." <<
endl;
int GetFileName(TString &filename, int run, int subrun, bool isOnMon=true)
void BuildMetricsTree_OnMon(TString filelist)
double GetMedian(TH1D *hist)
bool GetDBPartition(int run, int &par)
RunInfo GetRunInfo(int run)
::xsd::cxx::tree::buffer< char > buffer
vector< RunInfo > GetSubrunSets(RunInfo wholerun, double run_len)
vector< bool > isNewRelana
ifstream fileListItr("ManBadSubruns.txt")
vector< double > livetime
vector< bool > isNewRelom
void Format(TGraph *gr, int lcol, int lsty, int lwid, int mcol, int msty, double msiz)