00001 #include "StandardNtuple/NtpStRecord.h"
00002 #include "CandNtupleSR/NtpSRRecord.h"
00003 #include "CandNtupleSR/NtpSREvent.h"
00004 #include "CandNtupleSR/NtpSRTrack.h"
00005 #include "CandNtupleSR/NtpSRStrip.h"
00006 #include "MessageService/MsgService.h"
00007 #include "NueAna/NueAnaTools/SntpHelpers.h"
00008 #include "NueAna/ANtpEventInfoAna.h"
00009 #include "AnalysisNtuples/Module/ANtpRecoNtpManipulator.h"
00010
00011 #include "DatabaseInterface/DbiResultPtr.h"
00012 #include "DcsUser/Dcs_Mag_Near.h"
00013 #include "Mad/fddataquality.h"
00014
00015 #include "DcsUser/CoilTools.h"
00016 #include "Conventions/Munits.h"
00017 #include "Conventions/Detector.h"
00018 #include "DataUtil/PlaneOutline.h"
00019 #include "DataUtil/DataQualDB.h"
00020
00021 #include "NueAna/NueAnaTools/NueConvention.h"
00022 #include "VertexFinder/NtpVtxFinder/NtpVtxFinder.h"
00023
00024 CVSID("$Id: ANtpEventInfoAna.cxx,v 1.42 2008/11/19 18:22:51 rhatcher Exp $");
00025
00026 ANtpEventInfoAna::ANtpEventInfoAna(ANtpEventInfoNue &anei):
00027 fANtpEventInfo(anei),
00028 fDetectorType(Detector::kUnknown)
00029 {}
00030
00031 ANtpEventInfoAna::~ANtpEventInfoAna()
00032 {
00033
00034 }
00035
00036
00037 void ANtpEventInfoAna::Analyze(int evtn, RecRecordImp<RecCandHeader> *srobj)
00038 {
00039
00040 fANtpEventInfo.index = evtn;
00041
00042
00043
00044 ANtpRecoNtpManipulator *ntpManipulator = 0;
00045 NtpStRecord *st = dynamic_cast<NtpStRecord *>(srobj);
00046 NtpSRRecord *sr = 0;
00047 NtpSREventSummary *eventSummary;
00048 NtpSRDmxStatus *dmxSummary;
00049 NtpSRDetStatus *detStatus;
00050 const RecCandHeader *header;
00051
00052 if(st != 0){
00053 ntpManipulator = new ANtpRecoNtpManipulator(st);
00054 header = &(st->GetHeader());
00055 eventSummary = &(st->evthdr);
00056 detStatus = &(st->detstatus);
00057 dmxSummary = &(st->dmxstatus);
00058 }
00059 else{
00060 sr = dynamic_cast<NtpSRRecord *>(srobj);
00061 ntpManipulator = new ANtpRecoNtpManipulator(sr);
00062 header = &(sr->GetHeader());
00063 eventSummary = &(sr->evthdr);
00064 detStatus = &(sr->detstatus);
00065 dmxSummary = &(sr->dmxstatus);
00066 }
00067
00068 fDetectorType = header->GetVldContext().GetDetector();
00069 SimFlag::SimFlag_t s = header->GetVldContext().GetSimFlag();
00070 if(s == SimFlag::kMC && evtn == -10) return;
00071
00072
00073 MSG("ANtpEventInfoAna",Msg::kDebug)<<"Filled event information specific to nue" << endl;
00074
00075 fANtpEventInfo.triggerSource = header->GetTrigSrc();
00076 fANtpEventInfo.spillType = header->GetRemoteSpillType();
00077 fANtpEventInfo.liTime = eventSummary->litime;
00078
00079
00080 fANtpEventInfo.coilStatus = detStatus->coilstatus;
00081
00082 fANtpEventInfo.coilCurrent = 0;
00083 fANtpEventInfo.coilQuality = 0;
00084 VldContext vld = header->GetVldContext();
00085
00086 if(s != SimFlag::kMC){
00087 std::pair<float, float> temp = CoilTools::CoilCurrent(vld);
00088
00089 fANtpEventInfo.coilCurrent = temp.first;
00090 if(vld.GetDetector() == Detector::kFar)
00091 fANtpEventInfo.coilCurrentSM2 = temp.second;
00092 fANtpEventInfo.coilQuality = CoilTools::IsOK(vld);
00093 if(CoilTools::IsReverse(vld)) fANtpEventInfo.coilDirection = -1;
00094 else fANtpEventInfo.coilDirection = 1;
00095 }
00096
00097 fANtpEventInfo.dmxStatus = 0;
00098 fANtpEventInfo.dmxStatus += (dmxSummary->nonphysicalfail);
00099 fANtpEventInfo.dmxStatus += ((dmxSummary->validplanesfail<<1));
00100 fANtpEventInfo.dmxStatus += ((dmxSummary->vertexplanefail<<2));
00101
00102
00103 fANtpEventInfo.rcBoundary = FDRCBoundary(eventSummary);
00104 fANtpEventInfo.daveFDDataQuality = DataUtil::IsGoodFDData(st);
00105
00106 if(evtn == -10) return;
00107
00108
00109 NtpSREvent *event = 0;
00110 event = SntpHelpers::GetEvent(evtn,srobj);
00111 if(!event){
00112 MSG("ANtpEventInfoAna",Msg::kError)<<"Couldn't get event "
00113 <<evtn<<" from Snarl "<<srobj->GetHeader().GetSnarl()<<endl;
00114 return;
00115 }
00116
00117
00118 fInfoFiller = new ANtpInfoObjectFiller();
00119 MSG("ANtpEventInfoAna",Msg::kDebug)<<"Created manipulator and filler "
00120 << ntpManipulator << " "
00121 << fInfoFiller <<endl;
00122
00123
00124
00125
00126
00127 fInfoFiller->SetStripArray(ntpManipulator->GetStripArray());
00128 MSG("ANtpEventInfoAna",Msg::kDebug)<<"SetStripArray " << fInfoFiller;
00129 fInfoFiller->FillEventInformation(ntpManipulator, event, &fANtpEventInfo);
00130 MSG("ANtpEventInfoAna",Msg::kDebug)<<"Filled event information "
00131 << fInfoFiller << endl;
00132
00133 if(ReleaseType::IsCedar(release))
00134 {
00135 Float_t vtxx, vtxy, vtxz;
00136
00137 NtpVtxFinder vtxf;
00138 vtxf.SetTargetEvent(evtn, st);
00139 if(vtxf.FindVertex() > 0){
00140 fANtpEventInfo.vtxX = vtxx = vtxf.VtxX();
00141 fANtpEventInfo.vtxY = vtxy = vtxf.VtxY();
00142 fANtpEventInfo.vtxZ = vtxz = vtxf.VtxZ();
00143 fANtpEventInfo.vertexTime = vtxf.VtxT();
00144
00145 Detector::Detector_t det = ( Detector::Detector_t) fDetectorType;
00146 fANtpEventInfo.vtxMetersToBeam =
00147 fInfoFiller->MetersToBeam(det, vtxx, vtxy, vtxz);
00148 fANtpEventInfo.vtxMetersToCoil =
00149 fInfoFiller->MetersToCoil(det, vtxx, vtxy);
00150 fANtpEventInfo.vtxMetersToCloseEdge =
00151 fInfoFiller->MetersToCloseEdge(det, vtxx,vtxy, 0);
00152 }
00153 }
00154
00155 FillNueEventInformation(event, &fANtpEventInfo);
00156
00157
00158 int lgst_evt_idx=-1;
00159 float big_ph=0.0;
00160 for(int i=0;i<eventSummary->nevent;i++){
00161 NtpSREvent *evtTemp = SntpHelpers::GetEvent(i,srobj);
00162 if(evtTemp == 0) continue;
00163 if(evtTemp->ph.mip > big_ph){
00164 big_ph=evtTemp->ph.mip;
00165 lgst_evt_idx=i;
00166 }
00167 }
00168
00169 fANtpEventInfo.largestEvent = 0;
00170 if(lgst_evt_idx == evtn)
00171 fANtpEventInfo.largestEvent = 1;
00172
00173 FillStripVariables(event, srobj);
00174
00175 if(fInfoFiller){
00176 delete fInfoFiller;
00177 fInfoFiller=0;
00178 }
00179 if(ntpManipulator){
00180 delete ntpManipulator;
00181 ntpManipulator=0;
00182 }
00183
00184 }
00185
00186
00187 void ANtpEventInfoAna::FillNueEventInformation(NtpSREvent *ntpEvent, ANtpEventInfoNue *eventInfoNue)
00188 {
00189
00190 eventInfoNue->timeLength=ntpEvent->end.t-ntpEvent->vtx.t;
00191 eventInfoNue->phMeu = ntpEvent->ph.mip;
00192 eventInfoNue->phMip = ntpEvent->ph.mip;
00193 eventInfoNue->phNueGeV = ntpEvent->ph.mip/MeuPerGeV;
00194
00195 return;
00196 }
00197
00198 Float_t ANtpEventInfoAna::GetNDCoilCurrent(const VldContext& vc)
00199 {
00200 const Dcs_Mag_Near* magnear =
00201 CoilTools::Instance().GetMagNear(vc);
00202 if ( magnear ) return magnear->GetCurrent();
00203 else return 0;
00204 }
00205
00206 Int_t ANtpEventInfoAna::FDRCBoundary(NtpSREventSummary *eventSummary){
00207 Int_t litag=0;
00208 Int_t numshower=eventSummary->nshower;
00209 Float_t allph=eventSummary->ph.raw;
00210 Int_t plbeg=eventSummary->plane.beg;
00211 Int_t plend=eventSummary->plane.end;
00212
00213 if (numshower) {
00214 if (allph>1e6) litag+=10;
00215
00216 if (((plbeg==1 || plbeg==2) && (plend==63 || plend==64)) ||
00217 ((plbeg==65 || plbeg==66) && (plend==127 || plend==128)) ||
00218 ((plbeg==129 || plbeg==130) && (plend==191 || plend==192)) ||
00219 ((plbeg==193 || plbeg==194) && (plend==247 || plend==248))) litag++;
00220 if (((plbeg==250 || plbeg==251) && (plend==312 || plend==313)) ||
00221 ((plbeg==314 || plbeg==315) && (plend==376 || plend==377)) ||
00222 ((plbeg==378 || plbeg==379) && (plend==440 || plend==441)) ||
00223 ((plbeg==442 || plbeg==443) && (plend==484 || plend==485))) litag++;
00224 }
00225 return litag;
00226 }
00227
00228 void ANtpEventInfoAna::FillStripVariables(NtpSREvent *ntpEvent, RecRecordImp<RecCandHeader> *srobj)
00229 {
00230
00231 Int_t HotChannel = 0;
00232
00233
00234 double trgtime= srobj->GetHeader().GetVldContext().GetTimeStamp().GetNanoSec()/1.e9;
00235 double timemax=0.;
00236 double timemin=1.e10;
00237
00238 Float_t sigfull,sigpart;
00239 sigfull=sigpart=0;
00240
00241 int triggerPlanes = 4;
00242 int nDetPlanes = 0;
00243 if(fDetectorType == Detector::kNear) nDetPlanes = 122;
00244 if(fDetectorType == Detector::kFar) nDetPlanes = 485;
00245
00246 vector<int> dataInPlane;
00247 dataInPlane.assign(nDetPlanes, 0);
00248
00249 for(int i=0;i<ntpEvent->nstrip;i++){
00250 Int_t index = SntpHelpers::GetStripIndex(i,ntpEvent);
00251 NtpSRStrip *ntpStrip = SntpHelpers::GetStrip(index,srobj);
00252 if(!ntpStrip){
00253 MSG("ANtpEventInfoAna",Msg::kError)<<"Couldn't get strip "
00254 <<index<<" from "<<" snarl "
00255 <<srobj->GetHeader().GetSnarl()
00256 <<" something has gone horribly wrong, I'll just go"
00257 <<" on to the next strip"<<endl;
00258 continue;
00259 }
00260
00261 if(fDetectorType==Detector::kNear)
00262 if(ntpStrip->ph0.raw+ntpStrip->ph1.raw>60000) HotChannel = 1;
00263
00264
00265 Double_t striptime = 0;
00266 if(fDetectorType==Detector::kNear){
00267 striptime=ntpStrip->time1-trgtime;
00268 }
00269 if(fDetectorType==Detector::kFar){
00270 Double_t striptime1=ntpStrip->time1-trgtime;
00271 Double_t striptime0=ntpStrip->time0-trgtime;
00272 if(striptime1>0 && striptime0<0) striptime=striptime1;
00273 if(striptime0>0 && striptime1<0) striptime=striptime0;
00274 if(striptime0>0 && striptime1>0) striptime=(striptime0+striptime1)/2.;
00275 }
00276
00277 if(striptime<=timemin) timemin=striptime;
00278 if(striptime>=timemax) timemax=striptime;
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289 if(fDetectorType == Detector::kNear){
00290 Int_t pr = NueConvention::InPartialRegion(ntpStrip->plane, ntpStrip->strip);
00291 if(!evtstp0mip){
00292 MSG("ANtpEventInfoAna",Msg::kError)<<"No mip strip information"<<endl;
00293 continue;
00294 }
00295
00296 float charge = evtstp0mip[index] + evtstp1mip[index];
00297 if(pr==1) { sigpart += charge; }
00298 else if(pr==-1){ sigfull += charge; }
00299 }
00300
00301 if(ntpStrip->plane < nDetPlanes) dataInPlane[ntpStrip->plane] = 1;
00302 }
00303
00304 bool triggerVerified = false;
00305 Int_t group = 0;
00306
00307 for(Int_t loop = 0; loop < nDetPlanes && !triggerVerified; loop++) {
00308 if(dataInPlane[loop] > 0) {
00309 group = 1;
00310 for(Int_t l = 1; l < triggerPlanes+1; l++) {
00311 if(dataInPlane[loop+l] > 0) group++;
00312 }
00313 if(group >= triggerPlanes) triggerVerified = true;
00314 }
00315 }
00316
00317 dataInPlane.clear();
00318
00319 if(fDetectorType == Detector::kFar){
00320 sigfull = ntpEvent->ph.mip;
00321 sigpart = 0;
00322 }
00323
00324 fANtpEventInfo.eventSignalFull = sigfull;
00325 fANtpEventInfo.eventSignalPartial = sigpart;
00326
00327 fANtpEventInfo.triggerPass = (int) triggerVerified;
00328
00329 fANtpEventInfo.eventTimeMax=timemax;
00330 fANtpEventInfo.eventTimeMin=timemin;
00331 fANtpEventInfo.hotch = HotChannel;
00332
00333
00334
00335
00336 }
00337