Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

NueStandard.cxx

Go to the documentation of this file.
00001 
00002 // $Id: NueStandard.cxx,v 1.59 2009/10/27 16:19:05 scavan Exp $
00003 //
00004 // The NueConvention File will hopefully organize
00005 //  frequently used nue standards such as
00006 //    event class (was ClassType)
00007 //    fiducial Volume
00008 //    file indexing
00009 //
00010 // Author: Josh Boehm
00011 // Created: Sept. 14, 2006
00013 #include <vector>
00014 #include "NueAna/NueAnaTools/NueConvention.h"
00015 #include "NueStandard.h"
00016 #include "DcsUser/CoilTools.h"
00017 #include "MCReweight/SKZPWeightCalculator.h"
00018 #include "TMultiLayerPerceptron.h"
00019 
00020 #include "TFile.h"
00021 #include "TMath.h"
00022 #include <cmath>
00023 
00024 #include <fstream>
00025 #include "MessageService/MsgService.h"
00026 
00027 CVSID("");
00028 
00029 bool NueStandard::IsInFid(NueRecord *nr)
00030 {
00031    float x = nr->srevent.vtxX;
00032    float y = nr->srevent.vtxY;
00033    float z = nr->srevent.vtxZ;
00034                                                                                
00035    Detector::Detector_t fDet;
00036    fDet = nr->GetHeader().GetVldContext().GetDetector();
00037    if (fDet != Detector::kFar && fDet != Detector::kNear) return false;
00038 
00039    SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00040    bool isMC = (sim == SimFlag::kMC);
00041    int retval = 0;
00042 
00043    if (fDet == Detector::kFar)
00044      retval = NueConvention::IsInsideFarFiducial_Nue_Standard(x,y,z, isMC);
00045  
00046    if (fDet == Detector::kNear)
00047      retval = NueConvention::IsInsideNearFiducial_Nue_Standard(x,y,z, isMC);
00048       
00049    return (retval == 1);
00050 }
00051 
00052 bool NueStandard::PassesPOTStandards(NueRecord *nr)
00053 {
00054    SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00055    bool isMC = (sim == SimFlag::kMC);
00056    VldContext vld = nr->GetHeader().GetVldContext();
00057 
00058    if (isMC) return true;
00059    
00060    //common to both
00061    if (nr->bmon.goodBeamMon != 1) return false;
00062 
00063    if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear )
00064    {
00065      bool goodCoil =  nr->eventq.coilQuality && (nr->eventq.coilDirection ==1);
00066                       //CoilTools::IsOK(vld) && !CoilTools::IsReverse(vld);
00067      int dpDQ = nr->eventq.passNearDetQuality;
00068      return goodCoil && (dpDQ == 1);
00069    }
00070 
00071    if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00072    {
00073 
00074     if (nr->eventq.spillType != 1) return false;
00075     int dpDQ = nr->eventq.passFarDetQuality;
00076     if (nr->GetHeader().GetEventNo() < 0) return (dpDQ == 1);
00077 
00078      return (dpDQ == 1) && (nr->eventq.passLI == 1);
00079    }
00080 
00081    return false;
00082 }                                                                                                          
00083 bool NueStandard::PassesDataQuality(NueRecord *nr)
00084 {                                                 
00085    SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00086    bool isMC = (sim == SimFlag::kMC);
00087    VldContext vld = nr->GetHeader().GetVldContext();
00088 
00089    if (isMC) return true;
00090    
00091    if(!PassesPOTStandards(nr)) return false;
00092 
00093    if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear) return true;
00094 
00095    if (nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar){
00096 
00097      int rcB = nr->eventq.rcBoundary;
00098      float tmin = nr->srevent.eventTimeMin;
00099      double spillT = nr->bmon.dt_stnd;   
00100      return PassesFarDataQuality(-1, rcB, 1, tmin, spillT);       
00101    }
00102 
00103    return false;
00104 }
00105 
00106 bool NueStandard::PassesNearDataQuality(int gbm, float cc, int st)
00107 {
00108   //Assumes it is taking:
00109   // nr->bmon.goodBeamMon, nr->srevent.coilCurrent, nr->srevent.spillType
00110   if (gbm == 1 && cc < -1000.0 && st != 3)
00111      return true;
00112                                                                                 
00113   return false;
00114 }
00115 
00116 bool NueStandard::PassesFarDataTiming(NueRecord *nr) 
00117 {
00118  if(
00119        Detector::kFar == nr->GetHeader().GetVldContext().GetDetector()
00120     && SimFlag::kData == nr->GetHeader().GetVldContext().GetSimFlag()
00121   )
00122  {
00123   float tmin = nr->srevent.eventTimeMin;
00124   double spillT = nr->bmon.dt_stnd;
00125   return( (tmin - spillT) > -2e-6 && (tmin - spillT) < 12e-6 );
00126  }
00127   return true;
00128 }
00129 
00130 bool NueStandard::PassesFarDataQuality(float li, int rc, int dpfddq, 
00131                                           float tmin, double spillt)
00132 {
00133   if (li == -1 && rc == 0 && dpfddq == 1
00134     && (tmin - spillt) > -20e-6 && (tmin - spillt) < 30e-6)
00135      return true;
00136                                                                                 
00137   return false;
00138 }
00139 
00140 bool NueStandard::IsGoodRun(NueRecord *nr)
00141 {
00142   if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00143   {
00144     return true;
00145   }
00146   
00147   if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00148   {
00149     return NueStandard::IsGoodFarRun(nr);
00150   }
00151   
00152   return false;
00153 }
00154 
00155 bool NueStandard::IsGoodNearRun(NueRecord *nr)
00156 {
00157   if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00158   {
00159     return true;
00160   }
00161   
00162   if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar)
00163   {
00164     return true;
00165   }
00166   
00167   //for near detector data
00168   if(nr->GetHeader().GetRun()==8165 || nr->GetHeader().GetRun()==11318)
00169   {
00170     return false;
00171   }
00172   
00173   if(nr->GetHeader().GetRun()==7942 && nr->GetHeader().GetSubRun()==0)
00174   {
00175     return false;
00176   }
00177   
00178   if(nr->GetHeader().GetRun()==7982 && nr->GetHeader().GetSubRun()==0)
00179   {
00180     return false;
00181   }
00182   
00183   if(nr->GetHeader().GetRun()==8214 && nr->GetHeader().GetSubRun()==0)
00184   {
00185     return false;
00186   }
00187   
00188   if(nr->GetHeader().GetRun()==9809 && nr->GetHeader().GetSubRun()==0)
00189   {
00190     return false;
00191   }
00192   
00193   return true;
00194 }
00195 
00196 bool NueStandard::IsGoodFarRun(NueRecord *nr)
00197 {
00198   if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
00199   {
00200     return true;
00201   }
00202   
00203   if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear)
00204   {
00205     return true;
00206   }
00207   
00208   //for far detector data
00209   static vector<FilePosition> badFDrunlist;
00210   static unsigned int listpos = 0;
00211   int Run, SubRun;
00212   
00213   // If this is the first call fill the file list
00214   if(badFDrunlist.size() == 0)
00215   {
00216     std::ifstream ins;
00217     char *srt_dir = getenv("SRT_PRIVATE_CONTEXT");
00218     ins.open(Form("%s/NueAna/badrunsFD_list.txt",srt_dir));
00219     if(!ins.is_open())
00220     {
00221       MSG("NueStandard", Msg::kError)<<"IsGoodFarRun(): Unable to open badrunsFD_list.txt"<<endl;
00222     }
00223 
00224     while(!ins.eof())
00225     {
00226       ins>>Run>>SubRun;
00227       FilePosition temp;
00228       if(!ins.eof()){
00229           temp.Run = Run;
00230           temp.SubRun = SubRun;
00231           temp.Snarl = -1;
00232           temp.Event = -1;
00233           badFDrunlist.push_back(temp);
00234       }
00235     }
00236     
00237     if(badFDrunlist.size() == 0)  return true;
00238    }
00239    
00240    FilePosition current;
00241    
00242    current.Snarl = -1;
00243    current.Event = -1;
00244    current.Run = nr->GetHeader().GetRun();
00245    current.SubRun = nr->GetHeader().GetSubRun();
00246    
00247    if(current < badFDrunlist[0]) return true;
00248 
00249    if(current > badFDrunlist[badFDrunlist.size() - 1]) return true;
00250 
00251    if(current > badFDrunlist[listpos] )
00252    {
00253       while(current > badFDrunlist[listpos] && listpos < badFDrunlist.size())
00254           listpos++;
00255    }
00256    else if(current < badFDrunlist[listpos] )
00257    {
00258       while(current < badFDrunlist[listpos] && listpos > 0)
00259           listpos--;
00260    }
00261 
00262    if(current == badFDrunlist[listpos])
00263    {
00264        return false;
00265    }
00266 
00267    
00268    return true;
00269 }
00270 
00271 //  Now to the PreSelection Cuts
00272 
00273 bool NueStandard::PassesTrackPlaneCut(NueRecord *nr)
00274 {
00275    int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00276 
00277    return PassesTrackPlaneCut(tp);
00278 }
00279 
00280 bool NueStandard::PassesTrackPlaneCut(int trkplane)
00281 {
00282    return (trkplane < 25);
00283 }
00284 
00285 bool NueStandard::PassesMinPlaneCut(NueRecord *nr)
00286 {
00287    int planes = nr->shwfit.contPlaneCount050;
00288    return PassesMinPlaneCut(planes);
00289 }
00290 
00291 bool NueStandard::PassesMinPlaneCut(int planes)
00292 {
00293    return (planes > 4);
00294 }
00295 
00296 bool NueStandard::PassesShowerCut(NueRecord *nr)
00297 {
00298   int nshw = nr->srevent.showers;
00299   return PassesShowerCut(nshw);
00300 }
00301 
00302 bool NueStandard::PassesShowerCut(int nshw)
00303 {
00304   return (nshw > 0);
00305 }
00306 
00307 bool NueStandard::PassesCosmicCutFunction(NueRecord *nr)
00308 {
00309    bool result=true;    
00310    //cosmicy shower cut
00311    result = result && !(nr->shwfit.UVSlope > 10);
00312 
00313    //cosmicy track cut
00314    if (nr->srevent.tracks<1) return result;  //require a track to apply this cut
00315 
00316    float ex =  nr->srtrack.endX;
00317    float ey =  nr->srtrack.endY;
00318    float ez =  nr->srtrack.endZ;
00319 
00320    float vx =  nr->srtrack.vtxX;
00321    float vy =  nr->srtrack.vtxY;
00322    float vz =  nr->srtrack.vtxZ;
00323 
00324    float cosy = acos(fabs(vy-ey)/sqrt((vx-ex)*(vx-ex)+(vy-ey)*(vy-ey)+(vz-ez)*(vz-ez))); 
00325    float dy=fabs(vy-ey);
00326 
00327    result = result && !(dy>2 && cosy < 0.6);
00328 
00329    return result;
00330 }
00331 
00332 bool NueStandard::PassesCosmicCut(NueRecord *nr)
00333 {
00334   if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kNear)
00335        return true;
00336 
00337    bool ret=true;
00338    if(nr->eventq.passCosmicCut > -10)
00339      return (nr->eventq.passCosmicCut == 1);
00340 
00341    //or we are still in Ent
00342  
00343    if(nr->dtree.bt_var1==0)ret = false;
00344    else if(nr->dtree.bt_var1==1)ret = true;
00345    else{ NueStandard::FillCosmicCut(nr); ret = nr->dtree.bt_var1; }
00346 
00347    Detector::Detector_t fDet;
00348    fDet = nr->GetHeader().GetVldContext().GetDetector();
00349    if (fDet != Detector::kFar) ret = true;
00350 
00351    return ret;
00352 }
00353 
00354 void NueStandard::FillCosmicCut(NueRecord *nr)
00355 {
00356    int bv = 0;
00357    if (NueStandard::PassesCosmicCutFunction(nr)) bv=1;
00358    nr->dtree.bt_var1=bv;
00359 }
00360 
00361 bool NueStandard::PassesTrackLikePlaneCut(NueRecord *nr)
00362 {
00363    int tlp = nr->srtrack.trklikePlanes;
00364    return PassesTrackLikePlaneCut(tlp);
00365 }
00366 
00367 bool NueStandard::PassesTrackLikePlaneCut(int tlp)
00368 {       
00369    return (tlp < 16);
00370 }
00371 
00372 bool NueStandard::PassesLowEnergyCut(NueRecord *nr)
00373 {
00374    float energy = nr->srevent.phNueGeV;
00375    return PassesLowEnergyCut(energy);
00376 }
00377  
00378 bool NueStandard::PassesLowEnergyCut(float energy)
00379 {
00380    return (energy > 1.0);
00381 }
00382 
00383 bool NueStandard::PassesHighEnergyCut(NueRecord *nr)
00384 {
00385    float energy = nr->srevent.phNueGeV;
00386    return PassesHighEnergyCut(energy);
00387 }
00388           
00389 bool NueStandard::PassesHighEnergyCut(float energy)
00390 {
00391    return (energy < 8.0);
00392 }
00393 
00394 // Now to combinations of Preselection Cuts                                                                                                          
00395 bool NueStandard::PassesPreSelection(NueRecord *nr)
00396 {
00397    bool temp = PassesNonHEPreSelection(nr);
00398    temp = temp && PassesHighEnergyCut(nr);
00399   
00400    return temp;
00401 }
00402 
00403 bool NueStandard::PassesPreSelection(int trkplane, int tlp, float energy)
00404 {
00405    bool temp = PassesNonHEPreSelection(trkplane, tlp, energy);
00406    temp = temp && PassesHighEnergyCut(energy);
00407    return temp;
00408 }
00409 
00410 bool NueStandard::PassesNonHEPreSelection(NueRecord *nr)
00411 {
00412    bool temp = PassesPreSelectionTrackCuts(nr);
00413    temp = temp && PassesLowEnergyCut(nr);
00414    temp = temp && PassesPreSelectionBasicCuts(nr);
00415    
00416    return temp;
00417 }                                                                                                       
00418 bool NueStandard::PassesNonHEPreSelection(int trkplane, int tlp, float energy)
00419 {
00420    bool temp = PassesPreSelectionTrackCuts(trkplane, tlp);
00421    temp = temp && PassesLowEnergyCut(energy);
00422    return temp;
00423 }
00424 
00425 bool NueStandard::PassesPreSelectionTrackCuts(NueRecord *nr)
00426 {
00427    bool temp = PassesTrackPlaneCut(nr);
00428    temp = temp && PassesTrackLikePlaneCut(nr);
00429    return temp;  
00430 }
00431 
00432 bool NueStandard::PassesPreSelectionTrackCuts(int trkplane, int tlp)
00433 {
00434    bool temp = PassesTrackPlaneCut(trkplane);
00435    temp = temp && PassesTrackLikePlaneCut(tlp);
00436    return temp;
00437 }
00438 
00439 bool NueStandard::PassesPreSelectionBasicCuts(NueRecord *nr)
00440 {
00441    bool one = PassesMinPlaneCut(nr);
00442    one = one && PassesCosmicCut(nr); 
00443    one = one && IsLargestEvent(nr);
00444    one = one && PassesShowerCut(nr);
00445 
00446    return one;
00447 }
00448 
00449 bool NueStandard::PassesMRCCFiducial(NueRecord *nr)
00450 {
00451    float x = nr->mri.vtxx;
00452    float y = nr->mri.vtxy;
00453    float z = nr->mri.vtxz;
00454                                                                                 
00455    Detector::Detector_t fDet;
00456    fDet = nr->GetHeader().GetVldContext().GetDetector();
00457    
00458    SimFlag::SimFlag_t sim = nr->GetHeader().GetVldContext().GetSimFlag();
00459    bool isMC = (sim == SimFlag::kMC);
00460    int retval = 0;
00461                                                                                 
00462    if (fDet == Detector::kFar)
00463    {
00464      if(sqrt((x*x) + (y*y))>0.3 && sqrt((x*x) + (y*y))<sqrt(15.5) && ((z>0.3 && z<14.4)||(z>16.1 && z<28.2)))
00465      {
00466        retval=1;
00467      }
00468    }
00469        
00470    if (fDet == Detector::kNear)
00471      retval = NueConvention::IsInsideNearFiducial_MRE_Standard(x,y,z, isMC);
00472 
00473    return (retval == 1);
00474 }
00475 
00476 bool NueStandard::PassesMRCCPreSelection(NueRecord *nr)
00477 {
00478     double pid = nr->mri.orig_roCCPID;
00479     int fitp = nr->mri.fitp;
00480     float bestC = nr->mri.best_complete;
00481 
00482     return NueStandard::PassesMRCCPreSelection(bestC, fitp, pid);
00483 }
00484 
00485 bool NueStandard::PassesMRCCPreSelection(float bestComp, int fitp, double pid)
00486 {
00487    //currently assumes RO-PID
00488    bool good = true;
00489    good = good && (bestComp > -10);
00490    good = good && (fitp == 1);
00491    good = good && (pid > 0.3);
00492                                                                                 
00493    return good;
00494 }
00495 
00496 bool NueStandard::PassesMREFiducial(NueRecord *nr)
00497 {
00498     return NueStandard::PassesMRCCFiducial(nr);
00499 }
00500 
00501 bool NueStandard::PassesMREPreSelection(NueRecord *nr)
00502 {
00503     return NueStandard::PassesMRCCPreSelection(nr);
00504 }
00505                                                                                                               
00506 bool NueStandard::PassesMREPreSelection(float bestC, int fitp, double pid)
00507 {
00508     return NueStandard::PassesMRCCPreSelection(bestC, fitp, pid);
00509 }
00510                                                                                              
00511 bool NueStandard::PassesSysPreSelectionNoHE(NueRecord *nr)
00512 {
00513    int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00514    int tlp = nr->srtrack.trklikePlanes;
00515    float energy = nr->srevent.phNueGeV;
00516 
00517    return PassesSysPreSelectionNoHE(tp, tlp, energy);
00518 }
00519                                                                                              
00520 bool NueStandard::PassesSysPreSelectionNoHE(int trkplane, int tlp, float energy)
00521 {
00522    bool good = true;
00523    good = good && (trkplane < 28);
00524    good = good && (tlp < 18);
00525    good = good && (energy > 0.5);
00526    return good;
00527 }
00528 
00529 
00530 bool NueStandard::PassesSysPreSelection(NueRecord *nr)
00531 {
00532    int tp = TMath::Abs(nr->srtrack.endPlane - nr->srtrack.begPlane);
00533    int tlp = nr->srtrack.trklikePlanes;
00534    float energy = nr->srevent.phNueGeV;
00535                                                                                 
00536    return PassesSysPreSelection(tp, tlp, energy);
00537 }
00538                                                                                 
00539 bool NueStandard::PassesSysPreSelection(int trkplane, int tlp, float energy)
00540 {
00541    bool good = true;
00542    good = good && (trkplane < 28);
00543    good = good && (tlp < 18);
00544    good = good && (energy > 0.5 && energy < 10);
00545    return good;
00546 }
00547 
00548 double NueStandard::GetPIDValue(NueRecord *nr, Selection::Selection_t sel)
00549 {
00550   double retval = -9999;
00551 
00552   switch(sel) {
00553   case Selection::kCuts:  retval = nr->treepid.fCutPID;           break;
00554   case Selection::kANN6:  retval = nr->ann.pid_6inp;              break;
00555   case Selection::kANN30:  retval = nr->ann.pid_30inp;            break;
00556   case Selection::kANN2PE:  retval = nr->ann.pid_11inp;            break;
00557   case Selection::kANN2PE_DAIKON04:  retval = nr->ann.pid_11inp_daikon04;         break;
00558   case Selection::kANN14_DAIKON04:   retval = nr->ann.pid;         break;
00559 //  case Selection::kANN14_DAIKON04:   retval = nr->ann.pid_14inp_daikon04;         break;
00560   case Selection::kSSPID: retval = nr->subshowervars.pid;  break;
00561   case Selection::kMCNN:
00562      if (nr->mcnnv.bestmatches < 50)  retval = -0.5;
00563      else        retval = nr->mcnnv.mcnn_var1;                        break;   
00564   
00565   
00566   case Selection::kParticlePID:
00567         if(PassesParticlePIDPreselectionCut(nr))retval = nr->precord.event.pidF;
00568         break;  
00569   
00570   default:                                                        break;
00571   }
00572 
00573   return retval;
00574 }
00575 
00576 bool NueStandard::PassesPIDSelection(NueRecord *nr, Selection::Selection_t sel)
00577 {
00578   bool pass = false;
00579   double val = GetPIDValue(nr, sel);
00580                                                                                                   
00581   switch(sel) {
00582   case Selection::kCuts:  pass = (int(val) == 1);       break;
00583   case Selection::kANN6:   pass = val > 0.5;            break;
00584   case Selection::kANN30:  pass = val > 0.5;            break;
00585   case Selection::kANN2PE:  pass = val > 0.7;            break;
00586   case Selection::kANN2PE_DAIKON04:  pass = val > 0.7;   break;
00587   case Selection::kANN14_DAIKON04:   pass = val > 0.75;  break;
00588   case Selection::kSSPID: pass = val > 0.67;             break;
00589   case Selection::kMCNN:  pass = val > 0.80;             break;
00590   case Selection::kParticlePID:  pass = PassesParticlePIDCut(nr); break;
00591   default:                                              break;
00592   }
00593                                                                                                   
00594   return pass;
00595 }
00596 
00597 bool NueStandard::PassesParticlePIDCut(NueRecord *nr)
00598 {
00599         bool passPID=true;
00600         
00601         passPID = passPID && nr->precord.event.pidF>0.7;
00602 
00603         if(!passPID)return false;
00604 
00605 
00606         return passPID && PassesParticlePIDPreselectionCut(nr);
00607         
00608 
00609 }
00610 
00611 
00612 bool NueStandard::PassesParticlePIDPreselectionCut(NueRecord *nr)
00613 {
00614                 
00615         //fiducial cut
00616         bool passFid=true;
00617         passFid = passFid && (nr->precord.event.inFiducial==1); 
00618 
00619         if(!passFid)return false;
00620 
00621 
00622         double visenergy = nr->precord.event.visenergy;
00623                 
00624         //preselection cut
00625         int det = nr->GetHeader().GetVldContext().GetDetector();
00626         if(det == Detector::kFar)
00627         {
00628                 float offset =   0.489987;
00629                 float slope  =  0.0387301;
00630         visenergy = visenergy*slope+offset;
00631         }else if(det == Detector::kNear)
00632         {
00633                 float offset = 0.4803261;
00634                 float slope = 0.03799819;
00635                 visenergy = visenergy*slope+offset;
00636         }else{
00637                 printf("please don't run in a detector that is not near or far (NueStandard::PassesParticlePIDCut)\n");
00638                 exit(1);
00639         }
00640                 
00641         bool passPre=true;
00642                 
00643         double event_length=nr->precord.event.max_z-nr->precord.event.min_z;    
00644         passPre = passPre && event_length>0.1 && event_length<1.2;
00645         passPre = passPre && nr->precord.particles.longest_s_particle_s>0.1 && 
00646                 nr->precord.particles.longest_s_particle_s<1.2;
00647         passPre = passPre && nr->precord.particles.ntot>0;
00648         passPre = passPre && visenergy>0.5 && visenergy<8;      
00649 
00650         return passPre && passFid;
00651 
00652 }
00653 
00654 
00655 bool NueStandard::IsLargestEvent(NueRecord *nr)
00656 {
00657  if(nr->GetHeader().GetVldContext().GetDetector() == Detector::kFar){
00658     if(nr->srevent.largestEvent == 1) return true;
00659     return false;
00660  }
00661  return true;
00662 }
00663 
00664 bool NueStandard::PassesSelection(NueRecord *nr, Selection::Selection_t sel)
00665 {
00666   bool pass = false;
00667 
00668   bool dq = NueStandard::PassesDataQuality(nr);
00669   bool infid = NueStandard::IsInFid(nr) && dq;
00670   
00671   bool isMR = nr->GetHeader().FoundMR();
00672 
00673   if (isMR){
00674     bool mrfid = PassesMRCCFiducial(nr);
00675     bool mrps = PassesMRCCPreSelection(nr);
00676 
00677     infid = infid && mrfid && mrps;
00678   } 
00679   
00680   bool basic = NueStandard::PassesPreSelectionBasicCuts(nr) && infid;
00681   bool presel = infid && NueStandard::PassesPreSelection(nr);
00682   bool pid = NueStandard::PassesPIDSelection(nr,sel); 
00683 
00684   switch(sel) {
00685   case Selection::kNone:     pass = true;                 break;
00686   case Selection::kDataQual: pass = dq;                   break;
00687   case Selection::kFid:      pass = infid;                   break;
00688   case Selection::kBasic:    pass = basic;               break;
00689   case Selection::kPre:   pass = presel;                  break;
00690   case Selection::kCuts:  pass = presel && pid;           break;
00691   case Selection::kANN6:  pass = presel && pid;          break;
00692   case Selection::kANN30: pass = presel && pid;          break;
00693   case Selection::kANN2PE: pass = presel && pid;          break;
00694   case Selection::kANN2PE_DAIKON04: pass = presel && pid; break;
00695   case Selection::kANN14_DAIKON04: pass = presel && pid;  break;
00696   case Selection::kSSPID: pass = presel && pid;           break;
00697   case Selection::kMCNN:  pass = presel && pid;           break;
00698   case Selection::kMDA:   pass = presel && false;         break;
00699   case Selection::kBDT:   pass = presel && false;         break;
00700   case Selection::kKNue:  pass = presel && false;         break;
00701   case Selection::kCC:    pass = infid && 
00702                      NueStandard::PassesCCSelection(nr);  break;
00703   default:                                                break;
00704   }
00705 
00706   return pass;
00707 }
00708 
00709 bool NueStandard::PassesSelection(NueRecord *nr, Selection::Selection_t sel, Selection::Selection_t sel2)
00710 {
00711   bool pass = false;
00712 
00713   bool dq = NueStandard::PassesDataQuality(nr);
00714   bool infid = NueStandard::IsInFid(nr) && dq;
00715   bool basic = NueStandard::PassesPreSelectionBasicCuts(nr);
00716   bool presel = NueStandard::PassesPreSelection(nr);
00717   bool pid = NueStandard::PassesPIDSelection(nr,sel);
00718 
00719   switch(sel2) {
00720   case Selection::kDataQual:  dq = true;                  break;
00721   case Selection::kFid:       infid = true;               break;
00722   case Selection::kBasic:     basic = true;               break;
00723   case Selection::kPre:       presel = true;              break;
00724   default:                                                break;
00725   }
00726   
00727   bool isMR = nr->GetHeader().FoundMR();
00728 
00729   if(isMR){
00730     bool mrfid = true; //PassesMRCCFiducial(nr);
00731     bool mrps = PassesMRCCPreSelection(nr);
00732 
00733     infid = infid && mrfid && mrps;
00734   }
00735   
00736   basic = basic && infid;
00737   presel = dq && infid && presel;
00738 
00739   switch(sel) {
00740   case Selection::kNone:  pass = true;                    break;
00741   case Selection::kDataQual:  pass = dq;                  break;
00742   case Selection::kFid:   pass = infid;                   break;
00743   case Selection::kBasic: pass = basic;                   break;
00744   case Selection::kPre:   pass = presel;                  break;
00745   case Selection::kCuts:  pass = presel && pid;           break;
00746   case Selection::kANN6:   pass = presel && pid;          break;
00747   case Selection::kANN30:  pass = presel && pid;          break;
00748   case Selection::kANN2PE: pass = presel && pid;          break;
00749   case Selection::kANN2PE_DAIKON04: pass = presel && pid; break;
00750   case Selection::kANN14_DAIKON04: pass = presel && pid;  break;
00751   case Selection::kSSPID: pass = presel && pid;           break;
00752   case Selection::kMCNN:  pass = presel && pid;           break;
00753   case Selection::kMDA:   pass = presel && false;         break;
00754   case Selection::kBDT:   pass = presel && false;         break;
00755   case Selection::kKNue:  pass = presel && false;         break;
00756   case Selection::kCC:    pass = infid &&
00757                      NueStandard::PassesCCSelection(nr);  break;
00758   default:                                                break;
00759   }
00760 
00761   return pass;
00762 }
00763 
00764 
00765 bool NueStandard::PassesCCSelection(NueRecord *nr)
00766 {
00767    int ntrack  = nr->srevent.tracks;
00768    int pass = nr->srtrack.passedFit;
00769    int endPlaneU = nr->srtrack.endPlaneU;
00770    int endPlaneV = nr->srtrack.endPlaneV;
00771    int deltaUVVtx = nr->srtrack.deltaUVVtx;   
00772 
00773    if (ntrack < 1){ pass = 0; endPlaneU = endPlaneV = deltaUVVtx = 300; }
00774 
00775    bool trackPass =  (pass == 1) || 
00776                 (deltaUVVtx <= 5 && TMath::Abs(endPlaneU - endPlaneV) <= 40
00777                    && endPlaneU < 270 && endPlaneV < 270);
00778 
00779 
00780    return  (ntrack > 0) && trackPass && nr->anainfo.roCCPID > 0.3;
00781 }
00782 
00783 
00784 double NueStandard::GetRPWBeamWeight(NueRecord *nr, bool ismrcc)
00785 {
00786 
00787 
00788   std::vector<double> pots;
00789   
00790   Detector::Detector_t det = nr->GetHeader().GetVldContext().GetDetector();
00791   BeamType::BeamType_t beam = nr->GetHeader().GetBeamType();
00792 
00793   if(beam != BeamType::kL010z185i
00794      &&beam != BeamType::kL010z185i_i124 
00795      &&beam != BeamType::kL010z185i_i191   
00796      &&beam != BeamType::kL010z185i_i213
00797      &&beam != BeamType::kL010z185i_i224
00798      &&beam != BeamType::kL010z185i_i232
00799      &&beam != BeamType::kL010z185i_i243
00800      &&beam != BeamType::kL010z185i_i257
00801      &&beam != BeamType::kL010z185i_i282
00802      &&beam != BeamType::kL010z185i_i303
00803      &&beam != BeamType::kL010z185i_i324
00804    
00805      &&beam != BeamType::kL010z000i
00806      &&beam != BeamType::kL010z000i_i209
00807      &&beam != BeamType::kL010z000i_i225
00808      &&beam != BeamType::kL010z000i_i232
00809      &&beam != BeamType::kL010z000i_i259
00810      &&beam != BeamType::kL010z000i_i300
00811      &&beam != BeamType::kL010z000i_i317
00812      &&beam != BeamType::kL010z000i_i326
00813      &&beam != BeamType::kL010z000i_i380){
00814 
00815     MAXMSG("NueStandard",Msg::kWarning,5)<<"Can't use NueStandard::GetRPWBeamWeight for non L010185 or L010000 beams, stop it!"<<endl;
00816     return 0;
00817   }
00818 
00819   if (det==Detector::kNear){
00820     if (ismrcc){
00821       for(int i=0;i<NRUNPERIODS;i++){
00822         pots.push_back(pot_ndmrcc[i]);
00823       }
00824     }
00825     else if (beam == BeamType::kL010z185i
00826      ||beam == BeamType::kL010z185i_i124
00827      ||beam == BeamType::kL010z185i_i191
00828      ||beam == BeamType::kL010z185i_i213
00829      ||beam == BeamType::kL010z185i_i224
00830      ||beam == BeamType::kL010z185i_i232
00831      ||beam == BeamType::kL010z185i_i243
00832      ||beam == BeamType::kL010z185i_i257
00833      ||beam == BeamType::kL010z185i_i282
00834      ||beam == BeamType::kL010z185i_i303
00835      ||beam == BeamType::kL010z185i_i324){
00836       for(int i=0;i<NRUNPERIODS;i++){
00837         pots.push_back(pot_nd[i]);
00838       }
00839     }
00840     else if (beam==BeamType::kL010z000i
00841      ||beam == BeamType::kL010z000i_i209
00842      ||beam == BeamType::kL010z000i_i225
00843      ||beam == BeamType::kL010z000i_i232
00844      ||beam == BeamType::kL010z000i_i259
00845      ||beam == BeamType::kL010z000i_i300
00846      ||beam == BeamType::kL010z000i_i317  
00847      ||beam == BeamType::kL010z000i_i326
00848      ||beam == BeamType::kL010z000i_i380){
00849       for(int i=0;i<NRUNPERIODS;i++){
00850         pots.push_back(pot_ndhornoff[i]);
00851       }
00852     }
00853   }
00854   else{
00855     if (ismrcc){
00856       for(int i=0;i<NRUNPERIODS;i++){
00857         pots.push_back(pot_fdmrcc[i]);
00858       }
00859     }
00860     //FD has no intensity samples
00861     else if (beam==BeamType::kL010z185i){
00862       for(int i=0;i<NRUNPERIODS;i++){
00863         pots.push_back(pot_fd[i]);
00864       }
00865     }
00866     //FD has no intensity samples
00867     else if (beam==BeamType::kL010z000i){
00868       MAXMSG("NueStandard",Msg::kWarning,5)<<"Can't use NueStandard::GetRPWBeamWeight for FD L010000 beams, stop it!"<<endl;
00869       return 0;
00870     }
00871   }
00872 
00873   if(nr->mctrue.nuFlavor < -1000){
00874     MAXMSG("NueStandard",Msg::kWarning,5)<<"No truth info for this event returning 0 for beamweight"<<endl;
00875     return 0;
00876   }
00877 
00878   double weight = GetRPWBeamWeight(nr->fluxweights.RPtotbeamweight,pots);
00879   return weight;
00880 }
00881 
00882 double NueStandard::GetRPWBeamWeight(std::vector<double> weights, std::vector<double> pots)
00883 {
00884 
00885   double w=0.;
00886   double p=0.;
00887   for(unsigned int i=0;i<weights.size();i++){
00888     w+=weights[i]*pots[i];
00889     p+=pots[i];
00890   }
00891 
00892   if (p==0){
00893     cout<<"Total pots is set to zero, can not compute a exposure weighted average beam weight.  Returning 1"<<endl;
00894     return 1;
00895   }
00896 
00897   return w/p;
00898 }
00899 
00900 bool NueStandard::PassesNCCleaningCuts(NueRecord* nr)
00901 {                                                                                
00902   // 40ns timing cut
00903   if (TMath::Abs(nr->eventq.minTimeSeparation)<40e-9)
00904     return false;
00905                                                                                 
00906   // tiny events are mostly junk
00907   if (nr->srevent.totalStrips<5)    return false;
00908                                                                                 
00909   // this cuts very steep showers, leaking in
00910   if ( (nr->srevent.totalStrips/(nr->srevent.planes*nr->srevent.planes))>1.0)
00911     return false;
00912                                                                                 
00913   // this cuts leakage which leaves activity in partially instrumented
00914   // region
00915   if ( (nr->eventq.edgeActivityStrips>3)
00916        && (nr->eventq.edgeActivityPH>1000)
00917        && (nr->srevent.energyGeV<5.0)
00918        && (nr->srshower.planes>nr->srtrack.planes) ) // don't cut out CC
00919     return false;
00920   // also cut out events with too much activity in the opposite edge region
00921   if ( (nr->eventq.oppEdgeStrips>3)
00922        && (nr->eventq.oppEdgePH>1000)
00923        && (nr->srevent.energyGeV<5.0 )
00924          && (nr->srshower.planes>nr->srtrack.planes) ) // don't cut out CC
00925     return false;
00926                                                                                 
00927   // make additional deltaZ cuts if (40ns<|minDeltaT|<120ns)
00928   if (TMath::Abs(nr->eventq.closeTimeDeltaZ)<1.0
00929       && TMath::Abs(nr->eventq.minTimeSeparation)<120e-9)
00930     return false;
00931                                                                                 
00932   // Survived all cuts
00933   return true;
00934 }
00935 
00936 void NueStandard::SetDefaultOscParam()
00937 {
00938   Double_t dm2_12 = 8.0e-5;  // best fit SNO
00939   Double_t dm2_23 = 2.43e-3;
00940 
00941   Double_t par[9] = {0};
00942   par[OscPar::kL] = 735.0;
00943   par[OscPar::kTh23] = 3.1415926/4.0;
00944   par[OscPar::kTh12] = 0.59365;    // Sin2(2Th12) = 0.86
00945   par[OscPar::kTh13] = 0.19885;  // Sin2(2Th13) = 0.15;
00946   par[OscPar::kDeltaM23] = dm2_23; //normal heirarchy
00947   par[OscPar::kDeltaM12] = dm2_12;
00948   par[OscPar::kDensity] = 2.75; //standard rock density
00949   par[OscPar::kDelta] = 0;
00950   par[OscPar::kNuAntiNu] = 1;
00951 
00952   fOscGen.SetOscParam(par);
00953 }
00954 
00955 void NueStandard::SetDefaultOscParamNoNue()
00956 {
00957   NueStandard::SetDefaultOscParam();
00958   NueStandard::SetOscParam(OscPar::kTh13, 0);
00959 }
00960 
00961 void NueStandard::SetOscParamBestFitANN()
00962 {
00963   NueStandard::SetDefaultOscParam();
00964   NueStandard::SetOscParam(OscPar::kTh13, 0.172088);
00965 }
00966 
00967 void NueStandard::SetOscParamBestFitkNN()
00968 { 
00969   NueStandard::SetDefaultOscParam(); 
00970   NueStandard::SetOscParam(OscPar::kTh13, 0.145518);
00971 } 
00972 
00973 void NueStandard::SetOscNoMatter()
00974 {
00975    fOscGen.SetOscParam(OscPar::kDensity, 1e-9);
00976 }
00977 
00978 void NueStandard::SetOscParam(double *par)
00979 {
00980    fOscGen.SetOscParam(par);
00981 }
00982 
00983 void NueStandard::SetOscParam(OscPar::OscPar_t pos, double val)
00984 {
00985   fOscGen.SetOscParam(pos, val);
00986 }
00987 
00988 double NueStandard::GetOscWeight(int nuFlavor, int nonOsc, double E)
00989 {
00990    return fOscGen.Oscillate(nuFlavor, nonOsc, E);
00991 }
00992 
00993 void NueStandard::FillDefaultOscParam(double* par)
00994 {
00995   Double_t dm2_12 = 8.0e-5;  // best fit SNO
00996   Double_t dm2_23 = 2.43e-3;
00997                                                                                       
00998   par[OscPar::kL] = 735.0;
00999   par[OscPar::kTh23] = 3.1415926/4.0;
01000   par[OscPar::kTh12] = 0.59365;    // Sin2(2Th12) = 0.86
01001   par[OscPar::kTh13] = 0.19885;  // Sin2(2Th13) = 0.15;
01002   par[OscPar::kDeltaM23] = dm2_23; //normal heirarchy
01003   par[OscPar::kDeltaM12] = dm2_12;
01004   par[OscPar::kDensity] = 2.75; //standard rock density
01005   par[OscPar::kDelta] = 0;
01006   par[OscPar::kNuAntiNu] = 1;
01007 }
01008 
01009 void NueStandard::GetOscParam(double* par){
01010   fOscGen.GetOscParam(par);
01011 }
01012 
01013 Bool_t NueStandard::IsRun1(NueRecord* nr)
01014 {
01015  return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1145036420);
01016 }
01017 
01018 
01019 Bool_t NueStandard::IsRun2(NueRecord* nr)
01020 {
01021  return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() > 1145036420 && nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1190028111);
01022 }
01023 
01024 Bool_t NueStandard::IsRun3(NueRecord* nr)
01025 {
01026  return(nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() > 1190028111 && nr->GetHeader().GetVldContext().GetTimeStamp().GetSec() < 1249594050);
01027 }
01028 
01029 
01030  Double_t NueStandard::GetMCWeights(NueRecord *nr)
01031  {
01032   //Function to calculate MC event weights to correct for various effect
01033    Double_t eventWeight = 1.0;
01034    
01035   //Check if it is MC
01036    if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
01037    {
01038     //Correct MC flux (i.e. SKZP and Helium) 
01039     eventWeight *= NueStandard::GetSKZPBeamWeight(nr);
01040    }
01041 
01042    return(eventWeight);   
01043  }
01044 
01045 
01046 
01047  Double_t NueStandard::GetSKZPBeamWeight(NueRecord *nr)
01048  {
01049   //One time intialization
01050    static SKZPWeightCalculator skzpWC("DetXs",true);  //static because we only want this created once
01051                                                        //and not every time it's called within a loop
01052    static bool firstTimeFunctionCalled = true;
01053   
01054    if(firstTimeFunctionCalled)
01055    {
01056     //print out the configuration information once
01057      skzpWC.PrintReweightConfig(std::cout);
01058      firstTimeFunctionCalled = false;
01059    }
01060 
01061   //Now get the weight
01062    Double_t eventWeight = 1.0;
01063    
01064   //Check if it is MC
01065    if(nr->GetHeader().GetVldContext().GetSimFlag() == SimFlag::kMC)
01066    {
01067 
01068     //Correct MC flux (i.e. SKZP and Helium) 
01069     double pt = (nr->fluxinfo.tpx * nr->fluxinfo.tpx);
01070            pt += (nr->fluxinfo.tpy * nr->fluxinfo.tpy);
01071            pt = sqrt(pt);
01072 
01073     eventWeight = skzpWC.GetBeamWeight(
01074                                 nr->GetHeader().GetVldContext().GetDetector() /*int det*/,
01075                                 BeamType::ToZarko( nr->GetHeader().GetBeamType() ) /*int Ibeam*/,
01076 
01077                                 nr->fluxinfo.tptype /*int tptype*/,
01078                                 pt /*double pt*/,
01079                                 nr->fluxinfo.tpz /*double pz*/,
01080                       
01081                                 nr->mctrue.nuEnergy /*double true_enu*/,
01082                                 nr->mctrue.nonOscNuFlavor /*int inu*/,  //want weight before neutrino oscillations
01083                                 nr->GetHeader().GetVldContext() /*VldContext vc*/
01084                                );
01085    }
01086 
01087    return(eventWeight);   
01088  }
01089 
01090 void NueStandard::ModifyANNPID(NueRecord *nr) {
01091  
01092  // This is only a temporary solution for the ANN14 PID.
01093  
01094   static bool firstcall = true;
01095   static TMultiLayerPerceptron* fneuralNet_14inp_daikon04 = 0;
01096 
01097   double ann14pid = -9999.9;
01098 
01099   char *srt_dir = getenv("SRT_PRIVATE_CONTEXT");
01100   char annfile[1000];
01101 
01102   if (firstcall) {
01103     srt_dir = getenv("SRT_PRIVATE_CONTEXT");
01104     sprintf(annfile,"%s/NueAna/data/ann14_400_14_9.root",srt_dir);
01105     ifstream Test2(annfile);
01106     if (!Test2){
01107       srt_dir = getenv("SRT_PUBLIC_CONTEXT");
01108       sprintf(annfile,"%s/NueAna/data/ann14_400_14_9.root",srt_dir);
01109       ifstream Test_again2(annfile);
01110       if (!Test_again2){
01111         cout<<"Couldn't find ANN object, blame Jiajie"<<endl;
01112         exit(0);
01113       }
01114     }
01115 
01116     static TFile *f = TFile::Open(annfile);
01117     fneuralNet_14inp_daikon04 = (TMultiLayerPerceptron*) f->Get("mlp");
01118   }
01119 
01120   if (!fneuralNet_14inp_daikon04) {
01121     cout << "Couldn't find ANN object, blame Jiajie" << endl;
01122     exit(0);
01123   }
01124 
01125   if (firstcall) {
01126     cout << "Get ann14 value from : " << annfile << endl;
01127     firstcall = false;
01128   }
01129 
01130   NueConvention::NueEnergyCorrection(nr); 
01131 
01132   double paras[14];
01133   paras[0] = nr->shwfit.par_a;
01134   paras[1] = nr->shwfit.par_b;
01135   paras[2] = nr->shwfit.uv_rms_9s_2pe_dw;
01136   paras[3] = nr->fracvars.fract_road;
01137   paras[4] = nr->shwfit.LongE;
01138   paras[5] = nr->fracvars.shw_max;
01139   paras[6] = nr->fracvars.shw_slp;
01140   paras[7] = nr->srevent.phNueGeV;
01141   paras[8] = nr->fracvars.dis2stp;
01142   paras[9] = nr->fracvars.fract_1_plane;
01143   paras[10] = nr->fracvars.fract_5_planes;
01144   paras[11] = nr->fracvars.fract_6_counters;
01145   paras[12] = nr->fracvars.fract_20_counters;
01146   paras[13] = TMath::Abs(nr->srevent.endPlane - nr->srevent.begPlane);
01147 
01148   int pass = 1;
01149 
01150   if (nr->shwfit.par_a<-1000) pass = 0;
01151   if (nr->shwfit.par_b<-1000) pass = 0;
01152   if (nr->shwfit.uv_rms_9s_2pe_dw<-1000) pass = 0;
01153   if (nr->fracvars.fract_1_plane<-1000) pass = 0;
01154   if (nr->fracvars.fract_5_planes<-1000) pass = 0;
01155   if (nr->fracvars.fract_6_counters<-1000) pass = 0;
01156   if (nr->fracvars.fract_20_counters<-1000) pass = 0;
01157   if (nr->fracvars.fract_road<-1000) pass = 0;
01158   if (nr->shwfit.LongE<-1000) pass = 0;
01159   if (nr->shwfit.LongE>1000) pass = 0;
01160   if (nr->fracvars.shw_max<-1000) pass = 0;
01161   if (nr->fracvars.dis2stp<-1000) pass = 0;
01162   if (nr->fracvars.shw_slp<0) pass = 0;
01163   if (nr->srevent.endPlane<-1000) pass = 0;
01164   if (nr->srevent.begPlane<-1000) pass = 0;
01165   
01166   if (pass) {
01167     ann14pid = fneuralNet_14inp_daikon04->Evaluate(0, paras);
01168   } 
01169 
01170   // set the ann.pid value to be ANN14 
01171   nr->ann.pid = ann14pid;
01172 }

Generated on Mon Feb 15 11:07:12 2010 for loon by  doxygen 1.3.9.1