Commit ec74e750 authored by mbsdaq's avatar mbsdaq

Modification of the crate configuration

parent 13493d00
...@@ -27,8 +27,15 @@ TNeAnalysis::TNeAnalysis() ...@@ -27,8 +27,15 @@ TNeAnalysis::TNeAnalysis()
:fMbsEvent(0) :fMbsEvent(0)
,fEvents(0) ,fEvents(0)
,fLastEvent(0) ,fLastEvent(0)
,p_T1xa(0) ,p_Lxa(0)
,p_T1ya(0) ,p_Lya(0)
,p_Rxa(0)
,p_Rya(0)
,p_RVa(0)
,p_R60a(0)
,p_AnSa(0)
,p_AnRa(0)
,p_AnVa(0)
{ {
} }
//*********************************************************** //***********************************************************
...@@ -39,8 +46,15 @@ TNeAnalysis::TNeAnalysis(int argc, char** argv) ...@@ -39,8 +46,15 @@ TNeAnalysis::TNeAnalysis(int argc, char** argv)
,fMbsEvent(0) ,fMbsEvent(0)
,fEvents(0) ,fEvents(0)
,fLastEvent(0) ,fLastEvent(0)
,p_T1xa(0) ,p_Lxa(0)
,p_T1ya(0) ,p_Lya(0)
,p_Rxa(0)
,p_Rya(0)
,p_RVa(0)
,p_R60a(0)
,p_AnSa(0)
,p_AnRa(0)
,p_AnVa(0)
{ {
cout << "**** Create TNeAnalysis name: " << argv[0] << endl; cout << "**** Create TNeAnalysis name: " << argv[0] << endl;
...@@ -84,10 +98,24 @@ TNeAnalysis::TNeAnalysis(int argc, char** argv) ...@@ -84,10 +98,24 @@ TNeAnalysis::TNeAnalysis(int argc, char** argv)
// At this point, autosave file has not yet been read! // At this point, autosave file has not yet been read!
// Therefore parameter values set here will be overwritten // Therefore parameter values set here will be overwritten
// if an autosave file is there. // if an autosave file is there.
p_T1xa = new TNeDet16("T1xa"); p_Lxa = new TNeDet16("Lxa");
p_T1ya = new TNeDet16("T1ya"); p_Lya = new TNeDet16("Lya");
AddParameter(p_T1xa); p_Rxa = new TNeDet16("Rxa");
AddParameter(p_T1ya); p_Rya = new TNeDet16("Rya");
p_RVa = new TNeDet16("RVa");
p_R60a = new TNeDet16("R60a");
p_AnSa = new TNeDet16("AnSa");
p_AnRa = new TNeDet16("AnRa");
p_AnVa = new TNeDet16("AnVa");
AddParameter(p_Lxa);
AddParameter(p_Lya);
AddParameter(p_Rxa);
AddParameter(p_Rya);
AddParameter(p_RVa);
AddParameter(p_R60a);
AddParameter(p_AnSa);
AddParameter(p_AnRa);
AddParameter(p_AnVa);
// pMTracks = new TNeMParms("MTRACKS"); // pMTracks = new TNeMParms("MTRACKS");
// AddParameter(pMTracks); // AddParameter(pMTracks);
...@@ -126,8 +154,15 @@ Int_t TNeAnalysis::UserPreLoop() ...@@ -126,8 +154,15 @@ Int_t TNeAnalysis::UserPreLoop()
} }
fEvents=0; // event counter fEvents=0; // event counter
fLastEvent=0; // number of last event processed fLastEvent=0; // number of last event processed
p_T1xa->ReadData(); p_Lxa->ReadData();
// p_T1ya->ReadData();>Z p_Lya->ReadData();
p_Rxa->ReadData();
p_Rya->ReadData();
p_RVa->ReadData();
p_R60a->ReadData();
p_AnSa->ReadData();
p_AnRa->ReadData();
p_AnVa->ReadData();
return 0; return 0;
......
...@@ -29,8 +29,15 @@ public: ...@@ -29,8 +29,15 @@ public:
virtual Int_t UserEventFunc(); virtual Int_t UserEventFunc();
virtual Int_t UserPostLoop(); virtual Int_t UserPostLoop();
TNeDet16* p_T1xa; TNeDet16* p_Lxa;
TNeDet16* p_T1ya; TNeDet16* p_Lya;
TNeDet16* p_Rxa;
TNeDet16* p_Rya;
TNeDet16* p_RVa;
TNeDet16* p_R60a;
TNeDet16* p_AnSa;
TNeDet16* p_AnRa;
TNeDet16* p_AnVa;
// TNeMParms* pMTracks; // TNeMParms* pMTracks;
ClassDef(TNeAnalysis,1) ClassDef(TNeAnalysis,1)
......
...@@ -30,11 +30,25 @@ void TNeEvent::Clear(Option_t *t) ...@@ -30,11 +30,25 @@ void TNeEvent::Clear(Option_t *t)
//== all members should be cleared. //== all members should be cleared.
//== memset(fRawData,0, sizeof(fRawData)); //== memset(fRawData,0, sizeof(fRawData));
//================================================================== //==================================================================
// SQ // Si
memset(T1xa, 0, sizeof(T1xa)); memset(Lxa, 0, sizeof(Lxa));
memset(T1xt, 0, sizeof(T1xt)); memset(Lxt, 0, sizeof(Lxt));
memset(T1ya, 0, sizeof(T1ya)); memset(Lya, 0, sizeof(Lya));
memset(T1yt, 0, sizeof(T1yt)); memset(Lyt, 0, sizeof(Lyt));
memset(Rxa, 0, sizeof(Rxa));
memset(Rxt, 0, sizeof(Rxt));
memset(Rya, 0, sizeof(Rya));
memset(Ryt, 0, sizeof(Ryt));
memset(RVa, 0, sizeof(RVa));
memset(RVt, 0, sizeof(RVt));
memset(R60a, 0, sizeof(R60a));
memset(R60t, 0, sizeof(R60t));
memset(AnSa, 0, sizeof(AnSa));
memset(AnSt, 0, sizeof(AnSt));
memset(AnRa, 0, sizeof(AnRa));
memset(AnRt, 0, sizeof(AnRt));
memset(AnVa, 0, sizeof(AnVa));
memset(AnVt, 0, sizeof(AnVt));
// ToF // ToF
memset(F3, 0, sizeof(F3)); memset(F3, 0, sizeof(F3));
......
...@@ -18,11 +18,25 @@ public: ...@@ -18,11 +18,25 @@ public:
/** Method called by the framework to clear the event element. */ /** Method called by the framework to clear the event element. */
void Clear(Option_t *t=""); void Clear(Option_t *t="");
//-----SQ----- //-----Si-----
unsigned short T1xa[16]; unsigned short Lxa[16];
unsigned short T1xt[16]; unsigned short Lxt[16];
unsigned short T1ya[16]; unsigned short Lya[16];
unsigned short T1yt[16]; unsigned short Lyt[16];
unsigned short Rxa[16];
unsigned short Rxt[16];
unsigned short Rya[16];
unsigned short Ryt[16];
unsigned short RVa[16];
unsigned short RVt[16];
unsigned short R60a[16];
unsigned short R60t[16];
unsigned short AnSa[16];
unsigned short AnSt[16];
unsigned short AnRa[16];
unsigned short AnRt[16];
unsigned short AnVa[16];
unsigned short AnVt[16];
unsigned short F3[4]; unsigned short F3[4];
unsigned short tF3[4]; unsigned short tF3[4];
......
...@@ -63,12 +63,19 @@ TNeProc::TNeProc() : TGo4EventProcessor() ...@@ -63,12 +63,19 @@ TNeProc::TNeProc() : TGo4EventProcessor()
for(i = 0; i < 16; ++i) for(i = 0; i < 16; ++i)
{ {
//-----SQ----- //-----Si-----
d1T1xa[i] = NULL; d1Lxa[i] = NULL;
d1T1xt[i] = NULL; d1Lxt[i] = NULL;
d1T1xc[i] = NULL; d1Lxc[i] = NULL;
// d1T1ya[i] = NULL; d1Lya[i] = NULL;
// d1T1yt[i] = NULL; d1Lyt[i] = NULL;
d1Lyc[i] = NULL;
d1Rxa[i] = NULL;
d1Rxt[i] = NULL;
d1Rxc[i] = NULL;
d1Rya[i] = NULL;
d1Ryt[i] = NULL;
d1Ryc[i] = NULL;
} }
//_________________________________Neutrons //_________________________________Neutrons
// //
...@@ -108,22 +115,49 @@ TNeProc::TNeProc(const char* name) : TGo4EventProcessor(name) ...@@ -108,22 +115,49 @@ TNeProc::TNeProc(const char* name) : TGo4EventProcessor(name)
fSubEvents = MakeTH1('I', "SubEvents", "Number of subevents", 16, 0, 15); fSubEvents = MakeTH1('I', "SubEvents", "Number of subevents", 16, 0, 15);
fEventsSizes = MakeTH1('I', "EventSizes", "Size of each event", 1024, 0, 1023); fEventsSizes = MakeTH1('I', "EventSizes", "Size of each event", 1024, 0, 1023);
int i; int i;
hT1a = MakeTH2('S', "T1/T1a", "Amplitudes in T1 MADC",
4096,0,4095,32,0,31,"amp (ch.)","channel");
for (i = 0; i < 16; ++i) { for (i = 0; i < 16; ++i) {
//-----SQ telescope raw----- //-----SQ telescope raw-----
d1T1xa[i] = MakeTH1('I', Form("T1xa/T1xas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена d1Lxa[i] = MakeTH1('I', Form("Lxa/Lxas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
, Form("T1 x amp CH %2.2d",i), 8192, 0., 8192.); , Form("L x amp CH %2.2d",i), 8192, 0., 8192.);
d1T1xt[i] = MakeTH1('I', Form("T1xt/T1xts_%2.2d",i) d1Lxt[i] = MakeTH1('I', Form("Lxt/Lxts_%2.2d",i)
, Form("T1 x time CH %2.2d",i), 4096, 1., 4096); , Form("L x time CH %2.2d",i), 4096, 1., 4096);
d1T1xc[i] = MakeTH1('D', Form("T1xc/T1xcs_%2.2d",i) d1Lxc[i] = MakeTH1('D', Form("Lxc/Lxcs_%2.2d",i)
, Form("T1 x energy MeV %2.2d",i), 4000, -2., 98.); , Form("L x energy MeV %2.2d",i), 4000, -2., 98.);
d1T1ya[i] = MakeTH1('I', Form("T1ya/T1yas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена //
, Form("T1 x amp CH %2.2d",i), 8192, 0., 8192.); d1Lya[i] = MakeTH1('I', Form("Lya/Lyas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
d1T1yt[i] = MakeTH1('I', Form("T1yt/T1yts_%2.2d",i) , Form("L x amp CH %2.2d",i), 8192, 0., 8192.);
, Form("T1 x time CH %2.2d",i), 4096, 1, 4096); d1Lyt[i] = MakeTH1('I', Form("Lyt/Lyts_%2.2d",i)
d1T1yc[i] = MakeTH1('D', Form("T1yc/T1ycs_%2.2d",i) , Form("L x time CH %2.2d",i), 4096, 1, 4096);
, Form("T1 x energy MeV %2.2d",i), 4000, -2., 98.); d1Lyc[i] = MakeTH1('D', Form("Lyc/Lycs_%2.2d",i)
//
, Form("L x energy MeV %2.2d",i), 4000, -2., 98.);
d1Rxa[i] = MakeTH1('I', Form("Rxa/Rxas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
, Form("R x amp CH %2.2d",i), 8192, 0., 8192.);
d1Rxt[i] = MakeTH1('I', Form("Rxt/Rxts_%2.2d",i)
, Form("R x time CH %2.2d",i), 4096, 1., 4096);
d1Rxc[i] = MakeTH1('D', Form("Rxc/Rxcs_%2.2d",i)
, Form("R x energy MeV %2.2d",i), 4000, -2., 98.);
//
d1Rya[i] = MakeTH1('I', Form("Rya/Ryas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
, Form("R x amp CH %2.2d",i), 8192, 0., 8192.);
d1Ryt[i] = MakeTH1('I', Form("Ryt/Ryts_%2.2d",i)
, Form("R x time CH %2.2d",i), 4096, 1, 4096);
d1Ryc[i] = MakeTH1('D', Form("Ryc/Rycs_%2.2d",i)
, Form("R x energy MeV %2.2d",i), 4000, -2., 98.);
//
d1AnSa[i] = MakeTH1('I', Form("AnSa/AnSas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
, Form("Sect amp CH %2.2d",i), 8192, 0., 8192.);
d1AnSt[i] = MakeTH1('I', Form("AnSt/AnSts_%2.2d",i)
, Form("Sect time CH %2.2d",i), 4096, 1, 4096);
d1AnSc[i] = MakeTH1('D', Form("AnSc/AnScs_%2.2d",i)
, Form("Sect energy MeV %2.2d",i), 4000, -2., 98.);
//
d1AnRa[i] = MakeTH1('I', Form("AnRa/AnRas_%2.2d",i) //указывать не повторяющуюся структуру папок и уникальные имена
, Form("Ring amp CH %2.2d",i), 8192, 0., 8192.);
d1AnRt[i] = MakeTH1('I', Form("AnRt/AnRts_%2.2d",i)
, Form("Ring time CH %2.2d",i), 4096, 1, 4096);
d1AnRc[i] = MakeTH1('D', Form("AnRc/AnRcs_%2.2d",i)
, Form("Ring energy MeV %2.2d",i), 4000, -2., 98.);
} }
// //
d1F3[0] = MakeTH1('I',"F3/QDC/F3_QDC_L","F3 QDC left", 4096, 0., 4095.); d1F3[0] = MakeTH1('I',"F3/QDC/F3_QDC_L","F3 QDC left", 4096, 0., 4095.);
...@@ -203,8 +237,8 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -203,8 +237,8 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
} }
bool dooutput = false; bool dooutput = false;
// double value1, value2; // double value1, value2;
// double eT1xa,eT1ya; // double eLxa,eLya;
// int mT1xa,mT1ya; // int mLxa,mLya;
// //
int num = 0, sz = 0; int num = 0, sz = 0;
int i, n, geo, typ, header,caen_header, module_id=0, crate=-1, cnt, chnl, evnt, ch; int i, n, geo, typ, header,caen_header, module_id=0, crate=-1, cnt, chnl, evnt, ch;
...@@ -264,24 +298,6 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -264,24 +298,6 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
if(idata[n] >> 24!=0x04) break; if(idata[n] >> 24!=0x04) break;
switch (module_id) switch (module_id)
{ {
case 2: // mTDC: time sect & rings p1
chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16)
{
NeEvent->T1xt[chnl] = adc;
}
break;
case 3: // mADC: amp sect & rings p1
chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16)
{
NeEvent->T1xa[chnl] = adc;
}
break;
case 0: //mTDC: ToF case 0: //mTDC: ToF
if ((idata[n] >> 16) & 0x20) break; //T bit analysis if ((idata[n] >> 16) & 0x20) break; //T bit analysis
chnl= (idata[n] >> 16) & 0x1f; chnl= (idata[n] >> 16) & 0x1f;
...@@ -299,6 +315,72 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -299,6 +315,72 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
break; break;
case 6: //scaler v560
for(i = 0; i < 16; ++i)
NeEvent->scaler[i]=idata[n++] & 0x07ffffff;
break;
case 8: // mTDC: time Lx & Ly
chnl= (idata[n] >> 16)&0x3f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->Lxt[chnl] = adc;
} else if(chnl<32) {
NeEvent->Lyt[chnl-16] = adc;
}
break;
case 9: // mADC: amp Lx & Ly
chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->Lxa[chnl] = adc;
} else {
NeEvent->Lya[chnl-16] = adc;
}
break;
case 10: // mTDC: time Rx & Ry
chnl= (idata[n] >> 16)&0x3f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->Rxt[chnl] = adc;
} else if(chnl<32) {
NeEvent->Ryt[chnl-16] = adc;
}
break;
case 11: // mADC: amp Rx & Ry
chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->Rxa[chnl] = adc;
} else {
NeEvent->Rya[chnl-16] = adc;
}
break;
case 12: // mTDC: time An S & R
chnl= (idata[n] >> 16)&0x3f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->AnSt[chnl] = adc;
} else if(chnl<32) {
NeEvent->AnRt[chnl-16] = adc;
}
break;
case 13: // mADC: amp An S & R
chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) {
NeEvent->AnSa[chnl] = adc;
} else {
NeEvent->AnRa[chnl-16] = adc;
}
break;
} }
break; break;
...@@ -337,10 +419,6 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -337,10 +419,6 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
//printf("DATA: geo:%d Channel = %d\n", geo, chnl); //printf("DATA: geo:%d Channel = %d\n", geo, chnl);
switch(geo) switch(geo)
{ {
case 6: //scaler v560
for(i = 0; i < 16; ++i)
NeEvent->scaler[i]=idata[n++] & 0x07ffffff;
break;
} }
// printf(" Data: geo:%d chnl:%d adc:%d\n", geo, chnl, adc); // printf(" Data: geo:%d chnl:%d adc:%d\n", geo, chnl, adc);
break; break;
...@@ -481,9 +559,9 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -481,9 +559,9 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
chnl= (idata[n] >> 16)&0x3f; chnl= (idata[n] >> 16)&0x3f;
adc = idata[n] & 0xfff; //only 12 bits adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) { if(chnl<16) {
NeEvent->T1xt[chnl] = adc; NeEvent->Lxt[chnl] = adc;
} else if(chnl<32) { } else if(chnl<32) {
NeEvent->T1yt[chnl-16] = adc; NeEvent->Lyt[chnl-16] = adc;
} }
break; break;
...@@ -491,9 +569,9 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target) ...@@ -491,9 +569,9 @@ Bool_t TNeProc::BuildEvent(TGo4EventElement* target)
chnl= (idata[n] >> 16)&0x1f; chnl= (idata[n] >> 16)&0x1f;
adc = idata[n] & 0xfff; //only 12 bits adc = idata[n] & 0xfff; //only 12 bits
if(chnl<16) { if(chnl<16) {
NeEvent->T1xa[chnl] = adc; NeEvent->Lxa[chnl] = adc;
} else { } else {
NeEvent->T1ya[chnl-16] = adc; NeEvent->Lya[chnl-16] = adc;
} }
break; break;
...@@ -624,12 +702,18 @@ ToF = (tf5 - tf3)*0.015625 + 68.475; ...@@ -624,12 +702,18 @@ ToF = (tf5 - tf3)*0.015625 + 68.475;
} }
} }
for (n=0; n<16; ++n) { for (n=0; n<16; ++n) {
if(NeEvent->T1xt[n]>0) d1T1xa[n]->Fill(NeEvent->T1xa[n]); if(NeEvent->Lxt[n]>0) d1Lxa[n]->Fill(NeEvent->Lxa[n]);
d1T1xt[n]->Fill(NeEvent->T1xt[n]); d1Lxt[n]->Fill(NeEvent->Lxt[n]);
if(NeEvent->T1yt[n]>0) d1T1ya[n]->Fill(NeEvent->T1ya[n]); if(NeEvent->Lyt[n]>0) d1Lya[n]->Fill(NeEvent->Lya[n]);
d1T1yt[n]->Fill(NeEvent->T1yt[n]); d1Lyt[n]->Fill(NeEvent->Lyt[n]);
hT1a->Fill(NeEvent->T1xa[n],n); if(NeEvent->Rxt[n]>0) d1Rxa[n]->Fill(NeEvent->Rxa[n]);
hT1a->Fill(NeEvent->T1ya[n],n+16); d1Rxt[n]->Fill(NeEvent->Rxt[n]);
if(NeEvent->Ryt[n]>0) d1Rya[n]->Fill(NeEvent->Rya[n]);
d1Ryt[n]->Fill(NeEvent->Ryt[n]);
if(NeEvent->AnSt[n]>0) d1AnSa[n]->Fill(NeEvent->AnSa[n]);
d1AnSt[n]->Fill(NeEvent->AnSt[n]);
if(NeEvent->AnRt[n]>0) d1AnRa[n]->Fill(NeEvent->AnRa[n]);
d1AnRt[n]->Fill(NeEvent->AnRt[n]);
} }
//-----p1 secrors amp.----- //-----p1 secrors amp.-----
/* /*
...@@ -652,7 +736,7 @@ ToF = (tf5 - tf3)*0.015625 + 68.475; ...@@ -652,7 +736,7 @@ ToF = (tf5 - tf3)*0.015625 + 68.475;
{ {
value1 = (double)NeEvent->p1s[n] + gRandom->Uniform(); value1 = (double)NeEvent->p1s[n] + gRandom->Uniform();
value2 = ((TNeAnalysis*)go4)->p_p1s->Energy(value1, n); value2 = ((TNeAnalysis*)go4)->p_p1s->Energy(value1, n);
d1_T1xa_c[n]->Fill(value2); d1_Lxa_c[n]->Fill(value2);
mp1s++; mp1s++;
ep1s = value2; ep1s = value2;
} }
......
...@@ -26,14 +26,27 @@ private: ...@@ -26,14 +26,27 @@ private:
// //
//-----SQ----- //-----SQ-----
//-----raw----- //-----raw-----
TH2 * hT1a; TH1 *d1Lxa[16];
TH2 * hT1t; TH1 *d1Lxt[16];
TH1 *d1T1xa[16]; TH1 *d1Lxc[16];
TH1 *d1T1xt[16]; TH1 *d1Lya[16];
TH1 *d1T1xc[16]; TH1 *d1Lyt[16];
TH1 *d1T1ya[16]; TH1 *d1Lyc[16];
TH1 *d1T1yt[16]; TH1 *d1Rxa[16];
TH1 *d1T1yc[16]; TH1 *d1Rxt[16];
TH1 *d1Rxc[16];
TH1 *d1Rya[16];
TH1 *d1Ryt[16];
TH1 *d1Ryc[16];
TH1 *d1AnSa[16];
TH1 *d1AnSt[16];
TH1 *d1AnSc[16];
TH1 *d1AnRa[16];
TH1 *d1AnRt[16];
TH1 *d1AnRc[16];
TH1 *d1AnVa[16];
TH1 *d1AnVt[16];
TH1 *d1AnVc[16];
//-----clb----- //-----clb-----
TH1 *d1sq1_x_c[16]; TH1 *d1sq1_x_c[16];
//-----ToF+MWPC----- //-----ToF+MWPC-----
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment