23 #ifndef _CrystalWatchers
31 #include "TPavesText.h"
34 static Double_t gArrowL = 1000;
35 static Double_t gArrowP = 10;
36 static Double_t gArrowB = 4000;
37 static Double_t gArrowT = 1000;
38 static Double_t gArrowO = 6000;
40 static Double_t gArrowBaselineSigma = 5;
41 static Double_t gMaxForOneSigna = 10000;
44 UInt_t gRangeforBaseline = 20;
45 Float_t fSpekGain = 1.f;
46 Float_t fMinSegAmpli = 500.f;
47 UInt_t fRawAmplitude = 0;
57 if ( ! Watcher::SetTrigger(trigger) )
63 for( which = 0u; which < GetTrigger()->GetNbInputFrame(); which++){
65 SharedFP *fp = GetTrigger()->GetInputSharedFP(which);
76 if ( ftype.Contains(
"data") && ftype.Contains(
"crystal") ) {
103 fProcessingAlgo(
"basic"),
125 Color_t color[6] = {1, 4, 2, 8 , 27, 6}; TArrow *arrow; TString hname, htitle; TH1 *h;
127 fEnergies = MakeTH2<TH2F>(
"ADC",
"ADC for Core and Segments",
128 CrystalInterface::kNbCores+CrystalInterface::kNbSegments,0,CrystalInterface::kNbCores+CrystalInterface::kNbSegments,16384,0,8192);
129 fEnergies->GetXaxis()->SetTitle(
"bin [0,1] for Core and [2,38] for Segments");
135 for (Int_t i = 0; i < CrystalInterface::kNbCores; i++ ) {
138 hname = Form(
"BaseLine_Core%d",i);
139 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
142 h->SetLineColor(kRed);
143 h->SetFillColor(kRed);
147 hname = Form(
"Spectra_Core%d",i);
148 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
151 h->SetLineColor(kRed);
155 hname = Form(
"Amplitude_Core%d",i);
156 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
159 h->SetLineColor(kRed);
160 h->SetFillColor(kRed);
163 TObjArray *SigArray =
new TObjArray(
gkNB_SIG);
164 fCor->AddAt(SigArray,i);
166 for (Int_t j = 0; j <
gkNB_SIG; j++ ) {
167 hname = Form(
"Core%d_Sig%d",i,j);
168 h = MakeTH1<TH1F>(hname.Data(),hname.Data(),
169 CrystalInterface::kDefaultLength,0,CrystalInterface::kDefaultLength,
"LastSignals");
170 h->GetXaxis()->SetTitle(
"RawValue");
171 h->GetYaxis()->SetTitle(
"Counts");
174 h->SetLineColor(kRed);
175 ((TObjArray*)
fCor->At(i))->AddAt(h,j);
177 arrow =
new TArrow(gArrowP,gArrowB,gArrowP,gArrowB+gArrowL,0.05,
"<|" );
179 arrow->SetArrowSize(0.015);
180 arrow->SetLineColor(kRed);
181 arrow->SetFillColor(kRed);
184 arrow =
new TArrow(gArrowP+10,gArrowB+gArrowT,gArrowP+10,gArrowB+gArrowT+gArrowL,0.05,
"<|>" );
186 arrow->SetArrowSize(0.015);
187 arrow->SetLineColor(kRed);
188 arrow->SetFillColor(kRed);
191 arrow =
new TArrow(gArrowP+20,gArrowB-gArrowL+gArrowO,gArrowP+20,gArrowB+gArrowO,0.05,
"|>" );
193 arrow->SetArrowSize(0.015);
194 arrow->SetLineColor(kRed);
195 arrow->SetFillColor(kRed);
198 for (Int_t i = 0; i < CrystalInterface::kNbSegments; i++ ) {
201 hname = Form(
"BaseLine_Seg%d",i);
202 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
203 h->GetXaxis()->SetTitle(
"Baseline Position");
204 h->GetYaxis()->SetTitle(
"Counts");
205 h->SetLineColor(color[i%6]);
206 h->SetFillColor(color[i%6]);
210 hname = Form(
"Spectra_Seg%d",i);
211 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
212 h->GetXaxis()->SetTitle(
"RawValue");
213 h->GetYaxis()->SetTitle(
"Counts");
214 h->SetLineColor(kRed);
215 fSpectra->AddAt(h,CrystalInterface::kNbCores+i);
218 hname = Form(
"Amplitude_Seg%d",i);
219 h = MakeTH1<TH1F>(hname.Data(),hname.Data(), 16384,0,16384);
220 h->GetXaxis()->SetTitle(
"Signal Amplitude");
221 h->GetYaxis()->SetTitle(
"Counts");
222 h->SetLineColor(color[i%6]);
223 h->SetFillColor(color[i%6]);
224 fAmplitudes->AddAt(h,CrystalInterface::kNbCores+i);
226 TObjArray *SigArray =
new TObjArray(
gkNB_SIG);
227 fSeg->AddAt(SigArray,i);
229 for (Int_t j = 0; j <
gkNB_SIG; j++ ) {
230 hname = Form(
"Segment%d_Sig%d",i,j);
231 htitle = Form(
"Seg #color[1]{%d} #color[4]{%d} #color[2]{%d} #color[8]{%d} #color[27]{%d} #color[6]{%d}",
232 i, i+1, i+2, i+3, i+4, i+5);
233 h = MakeTH1<TH1F>(hname.Data(),htitle.Data(),
234 CrystalInterface::kDefaultLength,0,CrystalInterface::kDefaultLength,
"LastSignals");
235 h->GetXaxis()->SetTitle(
"Time");
236 h->GetYaxis()->SetTitle(
"Amplitude");
239 h->SetLineColor(color[i%6]);
240 ((TObjArray*)
fSeg->At(i))->AddAt(h,j);
243 arrow =
new TArrow(gArrowP,gArrowB,gArrowP,gArrowB+gArrowL,0.05,
"<|" );
245 arrow->SetArrowSize(0.015);
246 arrow->SetLineColor(color[i%6]);
247 arrow->SetFillColor(color[i%6]);
250 arrow =
new TArrow(gArrowP+10,gArrowB+gArrowT,gArrowP+10,gArrowB+gArrowT+gArrowL,0.05,
"<|>" );
252 arrow->SetArrowSize(0.015);
253 arrow->SetLineColor(color[i%6]);
254 arrow->SetFillColor(color[i%6]);
257 arrow =
new TArrow(gArrowP+20,gArrowB-gArrowL+gArrowO,gArrowP+20,gArrowB+gArrowO,0.05,
"|>" );
259 arrow->SetArrowSize(0.015);
260 arrow->SetLineColor(color[i%6]);
261 arrow->SetFillColor(color[i%6]);
264 fHThreshold = MakeTH3<TH3F>(
"Threshold3D",
"Signals that are greater that threshold",
265 CrystalInterface::kNbCores+CrystalInterface::kNbSegments,0,CrystalInterface::kNbCores+CrystalInterface::kNbSegments,
266 CrystalInterface::kNbCores+CrystalInterface::kNbSegments,0,CrystalInterface::kNbCores+CrystalInterface::kNbSegments,
268 fHOvershoot = MakeTH3<TH3F>(
"Overshoot",
"Signals that are greater that overshoot",
269 CrystalInterface::kNbCores+CrystalInterface::kNbSegments,0,CrystalInterface::kNbCores+CrystalInterface::kNbSegments,
270 CrystalInterface::kNbCores+CrystalInterface::kNbSegments,0,CrystalInterface::kNbCores+CrystalInterface::kNbSegments,
273 fCoinc = MakeTH2<TH2F>(
"Threshold2D",
"Signals that are greater that threshold",
274 CrystalInterface::kNbSegments,0,CrystalInterface::kNbSegments,
275 CrystalInterface::kNbSegments,0,CrystalInterface::kNbSegments);
276 fCoinc->GetXaxis()->SetTitle(
"Segment #");
277 fCoinc->GetYaxis()->SetTitle(
"Segment #");
279 fCoreCoinc = MakeTH2<TH2F>(
"Core0_Core1",
"Core high gain versus low gain", 4096,0,4096,4096,0,4096);
317 Double_t baseline_value, net_signal_value;
325 UInt_t range_for_baseline = sig->
GetLength()/5, range_for_net_charge;
327 range_for_baseline = TMath::Max(UInt_t(1), range_for_baseline); range_for_net_charge = sig->
GetLength() - range_for_baseline;
330 baseline_value = 0; net_signal_value = 0;
333 if ( sig->
GetLength() == UInt_t(fill_h->GetNbinsX()) ) {
334 fill_h->Reset(
"ICE");
340 int Nvalforfaseline = 0, Nvalfornetcharge = 0;
342 for (UInt_t j = 0; j < sig->
GetLength(); j++ ) {
345 Short_t val = 0; val = sig->
Get(val,j);
352 if ( j < range_for_baseline ) {
353 baseline_value += val;
356 if ( j > range_for_net_charge ) {
357 net_signal_value += val;
362 if ( Nvalforfaseline )
363 baseline_value = baseline_value / ((double)Nvalforfaseline);
365 if ( Nvalfornetcharge )
366 net_signal_value = net_signal_value / ((double)Nvalfornetcharge);
374 if ( fProcessingAlgo ==
"basic" ) {
395 TString opt = o; TH1 *h;
397 if ( opt.Contains(
"sig") ) {
398 c->Divide(4,2,0.0001,0.0001);
400 for (Int_t i = 0; i < 8; i++ ) {
403 h = (TH1*)((TObjArray*)
fCor->At(0))->At(0);
405 for (Int_t j = 0; j <
gkNB_SIG; j++ ) {
406 h = (TH1F *)((TObjArray*)
fCor->At(0))->At(j);
409 h = (TH1*)((TObjArray*)
fCor->At(0))->At(0);
412 h = (TH1*)((TObjArray*)
fSeg->At(0))->At(0);
414 for (Int_t j = 0; j <
gkNB_SIG; j++ )
416 for(
int k=0 ; k<6 ; k++)
418 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
424 h = (TH1*)((TObjArray*)
fSeg->At(6))->At(0);
426 for (Int_t j = 0; j <
gkNB_SIG; j++ )
428 for(
int k=6 ; k<12 ; k++)
430 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
436 h = (TH1*)((TObjArray*)
fSeg->At(12))->At(0);
438 for (Int_t j = 0; j <
gkNB_SIG; j++ )
440 for(
int k=12 ; k<18 ; k++)
442 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
448 h = (TH1*)((TObjArray*)
fCor->At(1))->At(0);
450 for (Int_t j = 0; j <
gkNB_SIG; j++ ) {
451 h = (TH1F *)((TObjArray*)
fCor->At(1))->At(j);
456 h = (TH1*)((TObjArray*)
fSeg->At(18))->At(0);
458 for (Int_t j = 0; j <
gkNB_SIG; j++ )
460 for(
int k=18 ; k<24 ; k++)
462 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
468 h = (TH1*)((TObjArray*)
fSeg->At(24))->At(0);
470 for (Int_t j = 0; j <
gkNB_SIG; j++ )
472 for(
int k=24 ; k<30 ; k++)
474 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
480 h = (TH1*)((TObjArray*)
fSeg->At(30))->At(0);
482 for (Int_t j = 0; j <
gkNB_SIG; j++ )
484 for(
int k=30 ; k<36 ; k++)
486 h = (TH1*)((TObjArray*)
fSeg->At(k))->At(j);
494 if ( opt.Contains(
"amp") ) {
496 c->Divide(6,6,0.0001,0.0001);
498 for(Int_t j = 0; j < CrystalInterface::kNbSegments; j++ ) {
500 fAmplitudes->At(CrystalInterface::kNbCores+j)->Draw();
504 if ( opt.Contains(
"base") ) {
506 c->Divide(6,6,0.0001,0.0001);
508 for(Int_t j = 0; j < CrystalInterface::kNbSegments; j++ ) {
510 fBaseLines->At(CrystalInterface::kNbCores+j)->Draw();
512 TString
tmp =
fBaseLines->At(CrystalInterface::kNbCores+j)->GetName();
514 TObject *tag_object =
GetReference().FindObject(tmp.Data());
516 tag_object->Draw(
"same");
521 c->Divide(2,2,0.0001,0.0001);
535 TCanvas *c = 0x0; TVirtualPad *current = TVirtualPad::Pad();
537 if ( (c = (TCanvas *)gROOT->GetListOfCanvases()->FindObject(
"ShowSignals::ShowLastOnes")) ) {
540 c =
new TCanvas(
"ShowSignals::ShowLastOnes",
"ShowSignals::ShowLastOnes");
547 c->Divide(6,6,0.001,0.001);
549 c->SetCrosshair(
true);
552 Float_t c_bot = gStyle->GetPadBottomMargin(); gStyle->SetPadBottomMargin(0.005);
553 Float_t c_top = gStyle->GetPadTopMargin(); gStyle->SetPadTopMargin(0.005);
554 Float_t c_lef = gStyle->GetPadLeftMargin(); gStyle->SetPadLeftMargin(0.005);
555 Float_t c_rig = gStyle->GetPadRightMargin(); gStyle->SetPadRightMargin(0.005);
557 for (Int_t i = 0; i < CrystalInterface::kNbSegments; i++ ) {
559 TH1 *h = (TH1 *)((TObjArray*)
fSeg->At(i))->At(fCurrentSig), *hc = 0x0;
562 hc->SetTitle(Form(
"Segment# %d",i));
564 TVirtualPad::Pad()->UseCurrentStyle(); hc->SetStats(
false); TVirtualPad::Pad()->SetEditable(kFALSE);
568 gStyle->SetPadBottomMargin(c_bot);
569 gStyle->SetPadTopMargin(c_top);
570 gStyle->SetPadLeftMargin(c_lef);
571 gStyle->SetPadRightMargin(c_rig);
581 TH1 *h; Double_t e[CrystalInterface::kNbCores];
589 printf(
"ShowSignals::Exec is called \n");
597 for (Int_t i = 0; i < CrystalInterface::kNbCores; i++ ) {
608 ((TH1*)(
fSpectra->At(i)))->Fill(e[i]);
615 Double_t mean = hbaseline->GetMean();
616 Double_t rms = gArrowBaselineSigma*hbaseline->GetRMS();
636 h->SetAxisRange( TMath::Max(
fHMin,h->GetXaxis()->GetXmin()),TMath::Min(
fHMax,h->GetXaxis()->GetXmax()) );
641 std::pair <Int_t,Double_t> unique_seg(0,0); Int_t nb_seg_fired = 0;
642 for (Int_t i = 0; i < CrystalInterface::kNbSegments; i++ ) {
656 TH1 *hbaseline = (TH1*)(
fBaseLines->At(CrystalInterface::kNbCores+i));
660 Double_t mean = hbaseline->GetMean();
661 Double_t rms = gArrowBaselineSigma*hbaseline->GetRMS();
664 ((TArrow *)
fBaseLinesArrows.At(CrystalInterface::kNbCores+i))->SetY2(mean+rms);
665 ((TArrow *)
fBaseLinesArrows.At(CrystalInterface::kNbCores+i))->SetY1(mean+rms);
674 unique_seg.first = i;
680 h->SetAxisRange( TMath::Max(
fHMin,h->GetXaxis()->GetXmin()),TMath::Min(
fHMax,h->GetXaxis()->GetXmax()) );
682 if ( nb_seg_fired == 1 ) {
683 ((TH1*)(
fAmplitudes->At(CrystalInterface::kNbCores+unique_seg.first)))->Fill(unique_seg.second);
730 TObjArray *arr = ((TString)GetName()).Tokenize(
"_");
732 if(((TString)GetName()).EndsWith(
"_"))
fCrystalName =
"";
735 TString RawOrCal_Name=
"";
736 TString RawOrCal_Title=
"";
737 TString Type = GetName();
739 if(Type.Contains(
"ccrystal"))
741 RawOrCal_Name =
"CalSpectra";
742 RawOrCal_Title =
"calibrated";
745 RawOrCal_Name =
"RawSpectra";
746 RawOrCal_Title =
"raw";
751 for(
int i=0 ; i<CrystalInterface::kNbSegments ; i++)
755 h = ((TH1*)
fSpectra->At(CrystalInterface::kNbCores + i));
756 TString Name = (TString)
"Cry_" +
fCrystalName +
"_Seg_" + HistPosition.
SegName.ReplaceAll(
" ",
"_") +
"_" + RawOrCal_Name;
757 h->SetNameTitle(Name,Name);
758 h = ((TH1*)
fBaseLines->At(CrystalInterface::kNbCores + i));
759 h->SetName((TString)
"Cry_" +
fCrystalName +
"_Seg_" + HistPosition.
SegName.ReplaceAll(
" ",
"_") +
"_BaseLine");
761 for(
int i=0 ; i<CrystalInterface::kNbCores ; i++)
766 TString Name = (TString)
"Cry_" +
fCrystalName +
"_" + HistPosition.
SegName.ReplaceAll(
" ",
"_") +
"_" + RawOrCal_Name;
767 h->SetNameTitle(Name,Name);
769 h->SetName((TString)
"Cry_" +
fCrystalName +
"_" + HistPosition.
SegName.ReplaceAll(
" ",
"_") +
"_BaseLine");
788 cout<<
"Warning: max number or overimposed signals is 10, NbrOfSignals set to 10"<<
endl;
793 int CrystalID = data->
GetUID();
795 TString Name =
"SignalsMap_" + CrystalName;
796 TString Title =
"Mapping of the signals for crystal " + CrystalName;
803 for(
int i=0 ; i<CrystalInterface::kNbSegments ; i++)
807 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
811 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
815 h = (TH1*)((TObjArray*)
fSeg->At(i))->At(j);
816 h->SetName((TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName + Form(
"_Sig%d",j+1));
817 h->SetTitle((TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName + Form(
"_Sig%d",j+1));
819 h->GetXaxis()->SetLabelSize(0.07);
820 h->GetYaxis()->SetLabelSize(0.07);
836 for(
int i=0 ; i<CrystalInterface::kNbCores ; i++)
840 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
844 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
848 h = (TH1*)((TObjArray*)
fCor->At(i))->At(j);
849 h->SetName((TString)
"Cry_" + CrystalName +
"_" + HistPosition.
SegName + Form(
"_Sig%d",j+1));
850 h->SetTitle((TString)
"Cry_" + CrystalName +
"_" + HistPosition.
SegName + Form(
"_Sig%d",j+1));
852 h->GetXaxis()->SetLabelSize(0.07);
853 h->GetYaxis()->SetLabelSize(0.07);
856 else h->Draw(
"same");
871 TString opt = (TString)option;
875 int CrystalID = data->
GetUID();
880 if(opt ==
"same") c = (TCanvas*)gPad->GetCanvas();
883 TString Name =
"Baselines_" + CrystalName;
884 TString Title =
"Mapping of the baselines for crystal " + CrystalName;
892 for(
int i=0 ; i<CrystalInterface::kNbSegments ; i++)
896 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
900 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
902 h = ((TH1*)
fBaseLines->At(CrystalInterface::kNbCores + i));
903 h->SetName((TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName +
"_BaseLine");
904 h->SetTitle((TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName +
"_BaseLine");
905 h->GetXaxis()->SetLabelSize(0.07);
906 h->GetYaxis()->SetLabelSize(0.07);
909 for(
int k=0 ; k<pad->GetListOfPrimitives()->GetSize() ; k++)
911 if(pad->GetListOfPrimitives()->At(k)->InheritsFrom(
"TH1"))col++;
918 if(col==0) h->GetXaxis()->SetRangeUser(h->GetMean()-75,h->GetMean()+75);
925 for(
int i=0 ; i<CrystalInterface::kNbCores ; i++)
929 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
933 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
936 h->SetName((TString)
"Cry_" + CrystalName +
"_" + HistPosition.
SegName +
"_BaseLine");
937 h->SetTitle((TString)
"Cry_" + CrystalName +
"_" + HistPosition.
SegName +
"_BaseLine");
938 h->GetXaxis()->SetLabelSize(0.07);
939 h->GetYaxis()->SetLabelSize(0.07);
942 for(
int k=0 ; k<pad->GetListOfPrimitives()->GetSize() ; k++)
944 if(pad->GetListOfPrimitives()->At(k)->InheritsFrom(
"TH1"))col++;
950 if(col==0) h->GetXaxis()->SetRangeUser(h->GetMean()-100,h->GetMean()+100);
958 if(!opt.Contains(
"same"))
967 TString opt = (TString)option;
970 TString RawOrCal_Name=
"";
971 TString RawOrCal_Title=
"";
972 TString Type = GetName();
974 if(Type.Contains(
"ccrystal"))
976 RawOrCal_Name =
"CalSpectra";
977 RawOrCal_Title =
"calibrated";
980 RawOrCal_Name =
"RawSpectra";
981 RawOrCal_Title =
"raw";
985 int CrystalID = data->
GetUID();
992 if(opt ==
"same") c = (TCanvas*)gPad->GetCanvas();
995 TString Name = RawOrCal_Name +
"_" + CrystalName;
996 TString Title =
"Mapping of the " + RawOrCal_Title +
" spectra for crystal " + CrystalName;
1000 if(c == 0x0)
return;
1004 for(
int i=0 ; i<CrystalInterface::kNbSegments ; i++)
1008 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
1012 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
1014 h = ((TH1*)
fSpectra->At(CrystalInterface::kNbCores + i));
1016 TString Name = (TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName +
"_" + RawOrCal_Name;
1017 h->SetNameTitle(Name,Name);
1018 h->GetXaxis()->SetLabelSize(0.07);
1019 h->GetYaxis()->SetLabelSize(0.07);
1022 for(
int k=0 ; k<pad->GetListOfPrimitives()->GetSize() ; k++)
1024 if(pad->GetListOfPrimitives()->At(k)->InheritsFrom(
"TH1"))col++;
1030 if(col==0) h->GetXaxis()->SetRangeUser(15,h->GetXaxis()->GetXmax());
1037 for(
int i=0 ; i<CrystalInterface::kNbCores ; i++)
1041 TPad *pad = (TPad*)c->cd(HistPosition.
PadNmbr);
1045 TPaveText *p = (TPaveText*)pad->GetListOfPrimitives()->FindObject(
"InfoPad");
1049 TString Name = (TString)
"Cry_" + CrystalName +
"_Seg_" + HistPosition.
SegName +
"_" + RawOrCal_Name;
1050 h->SetNameTitle(Name,Name);
1051 h->GetXaxis()->SetLabelSize(0.07);
1052 h->GetYaxis()->SetLabelSize(0.07);
1055 for(
int k=0 ; k<pad->GetListOfPrimitives()->GetSize() ; k++)
1057 if(pad->GetListOfPrimitives()->At(k)->InheritsFrom(
"TH1"))col++;
1063 if(col==0) h->GetXaxis()->SetRangeUser(15,h->GetXaxis()->GetXmax());
1071 if(!opt.Contains(
"same"))
1084 TCanvas *CurrentCanvas = gPad->GetCanvas();
1086 double MinY = 100000., MaxY = 1.;
1087 double MinX = 100000., MaxX = 1.;
1089 double ForceMin = 0.;
1090 if(((TString)CurrentCanvas->GetName()).Contains(
"RawSpectra")) ForceMin = 15;
1092 bool OnlySeg =
false;
1094 TString OptToToken = opt;
1095 TObjArray *token = OptToToken.Tokenize(
" ");
1096 TObject *an_obj = 0x0;
1098 while ( (an_obj = it.Next()) )
1100 TString Name = an_obj->GetName();
1101 if(Name.BeginsWith(
"forcemin=")) ForceMin = Name.ReplaceAll(
"forcemin=",
"").Atof();
1102 if(Name.Contains(
"seg")) OnlySeg =
true;
1105 bool signalmap = ((TString)CurrentCanvas->GetName()).Contains(
"SignalsMap_");
1107 int NTot = CrystalInterface::kNbSegments + CrystalInterface::kNbCores;
1108 if(OnlySeg) NTot = CrystalInterface::kNbSegments;
1110 for(
int i=0 ; i<NTot; i++)
1112 TH1 *baseline_hist = 0x0;
1115 if(i<CrystalInterface::kNbSegments) histnbr = CrystalInterface::kNbCores+i;
1116 else histnbr = i-CrystalInterface::kNbSegments;
1122 baseline_hist = (TH1*)
fBaseLines->At(histnbr);
1123 if(baseline_hist==0x0)
continue;
1126 TIter iter((TList*)CurrentPad->GetListOfPrimitives());
1129 while( (o = iter()) )
1131 if(o->InheritsFrom(
"TH1"))
1135 double BaseLineMean = 1.;
1136 if(signalmap) BaseLineMean = baseline_hist->GetMean();
1138 if(!opt.Contains(
"y"))
1140 MinY=h->GetBinLowEdge(h->GetYaxis()->GetFirst());
1141 MaxY=h->GetBinLowEdge(h->GetYaxis()->GetLast());
1143 if(!opt.Contains(
"x"))
1145 MinX=h->GetBinLowEdge(h->GetXaxis()->GetFirst());
1146 MaxX=h->GetBinLowEdge(h->GetXaxis()->GetLast());
1149 h->GetXaxis()->UnZoom();
1150 h->GetYaxis()->UnZoom();
1151 h->GetXaxis()->SetRangeUser(ForceMin,h->GetXaxis()->GetXmax());
1152 double SigMax = h->GetBinContent(h->GetMaximumBin());
1153 h->GetXaxis()->UnZoom();
1155 if(opt.Contains(
"y"))
1157 if(BaseLineMean<MinY && BaseLineMean > 1) MinY = BaseLineMean;
1158 if(SigMax>MaxY) MaxY = SigMax;
1160 if(opt.Contains(
"x"))
1162 int LastBin = h->FindLastBinAbove(10);
1163 int FirstBin = h->FindFirstBinAbove(10);
1164 if(h->GetBinLowEdge(LastBin)>MaxX && h->GetBinContent(LastBin-1)>1) MaxX = h->GetBinLowEdge(LastBin);
1165 if(h->GetBinLowEdge(FirstBin)<MinX) MinX = h->GetBinLowEdge(FirstBin);
1171 if(opt.Contains(
"y")&&signalmap)
1173 double shift = TMath::Abs((MaxY-MinY)*0.05);
1175 SetRange(MinY-shift,MaxY+shift,
"y");
1176 SetVRange((Int_t)(MinY-shift),(Int_t)(MaxY+shift));
virtual Double_t GetE() const
virtual Bool_t IsValid() const
true if it is a valid pointer
printf("******************************************************************** \n")
virtual Frame * GetFrame() const
static const Short_t gkNB_SIG
TH2 * fCoreCoinc
Core correlation core0 versus core1.
virtual GeCore * GetCore(UShort_t)=0
to get each core
virtual void GlobalAutoRange(const char *opt="xy")
TObjArray fThresholdArrows
TString GetCrystalNameFromID(int ID)
TObjArray * fSeg
Array of last gkNB_SIG signals for core and segments.
virtual void ShowSignalsMap(int NbrOfSignals=1)
virtual UShort_t Get(UShort_t, UInt_t) const =0
Method to get the value for a particular bin of the signal.
std::vector< Double_t > fFromSignal
Some characteritics extracted from the signal.
vector< PadPos > fHistPositionList
Int_t fVMin
to change the range to diplay signals
virtual GeSegment * GetSegment(UShort_t)=0
to get individual segment
virtual Signal * GetSignal()
TObjArray fOvershootArrows
std::vector< Int_t > fCoincOverShoot
virtual TObjArray & GetReference()
TH2 * fEnergies
Energie for the different channels core and segments.
Data produced fro a Crystal.
void ShowLastOnes()
do get the last signal in a detector like view
virtual void ShowSpectraMap(const char *option="")
virtual UInt_t GetLength() const =0
virtual void Exec(Option_t *option="")
change for that signal baseline, threshold and overshoot
void SetLastExecStatus(Short_t s=0)
reset last status. 0 means no error, 0 < means error, > 0 means ok with conditions ...
virtual Int_t GetUID() const =0
to get the crystal ID
virtual void ShowBaselinesMap(const char *option="")
static void SetDefaultArrow(Double_t baseline, Double_t threshold, Double_t overshoot, Double_t pos=10, Double_t length=1000)
overwritten to add some help
LoupOnPad, a class to Loupe on a Pad in a Canvas with many pads in it.
Base Watcher working for any kind of crystal Frame (Frame interface)
TCanvas * BuildSegmentedCanvas(TString CanvasName, TString CanvasTitle)
virtual Bool_t SetTrigger(ADF::DFTrigger *=0x0)
Set the trigger attached to this watcher.
TObjArray * fBaseLines
Baseline for the different channels core and segments.
virtual void SetRange(double min, double max, const char *x_y="y")
void SetVRange(Int_t min=0, Int_t max=10000)
change vertical range
void ProcessSignalBasic(Signal *, TH1 *h=0x0)
void ProcessSignal(Signal *, TH1 *h=0x0)
Extract from signal some quantities Baseline, Amplitude, T0.
void TagOn(TObject *)
Add this histogram to the list of tagged histograms.
void SetHRange(Double_t min=0, Double_t max=100)
change horizontal range
Base class for a trigger on a data flow.
virtual void DoCanvas(TCanvas *c, Option_t *)
To be overwritten by real implementation if a canvas is produced.
ADF::LogMessage & endl(ADF::LogMessage &log)
ShowSignals(const char *name="ShowSignals", const char *title="Display the signals for one crystal")
virtual void SetHRange(Double_t min, Double_t max)
change horizontal range
virtual ~CrystalSpectra()
std::vector< Int_t > fCoincThreshold
to keep event by event the list of signals and overshoot
virtual void SetLoupe(bool loupeon=true)
virtual void SetVRange(Int_t min, Int_t max)
change vertical range
TObjArray fBaseLinesArrows
contains arrows corresponding respectively to baseline, threshold and overshoot for all detector ...
TH2 * fCoinc
Coincidence between segments [signals above the threshold].
TH3 * fHThreshold
keep statistcis for threshold and overshoot
const std::string & GetItemName() const
CrystalSpectra(const char *name="CrystalSpectra", const char *title="Display the values for one crystal at the producer level")
Crystal spectra watcher class.
void ShowArrow(Int_t which_sig=0)
display the different current levels (baseline,thresold, overshoot) for the corresponding signal ...
const FactoryItem & GetSignature() const
Signature of that frame.